Teach Project how to relink a .git/ in the work tree
The _LinkWorkTree method can now be used to relink the work tree,
such as if the real repository was moved to a different location
on disk.
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/project.py b/project.py
index 1beee2a..bedc91e 100644
--- a/project.py
+++ b/project.py
@@ -1102,30 +1102,37 @@
msg = 'manifest set to %s' % self.revisionExpr
self.bare_git.symbolic_ref('-m', msg, ref, dst)
- def _InitWorkTree(self):
+ def _LinkWorkTree(self, relink=False):
dotgit = os.path.join(self.worktree, '.git')
- if not os.path.exists(dotgit):
+ if not relink:
os.makedirs(dotgit)
+ for name in ['config',
+ 'description',
+ 'hooks',
+ 'info',
+ 'logs',
+ 'objects',
+ 'packed-refs',
+ 'refs',
+ 'rr-cache',
+ 'svn']:
+ try:
+ src = os.path.join(self.gitdir, name)
+ dst = os.path.join(dotgit, name)
+ if relink:
+ os.remove(dst)
+ os.symlink(relpath(src, dst), dst)
+ except OSError, e:
+ if e.errno == errno.EPERM:
+ raise GitError('filesystem must support symlinks')
+ else:
+ raise
+
- for name in ['config',
- 'description',
- 'hooks',
- 'info',
- 'logs',
- 'objects',
- 'packed-refs',
- 'refs',
- 'rr-cache',
- 'svn']:
- try:
- src = os.path.join(self.gitdir, name)
- dst = os.path.join(dotgit, name)
- os.symlink(relpath(src, dst), dst)
- except OSError, e:
- if e.errno == errno.EPERM:
- raise GitError('filesystem must support symlinks')
- else:
- raise
+ def _InitWorkTree(self):
+ dotgit = os.path.join(self.worktree, '.git')
+ if not os.path.exists(dotgit):
+ self._LinkWorkTree()
_lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId())