diff options
Diffstat (limited to 'project.py')
-rw-r--r-- | project.py | 77 |
1 files changed, 42 insertions, 35 deletions
@@ -27,7 +27,7 @@ from git_config import GitConfig, IsId | |||
27 | from error import GitError, ImportError, UploadError | 27 | from error import GitError, ImportError, UploadError |
28 | from error import ManifestInvalidRevisionError | 28 | from error import ManifestInvalidRevisionError |
29 | 29 | ||
30 | from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M | 30 | from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB |
31 | 31 | ||
32 | def _lwrite(path, content): | 32 | def _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): | |||
1577 | class MetaProject(Project): | 1580 | class 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): |