rakelib/hglib.rb
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 05 Dec 2016 22:20:56 +0000
changeset 89 3fae142744f4
parent 86 f2a7a4378c22
child 101 32f9287b419a
permissions -rwxr-xr-x
`hglib.rb`: Fixed `bookmarks()` to support multiple bookmarks on a single changeset
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
# This file is not a standalone script. It is a kind
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
# of lightweight Mercurial library used by other scripts.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
require 'uri'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
require 'open3'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
require 'shellwords'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
# Following hack is to make hglib.rb working wit both jv:scripts and
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
# Smalltalk/X rakefiles. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
begin
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
  require 'rakelib/inifile'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
rescue
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
  begin
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
    require 'inifile'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
  rescue LoadError => ex
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    $LOGGER.error("Cannot load package 'inifile'")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
    $LOGGER.error("Run 'gem install inifile' to install it")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
    exit 1
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
if not $LOGGER then
69
23cdc822cfc5 Initial support for Jenkins pipelines.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
    23
  if STDOUT.tty? or win32? then
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
    require 'logger'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
    $LOGGER = Logger.new(STDOUT)
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
    26
    
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
    27
    if (VERBOSE != nil) then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
    28
        $LOGGER.level = Logger::DEBUG
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
    29
    else 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
    30
       $LOGGER.level = Logger::INFO 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
    31
    end
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
  else 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
    require 'syslog/logger'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
    $LOGGER = Syslog::Logger.new($0)    
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
module HG
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
  @@config = nil
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
86
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    41
  # Cross-platform way of finding an executable in the $PATH.
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    42
  #
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    43
  #   which('ruby') #=> /usr/bin/ruby
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    44
  module_function
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    45
  def which(cmd)
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    46
    exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    47
    ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    48
      exts.each { |ext|
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    49
        exe = File.join(path, "#{cmd}#{ext}")
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    50
        return exe if File.executable?(exe) && !File.directory?(exe)
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    51
      }
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    52
    end
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    53
    return nil
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    54
  end
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
    55
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
  GLOBAL_OPTIONS= [:'cwd', :'repository', :'noninteractive', :'config', :'debug', :'debugger',
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
       :'encoding',:'encodingmode',:'traceback',:'time', :'profile',:'version', :'help',
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
       :'hidden' ]
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
  # Execute `hg` command with given positional arguments and
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
  # keyword arguments turned into command options. For example, 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
  #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
  #     HG::hg("heads", "default", cwd: '/tmp/testrepo')
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
  #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
  # will result in executing
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
  # 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
  #     hg --cwd '/tmp/testrepo' heads default
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
  #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
  # In addition if block is passed, then the block is evaluate with
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
  # `hg` command exit status (as Process::Status) and (optionally)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
  # with contents of `hg` command stdout and stderr. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
  # If no block is given, an exception is raised when `hg` command 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
  # exit status IS NOT zero.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
  def self.hg(command, *args, **options, &block)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    g_opts = []
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    c_opts = []
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    options.each do | k , v |       
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
    77
      if v != false and v != nil
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
        o = k.size == 1 ? "-#{k}" : "--#{k}"                
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
        if GLOBAL_OPTIONS.include? k then                  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
          if v.kind_of?(Array)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
            v.each do | e |
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
              g_opts << o << (e == true ? '' : e)  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
            end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
          else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
            g_opts << o << (v == true ? '' : v)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
          end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
        else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
          if v.kind_of?(Array)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
            v.each do | e |
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
              c_opts << o << (e == true ? '' : e)  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
            end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
          else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
            c_opts << o << (v == true ? '' : v)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
          end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
    c_opts.reject! { | e | e.size == 0 }
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
    cmd = ['hg'] + g_opts + [command] + c_opts + args      
68
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   100
    cmd_info = cmd.shelljoin.
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   101
                gsub(/username\\=\S+/, "username\\=***").
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   102
                gsub(/password\\=\S+/, "password\\=***")
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   103
    $LOGGER.debug("executing: #{cmd_info}")
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   104
    if defined? RakeFileUtils then
68
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   105
      puts cmd_info
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   106
    end
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    if block_given? then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
      stdout, stderr, status = Open3.capture3(*cmd)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
      case block.arity
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   110
      when 1
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   111
        STDOUT.print stdout
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   112
        STDERR.print stderr        
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
        yield status
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   114
      when 2                
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   115
        STDERR.print stderr 
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
        yield status, stdout
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
      when 3        
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
        yield status, stdout, stderr
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
      else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
        raise Exception.new("invalid arity of given block")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
      if not system(*cmd) then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
        raise Exception.new("command failed: #{cmd.join(' ')}")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    end    
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
  def self.config()
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
    if @@config == nil
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
      files = Dir.glob('/etc/mercurial/hgrc.d/*.rc') + 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
          [ '/etc/mercurial/hgrc' ,
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
   133
          hgrc() ]
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   134
      if Gem.win_platform? then
86
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
   135
         hg_exe = HG::which("hg")
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   136
         hgrc_d = File.join(File.dirname(hg_exe), "hgrc.d")
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   137
         if File.directory? (hgrc_d) then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   138
            files += Dir.glob("#{hgrc_d}\\*.rc".gsub('\\', '/'))
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   139
         end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   140
      end
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
      @@config = IniFile.new()
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
      files.each do | file |
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
        if File.exist?(file)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
          $LOGGER.debug("Loading global config from \"#{file}\"")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
          @@config.merge!(IniFile.new(:filename => file))
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
      end  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
    return @@config
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
  def self.hgrc()
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   153
    return File.expand_path('~/.hgrc')
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
  class Repository
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   157
    @@HOSTS_ON_LAN = {}
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   158
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
    attr_accessor :path, :config
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   161
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   162
    private
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   163
    # Return --ssh config string for use with passed remote url or nil
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   164
    # if no special --ssh config is needed. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   165
    # 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   166
    # Rationale: 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   167
    #
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   168
    # On Windows, most of users tend to use TortoiseHG and hg.exe comming with
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   169
    # it. THG makes hg.exe to use (shipped) plink.exe which is bad for performance 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   170
    # since it uses 16k channel input buffer (!) leading to a pretty slow transfers 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   171
    # (a lot of iowaits...)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   172
    # OpenSSH OTOH has 2MB input buffer which is good though on Windows bit 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   173
    # oversized as Windows TCP window size is fixed to 65k for all connections with 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   174
    # RTT less than 1ms. Still, 65k better then 16k. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   175
    # As a workaround, look if MSYS2's OpenSSH client is installed and if so, use that 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   176
    # one - but only if `ui.ssh` config option has the default value. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   177
    # Ugly, isn't it? 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   178
    def self.sshconf(uri_string) 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   179
      uri = URI(uri_string)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   180
      ssh = nil      
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   181
      if (uri.scheme == 'ssh') 
86
f2a7a4378c22 Added task `workflow:merge' to ease merging code from eXept
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
   182
        ssh_in_path = HG::which('ssh') ? true : false
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   183
        if Gem.win_platform? then      
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   184
          # Running on Windows 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   185
          #
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   186
          # Mercurial uses `ssh` by default, so to use `plink.exe`, `ui.ssh` 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   187
          # config option has to be explicitly set.
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   188
          #
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   189
          # It it's set to `plink.exe`, check whether MSYS's `ssh.exe` is available
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   190
          # and if so, change it to `ssh.exe`...
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   191
          ssh_configured = HG::config['ui']['ssh'] 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   192
          if /^.*[pP]link.exe"?\s*(-ssh)?\s*(-2)?$/ =~ ssh_configured then            
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   193
            if ssh_in_path then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   194
              ssh = 'ssh'
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   195
            else 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   196
              if (File.exist? "c:\\msys64\\usr\\bin\\ssh.exe") then              
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   197
                ssh = "\"c:\\msys64\\usr\\bin\\ssh.exe\""
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   198
              end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   199
            end
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   200
            # Sigh, we should not tamper with SSH configuration wildly. User may have
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   201
            # her ssh and mercurial properly configured to use `plink.exe` and `pageant`.
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   202
            # If we just start using `ssh.exe` clone/pull might not work beause
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   203
            # `ssh.exe` cannot talk to `pageant`. So, if we don't find OpenSSH's 
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   204
            # style of agent, don't use `ssh.exe` event if available.
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   205
            if ssh then
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   206
              if ENV['SSH_AUTH_SOCK'] then
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   207
                # Good, OpenSSH agent running but still, be nice and  tell the 
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   208
                # user SSH configuration has been tampered wirh. 
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   209
                $LOGGER.info("Passing --ssh \"#{ssh}\" option to 'hg' command for faster transfers")
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   210
              else 
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   211
                # No agent, no fun. Be nice and give user a hit
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   212
                $LOGGER.warn("Not using -ssh \"#{ssh}\" option because SSH agent is not running")
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   213
                $LOGGER.warn("For faster clone/pull consider using ssh-agent or ssh-pageant (if you want to use PuTTY's pageant)")
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 83
diff changeset
   214
                ssh = nil
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   215
              end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   216
            end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   217
            # Turn off SSH compression - data transferred by Mercurial are either
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   218
            # already compressed or --uncompressed was given to reduce CPU load
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   219
            # in which case passing -C would reduce it further.
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   220
            if ssh and HG::Repository::host_on_lan?(uri.host) then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   221
              ssh += " -C"
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   222
            end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   223
          end       
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   224
        else           
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   225
          # Turn off SSH compression - data transferred by Mercurial are either
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   226
          # already compressed or --uncompressed was given to reduce CPU load
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   227
          # in which case passing -C would reduce it further.
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   228
          if ssh_in_path and HG::Repository::host_on_lan?(uri.host) then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   229
            ssh = "ssh -C"
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   230
          end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   231
        end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   232
      end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   233
      return ssh
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   234
    end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   235
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   236
    # Same as class method, but allows for remote aliases
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   237
    def sshconf(remote) 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   238
      return HG::Repository::sshconf(self.paths[remote] || remote)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   239
    end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   240
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   241
    # Given a hostname, return true if the host is on local LAN, false
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   242
    # otherwise. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   243
    #
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   244
    # Results are cached to reduce resolver queries (maybe not worth it,
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   245
    # system may cache answers anyways)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   246
    #
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   247
    # The detection is rather simplistic - it only checks if host's address
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   248
    # is from private IP range - and only for IPv4. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   249
    # This may cause problems when using over VPN that assigns private address
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   250
    # (the usuall case). In that case this code will treat is a local
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   251
    # which may result in transfer of uncompressed data over WAN. Not nice,
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   252
    # This should be fixed, somehow. 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   253
    def self.host_on_lan?(hostname)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   254
      if not @@HOSTS_ON_LAN.has_key? hostname then
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   255
        require 'resolv'
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   256
        addr = Resolv.getaddress(hostname)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   257
        # Really poor detection of LAN, but since this is an 
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   258
        # optimization, getting this wrong does not hurt.         
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   259
        local = (addr.start_with? '192.168.') or (addr.start_with? '10.10.')
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   260
        @@HOSTS_ON_LAN[hostname] = local
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   261
      end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   262
      return @@HOSTS_ON_LAN[hostname]
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   263
    end
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   264
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   265
    public
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   266
    # Clone a repository from given `uri` to given `directory`. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   267
    # Returns an `HG::Repository` instance representing the repository
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   268
    # clone. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   269
    # If `noupdate` is true, working copy is not updated, i.e., will be
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   270
    # empty. Use this when you're going to issue `update(rev)` shortly after.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   271
    #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   272
    def self.clone(uri, directory, noupdate: false)
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   273
      uri_obj = URI(uri)
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
   274
      host = uri_obj.host
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   275
      scheme = uri_obj.scheme
75
9b57c88b2ab3 Use `hg clone` instead of `hg init` followed by `hg pull` to checkout a Mercurial repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 73
diff changeset
   276
      # When cloning over LAN, use --uncompressed option
9b57c88b2ab3 Use `hg clone` instead of `hg init` followed by `hg pull` to checkout a Mercurial repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 73
diff changeset
   277
      # as it tends to be faster if bandwidth is good (1GB norm
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
   278
      # these days) amd saves some CPU cycles.
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   279
      local = HG::Repository::host_on_lan?(URI(uri).host)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   280
      ssh = HG::Repository::sshconf(uri)      
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
      if noupdate then
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
   282
        HG::hg("clone", uri, directory, ssh: ssh, uncompressed: local, noupdate: true)
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   283
      else
76
df28d45f7f5a On Windows use MSYS2 `ssh.exe` rather than `plink.exe` to clone/checkout repositories over SSH
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
   284
        HG::hg("clone", uri, directory, ssh: ssh, uncompressed: local)
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   285
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
      return HG::Repository.new(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   287
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   289
    # Initializes an empty repository in given directory. Returns an 
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   290
    # `HG::Repository` instance representing the created (empty) repository.
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   291
    def self.init(directory)
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   292
      HG::hg("init", directory)
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   293
      return HG::Repository.new(directory)
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   294
    end
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   295
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   296
    # Like HG::hg, but passes --cwd @path
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   297
    def hg(command, *args, **options, &block)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   298
      options[:cwd] = @path
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
      HG::hg(command, *args, **options, &block)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   301
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   302
    def hgrc() 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   303
      return File.join(@path, '.hg', 'hgrc')
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   304
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   305
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   306
    def initialize(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   307
      @path = directory
68
61d8bee7c4d4 Added new tasks - `workflow:push-upstream` and `workflow:push-staging`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   308
      config_file = hgrc()      
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   309
      if File.exist? ( config_file ) 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   310
        $LOGGER.debug("Loading repository config from \"#{config_file}\"")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
        @config = HG::config().merge(IniFile.new(:filename => config_file))
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312
      else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   313
        @config = HG::config()
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   314
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   316
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   317
    # Return a hashmap with defined paths (alias => uri)
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   318
    def paths() 
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   319
      return @config['paths'].clone
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   320
    end
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   321
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   322
    # Set paths for given repository
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   323
    def paths=(paths)
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   324
      config = IniFile.new(:filename => self.hgrc())
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   325
      config['paths'] = paths
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   326
      config.write()
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   327
    end
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   328
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   329
    def log(revset, template = "{node|short}\n")      
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
      log = []
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
      hg("log", rev: revset, template: template) do | status, out |     
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   332
        if status.success?
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   333
          puts out
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
          log = out.split("\n")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   337
      return log
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   338
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   339
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
    # Return changeset IDs of all head revisions. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
    # If `branch` is given, return only heads in given
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
    # branch.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   343
    def heads(branch = nil) 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   344
      if branch then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   345
        return log("head() and branch('#{branch}')")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   346
      else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   347
        return log("head()")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   348
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   349
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   350
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   351
    # Return name of an active bookmark or nil if no bookmark
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   352
    # is active
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   353
    def bookmark() 
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   354
      filename = File.join(@path, '.hg', 'bookmarks.current')
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   355
      if File.exist? filename then
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   356
        file = File.open(filename, "r")
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   357
        begin
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   358
          bookmark = file.read.chomp
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   359
        ensure
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   360
          file.close()
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   361
        end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   362
        return bookmark
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   363
      else
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   364
        return nil
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   365
      end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   366
    end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   367
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   368
    # Return a hash "bookmark => revision" of all 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   369
    # bookmarks. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   370
    def bookmarks(branch = nil)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   371
      revset  = "bookmark()"
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   372
      revset += " and branch('#{branch}')" if branch
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   373
      bookmarks = {}
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   374
      self.log(revset, "{bookmarks}|{node|short}\n").each do | line |
89
3fae142744f4 `hglib.rb`: Fixed `bookmarks()` to support multiple bookmarks on a single changeset
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 86
diff changeset
   375
        bookmarks_per_changeset, changesetid = line.split("|")
3fae142744f4 `hglib.rb`: Fixed `bookmarks()` to support multiple bookmarks on a single changeset
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 86
diff changeset
   376
        bookmarks_per_changeset.split(' ').each do | bookmark |
3fae142744f4 `hglib.rb`: Fixed `bookmarks()` to support multiple bookmarks on a single changeset
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 86
diff changeset
   377
          bookmarks[bookmark] = changesetid
3fae142744f4 `hglib.rb`: Fixed `bookmarks()` to support multiple bookmarks on a single changeset
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 86
diff changeset
   378
        end
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   379
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   380
      return bookmarks
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   381
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   382
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   383
    # a private helper to generate auth --config options for
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   384
    # HTTP-served repositories
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   385
    protected
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   386
    def authconf(remote, user, pass) 
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   387
      authconf = []
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   388
      if pass != nil then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   389
        if user == nil then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   390
          raise Exception.new("Password given but not username! Use user: named param to specify username.")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   391
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   392
        # If user/password is provided, make sure we don't have
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   393
        # username in remote URI. Otherwise Mercurial won't use 
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   394
        # password from config!        
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   395
        uri = URI.parse(self.paths[remote] || remote)
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   396
        uri.user = nil
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   397
        uri = uri.to_s
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   398
        uri_alias = if self.paths.has_key? remote then remote else 'xxx' end
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   399
        authconf << "auth.#{uri_alias}.prefix=#{uri}"
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   400
        authconf << "auth.#{uri_alias}.username=#{user}"        
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 68
diff changeset
   401
        authconf << "auth.#{uri_alias}.password=#{pass}"        
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   402
      end
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   403
      return authconf
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   404
    end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   405
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   406
    public 
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   407
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   408
    def incoming(remote = 'default', user: nil, pass: nil, rev: nil)
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   409
      hg("incoming", remote, ssh: sshconf(remote), config: authconf(remote, user, pass), rev: rev) do | status, stdout|        
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   410
        case status.exitstatus
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   411
        when 0
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   412
          STDOUT.print stdout
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   413
        when 1
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   414
          puts "No new changes comming from #{remote}"          
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   415
        else        
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   416
          raise Exception.new("Failed to do 'incoming' from #{remote} (exit code #{status.exitstatus})")
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   417
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   418
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   419
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   420
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   421
    def pull(remote = 'default', user: nil, pass: nil, rev: nil, bookmarks: nil)
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   422
      hg("pull", remote, ssh: sshconf(remote), config: authconf(remote, user, pass), rev: rev, bookmark: bookmarks) do | status, stdout|                
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   423
        STDOUT.print stdout
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   424
        case status.exitstatus
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   425
        when 0                    
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   426
          #nothing
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   427
        when 1
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   428
          raise Exception.new("Failed to 'pull' from #{remote} (update had unresolved conflicts)")
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   429
        else        
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   430
          raise Exception.new("Failed to 'pull' from #{remote} (exit code #{status.exitstatus})")
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   431
        end
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   432
      end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   433
    end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   434
79
1058962ee3ef Added new tasks: `workflow:out-staging` and `workflow:out-upstream`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 78
diff changeset
   435
    def outgoing(remote = 'default', user: nil, pass: nil, rev: nil)
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   436
      hg("outgoing", remote, ssh: sshconf(remote), config: authconf(remote, user, pass), rev: rev) do | status, stdout|                
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   437
        case status.exitstatus
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   438
        when 0          
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   439
          STDOUT.print stdout
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   440
        when 1
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   441
          puts "No new changes going to #{remote}"          
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   442
        else        
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   443
          raise Exception.new("Failed to do 'outgoing' from #{remote} (exit code #{status.exitstatus})")
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   444
        end
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   445
      end
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   446
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   448
    def push(remote = 'default', user: nil, pass: nil, rev: nil, bookmarks: [])
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   449
      hg("push", remote, ssh: sshconf(remote), config: authconf(remote, user, pass), rev: rev, bookmark: bookmarks) do | status, stdout|                
78
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   450
        case status.exitstatus
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   451
        when 0          
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   452
          STDOUT.print stdout
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   453
        when 1
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   454
          puts "No new changes to push to #{remote}"          
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   455
        else        
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   456
          raise Exception.new("Failed to 'push' from #{remote} (exit code #{status.exitstatus})")
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   457
        end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   458
      end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   459
    end
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   460
2d09a485772f Push active bookmark (if any) when running task `workflow:push-staging` or...
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 76
diff changeset
   461
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   462
    # Create a shared clone in given directory, Return a new
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   463
    # HG::Repository object on the shared clone
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   464
    def share(dst, rev = nil)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   465
      if File.exist? dst then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   466
        raise Exception.new("Destination file exists: #{dst}")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   467
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   468
      if rev == nil then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   469
        rev = log('.')[0]
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   470
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   471
      if not has_revision?(rev) 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   472
        raise Exception.new("Revision #{rev} does not exist")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   473
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   474
      mkdir_p File.dirname(dst);
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   475
      HG::hg("share", path, dst, config: 'extensions.share=', noupdate: true, bookmarks: false)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   476
      share = Repository.new(dst)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   477
      share.update(rev);
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   478
      return share
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   479
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   480
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   481
    # Updates the repository's working copy to given 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   482
    # revision if given. If not, update to most-recent
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   483
    # head, as plain
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   484
    #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   485
    #   hg update
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   486
    #
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   487
    # would do. 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   488
    def update(rev = nil)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   489
      if rev 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   490
        if not has_revision? rev then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   491
          raise Exception.new("Revision #{rev} does not exist")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   492
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   493
        hg("update", rev: rev)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   494
      else
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   495
        hg("update")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   496
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   497
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   498
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   499
    # Merge given revision. Return true, if the merge was
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   500
    # successful, false otherwise
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   501
    def merge(rev)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   502
      if not has_revision? rev then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   503
        raise Exception.new("Revision #{rev} does not exist")
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   504
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   505
      hg("merge", rev) do | status |
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   506
        return status.success?
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   507
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   508
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   509
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   510
    def commit(message)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   511
      user = ''
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   512
      if not @config['ui'].has_key? 'username' then
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   513
        user = @config['ui']['username']
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   514
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   515
      hg("commit", message: message, user: user)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   516
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   517
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   518
    def has_revision?(rev)
83
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   519
        revs = log(rev)
8405c22a8ffd Use customized ssh command for all commands involving data transfer (in addition to `clone`)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 79
diff changeset
   520
        return revs.size > 0      
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   521
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   522
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   523
    # Lookup a repository in given `directory`. If found,
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   524
    # return it as instance of HG::Repository. If not,
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   525
    # `nil` is returned.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   526
    def self.lookup(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   527
      return nil if not File.exist?(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   528
      repo_dir = directory
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   529
      while repo_dir != nil
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   530
        if HG::repository? repo_dir
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   531
          return Repository.new(repo_dir)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   532
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   533
        repo_dir_parent = File.dirname(repo_dir)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   534
        if repo_dir_parent == repo_dir
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   535
          repo_dir = nil
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   536
        else 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   537
          repo_dir = repo_dir_parent
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   538
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   539
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   540
    end    
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   541
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   542
    # Initializes and empty Mercurial repository in given `directory`
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   543
    def self.init(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   544
      FileUtils.mkdir_p File.dirname(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   545
      HG::hg("init", directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   546
      return Repository.new(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   547
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   548
  end # class Repository 
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   549
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   550
  # Return `true` if given `directory` is a root of mercurial
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   551
  # repository, `false` otherwise.
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   552
  def self.repository?(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   553
    return File.directory? File.join(directory, '.hg')
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   554
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   555
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   556
  # Enumerate all repositories in given `directory`
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   557
  def self.forest(directory, &block)      
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   558
    if repository? directory  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   559
      yield Repository.new(directory)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   560
    end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   561
    Dir.foreach(directory) do |x|
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   562
      path = File.join(directory, x)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   563
      if File.directory? path       
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   564
        if x == "." or x == ".." or x == ".svn" or x == '.git'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   565
          next    
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   566
        elsif File.directory?(path)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   567
          forest(path, &block)
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   568
        end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   569
      end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   570
    end  
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   571
  end
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   572
end # module HG