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