| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """Convert SVN based DEPS into .DEPS.git for use with NewGit.""" | 6 """Convert SVN based DEPS into .DEPS.git for use with NewGit.""" |
| 7 | 7 |
| 8 import collections | 8 import collections |
| 9 from cStringIO import StringIO |
| 9 import json | 10 import json |
| 10 import optparse | 11 import optparse |
| 11 import os | 12 import os |
| 12 import Queue | 13 import Queue |
| 13 import shutil | 14 import shutil |
| 14 import subprocess | 15 import subprocess |
| 15 import sys | 16 import sys |
| 17 import threading |
| 16 import time | 18 import time |
| 17 | 19 |
| 18 from multiprocessing.pool import ThreadPool | |
| 19 | |
| 20 import deps_utils | 20 import deps_utils |
| 21 import git_tools | 21 import git_tools |
| 22 import svn_to_git_public | 22 import svn_to_git_public |
| 23 | 23 |
| 24 try: |
| 25 import git_cache |
| 26 except ImportError: |
| 27 for p in os.environ['PATH'].split(os.pathsep): |
| 28 if (os.path.basename(p) == 'depot_tools' and |
| 29 os.path.exists(os.path.join(p, 'git_cache.py'))): |
| 30 sys.path.append(p) |
| 31 import git_cache |
| 32 |
| 33 Job = collections.namedtuple( |
| 34 'Job', |
| 35 ['dep', 'git_url', 'dep_url', 'path', 'git_host', 'dep_rev', 'svn_branch']) |
| 36 |
| 37 ConversionResults = collections.namedtuple( |
| 38 'ConversionResults', |
| 39 ['new_deps', 'deps_vars', 'bad_git_urls', 'bad_dep_urls', 'bad_override', |
| 40 'bad_git_hash']) |
| 24 | 41 |
| 25 # This is copied from depot_tools/gclient.py | 42 # This is copied from depot_tools/gclient.py |
| 26 DEPS_OS_CHOICES = { | 43 DEPS_OS_CHOICES = { |
| 27 "win32": "win", | 44 "win32": "win", |
| 28 "win": "win", | 45 "win": "win", |
| 29 "cygwin": "win", | 46 "cygwin": "win", |
| 30 "darwin": "mac", | 47 "darwin": "mac", |
| 31 "mac": "mac", | 48 "mac": "mac", |
| 32 "unix": "unix", | 49 "unix": "unix", |
| 33 "linux": "unix", | 50 "linux": "unix", |
| 34 "linux2": "unix", | 51 "linux2": "unix", |
| 35 "linux3": "unix", | 52 "linux3": "unix", |
| 36 "android": "android", | 53 "android": "android", |
| 37 } | 54 } |
| 38 | 55 |
| 56 |
| 39 def SplitScmUrl(url): | 57 def SplitScmUrl(url): |
| 40 """Given a repository, return a set containing the URL and the revision.""" | 58 """Given a repository, return a set containing the URL and the revision.""" |
| 41 url_split = url.split('@') | 59 url_split = url.split('@') |
| 42 scm_url = url_split[0] | 60 scm_url = url_split[0] |
| 43 scm_rev = 'HEAD' | 61 scm_rev = 'HEAD' |
| 44 if len(url_split) == 2: | 62 if len(url_split) == 2: |
| 45 scm_rev = url_split[1] | 63 scm_rev = url_split[1] |
| 46 return (scm_url, scm_rev) | 64 return (scm_url, scm_rev) |
| 47 | 65 |
| 48 | 66 |
| 49 def SvnRevToGitHash(svn_rev, git_url, repos_path, workspace, dep_path, | 67 def SvnRevToGitHash( |
| 50 git_host, svn_branch_name=None, cache_dir=None): | 68 svn_rev, git_url, repos_path, workspace, dep_path, git_host, |
| 69 svn_branch_name=None, cache_dir=None, outbuf=None, shallow=None): |
| 51 """Convert a SVN revision to a Git commit id.""" | 70 """Convert a SVN revision to a Git commit id.""" |
| 52 git_repo = None | 71 git_repo = None |
| 53 if git_url.startswith(git_host): | 72 if git_url.startswith(git_host): |
| 54 git_repo = git_url.replace(git_host, '') | 73 git_repo = git_url.replace(git_host, '') |
| 55 else: | 74 else: |
| 56 raise Exception('Unknown git server %s, host %s' % (git_url, git_host)) | 75 raise RuntimeError('Unknown git server %s, host %s' % (git_url, git_host)) |
| 57 if repos_path is None and workspace is None and cache_dir is None: | 76 if repos_path is None and workspace is None and cache_dir is None: |
| 58 # We're running without a repository directory (i.e. no -r option). | 77 # We're running without a repository directory (i.e. no -r option). |
| 59 # We cannot actually find the commit id, but this mode is useful | 78 # We cannot actually find the commit id, but this mode is useful |
| 60 # just for testing the URL mappings. Produce an output file that | 79 # just for testing the URL mappings. Produce an output file that |
| 61 # can't actually be used, but can be eyeballed for correct URLs. | 80 # can't actually be used, but can be eyeballed for correct URLs. |
| 62 return 'xxx-r%s' % svn_rev | 81 return 'xxx-r%s' % svn_rev |
| 63 if repos_path: | 82 if repos_path: |
| 64 mirror = True | 83 mirror = True |
| 65 git_repo_path = os.path.join(repos_path, git_repo) | 84 git_repo_path = os.path.join(repos_path, git_repo) |
| 66 if not os.path.exists(git_repo_path) or not os.listdir(git_repo_path): | 85 if not os.path.exists(git_repo_path) or not os.listdir(git_repo_path): |
| 67 git_tools.Clone(git_url, git_repo_path, mirror) | 86 git_tools.Clone(git_url, git_repo_path, mirror, outbuf) |
| 68 elif cache_dir: | 87 elif cache_dir: |
| 69 mirror = 'bare' | 88 mirror = True |
| 70 git_tools.Clone(git_url, None, mirror, cache_dir=cache_dir) | 89 git_repo_path = git_tools.PopulateCache(git_url, shallow) |
| 71 git_repo_path = git_tools.GetCacheRepoDir(git_url, cache_dir) | |
| 72 else: | 90 else: |
| 73 mirror = False | 91 mirror = False |
| 74 git_repo_path = os.path.join(workspace, dep_path) | 92 git_repo_path = os.path.join(workspace, dep_path) |
| 75 if (os.path.exists(git_repo_path) and | 93 if (os.path.exists(git_repo_path) and |
| 76 not os.path.exists(os.path.join(git_repo_path, '.git'))): | 94 not os.path.exists(os.path.join(git_repo_path, '.git'))): |
| 77 # shutil.rmtree is unreliable on windows | 95 # shutil.rmtree is unreliable on windows |
| 78 if sys.platform == 'win32': | 96 if sys.platform == 'win32': |
| 79 for _ in xrange(3): | 97 for _ in xrange(3): |
| 80 if not subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', | 98 if not subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', |
| 81 os.path.normcase(git_repo_path)]): | 99 os.path.normcase(git_repo_path)]): |
| 82 break | 100 break |
| 83 time.sleep(3) | 101 time.sleep(3) |
| 84 else: | 102 else: |
| 85 shutil.rmtree(git_repo_path) | 103 shutil.rmtree(git_repo_path) |
| 86 if not os.path.exists(git_repo_path): | 104 if not os.path.exists(git_repo_path): |
| 87 git_tools.Clone(git_url, git_repo_path, mirror) | 105 git_tools.Clone(git_url, git_repo_path, mirror, outbuf) |
| 88 | 106 |
| 89 if svn_branch_name: | 107 if svn_branch_name: |
| 90 # svn branches are mirrored with: | 108 # svn branches are mirrored with: |
| 91 # branches = branches/*:refs/remotes/branch-heads/* | 109 # branches = branches/*:refs/remotes/branch-heads/* |
| 92 if mirror: | 110 if mirror: |
| 93 refspec = 'refs/branch-heads/' + svn_branch_name | 111 refspec = 'refs/branch-heads/' + svn_branch_name |
| 94 else: | 112 else: |
| 95 refspec = 'refs/remotes/branch-heads/' + svn_branch_name | 113 refspec = 'refs/remotes/branch-heads/' + svn_branch_name |
| 96 else: | 114 else: |
| 97 if mirror: | 115 if mirror: |
| 98 refspec = 'refs/heads/master' | 116 refspec = 'refs/heads/master' |
| 99 else: | 117 else: |
| 100 refspec = 'refs/remotes/origin/master' | 118 refspec = 'refs/remotes/origin/master' |
| 101 | 119 |
| 102 # Work-around for: | 120 # Work-around for: |
| 103 # http://code.google.com/p/chromium/issues/detail?id=362222 | 121 # http://code.google.com/p/chromium/issues/detail?id=362222 |
| 104 if (git_url.startswith('https://chromium.googlesource.com/external/pefile') | 122 if (git_url.startswith('https://chromium.googlesource.com/external/pefile') |
| 105 and int(svn_rev) == 63): | 123 and int(svn_rev) in (63, 141)): |
| 106 return '1ceaa279daa62b71e3431e58f68be6a96dd1519a' | 124 return '1ceaa279daa62b71e3431e58f68be6a96dd1519a' |
| 107 | 125 |
| 108 try: | 126 return git_tools.Search(git_repo_path, svn_rev, mirror, refspec, git_url) |
| 109 return git_tools.Search(git_repo_path, svn_rev, mirror, refspec, git_url) | |
| 110 except Exception: | |
| 111 print >> sys.stderr, '%s <-> ERROR' % git_repo_path | |
| 112 raise | |
| 113 | |
| 114 def ConvertDepsToGit(deps, options, deps_vars, svn_deps_vars, svn_to_git_objs, | |
| 115 deps_overrides): | |
| 116 """Convert a 'deps' section in a DEPS file from SVN to Git.""" | |
| 117 new_deps = {} | |
| 118 bad_git_urls = set([]) | |
| 119 bad_dep_urls = [] | |
| 120 bad_override = [] | |
| 121 bad_git_hash = [] | |
| 122 | |
| 123 # Populate our deps list. | |
| 124 deps_to_process = {} | |
| 125 for dep, dep_url in deps.iteritems(): | |
| 126 if not dep_url: # dep is 'None' and emitted to exclude the dep | |
| 127 new_deps[dep] = None | |
| 128 continue | |
| 129 | |
| 130 # Get the URL and the revision/hash for this dependency. | |
| 131 dep_url, dep_rev = SplitScmUrl(deps[dep]) | |
| 132 | |
| 133 path = dep | |
| 134 git_url = dep_url | |
| 135 svn_branch = None | |
| 136 git_host = dep_url | |
| 137 | |
| 138 if not dep_url.endswith('.git'): | |
| 139 # Convert this SVN URL to a Git URL. | |
| 140 for svn_git_converter in svn_to_git_objs: | |
| 141 converted_data = svn_git_converter.SvnUrlToGitUrl(dep, dep_url) | |
| 142 if converted_data: | |
| 143 path, git_url, git_host = converted_data[:3] | |
| 144 if len(converted_data) > 3: | |
| 145 svn_branch = converted_data[3] | |
| 146 break | |
| 147 else: | |
| 148 # Make all match failures fatal to catch errors early. When a match is | |
| 149 # found, we break out of the loop so the exception is not thrown. | |
| 150 if options.no_fail_fast: | |
| 151 bad_dep_urls.append(dep_url) | |
| 152 continue | |
| 153 raise Exception('No match found for %s' % dep_url) | |
| 154 | |
| 155 Job = collections.namedtuple('Job', ['git_url', 'dep_url', 'path', | |
| 156 'git_host', 'dep_rev', 'svn_branch']) | |
| 157 deps_to_process[dep] = Job( | |
| 158 git_url, dep_url, path, git_host, dep_rev, svn_branch) | |
| 159 | |
| 160 # Lets pre-cache all of the git repos now if we have cache_dir turned on. | |
| 161 if options.cache_dir: | |
| 162 if not os.path.isdir(options.cache_dir): | |
| 163 os.makedirs(options.cache_dir) | |
| 164 pool = ThreadPool(processes=len(deps_to_process)) | |
| 165 output_queue = Queue.Queue() | |
| 166 num_threads = 0 | |
| 167 for git_url, _, _, _, _, _ in deps_to_process.itervalues(): | |
| 168 print 'Populating cache for %s' % git_url | |
| 169 num_threads += 1 | |
| 170 pool.apply_async(git_tools.Clone, (git_url, None, 'bare', | |
| 171 output_queue, options.cache_dir, | |
| 172 options.shallow)) | |
| 173 pool.close() | |
| 174 | |
| 175 # Stream stdout line by line. | |
| 176 sec_since = 0 | |
| 177 while num_threads > 0: | |
| 178 try: | |
| 179 line = output_queue.get(block=True, timeout=1) | |
| 180 sec_since = 0 | |
| 181 except Queue.Empty: | |
| 182 sec_since += 1 | |
| 183 line = ('Main> Heartbeat ping. We are still alive!! ' | |
| 184 'Seconds since last output: %d sec' % sec_since) | |
| 185 if line is None: | |
| 186 num_threads -= 1 | |
| 187 else: | |
| 188 print line | |
| 189 pool.join() | |
| 190 | 127 |
| 191 | 128 |
| 192 for dep, items in deps_to_process.iteritems(): | 129 def MessageMain(message_q, threads): |
| 193 git_url, dep_url, path, git_host, dep_rev, svn_branch = items | 130 while True: |
| 131 try: |
| 132 msg = message_q.get(True, 10) |
| 133 except Queue.Empty: |
| 134 print >> sys.stderr, 'Still working on:' |
| 135 for s in sorted([th.working_on for th in threads if th.working_on]): |
| 136 print >> sys.stderr, ' %s' % s |
| 137 continue |
| 138 if msg is Queue.Empty: |
| 139 return |
| 140 if msg: |
| 141 print >> sys.stderr, msg |
| 142 |
| 143 |
| 144 def ConvertDepMain(dep_q, message_q, options, deps_overrides, svn_deps_vars, |
| 145 results): |
| 146 cur_thread = threading.current_thread() |
| 147 while True: |
| 148 try: |
| 149 job = dep_q.get(False) |
| 150 dep, git_url, dep_url, path, git_host, dep_rev, svn_branch = job |
| 151 cur_thread.working_on = dep |
| 152 except Queue.Empty: |
| 153 cur_thread.working_on = None |
| 154 return |
| 155 |
| 156 outbuf = StringIO() |
| 157 def _print(s): |
| 158 for l in s.splitlines(): |
| 159 outbuf.write('[%s] %s\n' % (dep, l)) |
| 160 |
| 194 if options.verify: | 161 if options.verify: |
| 195 delay = 0.5 | 162 delay = 0.5 |
| 196 success = False | 163 success = False |
| 197 for try_index in range(1, 6): | 164 for try_index in range(1, 6): |
| 198 print >> sys.stderr, 'checking %s (try #%d) ...' % (git_url, try_index), | 165 _print('checking %s (try #%d) ...' % (git_url, try_index)) |
| 199 if git_tools.Ping(git_url, verbose=True): | 166 if git_tools.Ping(git_url, verbose=True): |
| 200 print >> sys.stderr, ' success' | 167 _print(' success') |
| 201 success = True | 168 success = True |
| 202 break | 169 break |
| 203 | 170 _print(' failure') |
| 204 print >> sys.stderr, ' failure' | 171 _print('sleeping for %.01f seconds ...' % delay) |
| 205 print >> sys.stderr, 'sleeping for %.01f seconds ...' % delay | |
| 206 time.sleep(delay) | 172 time.sleep(delay) |
| 207 delay *= 2 | 173 delay *= 2 |
| 208 | 174 |
| 209 if not success: | 175 if not success: |
| 210 bad_git_urls.update([git_url]) | 176 results.bad_git_urls.add(git_url) |
| 211 | 177 |
| 212 # Get the Git hash based off the SVN rev. | 178 # Get the Git hash based off the SVN rev. |
| 213 git_hash = '' | 179 git_hash = '' |
| 214 if dep_rev != 'HEAD': | 180 if dep_rev != 'HEAD': |
| 215 if dep in deps_overrides and deps_overrides[dep]: | 181 if dep in deps_overrides and deps_overrides[dep]: |
| 216 # Transfer any required variables over from SVN DEPS. | 182 # Transfer any required variables over from SVN DEPS. |
| 217 if not deps_overrides[dep] in svn_deps_vars: | 183 if not deps_overrides[dep] in svn_deps_vars: |
| 218 if options.no_fail_fast: | 184 if options.no_fail_fast: |
| 219 bad_override.append(deps_overrides[dep]) | 185 results.bad_override.append(deps_overrides[dep]) |
| 220 continue | 186 continue |
| 221 raise Exception('Missing DEPS variable: %s' % deps_overrides[dep]) | 187 raise RuntimeError( |
| 222 deps_vars[deps_overrides[dep]] = ( | 188 'Missing DEPS variable: %s' % deps_overrides[dep]) |
| 223 '@' + svn_deps_vars[deps_overrides[dep]].lstrip('@')) | 189 var_override = svn_deps_vars[deps_overrides[dep]] |
| 190 results.deps_vars[deps_overrides[dep]] = ( |
| 191 '@' + var_override.lstrip('@')) |
| 192 |
| 224 # Tag this variable as needing a transform by Varify() later. | 193 # Tag this variable as needing a transform by Varify() later. |
| 225 git_hash = '%s_%s' % (deps_utils.VARIFY_MARKER_TAG_PREFIX, | 194 git_hash = '%s_%s' % (deps_utils.VARIFY_MARKER_TAG_PREFIX, |
| 226 deps_overrides[dep]) | 195 deps_overrides[dep]) |
| 227 else: | 196 else: |
| 228 # Pass-through the hash for Git repositories. Resolve the hash for | 197 # Pass-through the hash for Git repositories. Resolve the hash for |
| 229 # subversion repositories. | 198 # subversion repositories. |
| 230 if dep_url.endswith('.git'): | 199 if dep_url.endswith('.git'): |
| 231 git_hash = '@%s' % dep_rev | 200 git_hash = '@%s' % dep_rev |
| 232 else: | 201 else: |
| 233 try: | 202 try: |
| 234 git_hash = '@%s' % SvnRevToGitHash( | 203 git_hash = '@%s' % SvnRevToGitHash( |
| 235 dep_rev, git_url, options.repos, options.workspace, path, | 204 dep_rev, git_url, options.repos, options.workspace, path, |
| 236 git_host, svn_branch, options.cache_dir) | 205 git_host, svn_branch, options.cache_dir, outbuf, |
| 206 options.shallow) |
| 237 except Exception as e: | 207 except Exception as e: |
| 238 if options.no_fail_fast: | 208 if options.no_fail_fast: |
| 239 bad_git_hash.append(e) | 209 results.bad_git_hash.append(e) |
| 240 continue | 210 continue |
| 241 raise | 211 raise |
| 242 | 212 |
| 243 # If this is webkit, we need to add the var for the hash. | 213 # If this is webkit, we need to add the var for the hash. |
| 244 if dep == 'src/third_party/WebKit' and dep_rev: | 214 if dep == 'src/third_party/WebKit' and dep_rev: |
| 245 deps_vars['webkit_rev'] = git_hash | 215 results.deps_vars['webkit_rev'] = git_hash |
| 246 git_hash = 'VAR_WEBKIT_REV' | 216 git_hash = 'VAR_WEBKIT_REV' |
| 247 | 217 |
| 248 # Hack to preserve the angle_revision variable in .DEPS.git. | 218 # Hack to preserve the angle_revision variable in .DEPS.git. |
| 249 # This will go away as soon as deps2git does. | 219 # This will go away as soon as deps2git does. |
| 250 if dep == 'src/third_party/angle' and git_hash: | 220 if dep == 'src/third_party/angle' and git_hash: |
| 251 # Cut the leading '@' so this variable has the same semantics in | 221 # Cut the leading '@' so this variable has the same semantics in |
| 252 # DEPS and .DEPS.git. | 222 # DEPS and .DEPS.git. |
| 253 deps_vars['angle_revision'] = git_hash[1:] | 223 results.deps_vars['angle_revision'] = git_hash[1:] |
| 254 git_hash = 'VAR_ANGLE_REVISION' | 224 git_hash = 'VAR_ANGLE_REVISION' |
| 255 | 225 |
| 256 # Add this Git dep to the new deps. | 226 # Add this Git dep to the new deps. |
| 257 new_deps[path] = '%s%s' % (git_url, git_hash) | 227 results.new_deps[path] = '%s%s' % (git_url, git_hash) |
| 258 | 228 |
| 259 return new_deps, bad_git_urls, bad_dep_urls, bad_override, bad_git_hash | 229 message_q.put(outbuf.getvalue()) |
| 230 |
| 231 |
| 232 def ConvertDepsToGit(deps, options, deps_vars, svn_deps_vars, svn_to_git_objs, |
| 233 deps_overrides): |
| 234 """Convert a 'deps' section in a DEPS file from SVN to Git.""" |
| 235 results = ConversionResults( |
| 236 new_deps={}, |
| 237 deps_vars=deps_vars, |
| 238 bad_git_urls=set([]), |
| 239 bad_dep_urls=[], |
| 240 bad_override=[], |
| 241 bad_git_hash=[] |
| 242 ) |
| 243 |
| 244 # Populate our deps list. |
| 245 deps_to_process = Queue.Queue() |
| 246 for dep, dep_url in deps.iteritems(): |
| 247 if not dep_url: # dep is 'None' and emitted to exclude the dep |
| 248 results.new_deps[dep] = None |
| 249 continue |
| 250 |
| 251 # Get the URL and the revision/hash for this dependency. |
| 252 dep_url, dep_rev = SplitScmUrl(deps[dep]) |
| 253 |
| 254 path = dep |
| 255 git_url = dep_url |
| 256 svn_branch = None |
| 257 git_host = dep_url |
| 258 |
| 259 if not dep_url.endswith('.git'): |
| 260 # Convert this SVN URL to a Git URL. |
| 261 for svn_git_converter in svn_to_git_objs: |
| 262 converted_data = svn_git_converter.SvnUrlToGitUrl(dep, dep_url) |
| 263 if converted_data: |
| 264 path, git_url, git_host = converted_data[:3] |
| 265 if len(converted_data) > 3: |
| 266 svn_branch = converted_data[3] |
| 267 break |
| 268 else: |
| 269 # Make all match failures fatal to catch errors early. When a match is |
| 270 # found, we break out of the loop so the exception is not thrown. |
| 271 if options.no_fail_fast: |
| 272 results.bad_dep_urls.append(dep_url) |
| 273 continue |
| 274 raise RuntimeError('No match found for %s' % dep_url) |
| 275 |
| 276 deps_to_process.put( |
| 277 Job(dep, git_url, dep_url, path, git_host, dep_rev, svn_branch)) |
| 278 |
| 279 threads = [] |
| 280 message_q = Queue.Queue() |
| 281 thread_args = (deps_to_process, message_q, options, deps_overrides, |
| 282 svn_deps_vars, results) |
| 283 num_threads = options.num_threads or deps_to_process.qsize() |
| 284 for _ in xrange(num_threads): |
| 285 th = threading.Thread(target=ConvertDepMain, args=thread_args) |
| 286 th.working_on = None |
| 287 th.start() |
| 288 threads.append(th) |
| 289 message_th = threading.Thread(target=MessageMain, args=(message_q, threads)) |
| 290 message_th.start() |
| 291 |
| 292 for th in threads: |
| 293 th.join() |
| 294 message_q.put(Queue.Empty) |
| 295 message_th.join() |
| 296 |
| 297 return results |
| 260 | 298 |
| 261 | 299 |
| 262 def main(): | 300 def main(): |
| 263 parser = optparse.OptionParser() | 301 parser = optparse.OptionParser() |
| 264 parser.add_option('-d', '--deps', default='DEPS', | 302 parser.add_option('-d', '--deps', default='DEPS', |
| 265 help='path to the DEPS file to convert') | 303 help='path to the DEPS file to convert') |
| 266 parser.add_option('-o', '--out', | 304 parser.add_option('-o', '--out', |
| 267 help='path to the converted DEPS file (default: stdout)') | 305 help='path to the converted DEPS file (default: stdout)') |
| 306 parser.add_option('-j', '--num-threads', type='int', default=4, |
| 307 help='Maximum number of threads') |
| 268 parser.add_option('-t', '--type', | 308 parser.add_option('-t', '--type', |
| 269 help='[DEPRECATED] type of DEPS file (public, etc)') | 309 help='[DEPRECATED] type of DEPS file (public, etc)') |
| 270 parser.add_option('-x', '--extra-rules', | 310 parser.add_option('-x', '--extra-rules', |
| 271 help='Path to file with additional conversion rules.') | 311 help='Path to file with additional conversion rules.') |
| 272 parser.add_option('-r', '--repos', | 312 parser.add_option('-r', '--repos', |
| 273 help='path to the directory holding all the Git repos') | 313 help='path to the directory holding all the Git repos') |
| 274 parser.add_option('-w', '--workspace', metavar='PATH', | 314 parser.add_option('-w', '--workspace', metavar='PATH', |
| 275 help='top level of a git-based gclient checkout') | 315 help='top level of a git-based gclient checkout') |
| 276 parser.add_option('-c', '--cache_dir', | 316 parser.add_option('-c', '--cache_dir', |
| 277 help='top level of a gclient git cache diretory.') | 317 help='top level of a gclient git cache diretory.') |
| (...skipping 21 matching lines...) Expand all Loading... |
| 299 'svn_to_git_%s.py' % options.type) | 339 'svn_to_git_%s.py' % options.type) |
| 300 if options.cache_dir and options.repos: | 340 if options.cache_dir and options.repos: |
| 301 parser.error('Can\'t specify both cache_dir and repos at the same time.') | 341 parser.error('Can\'t specify both cache_dir and repos at the same time.') |
| 302 if options.shallow and not options.cache_dir: | 342 if options.shallow and not options.cache_dir: |
| 303 parser.error('--shallow only supported with --cache_dir.') | 343 parser.error('--shallow only supported with --cache_dir.') |
| 304 | 344 |
| 305 if options.cache_dir: | 345 if options.cache_dir: |
| 306 options.cache_dir = os.path.abspath(options.cache_dir) | 346 options.cache_dir = os.path.abspath(options.cache_dir) |
| 307 | 347 |
| 308 if options.extra_rules and not os.path.exists(options.extra_rules): | 348 if options.extra_rules and not os.path.exists(options.extra_rules): |
| 309 raise Exception('Can\'t locate rules file "%s".' % options.extra_rules) | 349 raise RuntimeError('Can\'t locate rules file "%s".' % options.extra_rules) |
| 310 | 350 |
| 311 # Create a var containing the Git and Webkit URL, this will make it easy for | 351 # Create a var containing the Git and Webkit URL, this will make it easy for |
| 312 # people to use a mirror instead. | 352 # people to use a mirror instead. |
| 313 git_url = 'https://chromium.googlesource.com' | 353 git_url = 'https://chromium.googlesource.com' |
| 314 deps_vars = { | 354 deps_vars = { |
| 315 'git_url': git_url, | 355 'git_url': git_url, |
| 316 'webkit_url': git_url + '/chromium/blink.git', | 356 'webkit_url': git_url + '/chromium/blink.git', |
| 317 } | 357 } |
| 318 | 358 |
| 319 # Find and load svn_to_git_* modules that handle the URL mapping. | 359 # Find and load svn_to_git_* modules that handle the URL mapping. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 344 print >> sys.stderr, 'Could not parse %s' % gclient_file | 384 print >> sys.stderr, 'Could not parse %s' % gclient_file |
| 345 raise | 385 raise |
| 346 target_os = gclient_dict.get('target_os', []) | 386 target_os = gclient_dict.get('target_os', []) |
| 347 if not target_os or not gclient_dict.get('target_os_only'): | 387 if not target_os or not gclient_dict.get('target_os_only'): |
| 348 target_os.append(DEPS_OS_CHOICES.get(sys.platform, 'unix')) | 388 target_os.append(DEPS_OS_CHOICES.get(sys.platform, 'unix')) |
| 349 if 'all' not in target_os: | 389 if 'all' not in target_os: |
| 350 deps_os = dict([(k, v) for k, v in deps_os.iteritems() if k in target_os]) | 390 deps_os = dict([(k, v) for k, v in deps_os.iteritems() if k in target_os]) |
| 351 if not options.cache_dir and 'cache_dir' in gclient_dict: | 391 if not options.cache_dir and 'cache_dir' in gclient_dict: |
| 352 options.cache_dir = os.path.abspath(gclient_dict['cache_dir']) | 392 options.cache_dir = os.path.abspath(gclient_dict['cache_dir']) |
| 353 | 393 |
| 394 if options.cache_dir: |
| 395 git_cache.Mirror.SetCachePath(options.cache_dir) |
| 396 else: |
| 397 try: |
| 398 options.cache_dir = git_cache.Mirror.GetCachePath() |
| 399 except RuntimeError: |
| 400 pass |
| 401 |
| 354 # Do general pre-processing of the DEPS data. | 402 # Do general pre-processing of the DEPS data. |
| 355 for svn_git_converter in svn_to_git_objs: | 403 for svn_git_converter in svn_to_git_objs: |
| 356 if hasattr(svn_git_converter, 'CleanDeps'): | 404 if hasattr(svn_git_converter, 'CleanDeps'): |
| 357 svn_git_converter.CleanDeps(deps, deps_os, include_rules, | 405 svn_git_converter.CleanDeps(deps, deps_os, include_rules, |
| 358 skip_child_includes, hooks, svn_deps_vars) | 406 skip_child_includes, hooks, svn_deps_vars) |
| 359 | 407 |
| 360 # Convert the DEPS file to Git. | 408 # Convert the DEPS file to Git. |
| 361 deps, baddeps, badmaps, badvars, badhashes = ConvertDepsToGit( | 409 results = ConvertDepsToGit( |
| 362 deps, options, deps_vars, svn_deps_vars, svn_to_git_objs, deps_overrides) | 410 deps, options, deps_vars, svn_deps_vars, svn_to_git_objs, deps_overrides) |
| 363 for os_dep in deps_os: | 411 for os_dep in deps_os: |
| 364 result = ConvertDepsToGit(deps_os[os_dep], options, deps_vars, | 412 os_results = ConvertDepsToGit(deps_os[os_dep], options, deps_vars, |
| 365 svn_deps_vars, svn_to_git_objs, deps_overrides) | 413 svn_deps_vars, svn_to_git_objs, deps_overrides) |
| 366 deps_os[os_dep] = result[0] | 414 deps_os[os_dep] = os_results.new_deps |
| 367 baddeps = baddeps.union(result[1]) | 415 results.bad_git_urls.update(os_results.bad_git_urls) |
| 368 badmaps.extend(result[2]) | 416 results.bad_dep_urls.extend(os_results.bad_dep_urls) |
| 369 badvars.extend(result[3]) | 417 results.bad_override.extend(os_results.bad_override) |
| 370 badhashes.extend(result[4]) | 418 results.bad_git_hash.extend(os_results.bad_git_hash) |
| 371 | 419 |
| 372 if options.json: | 420 if options.json: |
| 373 with open(options.json, 'w') as f: | 421 with open(options.json, 'w') as f: |
| 374 json.dump(list(baddeps), f, sort_keys=True, indent=2) | 422 json.dump(list(results.bad_git_urls), f, sort_keys=True, indent=2) |
| 375 | 423 |
| 376 if baddeps: | 424 if results.bad_git_urls: |
| 377 print >> sys.stderr, ('\nUnable to resolve the following repositories. ' | 425 print >> sys.stderr, ('\nUnable to resolve the following repositories. ' |
| 378 'Please make sure\nthat any svn URLs have a git mirror associated with ' | 426 'Please make sure\nthat any svn URLs have a git mirror associated with ' |
| 379 'them.\nTo see the exact error, run `git ls-remote [repository]` where' | 427 'them.\nTo see the exact error, run `git ls-remote [repository]` where' |
| 380 '\n[repository] is the URL ending in .git (strip off the @revision\n' | 428 '\n[repository] is the URL ending in .git (strip off the @revision\n' |
| 381 'number.) For more information, visit http://code.google.com\n' | 429 'number.) For more information, visit http://code.google.com\n' |
| 382 '/p/chromium/wiki/UsingGit#Adding_new_repositories_to_DEPS.\n') | 430 '/p/chromium/wiki/UsingGit#Adding_new_repositories_to_DEPS.\n') |
| 383 for dep in baddeps: | 431 for dep in results.bad_git_urls: |
| 384 print >> sys.stderr, ' ' + dep | 432 print >> sys.stderr, ' ' + dep |
| 385 if badmaps: | 433 if results.bad_dep_urls: |
| 386 print >> sys.stderr, '\nNo mappings found for the following urls:\n' | 434 print >> sys.stderr, '\nNo mappings found for the following urls:\n' |
| 387 for bad in badmaps: | 435 for bad in results.bad_dep_urls: |
| 388 print >> sys.stderr, ' ' + bad | 436 print >> sys.stderr, ' ' + bad |
| 389 if badvars: | 437 if results.bad_override: |
| 390 print >> sys.stderr, '\nMissing DEPS variables for overrides:\n' | 438 print >> sys.stderr, '\nMissing DEPS variables for overrides:\n' |
| 391 for bad in badvars: | 439 for bad in results.bad_override: |
| 392 print >> sys.stderr, ' ' + bad | 440 print >> sys.stderr, ' ' + bad |
| 393 if badhashes: | 441 if results.bad_git_hash: |
| 394 print >> sys.stderr, '\nsvn rev to git hash failures:\n' | 442 print >> sys.stderr, '\nsvn rev to git hash failures:\n' |
| 395 for bad in badhashes: | 443 for bad in results.bad_git_hash: |
| 396 print >> sys.stderr, ' ' + str(bad) | 444 print >> sys.stderr, ' ' + str(bad) |
| 397 | 445 |
| 398 if baddeps or badmaps or badvars or badhashes: | 446 if (results.bad_git_urls or results.bad_dep_urls or |
| 447 results.bad_override or results.bad_git_hash): |
| 399 return 2 | 448 return 2 |
| 400 | 449 |
| 401 if options.verify: | 450 if options.verify: |
| 402 print >> sys.stderr, ('\nAll referenced repositories were successfully ' | 451 print >> sys.stderr, ('\nAll referenced repositories were successfully ' |
| 403 'resolved.') | 452 'resolved.') |
| 404 return 0 | 453 return 0 |
| 405 | 454 |
| 406 # Write the DEPS file to disk. | 455 # Write the DEPS file to disk. |
| 407 deps_utils.WriteDeps(options.out, deps_vars, deps, deps_os, include_rules, | 456 deps_utils.WriteDeps(options.out, deps_vars, results.new_deps, deps_os, |
| 408 skip_child_includes, hooks) | 457 include_rules, skip_child_includes, hooks) |
| 409 return 0 | 458 return 0 |
| 410 | 459 |
| 411 | 460 |
| 412 if '__main__' == __name__: | 461 if '__main__' == __name__: |
| 413 sys.exit(main()) | 462 sys.exit(main()) |
| OLD | NEW |