rakelib/scm.rb
changeset 67 75b6eb7b781c
parent 66 8d2d5dfe94d0
child 71 68c8cccbdec5
--- a/rakelib/scm.rb	Sat Oct 29 23:54:12 2016 +0000
+++ b/rakelib/scm.rb	Wed Nov 02 00:18:25 2016 +0000
@@ -28,7 +28,9 @@
     end
   end
 
-  def self.update(type, repository, directory, *params)
+  def self.update(repository, directory, *params)
+    type = repository.type
+    url = repository.canonical
     self._check_type(type)
     if params.size() > 0
       p = params.last
@@ -38,7 +40,7 @@
     root = p[:root] || BUILD_DIR
     wc = root / directory
     if (! File.exist? wc)
-      self.checkout(type, repository, directory, *params)
+      self.checkout(repository, directory, *params)
       return
     end
     case type
@@ -49,22 +51,35 @@
     end
   end
 
-
-  def self._update_hg(wc, repository = nil, directory = nil, *params)
-    url = ''
-    if repository != nil and directory != nil then
+  def self._update_hg(wc, repository, directory = nil, *params)    
+    if directory != nil then
       if params.size() > 0
         p = params.last
       else
         p = {}
       end
       separator = p[:separator] || '.'
-      url = "#{repository}/#{directory.gsub('/', separator)}"
+      url = "#{repository.canonical}/#{directory.gsub('/', separator)}"
     end
-    repo = HG::Repository.new(wc)
+    hg = HG::Repository.new(wc)
     begin
-      repo.pull(url)
-      repo.update()
+      paths = hg.paths
+      if repository.staging then
+        if not paths.has_key? 'staging'           
+          paths['staging'] = "#{repository.staging}/#{directory.gsub('/', separator)}"
+          hg.paths = paths
+        end
+        hg.pull('staging')
+      end
+      if not paths.has_key? 'canonical'
+        paths['canonical'] = "#{repository.canonical}/#{directory.gsub('/', separator)}"
+        hg.paths = paths
+      end
+      hg.pull('default')
+      if paths['default'] != paths['canonical'] then
+        hg.pull('canonical')
+      end
+      hg.update()
     rescue Exception => ex 
       raise CheckoutException.new("HG: Cannot update #{wc}: #{ex.message}")
     end
@@ -89,7 +104,9 @@
     end
   end
 
-  def self.checkout(type, repository, directory, *params)    
+  def self.checkout(repository, directory, *params)    
+    type = repository.type
+    url = repository.canonical
     self._check_type(type)
     if params.size() > 0
       p = params.last
@@ -108,7 +125,7 @@
 
     wc = root / directory
     if (File.exist? wc)
-      self.update(type, repository, directory, *params)
+      self.update(repository, directory, *params)
       return
     end
 
@@ -129,7 +146,7 @@
   end
 
   def self._checkout_svn(repository, directory, branch, root, *params)
-    url = "#{repository}/#{directory}/#{branch}"
+    url = "#{repository.canonical}/#{directory}/#{branch}"
     if not sh %W{svn --non-interactive --trust-server-cert co #{url} #{directory}}, cwd: root
       raise CheckoutException.new("SVN: Cannot checkout from #{url}")
     end
@@ -143,18 +160,32 @@
     end
     separator = p[:separator] || '.'
 
-    url = "#{repository}/#{directory.gsub('/', separator)}"
+    hg = HG::Repository.init(root / directory)
+    paths = { 'default' => "#{repository.upstream}/#{directory.gsub('/', separator)}",
+              'canonical' => "#{repository.canonical}/#{directory.gsub('/', separator)}" }            
+    if repository.staging then
+      paths['staging'] = "#{repository.staging}/#{directory.gsub('/', separator)}"
+    end
+
+    hg.paths = paths
+
     begin
-      repo = HG::Repository::clone(url, root / directory, noupdate: true)
-      repo.update(branch)
+      if repository.staging then
+        hg.pull('staging')
+      end
+      hg.pull('default')
+      if paths['default'] != paths['canonical'] then
+        hg.pull('canonical')
+      end
+      hg.update(branch)
     #rescue Exception => e
     #  raise CheckoutException.new("HG: Cannot clone from #{url}: #{e.message}")
     end
   end
 
   def self._checkout_cvs(repository, directory, branch, root, *params)    
-    if not sh %W{cvs -z 9 -d #{repository} co #{directory}}, cwd: root
-      raise CheckoutException.new("CVS: Cannot checkout #{directory}from #{repository}")
+    if not sh %W{cvs -z 9 -d #{repository.canonical} co #{directory}}, cwd: root
+      raise CheckoutException.new("CVS: Cannot checkout #{directory}from #{repository.url}")
     end
   end
 end # module Rake::Stx::SCM
@@ -170,7 +201,7 @@
   else
     params << {:separator => repo.separator}
   end    
-  Rake::Stx::SCM.checkout(repo.type, repo.url, directory, *params)  
+  Rake::Stx::SCM.checkout(repo, directory, *params)  
 end
 
 def update(repo_name, directory, *params)
@@ -179,22 +210,26 @@
   if not repo then  
     error("update(): No repository found (#{repo_name})")
   end  
-  Rake::Stx::SCM.update(repo.type, repo.url, directory, *params)
+  Rake::Stx::SCM.update(repo, directory, *params)
 end
 
-def cvs(repository, directory, *params)
-  Rake::Stx::SCM.checkout(:cvs, repository, directory, *params)
+def cvs(url, directory, *params)
+  repo = Rake::Stx::Configuration::Repository.new(:type => :cvs, :url => url)
+  Rake::Stx::SCM.checkout(repo, directory, *params)
 end
 
-def svn(repository, directory, *params)
-  Rake::Stx::SCM.checkout(:svn, repository, directory, *params)
+def svn(url, directory, *params)
+  repo = Rake::Stx::Configuration::Repository.new(:type => :svn, :url => url)
+  Rake::Stx::SCM.checkout(repo, directory, *params)
 end
 
-def hg(repository, directory, *params)
-  Rake::Stx::SCM.checkout(:hg, repository, directory, *params)
+def hg(url, directory, *params)
+  repo = Rake::Stx::Configuration::Repository.new(:type => :hg, :url => url)
+  Rake::Stx::SCM.checkout(repo, directory, *params)
 end
 
-def git(repository, directory, *params)
-  Rake::Stx::SCM.checkout(:git, repository, directory, *params)
+def git(url, directory, *params)
+  repo = Rake::Stx::Configuration::Repository.new(:type => :git, :url => url)
+  Rake::Stx::SCM.checkout(repo, directory, *params)
 end