Merge "Print project name for -p on mirror clients"
diff --git a/project.py b/project.py
index 5a7a6ca..679dccc 100644
--- a/project.py
+++ b/project.py
@@ -1728,9 +1728,8 @@
remote = self.GetRemote(self.remote.name)
bundle_url = remote.url + '/clone.bundle'
bundle_url = GitConfig.ForUser().UrlInsteadOf(bundle_url)
- if GetSchemeFromUrl(bundle_url) in ('persistent-http', 'persistent-https'):
- bundle_url = bundle_url[len('persistent-'):]
- if GetSchemeFromUrl(bundle_url) not in ('http', 'https'):
+ if GetSchemeFromUrl(bundle_url) not in (
+ 'http', 'https', 'persistent-http', 'persistent-https'):
return False
bundle_dst = os.path.join(self.gitdir, 'clone.bundle')
@@ -1779,9 +1778,11 @@
os.remove(tmpPath)
if 'http_proxy' in os.environ and 'darwin' == sys.platform:
cmd += ['--proxy', os.environ['http_proxy']]
- cookiefile = GitConfig.ForUser().GetString('http.cookiefile')
+ cookiefile = self._GetBundleCookieFile(srcUrl)
if cookiefile:
cmd += ['--cookie', cookiefile]
+ if srcUrl.startswith('persistent-'):
+ srcUrl = srcUrl[len('persistent-'):]
cmd += [srcUrl]
if IsTrace():
@@ -1804,7 +1805,7 @@
return False
if os.path.exists(tmpPath):
- if curlret == 0 and os.stat(tmpPath).st_size > 16:
+ if curlret == 0 and self._IsValidBundle(tmpPath):
os.rename(tmpPath, dstPath)
return True
else:
@@ -1813,6 +1814,41 @@
else:
return False
+ def _IsValidBundle(self, path):
+ try:
+ with open(path) as f:
+ if f.read(16) == '# v2 git bundle\n':
+ return True
+ else:
+ print("Invalid clone.bundle file; ignoring.", file=sys.stderr)
+ return False
+ except OSError:
+ return False
+
+ def _GetBundleCookieFile(self, url):
+ if url.startswith('persistent-'):
+ try:
+ p = subprocess.Popen(
+ ['git-remote-persistent-https', '-print_config', url],
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ prefix = 'http.cookiefile='
+ for line in p.stdout:
+ line = line.strip()
+ if line.startswith(prefix):
+ return line[len(prefix):]
+ if p.wait():
+ line = iter(p.stderr).next()
+ if ' -print_config' in line:
+ pass # Persistent proxy doesn't support -print_config.
+ else:
+ print(line + p.stderr.read(), file=sys.stderr)
+ except OSError as e:
+ if e.errno == errno.ENOENT:
+ pass # No persistent proxy.
+ raise
+ return GitConfig.ForUser().GetString('http.cookiefile')
+
def _Checkout(self, rev, quiet=False):
cmd = ['checkout']
if quiet: