class Raykit::Console

The implementation for the raykit console application

Attributes

opts[RW]

Public Class Methods

new() click to toggle source
# File lib/raykit/console.rb, line 9
def initialize
    @opts = Slop.parse do |o|
        o.string '-t','--task','rake task', default: 'default'
        o.bool '-v','--verbose','print detailed output', default: false
        o.bool '-q','--quiet','minimal output', default: false
        o.bool '-s','--stop','stop on error', default: true
    end

    if(opts.verbose?)
        puts "options: " + Rainbow(@opts.to_hash).yellow.bright
        puts "arguments:" + Rainbow(@opts.arguments).yellow.bright
    end
end

Public Instance Methods

add() click to toggle source
# File lib/raykit/console.rb, line 88
def add
    if(@opts.arguments.length < 2)
        puts 'add requires a url'
        return 1
    end
    url=@opts.arguments[1] 
    if(REPOSITORIES.include?(url))
        puts 'url ' + url + ' already exists.'
    else
        REPOSITORIES << url
        REPOSITORIES.save(REPOSITORIES.filename)
        puts 'url ' + url + ' added.'
    end
end
clean() click to toggle source
# File lib/raykit/console.rb, line 223
def clean
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)
    REPOSITORIES.matches(pattern).each{|url|
        repo=Raykit::Git::Repository.new(url)
        work=Raykit::Git::Directory.new(repo.get_dev_dir('work'))
        if(Dir.exist?(work.directory))
            puts 'removing ' + work.directory
            begin
                FileUtils.rm_rf(work.directory,secure:true)
            rescue
                puts 'error removing ' + work.directory
            end
        end
    }
end
copy() click to toggle source

def sync_version

if(@opts.arguments.length < 3)
    puts 'source and destination arguments are required for sync_version'
    return 1
end
source = @opts.arguments[1]
dest = @opts.arguments[2]
Raykit::Version::sync_file_versions(source,dest)
version = Raykit::Version::detect(source,false)
puts "version #{version} detected in #{source}, updating #{dest} to match."

end

# File lib/raykit/console.rb, line 252
def copy
    if(@opts.arguments.length < 3)
        puts 'source and destination arguments are required for copy'
        return 1
    end
    source = @opts.arguments[1]
    dest = @opts.arguments[2]
    FileUtils.cp(source,dest)
    puts "copied #{source} to #{dest}"
end
import() click to toggle source
# File lib/raykit/console.rb, line 213
def import
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)
    puts 'scanning...'
    count=REPOSITORIES.length
    REPOSITORIES.import(pattern)
    new_count=REPOSITORIES.length-count
    puts "imported #{new_count} git repositories"
end
pull() click to toggle source
# File lib/raykit/console.rb, line 178
def pull
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)
    REPOSITORIES.matches(pattern).each{|url|
        begin
            repo=Raykit::Git::Repository.new(url)
            work=Raykit::Git::Directory.new(repo.get_dev_dir('work'))
            if(Dir.exist?(work.directory) && !work.directory=='.git')
                Dir.chdir(work.directory) do
                    diff=`git diff`.strip
                    status=`git status`.strip
                    if(diff.length == 0 && status.include?('nothing to commit'))
                        cmd = Command.new('git pull')
                        cmd.summary if(@opts.verbose?)

                        if(cmd.exitstatus != 0)
                            cmd.details
                            if(@opts.quit?)
                                abort Rainbow(cmd.summary).blue.bright
                            end
                        end
                    end
                end
            end
        rescue => error
            issue = 'error occurred for pull of ' + url +' ' + error.to_s
            if(@opts.quit?)
                abort Rainbow(issue).blue.bright
            else
                puts Rainbow(issue).blue.bright
            end
        end
    }
end
rake(hash) click to toggle source
# File lib/raykit/console.rb, line 263
def rake(hash)
    REPOSITORIES.each{|remote|
        if(remote.include?(hash[:pattern]))
            begin
                puts "remote: #{remote}"
                cmd = Raykit::Rake::run(remote,'master')
                elapsed_str = Timer.get_elapsed_str(cmd.elapsed)
                if(cmd.exitstatus == 0)
                    puts elapsed_str + " " +  Rainbow(SECRETS.hide(cmd.command)).yellow.bright + " (#{cmd.directory})"
                else
                    puts "\r\n" + cmd.command + "\r\n"
                    puts "\r\n" + cmd.output + "\r\n"
                    puts "\r\n" + cmd.error + "\r\n"
                    puts ''
                    puts Rainbow(elapsed_str).red.bright + " " +  Rainbow(cmd.command).white
                end
            rescue
                puts 'rescued...'
            end
        end
    }
end
remove() click to toggle source
# File lib/raykit/console.rb, line 103
def remove
    if(@opts.arguments.length < 2)
        puts 'remove requires a url or pattern'
        return 1
    end
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)
    remove_urls = REPOSITORIES.matches(pattern)
    if(remove_urls.length == 0)
        puts 'no matching urls found.'
    
    else
        remove_urls.each{|url|
        REPOSITORIES.delete(url)
        puts 'url ' + url + ' removed.'
        }
        REPOSITORIES.save(REPOSITORIES.filename)
    end
end
run() click to toggle source
# File lib/raykit/console.rb, line 23
def run
    verb = "usage"
    verb = @opts.arguments[0] if(@opts.arguments.length > 0)
    case verb
    when "usage"
        usage
    when "add"
        add
    when "remove"
        remove
    when "show"
        show
    when "work"
        work
    when "import"
        import
    when "clean"
        clean
    when "sync_version"
        sync_version
    when "copy"
        copy
    when "pull"
        pull
    else
        puts 'unrecognized command ' + verb
        return 1
    end
end
show() click to toggle source
# File lib/raykit/console.rb, line 123
def show
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)
    REPOSITORIES.matches(pattern).each{|url|
        puts url
    }
end
usage() click to toggle source
# File lib/raykit/console.rb, line 77
def usage

    puts "Usage: raykit VERB [GIT_URL|PATTERN] [OPTIONS]"
    verb_descriptions.each{|k,v|
        puts k.ljust(15,' ') + " - " + v
    }
    #puts @opts
    #puts "verbs: " + verbs.to_s
    0
end
verb_descriptions() click to toggle source
# File lib/raykit/console.rb, line 53
def verb_descriptions
    { "add"=> "add a git url",
    "remove" => "remove one or more git urls",
    "show" => "show git urls matching a specific pattern",
    "work" => "clone and rake a git repository",
    "import" => "import git urls matching a specific pattern",
    "clean" => "clean one or more working directories",
    "pull" => "preform git pull on one or more working directories",
    "sync_version" => "synchronize the version number between two files",
    "copy" => "copy a file"
}
end
verb_usage() click to toggle source
# File lib/raykit/console.rb, line 65
def verb_usage
    { "add" => "add GIT_URL",
        "remove" => "remove URL_PATTERN",
        "show" => "show URL_PATTERN",
        "work" => "work URL_PATTERN [--task RAKE_TASK]",
        "import" => "import URL_PATTERN",
        "clean" => "clean URL_PATTERN",
        "pull" => "pull URL_PATTERN",
        "sync_version" => "sync_version SOURCE_FILENAME DESTINATION_FILENAME",
        "copy" => "copy SOURCE DESTINATION"}
end
work() click to toggle source
# File lib/raykit/console.rb, line 131
def work
    pattern=''
    pattern=@opts.arguments[1] if(@opts.arguments.length > 1)

    work_repositories = REPOSITORIES.matches(pattern)
    errors=Array.new()
    puts 'work: found ' + work_repositories.length.to_s + ' matching urls'
    work_repositories.each{|url|
        exitstatus = work_url(url)
        puts ' ' if(@opts.verbose?)
        return exitstatus if(@opts[:stop] && exitstatus != 0)
    }
    0
end
work_url(url) click to toggle source
# File lib/raykit/console.rb, line 146
def work_url(url)
    return 0 if(url == "https://gitlab.com/lou-parslow/raykit.git")
    puts Rainbow(url).yellow.bright if(@opts.verbose?)
    repo=Raykit::Git::Repository.new(url)
    work=Raykit::Git::Directory.new(repo.get_dev_dir('work'))
    if(!Dir.exist?(work.directory))
        clone = Command.new("git clone #{url} #{work.directory} --recursive")
        puts clone.summary if(!@opts.quiet?)
        if(clone.exitstatus != 0)
            clone.details
            return clone.exitstatus
        end
    end
    if(Dir.exist?(work.directory))
        Dir.chdir(work.directory) do
            if(File.exist?('rakefile.rb'))
                rake = Raykit::Command.new("rake #{@opts[:task]}")
                rake.summary(true) if(!@opts.quiet?) || rake.exitstatus != 0
                if(rake.exitstatus != 0)
                    rake.details
                    rake.summary true
                    return rake.exitstatus
                end
            else
                puts('rakefile.rb not found in ' + work.directory) if(@opts.verbose?)
                return 0
            end
        end
    end
    return 0
end