rakelib/scm.rb
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 20 Jan 2020 11:34:02 +0000
changeset 286 c08455e14746
parent 271 19e660694318
child 331 0e5ff9ce7feb
permissions -rw-r--r--
Rakefiles: add support for manual dependency definitions Normally, pacjage dependencies are extracted automatically from package definition but eXept sometimes get dependencies wrong. As we (still, sigh) use some packages form eXept's CVS tree, this commit introduces `dependencies.rbspec` that has these manually fixed. This commit also includes fix for an issue with `stx:goodies/communication`
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: 62
diff changeset
     1
require 'rakelib/hglib'
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
     2
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
module Rake
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
module Rake::StX
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
     9
# Cross-platform way of finding an executable in the $PATH.
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    10
#
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    11
#   which('ruby') #=> /usr/bin/ruby
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    12
def which(cmd)
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    13
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    14
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    15
    exts.each {|ext|
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    16
      exe = File.join(path, "#{cmd}#{ext}")
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    17
      return exe if File.executable?(exe) && !File.directory?(exe)
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    18
    }
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    19
  end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    20
  nil
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    21
end
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    22
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    23
cvs_rsh_set = false
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    24
60
57c963e85a00 Cleanup: Renamed `vcs.rb` & `Rake::StX::VCS` to `scm.rb` and `Rake::StX::SCM`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 59
diff changeset
    25
module Rake::Stx::SCM
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    26
  # Not quite sure why following code
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    27
  #
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    28
  #     include RakeFileUtils
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    29
  #
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    30
  # does not make extra methods (like `sh`) defined in `extensions.rb`
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    31
  # visible here. To workaround, define them here. Ugly...
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    32
  module_function
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    33
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    34
  def sh(cmd, cwd: Dir.pwd, &block)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    35
    begin
81
2a1efb99c83d Oops, fixed bug introduced in de0e8016c2d5
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
    36
      return RakeFileUtils::sh(cmd, cwd: cwd, &block)
2a1efb99c83d Oops, fixed bug introduced in de0e8016c2d5
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
    37
    rescue
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    38
      return false
81
2a1efb99c83d Oops, fixed bug introduced in de0e8016c2d5
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 75
diff changeset
    39
    end
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
    40
  end
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    42
  # Make sure CVS_RSH environment variable is properly set. Prefer MSYS2 ssh.exe
268
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
    43
  # over plink.exe. For details, see `hglib.rb`, method `sshconf()`
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    44
  module_function
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    45
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    46
  def ensure_cvs_rsh_set
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    47
    return if @cvs_rsh_set
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    48
    ssh = nil
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    49
    ssh_configured = ENV['CVS_RSH']
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    50
    ssh_in_path = which('ssh') ? true : false
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    51
    plink_in_path = which('plink') ? true : false
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    52
    if Gem.win_platform?
268
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
    53
      # If CVS_RSH is not set or is set to plink.exe, try to change to
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
    54
      # MSYS2 ssh.exe as it gives better performance on (fast) LANs.
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    55
      if /^.*[pP]link(\.exe)?"?\s*(-ssh)?\s*(-2)?$/ =~ ssh_configured
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    56
        ssh_in_path ? (ssh = 'ssh') : (ssh = %q{"c:\msys64\usr\bin\ssh.exe"} if File.exist? %q{c:\msys64\usr\bin\ssh.exe})
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    57
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    58
        # 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: 81
diff changeset
    59
        # 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: 81
diff changeset
    60
        # 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: 81
diff changeset
    61
        # `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: 81
diff changeset
    62
        # style of agent, don't use `ssh.exe` event if available.
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    63
        if ssh
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    64
          if ENV['SSH_AUTH_SOCK']
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    65
            # 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: 81
diff changeset
    66
            # 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: 81
diff changeset
    67
            info("Setting CVS_RSH=\"#{ssh}\" for faster transfers")
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    68
          else
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    69
            # 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: 81
diff changeset
    70
            warn("Not using CVS_RSH=\"#{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: 81
diff changeset
    71
            warn("For faster CVS checkout over LAN, 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: 81
diff changeset
    72
            ssh = nil
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    73
          end
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    74
        end
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    75
      end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    76
    else
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    77
      ssh = 'ssh' unless ssh_configured
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    78
    end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    79
    ENV['CVS_RSH'] = ssh if ssh
85
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    80
    cvs_rsh_set = true
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    81
  end
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    82
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    83
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    84
  public
6d918f722075 Do not tamper with SSH configuration if SSH agent is not running.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 81
diff changeset
    85
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
  class CheckoutException < Exception
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
  end # class CheckoutException
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
  def self._check_type(type)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    91
    raise CheckoutException.new("Unknown version control system type (#{type})") if type != :cvs and type != :svn and type != :git and type != :hg
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    94
  def self.update(repository, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
    95
    type = repository.type
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
    96
    url = repository.canonical
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
    97
    self._check_type(type)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    98
    root = kwargs[:root] || BUILD_DIR
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    99
    branch = kwargs[:branch]
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   100
    if branch.nil?
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   101
      if type == :svn
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   102
        branch = 'trunk'
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   103
      elsif type == :hg
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   104
        branch = 'default'
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   105
      end
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
    end
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   107
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    wc = root / directory
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   109
    unless File.exist? wc
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   110
      self.checkout(repository, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
      return
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   113
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
    case type
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   115
      when :svn
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   116
        _update_svn(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   117
      when :cvs
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   118
        _update_cvs(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   119
      when :git
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   120
        _update_git(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   121
      when :hg
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   122
        _update_hg(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   123
      else
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   124
        error("Type #{type} not found")
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   128
  def self._update_hg(repository, directory, branch, root, **kwargs)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   129
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   130
    wc = root / directory
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   131
    separator = kwargs[:separator] || '.'
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   132
    revision = kwargs[:revision]
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   133
    url = "#{repository.canonical}/#{directory.gsub('/', separator)}" unless directory.nil?
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   134
    hg = HG::Repository.new(wc)
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
   135
    begin
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   136
      paths = hg.paths
268
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
   137
      if repository.origin
270
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   138
        unless paths.has_key? 'default'
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   139
          paths['default'] = "#{repository.origin}/#{directory.gsub('/', separator)}"
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   140
          hg.paths = paths
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   141
        end
270
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   142
        hg.pull('default')
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   143
      else
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   144
        raise Exception.new("Repository named #{repository.name} does not define mandatory 'origin' repository URL")
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   145
      end
263
dd183640f63e Retry `hg pull` from canonical (BitBucket) repos if it fails
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 249
diff changeset
   146
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   147
      # If revision is not specified, then look for an active bookmark
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   148
      # and update to it. If no bookmark is active, then look for bookmark
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   149
      # `master`. If it exist, then update to `master`. If it
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   150
      # does not, then update to tip or throw an error.
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   151
      # The error is thrown if there's no bookmark `master` and
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   152
      # branch has multiple heads since it's not clear which
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   153
      # head rev to use.
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   154
      unless revision
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   155
        revision = hg.bookmark
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   156
        unless revision
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   157
          bookmarks = hg.bookmarks(branch)
249
20b718d60bba Rakefiles: automagically checkout revisions for given branch
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 220
diff changeset
   158
          if bookmarks.has_key? BUILD_BRANCH
263
dd183640f63e Retry `hg pull` from canonical (BitBucket) repos if it fails
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 249
diff changeset
   159
            revision = BUILD_BRANCH
249
20b718d60bba Rakefiles: automagically checkout revisions for given branch
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 220
diff changeset
   160
          elsif bookmarks.has_key? 'master'
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   161
            revision = 'master'
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   162
          else
220
8faa459a7ee9 Rakefiles: do not consider secret changesets as heads when updating
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 137
diff changeset
   163
            if hg.heads(branch, include_secret: false).size > 1
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   164
              raise CheckoutException.new("HG: Cannot checkout #{directory}: directory. The ->#{branch}<- branch has multiple heads but no bookmark named 'master'! (All other branches are ignored)")
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   165
            end
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   166
          end
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   167
        end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   168
      end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   169
      hg.update(revision || branch)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   170
    rescue Exception => ex
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
   171
      raise CheckoutException.new("HG: Cannot update #{wc}: #{ex.message}")
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   176
  def self._update_svn(repository, directory, branch, root, **kwargs)
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   177
    wc = root / directory
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   178
    raise CheckoutException.new("SVN: Cannot update #{wc}") unless (sh %W{svn --non-interactive --trust-server-cert update}, cwd: wc)
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   179
  end
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   180
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   181
  def self._update_cvs(repository, directory, branch, root, **kwargs)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   182
    ensure_cvs_rsh_set
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   183
    wc = root / directory
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   184
    if File.directory? wc
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   185
      raise CheckoutException.new("CVS: Cannot update #{wc}") unless (sh %W{cvs -z 9 update -A -d}, cwd: wc)
62
de0e8016c2d5 Cleanup: Cleaned up command executing code in `rakelib\scm.rb`.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   186
    else
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   187
      raise CheckoutException.new("CVS: Cannot update #{wc}") unless (sh %W{cvs -z 9 update -A #{File.basename(wc)}}, cwd: File.dirname(wc))
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   191
  def self.checkout(repository, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   192
    type = repository.type
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   193
    url = repository.canonical
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
    self._check_type(type)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   195
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   196
    root = kwargs[:root] || BUILD_DIR
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   197
    branch = kwargs[:branch]
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   198
    if branch.nil?
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
      if type == :svn
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
        branch = 'trunk'
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
      elsif type == :hg
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
        branch = 'default'
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
      end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
    wc = root / directory
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   207
    if File.exist? wc
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   208
      self.update(repository, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
      return
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   212
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   213
    unless File.exists? File.dirname(wc)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
      begin
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
        FileUtils.mkdir_p(File.dirname(wc))
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
      rescue => ex
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
        raise CheckoutException.new("Cannot create directory for working copy (#{ex})")
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   218
      end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   219
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
    case type
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   221
      when :svn
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   222
        _checkout_svn(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   223
      when :cvs
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   224
        _checkout_cvs(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   225
      when :git
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   226
        _checkout_git(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   227
      when :hg
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   228
        _checkout_hg(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   229
      else
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   230
        error("Type #{type} not found")
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   235
  def self._checkout_svn(repository, directory, branch, root, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   236
    url = "#{repository.canonical}/#{directory}/#{branch}"
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   237
    raise CheckoutException.new("SVN: Cannot checkout from #{url}") unless (sh %W{svn --non-interactive --trust-server-cert co #{url} #{directory}}, cwd: root)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   240
  def self._checkout_hg(repository, directory, branch, root, **kwargs)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   241
    separator = kwargs[:separator] || '.'
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   242
    revision = kwargs[:revision]
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   243
102
fc572bd895f2 Cleanup: treat stx:stc & stx:librun as normal packages
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 88
diff changeset
   244
    paths = {}
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   245
    if repository.canonical
102
fc572bd895f2 Cleanup: treat stx:stc & stx:librun as normal packages
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 88
diff changeset
   246
      paths['canonical'] = "#{repository.canonical}/#{directory.gsub('/', separator)}"
fc572bd895f2 Cleanup: treat stx:stc & stx:librun as normal packages
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 88
diff changeset
   247
    end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   248
    if repository.upstream
88
112075e99cef Support for 'upstream' repositories refactored.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
   249
      paths['upstream'] = "#{repository.upstream}/#{directory.gsub('/', separator)}"
112075e99cef Support for 'upstream' repositories refactored.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
   250
    end
268
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
   251
    if repository.origin
270
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   252
      paths['default'] = "#{repository.origin}/#{directory.gsub('/', separator)}"
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   253
    else
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   254
      raise Exception.new("Repository named #{repository.name} does not define mandatory 'origin' repository URL")
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   255
    end
88
112075e99cef Support for 'upstream' repositories refactored.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 85
diff changeset
   256
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
   257
    begin
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   258
      hg = HG::Repository.init(root / directory)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   259
      # Configure path aliases.
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   260
      #
268
da6c28844912 Rakefiles: renamed `staging` repository to `origin` repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 263
diff changeset
   261
      # Set the repository as non-publishing, This way when cloning from 'origin'
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   262
      # repo changes in draft phase would remain drafs. This is  essential to
120
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   263
      # employ evolve extension and being able to fix & evolve changes in clones
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   264
      # (on a CI server, for instance) and being able to push back without need to
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   265
      # fiddle around phases.
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   266
      #
120
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   267
      # The downside is that we cannot do an `uncompressed` pull. This is the price
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   268
      # we have to pay.
120
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   269
      hg.config_set(
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   270
          phases: {'publish' => 'false'},
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   271
          paths: paths
120
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   272
      )
2c4e52c4c930 Do not use `hg clone ...` to create and pull changes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 117
diff changeset
   273
270
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   274
      hg.pull('default') if repository.origin
263
dd183640f63e Retry `hg pull` from canonical (BitBucket) repos if it fails
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 249
diff changeset
   275
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   276
      # If revision is not specified, then look for bookmark
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   277
      # `master`. If it exist, then check out `master`. If it
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   278
      # does not, then checkout tip or throw an error.
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   279
      # The error is thrown if there's no bookmark `master` and
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   280
      # branch has multiple heads since it's not clear which
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   281
      # head rev to use.
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   282
      unless revision
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   283
        bookmarks = hg.bookmarks(branch)
249
20b718d60bba Rakefiles: automagically checkout revisions for given branch
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 220
diff changeset
   284
        if bookmarks.has_key? BUILD_BRANCH
263
dd183640f63e Retry `hg pull` from canonical (BitBucket) repos if it fails
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 249
diff changeset
   285
            revision = BUILD_BRANCH
249
20b718d60bba Rakefiles: automagically checkout revisions for given branch
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 220
diff changeset
   286
        elsif bookmarks.has_key? 'master'
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   287
          revision = 'master'
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   288
        else
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   289
          if hg.heads(branch).size > 1
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   290
            raise CheckoutException.new("HG: Cannot checkout #{directory}: branch #{branch} has multiple heads but no bookmark named 'master'!")
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   291
          end
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   292
        end
72
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   293
      end
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   294
3e832d54a4af Added support for checking out a particular revision
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 71
diff changeset
   295
      hg.update(revision || branch)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   296
      #rescue Exception => e
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   297
      #  raise CheckoutException.new("HG: Cannot clone from #{url}: #{e.message}")
66
8d2d5dfe94d0 Refactored SCM support to use `hglib.rb` for performing Mercurial related tasks
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
   298
    end
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
  end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   301
  def self._checkout_cvs(repository, directory, branch, root, **kwargs)
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   302
    revision = kwargs[:revision] || nil
117
f163911eb7bc Win32: Workarounds for bugs in eXept's Win32 makefiles as of 2017-01-13
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 102
diff changeset
   303
    revision_arg = ''
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   304
    if revision
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   305
      raise Exception.new('CVS only support date spec as revision: option (YYYY-MM-DD)') unless revision.match(/^\d{4}-([0]\d|[1][012])-([012]\d|[3][01])$/)
117
f163911eb7bc Win32: Workarounds for bugs in eXept's Win32 makefiles as of 2017-01-13
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 102
diff changeset
   306
      revision_arg = " -D #{revision}"
f163911eb7bc Win32: Workarounds for bugs in eXept's Win32 makefiles as of 2017-01-13
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 102
diff changeset
   307
    end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   308
    ensure_cvs_rsh_set
270
abb5268826c7 Rakefiles: make 'origin' repository the only mandatory repository
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 269
diff changeset
   309
    unless sh "cvs -z 9 -d #{repository.origin} co #{revision_arg} #{directory}", cwd: root
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   310
      raise CheckoutException.new("CVS: Cannot checkout #{directory}from #{repository.url}")
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312
  end
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   313
60
57c963e85a00 Cleanup: Renamed `vcs.rb` & `Rake::StX::VCS` to `scm.rb` and `Rake::StX::SCM`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 59
diff changeset
   314
end # module Rake::Stx::SCM
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   316
def checkout(repo_name, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   317
  # repository should be symbolic name
59
9099e2455d9c Added support for multiple different repository sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 58
diff changeset
   318
  repo = Rake::Stx::Configuration::Repository::find(repo_name)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   319
  error("checkout: No repository found (#{repo_name})") unless repo
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   320
  kwargs[:separator] = repo.separator
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   321
  Rake::Stx::SCM.checkout(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   322
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   323
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   324
def update(repo_name, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   325
  # repository should be symbolic name
59
9099e2455d9c Added support for multiple different repository sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 58
diff changeset
   326
  repo = Rake::Stx::Configuration::Repository::find(repo_name)
137
e665031cade7 Cleaning up code and having it more rubyish
Patrik Svestka <patrik.svestka@gmail.com>
parents: 120
diff changeset
   327
  error("update: No repository found (#{repo_name})") unless repo
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   328
  kwargs[:separator] = repo.separator
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   329
  Rake::Stx::SCM.update(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   332
def cvs(url, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   333
  repo = Rake::Stx::Configuration::Repository.new(:type => :cvs, :url => url)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   334
  Rake::Stx::SCM.checkout(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   337
def svn(url, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   338
  repo = Rake::Stx::Configuration::Repository.new(:type => :svn, :url => url)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   339
  Rake::Stx::SCM.checkout(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   342
def hg(url, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   343
  repo = Rake::Stx::Configuration::Repository.new(:type => :hg, :url => url)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   344
  Rake::Stx::SCM.checkout(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   345
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   346
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   347
def git(url, directory, **kwargs)
67
75b6eb7b781c Added support for canonical, upstream and staging repositores.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 66
diff changeset
   348
  repo = Rake::Stx::Configuration::Repository.new(:type => :git, :url => url)
71
68c8cccbdec5 Cleanup in `scm.rb`: Unified API of `checkout` and `update` functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
   349
  Rake::Stx::SCM.checkout(repo, directory, **kwargs)
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   350
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   351