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 |
@@ -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): | |||
1439 | class MetaProject(Project): | 1442 | class 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): |