Index: fetch.py |
diff --git a/fetch.py b/fetch.py |
index 249b50bde1923a0972a22ca7fd0b2b6025cb80e6..71e62190d62889ee7f70845b8594342f140e8a7f 100755 |
--- a/fetch.py |
+++ b/fetch.py |
@@ -75,7 +75,15 @@ class GitCheckout(Checkout): |
return subprocess.check_call(('git',) + cmd, **kwargs) |
-class GclientGitSvnCheckout(GclientCheckout, GitCheckout): |
+class SvnCheckout(Checkout): |
+ |
+ def run_svn(self, *cmd, **kwargs): |
+ print 'Running: svn %s' % ' '.join(pipes.quote(x) for x in cmd) |
+ if not self.dryrun: |
+ return subprocess.check_call(('svn',) + cmd, **kwargs) |
+ |
+ |
+class GclientGitSvnCheckout(GclientCheckout, GitCheckout, SvnCheckout): |
def __init__(self, dryrun, spec, root): |
super(GclientGitSvnCheckout, self).__init__(dryrun, spec, root) |
@@ -92,6 +100,16 @@ class GclientGitSvnCheckout(GclientCheckout, GitCheckout): |
return os.path.exists(os.path.join(os.getcwd(), self.root)) |
def init(self): |
+ # Ensure we are authenticated with subversion for all submodules. |
+ git_svn_dirs = json.loads(self.spec.get('submodule_git_svn_spec', '{}')) |
+ git_svn_dirs.update({self.root: self.spec}) |
+ for _, svn_spec in git_svn_dirs.iteritems(): |
+ try: |
+ self.run_svn('ls', '--non-interactive', svn_spec['svn_url']) |
+ except subprocess.CalledProcessError: |
+ print 'Please run `svn ls %s`' % svn_spec['svn_url'] |
+ return 1 |
+ |
# Configure and do the gclient checkout. |
self.run_gclient('config', '--spec', self.spec['gclient_spec']) |
self.run_gclient('sync') |
@@ -99,7 +117,7 @@ class GclientGitSvnCheckout(GclientCheckout, GitCheckout): |
# Configure git. |
wd = os.path.join(self.base, self.root) |
if self.dryrun: |
- print "cd %s" % wd |
+ print 'cd %s' % wd |
self.run_git( |
'submodule', 'foreach', |
'git config -f $toplevel/.git/config submodule.$name.ignore all', |
@@ -107,28 +125,22 @@ class GclientGitSvnCheckout(GclientCheckout, GitCheckout): |
self.run_git('config', 'diff.ignoreSubmodules', 'all', cwd=wd) |
# Configure git-svn. |
- self.run_git('svn', 'init', '--prefix=origin/', '-T', |
- self.spec['svn_branch'], self.spec['svn_url'], cwd=wd) |
- self.run_git('config', 'svn-remote.svn.fetch', self.spec['svn_branch'] + |
- ':refs/remotes/origin/' + self.spec['svn_ref'], cwd=wd) |
- self.run_git('svn', 'fetch', cwd=wd) |
- |
- # Configure git-svn submodules, if any. |
- submodules = json.loads(self.spec.get('submodule_git_svn_spec', '{}')) |
- for path, subspec in submodules.iteritems(): |
- subspec = submodules[path] |
- ospath = os.path.join(*path.split('/')) |
- wd = os.path.join(self.base, self.root, ospath) |
+ for path, svn_spec in git_svn_dirs.iteritems(): |
+ real_path = os.path.join(*path.split('/')) |
+ if real_path != self.root: |
+ real_path = os.path.join(self.root, real_path) |
+ wd = os.path.join(self.base, real_path) |
if self.dryrun: |
- print "cd %s" % wd |
+ print 'cd %s' % wd |
self.run_git('svn', 'init', '--prefix=origin/', '-T', |
- subspec['svn_branch'], subspec['svn_url'], cwd=wd) |
+ svn_spec['svn_branch'], svn_spec['svn_url'], cwd=wd) |
self.run_git('config', '--replace', 'svn-remote.svn.fetch', |
- subspec['svn_branch'] + ':refs/remotes/origin/' + |
- subspec['svn_ref'], cwd=wd) |
+ svn_spec['svn_branch'] + ':refs/remotes/origin/' + |
+ svn_spec['svn_ref'], cwd=wd) |
self.run_git('svn', 'fetch', cwd=wd) |
+ |
CHECKOUT_TYPE_MAP = { |
'gclient': GclientCheckout, |
'gclient_git_svn': GclientGitSvnCheckout, |
@@ -225,8 +237,7 @@ def run(dryrun, spec, root): |
print 'You appear to already have this checkout.' |
print 'Aborting to avoid clobbering your work.' |
return 1 |
- checkout.init() |
- return 0 |
+ return checkout.init() |
def main(): |