class Mono::Tool
pass along hash of repos (e.g. monorepo.yml or repos.yml )
pass along hash of repos (e.g. monorepo.yml or repos.yml )
pass along hash of repos (e.g. monorepo.yml or repos.yml )
pass along hash of repos (e.g. monorepo.yml or repos.yml )
Public Class Methods
backup()
click to toggle source
# File lib/mono/commands/backup.rb, line 5 def self.backup repos = Mono.monofile backup = GitBackup.new ## step 2: pass in all repos to backup by using ## 1) git clone --mirror or ## 2) git remote update (if local backup already exists) backup.backup( repos ) end
env()
click to toggle source
# File lib/mono/commands/env.rb, line 4 def self.env ## check environment setup puts "Mono.root (MOPATH): >#{Mono.root}<" puts "Mono::Module::Tool.root: >#{Mono::Module::Tool.root}<" puts ## add ruby version and path - why? why not? e.g. ## ruby: ## bin: C:/ri330/Ruby2.0.0/bin/ruby.exe ## version: ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32] puts "git version:" Git.version ## Git.config( 'user.name' ) ## Git.config( 'user.email', show_origin: true ) ## dump/print all user.* settings e.g. user.name, user.email Git.config( /user/, show_origin: true ) puts puts "monofile => (#{Monofile.find}):" pp Mono.monofile end
fetch()
click to toggle source
# File lib/mono/commands/fetch.rb, line 4 def self.fetch repos = Mono.monofile count_orgs = 0 count_repos = 0 total_repos = repos.size repos.each do |org,names| org_path = "#{Mono.root}/#{org}" names.each do |name| puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..." repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice Dir.chdir( org_path ) do if Dir.exist?( repo.name ) GitProject.open( repo.name ) do |proj| proj.fetch end else puts "!! repo not found / missing" end end count_repos += 1 end count_orgs += 1 end ## print stats & changes summary puts print "#{count_repos} repo(s) @ #{count_orgs} org(s)" print "\n" end
main( args=ARGV )
click to toggle source
# File lib/mono/tool.rb, line 5 def self.main( args=ARGV ) options = {} OptionParser.new do |parser| ## note: ## you can add many/multiple modules ## e.g. -r gitti -r mono etc. parser.on( '-r NAME', '--require NAME') do |name| options[:requires] ||= [] options[:requires] << name end ## todo/fix: ## add --verbose ## add -d/--debug end.parse!( args ) ## add check for auto-require (e.g. ./config.rb) if options[:requires] ## use custom (auto-)requires options[:requires].each do |path| puts "[monofile] auto-require >#{path}<..." require( path ) end else ## use/try defaults config_path = "./config.rb" if File.exist?( config_path ) puts "[monofile] auto-require (default) >#{config_path}<..." require( config_path ) end end ## note: for now assume first argument is command cmd = if args.size == 0 'status' ## make status "default" command else args.shift ## remove first (head) element end ## note: allow shortcut for commands case cmd.downcase when 'status', 'stati', 'stat', 'st', 's' status when 'sync', 'syn', 'sy', ## note: allow aliases such as install, get & up too 'get', 'g', 'install', 'insta', 'inst', 'ins', 'i', 'up', 'u' sync when 'fetch', 'f' fetch when 'env', 'e' env when 'backup', 'back', 'b' backup when 'run', 'r', 'exec' run( args ) ################## ## for debugging / linting when 'walk' Mono.walk else puts "!! ERROR: unknown command >#{cmd}<" exit 1 end end
run( *args )
click to toggle source
# File lib/mono/commands/run.rb, line 4 def self.run( *args ) ## todo/fix: use a "standard" argument to pass along hash of repos ## (e.g. monorepo.yml or repos.yml ) how? - why? why not? repos = Mono.monofile cmd = args.join( ' ' ) count_orgs = 0 count_repos = 0 total_repos = repos.size repos.each do |org,names| org_path = "#{Mono.root}/#{org}" names.each do |name| puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..." repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice Dir.chdir( org_path ) do if Dir.exist?( repo.name ) GitProject.open( repo.name ) do |proj| proj.run( cmd ) end else puts "!! repo not found / missing" end end count_repos += 1 end count_orgs += 1 end ## print stats & changes summary puts print "#{count_repos} repo(s) @ #{count_orgs} org(s)" print "\n" end
status()
click to toggle source
# File lib/mono/commands/status.rb, line 5 def self.status repos = Mono.monofile changes = [] ## track changes count_orgs = 0 count_repos = 0 total_repos = repos.size repos.each do |org,names| org_path = "#{Mono.root}/#{org}" names.each do |name| puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..." repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice Dir.chdir( org_path ) do if Dir.exist?( repo.name ) GitProject.open( repo.name ) do |proj| output = proj.changes if output.empty? puts " - no changes -" else changes << ["#{org}@#{name}", :CHANGES, output] end end else puts "!! repo not found / missing" changes << ["#{org}@#{name}", :NOT_FOUND] end end count_repos += 1 end count_orgs += 1 end ## print stats & changes summary puts print "#{changes.size} change(s) in " print "#{count_repos} repo(s) @ #{count_orgs} org(s)" print "\n" changes.each do |item| puts print "== #{item[0]} - #{item[1]}" case item[1] when :CHANGES print ":\n" print item[2] when :NOT_FOUND print "\n" end end end
sync()
click to toggle source
# File lib/mono/commands/sync.rb, line 5 def self.sync repos = Mono.monofile count_orgs = 0 count_repos = 0 total_repos = repos.size repos.each do |org,names| org_path = "#{Mono.root}/#{org}" FileUtils.mkdir_p( org_path ) unless Dir.exist?( org_path ) ## make sure path exists names.each do |name| puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..." repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice Dir.chdir( org_path ) do if Dir.exist?( repo.name ) GitProject.open( repo.name ) do |proj| if proj.changes? puts "!! WARN - local changes in workdir; skipping fast forward (remote) sync / merge" else proj.fast_forward ## note: use git pull --ff-only (fast forward only - do NOT merge) end end else Git.clone( repo.ssh_clone_url ) end end # # todo/fix: add (back) error log !!!!!!!!!!!! # rescue GitError => ex # puts "!! ERROR: #{ex.message}" # # File.open( './errors.log', 'a' ) do |f| # f.write "#{Time.now} -- repo #{org}/#{name} - #{ex.message}\n" # end count_repos += 1 end count_orgs += 1 end ## print stats puts "#{count_repos} repo(s) @ #{count_orgs} org(s)" end