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 12595cd7..b4044943 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
@@ -643,7 +643,7 @@ class Project(object):
643 self._RemoteFetch(None, rev[len(R_TAGS):], quiet=quiet) 643 self._RemoteFetch(None, rev[len(R_TAGS):], quiet=quiet)
644 644
645 if self.worktree: 645 if self.worktree:
646 self._InitMRef() 646 self.manifest.SetMRefs(self)
647 else: 647 else:
648 self._InitMirrorHead() 648 self._InitMirrorHead()
649 try: 649 try:
@@ -1231,10 +1231,6 @@ class Project(object):
1231 remote.ResetFetch(mirror=True) 1231 remote.ResetFetch(mirror=True)
1232 remote.Save() 1232 remote.Save()
1233 1233
1234 def _InitMRef(self):
1235 if self.manifest.branch:
1236 self._InitAnyMRef(R_M + self.manifest.branch)
1237
1238 def _InitMirrorHead(self): 1234 def _InitMirrorHead(self):
1239 self._InitAnyMRef(HEAD) 1235 self._InitAnyMRef(HEAD)
1240 1236
@@ -1253,33 +1249,40 @@ class Project(object):
1253 msg = 'manifest set to %s' % self.revisionExpr 1249 msg = 'manifest set to %s' % self.revisionExpr
1254 self.bare_git.symbolic_ref('-m', msg, ref, dst) 1250 self.bare_git.symbolic_ref('-m', msg, ref, dst)
1255 1251
1256 def _InitWorkTree(self): 1252 def _LinkWorkTree(self, relink=False):
1257 dotgit = os.path.join(self.worktree, '.git') 1253 dotgit = os.path.join(self.worktree, '.git')
1258 if not os.path.exists(dotgit): 1254 if not relink:
1259 os.makedirs(dotgit) 1255 os.makedirs(dotgit)
1260 1256
1261 for name in ['config', 1257 for name in ['config',
1262 'description', 1258 'description',
1263 'hooks', 1259 'hooks',
1264 'info', 1260 'info',
1265 'logs', 1261 'logs',
1266 'objects', 1262 'objects',
1267 'packed-refs', 1263 'packed-refs',
1268 'refs', 1264 'refs',
1269 'rr-cache', 1265 'rr-cache',
1270 'svn']: 1266 'svn']:
1271 try: 1267 try:
1272 src = os.path.join(self.gitdir, name) 1268 src = os.path.join(self.gitdir, name)
1273 dst = os.path.join(dotgit, name) 1269 dst = os.path.join(dotgit, name)
1274 if os.path.islink(dst) or not os.path.exists(dst): 1270 if relink:
1275 os.symlink(relpath(src, dst), dst) 1271 os.remove(dst)
1276 else: 1272 if os.path.islink(dst) or not os.path.exists(dst):
1277 raise GitError('cannot overwrite a local work tree') 1273 os.symlink(relpath(src, dst), dst)
1278 except OSError, e: 1274 else:
1279 if e.errno == errno.EPERM: 1275 raise GitError('cannot overwrite a local work tree')
1280 raise GitError('filesystem must support symlinks') 1276 except OSError, e:
1281 else: 1277 if e.errno == errno.EPERM:
1282 raise 1278 raise GitError('filesystem must support symlinks')
1279 else:
1280 raise
1281
1282 def _InitWorkTree(self):
1283 dotgit = os.path.join(self.worktree, '.git')
1284 if not os.path.exists(dotgit):
1285 self._LinkWorkTree()
1283 1286
1284 _lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId()) 1287 _lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId())
1285 1288
@@ -1577,15 +1580,17 @@ class SyncBuffer(object):
1577class MetaProject(Project): 1580class MetaProject(Project):
1578 """A special project housed under .repo. 1581 """A special project housed under .repo.
1579 """ 1582 """
1580 def __init__(self, manifest, name, gitdir, worktree): 1583 def __init__(self, manifest, name, gitdir, worktree, relpath=None):
1581 repodir = manifest.repodir 1584 repodir = manifest.repodir
1585 if relpath is None:
1586 relpath = '.repo/%s' % name
1582 Project.__init__(self, 1587 Project.__init__(self,
1583 manifest = manifest, 1588 manifest = manifest,
1584 name = name, 1589 name = name,
1585 gitdir = gitdir, 1590 gitdir = gitdir,
1586 worktree = worktree, 1591 worktree = worktree,
1587 remote = RemoteSpec('origin'), 1592 remote = RemoteSpec('origin'),
1588 relpath = '.repo/%s' % name, 1593 relpath = relpath,
1589 revisionExpr = 'refs/heads/master', 1594 revisionExpr = 'refs/heads/master',
1590 revisionId = None) 1595 revisionId = None)
1591 1596
@@ -1593,10 +1598,12 @@ class MetaProject(Project):
1593 if self.Exists: 1598 if self.Exists:
1594 cb = self.CurrentBranch 1599 cb = self.CurrentBranch
1595 if cb: 1600 if cb:
1596 base = self.GetBranch(cb).merge 1601 cb = self.GetBranch(cb)
1597 if base: 1602 if cb.merge:
1598 self.revisionExpr = base 1603 self.revisionExpr = cb.merge
1599 self.revisionId = None 1604 self.revisionId = None
1605 if cb.remote and cb.remote.name:
1606 self.remote.name = cb.remote.name
1600 1607
1601 @property 1608 @property
1602 def LastFetch(self): 1609 def LastFetch(self):