Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: fetch.py

Issue 13540004: Make fetch run svn ls for svn repos behind git-svn configs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Rebase Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ 6 """
7 Tool to perform checkouts in one easy command line! 7 Tool to perform checkouts in one easy command line!
8 8
9 Usage: 9 Usage:
10 fetch <recipe> [--property=value [--property2=value2 ...]] 10 fetch <recipe> [--property=value [--property2=value2 ...]]
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 68
69 69
70 class GitCheckout(Checkout): 70 class GitCheckout(Checkout):
71 71
72 def run_git(self, *cmd, **kwargs): 72 def run_git(self, *cmd, **kwargs):
73 print 'Running: git %s' % ' '.join(pipes.quote(x) for x in cmd) 73 print 'Running: git %s' % ' '.join(pipes.quote(x) for x in cmd)
74 if not self.dryrun: 74 if not self.dryrun:
75 return subprocess.check_call(('git',) + cmd, **kwargs) 75 return subprocess.check_call(('git',) + cmd, **kwargs)
76 76
77 77
78 class GclientGitSvnCheckout(GclientCheckout, GitCheckout): 78 class SvnCheckout(Checkout):
79
80 def run_svn(self, *cmd, **kwargs):
81 print 'Running: svn %s' % ' '.join(pipes.quote(x) for x in cmd)
82 if not self.dryrun:
83 return subprocess.check_call(('svn',) + cmd, **kwargs)
84
85
86 class GclientGitSvnCheckout(GclientCheckout, GitCheckout, SvnCheckout):
79 87
80 def __init__(self, dryrun, spec, root): 88 def __init__(self, dryrun, spec, root):
81 super(GclientGitSvnCheckout, self).__init__(dryrun, spec, root) 89 super(GclientGitSvnCheckout, self).__init__(dryrun, spec, root)
82 assert 'solutions' in self.spec 90 assert 'solutions' in self.spec
83 keys = ['solutions', 'target_os', 'target_os_only'] 91 keys = ['solutions', 'target_os', 'target_os_only']
84 gclient_spec = '\n'.join('%s = %s' % (key, self.spec[key]) 92 gclient_spec = '\n'.join('%s = %s' % (key, self.spec[key])
85 for key in self.spec if key in keys) 93 for key in self.spec if key in keys)
86 self.spec['gclient_spec'] = gclient_spec 94 self.spec['gclient_spec'] = gclient_spec
87 assert 'svn_url' in self.spec 95 assert 'svn_url' in self.spec
88 assert 'svn_branch' in self.spec 96 assert 'svn_branch' in self.spec
89 assert 'svn_ref' in self.spec 97 assert 'svn_ref' in self.spec
90 98
91 def exists(self): 99 def exists(self):
92 return os.path.exists(os.path.join(os.getcwd(), self.root)) 100 return os.path.exists(os.path.join(os.getcwd(), self.root))
93 101
94 def init(self): 102 def init(self):
103 # Ensure we are authenticated with subversion for all submodules.
104 git_svn_dirs = json.loads(self.spec.get('submodule_git_svn_spec', '{}'))
105 git_svn_dirs.update({self.root: self.spec})
106 for _, svn_spec in git_svn_dirs.iteritems():
107 try:
108 self.run_svn('ls', '--non-interactive', svn_spec['svn_url'])
109 except subprocess.CalledProcessError:
110 print 'Please run `svn ls %s`' % svn_spec['svn_url']
111 return 1
112
95 # Configure and do the gclient checkout. 113 # Configure and do the gclient checkout.
96 self.run_gclient('config', '--spec', self.spec['gclient_spec']) 114 self.run_gclient('config', '--spec', self.spec['gclient_spec'])
97 self.run_gclient('sync') 115 self.run_gclient('sync')
98 116
99 # Configure git. 117 # Configure git.
100 wd = os.path.join(self.base, self.root) 118 wd = os.path.join(self.base, self.root)
101 if self.dryrun: 119 if self.dryrun:
102 print "cd %s" % wd 120 print 'cd %s' % wd
103 self.run_git( 121 self.run_git(
104 'submodule', 'foreach', 122 'submodule', 'foreach',
105 'git config -f $toplevel/.git/config submodule.$name.ignore all', 123 'git config -f $toplevel/.git/config submodule.$name.ignore all',
106 cwd=wd) 124 cwd=wd)
107 self.run_git('config', 'diff.ignoreSubmodules', 'all', cwd=wd) 125 self.run_git('config', 'diff.ignoreSubmodules', 'all', cwd=wd)
108 126
109 # Configure git-svn. 127 # Configure git-svn.
110 self.run_git('svn', 'init', '--prefix=origin/', '-T', 128 for path, svn_spec in git_svn_dirs.iteritems():
111 self.spec['svn_branch'], self.spec['svn_url'], cwd=wd) 129 real_path = os.path.join(*path.split('/'))
112 self.run_git('config', 'svn-remote.svn.fetch', self.spec['svn_branch'] + 130 if real_path != self.root:
113 ':refs/remotes/origin/' + self.spec['svn_ref'], cwd=wd) 131 real_path = os.path.join(self.root, real_path)
114 self.run_git('svn', 'fetch', cwd=wd) 132 wd = os.path.join(self.base, real_path)
133 if self.dryrun:
134 print 'cd %s' % wd
135 self.run_git('svn', 'init', '--prefix=origin/', '-T',
136 svn_spec['svn_branch'], svn_spec['svn_url'], cwd=wd)
137 self.run_git('config', '--replace', 'svn-remote.svn.fetch',
138 svn_spec['svn_branch'] + ':refs/remotes/origin/' +
139 svn_spec['svn_ref'], cwd=wd)
140 self.run_git('svn', 'fetch', cwd=wd)
115 141
116 # Configure git-svn submodules, if any.
117 submodules = json.loads(self.spec.get('submodule_git_svn_spec', '{}'))
118 for path, subspec in submodules.iteritems():
119 subspec = submodules[path]
120 ospath = os.path.join(*path.split('/'))
121 wd = os.path.join(self.base, self.root, ospath)
122 if self.dryrun:
123 print "cd %s" % wd
124 self.run_git('svn', 'init', '--prefix=origin/', '-T',
125 subspec['svn_branch'], subspec['svn_url'], cwd=wd)
126 self.run_git('config', '--replace', 'svn-remote.svn.fetch',
127 subspec['svn_branch'] + ':refs/remotes/origin/' +
128 subspec['svn_ref'], cwd=wd)
129 self.run_git('svn', 'fetch', cwd=wd)
130 142
131 143
132 CHECKOUT_TYPE_MAP = { 144 CHECKOUT_TYPE_MAP = {
133 'gclient': GclientCheckout, 145 'gclient': GclientCheckout,
134 'gclient_git_svn': GclientGitSvnCheckout, 146 'gclient_git_svn': GclientGitSvnCheckout,
135 'git': GitCheckout, 147 'git': GitCheckout,
136 } 148 }
137 149
138 150
139 def CheckoutFactory(type_name, dryrun, spec, root): 151 def CheckoutFactory(type_name, dryrun, spec, root):
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 checkout_type = spec['type'] 230 checkout_type = spec['type']
219 checkout_spec = spec['%s_spec' % checkout_type] 231 checkout_spec = spec['%s_spec' % checkout_type]
220 try: 232 try:
221 checkout = CheckoutFactory(checkout_type, dryrun, checkout_spec, root) 233 checkout = CheckoutFactory(checkout_type, dryrun, checkout_spec, root)
222 except KeyError: 234 except KeyError:
223 return 1 235 return 1
224 if checkout.exists(): 236 if checkout.exists():
225 print 'You appear to already have this checkout.' 237 print 'You appear to already have this checkout.'
226 print 'Aborting to avoid clobbering your work.' 238 print 'Aborting to avoid clobbering your work.'
227 return 1 239 return 1
228 checkout.init() 240 return checkout.init()
229 return 0
230 241
231 242
232 def main(): 243 def main():
233 dryrun, recipe, props = handle_args(sys.argv) 244 dryrun, recipe, props = handle_args(sys.argv)
234 spec, root = run_recipe_fetch(recipe, props) 245 spec, root = run_recipe_fetch(recipe, props)
235 return run(dryrun, spec, root) 246 return run(dryrun, spec, root)
236 247
237 248
238 if __name__ == '__main__': 249 if __name__ == '__main__':
239 sys.exit(main()) 250 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698