summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
Diffstat (limited to 'project.py')
-rw-r--r--project.py81
1 files changed, 44 insertions, 37 deletions
diff --git a/project.py b/project.py
index 01dc8678..fde98ad7 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
@@ -236,8 +236,8 @@ class Project(object):
236 self.manifest = manifest 236 self.manifest = manifest
237 self.name = name 237 self.name = name
238 self.remote = remote 238 self.remote = remote
239 self.gitdir = gitdir 239 self.gitdir = gitdir.replace('\\', '/')
240 self.worktree = worktree 240 self.worktree = worktree.replace('\\', '/')
241 self.relpath = relpath 241 self.relpath = relpath
242 self.revisionExpr = revisionExpr 242 self.revisionExpr = revisionExpr
243 243
@@ -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):
1574class MetaProject(Project): 1577class 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):