summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2008-11-04 07:37:10 -0800
committerShawn O. Pearce <sop@google.com>2008-11-05 18:08:32 -0800
commite284ad1d1a2c6fa0e0ac800e87b2607f9bda339e (patch)
treefcf35ac784ec2e13c78ee3882ccb1fec0ad3d049 /project.py
parent3e5481999d5f853e19ee5caaaaa968fc4b5176ab (diff)
downloadgit-repo-e284ad1d1a2c6fa0e0ac800e87b2607f9bda339e.tar.gz
Add 'repo init --mirror' to download a complete forrestv1.1
The mirror option downloads a complete forrest (as described by the manifest) and creates a replica of the remote repositories rather than a client working directory. This permits other clients to sync off the mirror site. A mirror can be positioned in a "DMZ", where the mirror executes "repo sync" to obtain changes from the external upstream and clients inside the protected zone operate off the mirror only, and therefore do not require direct git:// access to the external upstream repositories. Signed-off-by: Shawn O. Pearce <sop@google.com>
Diffstat (limited to 'project.py')
-rw-r--r--project.py36
1 files changed, 29 insertions, 7 deletions
diff --git a/project.py b/project.py
index 0637f4bf..1cfaaae5 100644
--- a/project.py
+++ b/project.py
@@ -211,7 +211,10 @@ class Project(object):
211 gitdir = self.gitdir, 211 gitdir = self.gitdir,
212 defaults = self.manifest.globalConfig) 212 defaults = self.manifest.globalConfig)
213 213
214 self.work_git = self._GitGetByExec(self, bare=False) 214 if self.worktree:
215 self.work_git = self._GitGetByExec(self, bare=False)
216 else:
217 self.work_git = None
215 self.bare_git = self._GitGetByExec(self, bare=True) 218 self.bare_git = self._GitGetByExec(self, bare=True)
216 219
217 @property 220 @property
@@ -489,14 +492,23 @@ class Project(object):
489 print >>sys.stderr 492 print >>sys.stderr
490 print >>sys.stderr, 'Initializing project %s ...' % self.name 493 print >>sys.stderr, 'Initializing project %s ...' % self.name
491 self._InitGitDir() 494 self._InitGitDir()
495
492 self._InitRemote() 496 self._InitRemote()
493 for r in self.extraRemotes.values(): 497 for r in self.extraRemotes.values():
494 if not self._RemoteFetch(r.name): 498 if not self._RemoteFetch(r.name):
495 return False 499 return False
496 if not self._RemoteFetch(): 500 if not self._RemoteFetch():
497 return False 501 return False
498 self._RepairAndroidImportErrors() 502
499 self._InitMRef() 503 if self.worktree:
504 self._RepairAndroidImportErrors()
505 self._InitMRef()
506 else:
507 self._InitMirrorHead()
508 try:
509 os.remove(os.path.join(self.gitdir, 'FETCH_HEAD'))
510 except OSError:
511 pass
500 return True 512 return True
501 513
502 def PostRepoUpgrade(self): 514 def PostRepoUpgrade(self):
@@ -792,9 +804,11 @@ class Project(object):
792 def _RemoteFetch(self, name=None): 804 def _RemoteFetch(self, name=None):
793 if not name: 805 if not name:
794 name = self.remote.name 806 name = self.remote.name
795 return GitCommand(self, 807 cmd = ['fetch']
796 ['fetch', name], 808 if not self.worktree:
797 bare = True).Wait() == 0 809 cmd.append('--update-head-ok')
810 cmd.append(name)
811 return GitCommand(self, cmd, bare = True).Wait() == 0
798 812
799 def _Checkout(self, rev, quiet=False): 813 def _Checkout(self, rev, quiet=False):
800 cmd = ['checkout'] 814 cmd = ['checkout']
@@ -874,7 +888,10 @@ class Project(object):
874 remote.url = url 888 remote.url = url
875 remote.review = self.remote.reviewUrl 889 remote.review = self.remote.reviewUrl
876 890
877 remote.ResetFetch() 891 if self.worktree:
892 remote.ResetFetch(mirror=False)
893 else:
894 remote.ResetFetch(mirror=True)
878 remote.Save() 895 remote.Save()
879 896
880 for r in self.extraRemotes.values(): 897 for r in self.extraRemotes.values():
@@ -897,6 +914,11 @@ class Project(object):
897 dst = remote.ToLocal(self.revision) 914 dst = remote.ToLocal(self.revision)
898 self.bare_git.symbolic_ref('-m', msg, ref, dst) 915 self.bare_git.symbolic_ref('-m', msg, ref, dst)
899 916
917 def _InitMirrorHead(self):
918 dst = self.GetRemote(self.remote.name).ToLocal(self.revision)
919 msg = 'manifest set to %s' % self.revision
920 self.bare_git.SetHead(dst, message=msg)
921
900 def _InitWorkTree(self): 922 def _InitWorkTree(self):
901 dotgit = os.path.join(self.worktree, '.git') 923 dotgit = os.path.join(self.worktree, '.git')
902 if not os.path.exists(dotgit): 924 if not os.path.exists(dotgit):