summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
Diffstat (limited to 'project.py')
-rw-r--r--project.py77
1 files changed, 42 insertions, 35 deletions
diff --git a/project.py b/project.py
index ff896d01..5a143a76 100644
--- a/project.py
+++ b/project.py
@@ -27,7 +27,7 @@ from git_config import GitConfig, IsId
27from error import GitError, ImportError, UploadError 27from error import GitError, ImportError, UploadError
28from error import ManifestInvalidRevisionError 28from error import ManifestInvalidRevisionError
29 29
30from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M 30from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB
31 31
32def _lwrite(path, content): 32def _lwrite(path, content):
33 lock = '%s.lock' % path 33 lock = '%s.lock' % path
@@ -598,7 +598,7 @@ class Project(object):
598 return False 598 return False
599 599
600 if self.worktree: 600 if self.worktree:
601 self._InitMRef() 601 self.manifest.SetMRefs(self)
602 else: 602 else:
603 self._InitMirrorHead() 603 self._InitMirrorHead()
604 try: 604 try:
@@ -1093,10 +1093,6 @@ class Project(object):
1093 remote.ResetFetch(mirror=True) 1093 remote.ResetFetch(mirror=True)
1094 remote.Save() 1094 remote.Save()
1095 1095
1096 def _InitMRef(self):
1097 if self.manifest.branch:
1098 self._InitAnyMRef(R_M + self.manifest.branch)
1099
1100 def _InitMirrorHead(self): 1096 def _InitMirrorHead(self):
1101 self._InitAnyMRef(HEAD) 1097 self._InitAnyMRef(HEAD)
1102 1098
@@ -1115,33 +1111,40 @@ class Project(object):
1115 msg = 'manifest set to %s' % self.revisionExpr 1111 msg = 'manifest set to %s' % self.revisionExpr
1116 self.bare_git.symbolic_ref('-m', msg, ref, dst) 1112 self.bare_git.symbolic_ref('-m', msg, ref, dst)
1117 1113
1118 def _InitWorkTree(self): 1114 def _LinkWorkTree(self, relink=False):
1119 dotgit = os.path.join(self.worktree, '.git') 1115 dotgit = os.path.join(self.worktree, '.git')
1120 if not os.path.exists(dotgit): 1116 if not relink:
1121 os.makedirs(dotgit) 1117 os.makedirs(dotgit)
1122 1118
1123 for name in ['config', 1119 for name in ['config',
1124 'description', 1120 'description',
1125 'hooks', 1121 'hooks',
1126 'info', 1122 'info',
1127 'logs', 1123 'logs',
1128 'objects', 1124 'objects',
1129 'packed-refs', 1125 'packed-refs',
1130 'refs', 1126 'refs',
1131 'rr-cache', 1127 'rr-cache',
1132 'svn']: 1128 'svn']:
1133 try: 1129 try:
1134 src = os.path.join(self.gitdir, name) 1130 src = os.path.join(self.gitdir, name)
1135 dst = os.path.join(dotgit, name) 1131 dst = os.path.join(dotgit, name)
1136 if os.path.islink(dst) or not os.path.exists(dst): 1132 if relink:
1137 os.symlink(relpath(src, dst), dst) 1133 os.remove(dst)
1138 else: 1134 if os.path.islink(dst) or not os.path.exists(dst):
1139 raise GitError('cannot overwrite a local work tree') 1135 os.symlink(relpath(src, dst), dst)
1140 except OSError, e: 1136 else:
1141 if e.errno == errno.EPERM: 1137 raise GitError('cannot overwrite a local work tree')
1142 raise GitError('filesystem must support symlinks') 1138 except OSError, e:
1143 else: 1139 if e.errno == errno.EPERM:
1144 raise 1140 raise GitError('filesystem must support symlinks')
1141 else:
1142 raise
1143
1144 def _InitWorkTree(self):
1145 dotgit = os.path.join(self.worktree, '.git')
1146 if not os.path.exists(dotgit):
1147 self._LinkWorkTree()
1145 1148
1146 _lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId()) 1149 _lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId())
1147 1150
@@ -1439,15 +1442,17 @@ class SyncBuffer(object):
1439class MetaProject(Project): 1442class MetaProject(Project):
1440 """A special project housed under .repo. 1443 """A special project housed under .repo.
1441 """ 1444 """
1442 def __init__(self, manifest, name, gitdir, worktree): 1445 def __init__(self, manifest, name, gitdir, worktree, relpath=None):
1443 repodir = manifest.repodir 1446 repodir = manifest.repodir
1447 if relpath is None:
1448 relpath = '.repo/%s' % name
1444 Project.__init__(self, 1449 Project.__init__(self,
1445 manifest = manifest, 1450 manifest = manifest,
1446 name = name, 1451 name = name,
1447 gitdir = gitdir, 1452 gitdir = gitdir,
1448 worktree = worktree, 1453 worktree = worktree,
1449 remote = RemoteSpec('origin'), 1454 remote = RemoteSpec('origin'),
1450 relpath = '.repo/%s' % name, 1455 relpath = relpath,
1451 revisionExpr = 'refs/heads/master', 1456 revisionExpr = 'refs/heads/master',
1452 revisionId = None) 1457 revisionId = None)
1453 1458
@@ -1455,10 +1460,12 @@ class MetaProject(Project):
1455 if self.Exists: 1460 if self.Exists:
1456 cb = self.CurrentBranch 1461 cb = self.CurrentBranch
1457 if cb: 1462 if cb:
1458 base = self.GetBranch(cb).merge 1463 cb = self.GetBranch(cb)
1459 if base: 1464 if cb.merge:
1460 self.revisionExpr = base 1465 self.revisionExpr = cb.merge
1461 self.revisionId = None 1466 self.revisionId = None
1467 if cb.remote and cb.remote.name:
1468 self.remote.name = cb.remote.name
1462 1469
1463 @property 1470 @property
1464 def LastFetch(self): 1471 def LastFetch(self):