summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
Diffstat (limited to 'project.py')
-rw-r--r--project.py46
1 files changed, 35 insertions, 11 deletions
diff --git a/project.py b/project.py
index 127176e5..95403ccb 100644
--- a/project.py
+++ b/project.py
@@ -46,7 +46,7 @@ if not is_python3():
46def _lwrite(path, content): 46def _lwrite(path, content):
47 lock = '%s.lock' % path 47 lock = '%s.lock' % path
48 48
49 fd = open(lock, 'wb') 49 fd = open(lock, 'w')
50 try: 50 try:
51 fd.write(content) 51 fd.write(content)
52 finally: 52 finally:
@@ -259,10 +259,12 @@ class RemoteSpec(object):
259 def __init__(self, 259 def __init__(self,
260 name, 260 name,
261 url = None, 261 url = None,
262 review = None): 262 review = None,
263 revision = None):
263 self.name = name 264 self.name = name
264 self.url = url 265 self.url = url
265 self.review = review 266 self.review = review
267 self.revision = revision
266 268
267class RepoHook(object): 269class RepoHook(object):
268 """A RepoHook contains information about a script to run as a hook. 270 """A RepoHook contains information about a script to run as a hook.
@@ -438,7 +440,8 @@ class RepoHook(object):
438 # and convert to a HookError w/ just the failing traceback. 440 # and convert to a HookError w/ just the failing traceback.
439 context = {} 441 context = {}
440 try: 442 try:
441 execfile(self._script_fullpath, context) 443 exec(compile(open(self._script_fullpath).read(),
444 self._script_fullpath, 'exec'), context)
442 except Exception: 445 except Exception:
443 raise HookError('%s\nFailed to import %s hook; see traceback above.' % ( 446 raise HookError('%s\nFailed to import %s hook; see traceback above.' % (
444 traceback.format_exc(), self._hook_type)) 447 traceback.format_exc(), self._hook_type))
@@ -1657,7 +1660,8 @@ class Project(object):
1657 1660
1658 remote = RemoteSpec(self.remote.name, 1661 remote = RemoteSpec(self.remote.name,
1659 url = url, 1662 url = url,
1660 review = self.remote.review) 1663 review = self.remote.review,
1664 revision = self.remote.revision)
1661 subproject = Project(manifest = self.manifest, 1665 subproject = Project(manifest = self.manifest,
1662 name = name, 1666 name = name,
1663 remote = remote, 1667 remote = remote,
@@ -1702,6 +1706,7 @@ class Project(object):
1702 if command.Wait() != 0: 1706 if command.Wait() != 0:
1703 raise GitError('git archive %s: %s' % (self.name, command.stderr)) 1707 raise GitError('git archive %s: %s' % (self.name, command.stderr))
1704 1708
1709
1705 def _RemoteFetch(self, name=None, 1710 def _RemoteFetch(self, name=None,
1706 current_branch_only=False, 1711 current_branch_only=False,
1707 initial=False, 1712 initial=False,
@@ -1804,19 +1809,30 @@ class Project(object):
1804 else: 1809 else:
1805 cmd.append('--tags') 1810 cmd.append('--tags')
1806 1811
1812 spec = []
1807 if not current_branch_only: 1813 if not current_branch_only:
1808 # Fetch whole repo 1814 # Fetch whole repo
1809 cmd.append(str((u'+refs/heads/*:') + remote.ToLocal('refs/heads/*'))) 1815 spec.append(str((u'+refs/heads/*:') + remote.ToLocal('refs/heads/*')))
1810 elif tag_name is not None: 1816 elif tag_name is not None:
1811 cmd.append('tag') 1817 spec.append('tag')
1812 cmd.append(tag_name) 1818 spec.append(tag_name)
1813 else: 1819 else:
1814 branch = self.revisionExpr 1820 branch = self.revisionExpr
1815 if is_sha1: 1821 if is_sha1:
1816 branch = self.upstream 1822 branch = self.upstream
1817 if branch.startswith(R_HEADS): 1823 if branch.startswith(R_HEADS):
1818 branch = branch[len(R_HEADS):] 1824 branch = branch[len(R_HEADS):]
1819 cmd.append(str((u'+refs/heads/%s:' % branch) + remote.ToLocal('refs/heads/%s' % branch))) 1825 spec.append(str((u'+refs/heads/%s:' % branch) + remote.ToLocal('refs/heads/%s' % branch)))
1826 cmd.extend(spec)
1827
1828 shallowfetch = self.config.GetString('repo.shallowfetch')
1829 if shallowfetch and shallowfetch != ' '.join(spec):
1830 GitCommand(self, ['fetch', '--unshallow', name] + shallowfetch.split(),
1831 bare=True, ssh_proxy=ssh_proxy).Wait()
1832 if depth:
1833 self.config.SetString('repo.shallowfetch', ' '.join(spec))
1834 else:
1835 self.config.SetString('repo.shallowfetch', None)
1820 1836
1821 ok = False 1837 ok = False
1822 for _i in range(2): 1838 for _i in range(2):
@@ -2201,6 +2217,14 @@ class Project(object):
2201 if name in symlink_dirs and not os.path.lexists(src): 2217 if name in symlink_dirs and not os.path.lexists(src):
2202 os.makedirs(src) 2218 os.makedirs(src)
2203 2219
2220 # If the source file doesn't exist, ensure the destination
2221 # file doesn't either.
2222 if name in symlink_files and not os.path.lexists(src):
2223 try:
2224 os.remove(dst)
2225 except OSError:
2226 pass
2227
2204 if name in to_symlink: 2228 if name in to_symlink:
2205 os.symlink(os.path.relpath(src, os.path.dirname(dst)), dst) 2229 os.symlink(os.path.relpath(src, os.path.dirname(dst)), dst)
2206 elif copy_all and not os.path.islink(dst): 2230 elif copy_all and not os.path.islink(dst):
@@ -2321,8 +2345,8 @@ class Project(object):
2321 out = iter(out[:-1].split('\0')) # pylint: disable=W1401 2345 out = iter(out[:-1].split('\0')) # pylint: disable=W1401
2322 while out: 2346 while out:
2323 try: 2347 try:
2324 info = out.next() 2348 info = next(out)
2325 path = out.next() 2349 path = next(out)
2326 except StopIteration: 2350 except StopIteration:
2327 break 2351 break
2328 2352
@@ -2348,7 +2372,7 @@ class Project(object):
2348 info = _Info(path, *info) 2372 info = _Info(path, *info)
2349 if info.status in ('R', 'C'): 2373 if info.status in ('R', 'C'):
2350 info.src_path = info.path 2374 info.src_path = info.path
2351 info.path = out.next() 2375 info.path = next(out)
2352 r[info.path] = info 2376 r[info.path] = info
2353 return r 2377 return r
2354 finally: 2378 finally: