rakelib/workflow.rake
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 12 Jan 2017 20:21:55 +0000
changeset 116 2512c874e5e1
parent 108 054919e32ff0
child 127 664296ccdb4a
child 137 e665031cade7
permissions -rw-r--r--
CI: Oops, fixed task `wofkflow:push-upstream` so it actually pushes commits Die to a bad coding, push loop was terminated prematurely as soon as stx:stc or stx:librun packages were reached. Also, as soon as one local repository had no upstream repository defined, all subsequent packages were pushed to canonical, not upstream repository.

# This file contains various tasks usefull for Smalltalk/X jv-branch 
# development. Currently it only supports working with Mercurial repositories,
# Honestly, there's not much one can do with CVS, we're using it only for
# packages that have not been converted to Mercurial. 

namespace :'workflow' do
  # A helper function to :push-upstream and push-staging tasks
  def hg_repositories()     
    project.packages_and_application.each do | pkg |
      if not pkg.nested_package? then
        repo = Rake::Stx::Configuration::Repository::find(pkg.repository)
        if repo.type == :'hg' then
          hg = HG::Repository.new(BUILD_DIR / pkg.directory)          
          yield pkg, hg          
        end
      end
    end    
  end
  
  def push(remote, user, pass, review_only, push_bookmark)  
    hg_repositories do | pkg, hg |
      opts = {
        :user => user,
        :pass => pass,
      }   
      paths = hg.paths
      remote_used = remote
      if remote_used == 'upstream' 
        if not paths['upstream'] then
          remote_used = 'canonical'
        end
      elsif remote_used == 'staging'
        if not paths['staging'] then
          puts ""
          puts "!! repository #{hg.path} has not staging repository defined - skipping !!"
          puts ""  
          return
        end
      end

      # STC and librun are special - never push them automatically
      # to upstream / canonical repo, must be done manually. This is 
      # mainly beacuse there are on separate protected repositories 
      # not accessible without a special setup. Sigh...
      if ((pkg.name == 'stx:stc') or (pkg.name == 'stx:librun')) and ((remote_used == 'upstream') or (remote_used == 'canonical')) then        
        puts ""
        puts "== Skipping push of #{pkg.name} - you must push manually =="
        puts ""                  
      else      
        if review_only then
          opts[:rev] = '.'
          remote_url = hg.paths[remote_used] || remote_used
          bookmark = hg.bookmark()
          puts ""
          puts "== changes going to #{remote_url} =="
          puts ""
          hg.outgoing(remote_used, **opts)
          puts ""
          if push_bookmark and bookmark then
            puts "Will update bookmark '#{bookmark}"
          end
          puts "===================================="
          puts ""
        else
          if push_bookmark && bookmark then
            opts[:bookmarks] = ['.']
          else
            opts[:rev] = '.'
          end        
          hg.push(remote_used, **opts)
        end
      end
    end
  end

  desc "Display changes to be pushed to upstream repositores (use it to review what workflow:push-upstream would do)"
  task :'out-upstream', :user, :pass do | t, args |
    push('upstream', args[:user], args[:pass], true, false)
  end
  task :'out-upstream' => :'setup'

  desc "Push currently checked out revisions to upstream repositories (to be called after all tests pass on all configurations)"
  task :'push-upstream', :user, :pass do | t, args |
    push('upstream', args[:user], args[:pass], false, false)
  end
  task :'push-upstream' => :'setup'


  desc "Display changes to be pushed to staging repositores (use it to review what workflow:push-staging would do)"
  task :'out-staging', :user, :pass do | t, args |
    push('staging', args[:user], args[:pass], true, true)
  end
  task :'out-staging' => :'setup'

  desc "Push currently checked out revisions to staging repositories (to be by developer to test her changes)"
  task :'push-staging', :user, :pass do | t, args |
    push('staging', args[:user], args[:pass], false, true)
  end
  task :'push-staging' => :'setup'

  desc "(Auto)merge changes (from eXept)"
  task :'merge' => :'setup' do
    if not which("hg-automerge.rb") then
      info "Cannot find 'hg-automerge.rb' in PATH"
      info "You may find it at https://bitbucket.org/janvrany/jv-scripts"
      error "Cannot find 'hg-automerge.rb' in PATH"
    end    
    hg_repositories_failed_to_merge = []
    hg_repositories do | pkg, hg |
      if File.exist? (hg.path / '.hgautomerge') then
        info "Merging #{hg.path}"
        sh "hg-automerge.rb --cwd #{hg.path}"
      else 
        info "Not merging #{hg.path} - no merge config found."
        info "To configure run: 'hg-automerge.rb --cwd #{hg.path} --config'"
      end
    end
  end

end