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

Side by Side Diff: recipe_modules/git/api.py

Issue 2173823002: git recipe_module: add experimental git-cache support. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: improved Created 4 years, 5 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
« no previous file with comments | « no previous file | recipe_modules/git/example.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import itertools 5 import itertools
6 import re 6 import re
7 7
8 from recipe_engine import recipe_api 8 from recipe_engine import recipe_api
9 9
10 class GitApi(recipe_api.RecipeApi): 10 class GitApi(recipe_api.RecipeApi):
11 _GIT_HASH_RE = re.compile('[0-9a-f]{40}', re.IGNORECASE) 11 _GIT_HASH_RE = re.compile('[0-9a-f]{40}', re.IGNORECASE)
12 12
13 def __init__(self, *args, **kwargs): 13 def __init__(self, *args, **kwargs):
14 super(GitApi, self).__init__(*args, **kwargs) 14 super(GitApi, self).__init__(*args, **kwargs)
15 self.initialized_win_git = False 15 self.initialized_win_git = False
16 16
17 def __call__(self, *args, **kwargs): 17 def __call__(self, *args, **kwargs):
18 """Return a git command step.""" 18 """Return a git command step."""
19 name = kwargs.pop('name', 'git '+args[0]) 19 name = kwargs.pop('name', 'git ' + args[0])
20 infra_step = kwargs.pop('infra_step', True) 20 infra_step = kwargs.pop('infra_step', True)
21 if 'cwd' not in kwargs: 21 if 'cwd' not in kwargs:
22 kwargs.setdefault('cwd', self.m.path['checkout']) 22 kwargs.setdefault('cwd', self.m.path['checkout'])
23 git_cmd = ['git'] 23 git_cmd = ['git']
24 if self.m.platform.is_win: 24 if self.m.platform.is_win:
25 self.ensure_win_git_tooling() 25 self.ensure_win_git_tooling()
26 git_cmd = [self.package_repo_resource('git.bat')] 26 git_cmd = [self.package_repo_resource('git.bat')]
27 options = kwargs.pop('git_config_options', {}) 27 options = kwargs.pop('git_config_options', {})
28 for k, v in sorted(options.iteritems()): 28 for k, v in sorted(options.iteritems()):
29 git_cmd.extend(['-c', '%s=%s' % (k, v)]) 29 git_cmd.extend(['-c', '%s=%s' % (k, v)])
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 if can_fail_build: 126 if can_fail_build:
127 raise recipe_api.InfraFailure('count-objects failed: %s' % ex) 127 raise recipe_api.InfraFailure('count-objects failed: %s' % ex)
128 return None 128 return None
129 129
130 def checkout(self, url, ref=None, dir_path=None, recursive=False, 130 def checkout(self, url, ref=None, dir_path=None, recursive=False,
131 submodules=True, submodule_update_force=False, 131 submodules=True, submodule_update_force=False,
132 keep_paths=None, step_suffix=None, 132 keep_paths=None, step_suffix=None,
133 curl_trace_file=None, can_fail_build=True, 133 curl_trace_file=None, can_fail_build=True,
134 set_got_revision=False, remote_name=None, 134 set_got_revision=False, remote_name=None,
135 display_fetch_size=None, file_name=None, 135 display_fetch_size=None, file_name=None,
136 submodule_update_recursive=True): 136 submodule_update_recursive=True,
137 """Returns an iterable of steps to perform a full git checkout. 137 use_git_cache=False):
138 """Performs a full git checkout and returns sha1 of checked out revision.
139
138 Args: 140 Args:
139 url (str): url of remote repo to use as upstream 141 url (str): url of remote repo to use as upstream
140 ref (str): ref to fetch and check out 142 ref (str): ref to fetch and check out
141 dir_path (Path): optional directory to clone into 143 dir_path (Path): optional directory to clone into
142 recursive (bool): whether to recursively fetch submodules or not 144 recursive (bool): whether to recursively fetch submodules or not
143 submodules (bool): whether to sync and update submodules or not 145 submodules (bool): whether to sync and update submodules or not
144 submodule_update_force (bool): whether to update submodules with --force 146 submodule_update_force (bool): whether to update submodules with --force
145 keep_paths (iterable of strings): paths to ignore during git-clean; 147 keep_paths (iterable of strings): paths to ignore during git-clean;
146 paths are gitignore-style patterns relative to checkout_path. 148 paths are gitignore-style patterns relative to checkout_path.
147 step_suffix (str): suffix to add to a each step name 149 step_suffix (str): suffix to add to a each step name
148 curl_trace_file (Path): if not None, dump GIT_CURL_VERBOSE=1 trace to that 150 curl_trace_file (Path): if not None, dump GIT_CURL_VERBOSE=1 trace to that
149 file. Useful for debugging git issue reproducible only on bots. It has 151 file. Useful for debugging git issue reproducible only on bots. It has
150 a side effect of all stderr output of 'git fetch' going to that file. 152 a side effect of all stderr output of 'git fetch' going to that file.
151 can_fail_build (bool): if False, ignore errors during fetch or checkout. 153 can_fail_build (bool): if False, ignore errors during fetch or checkout.
152 set_got_revision (bool): if True, resolves HEAD and sets got_revision 154 set_got_revision (bool): if True, resolves HEAD and sets got_revision
153 property. 155 property.
154 remote_name (str): name of the git remote to use 156 remote_name (str): name of the git remote to use
155 display_fetch_size (bool): if True, run `git count-objects` before and 157 display_fetch_size (bool): if True, run `git count-objects` before and
156 after fetch and display delta. Adds two more steps. Defaults to False. 158 after fetch and display delta. Adds two more steps. Defaults to False.
157 file_name (str): optional path to a single file to checkout. 159 file_name (str): optional path to a single file to checkout.
158 submodule_update_recursive (bool): if True, updates submodules 160 submodule_update_recursive (bool): if True, updates submodules
159 recursively. 161 recursively.
162 use_git_cache (bool): if True, git cache will be used for this checkout.
163 WARNING, this is EXPERIMENTAL!!! This wasn't tested with:
164 * submodules
165 * since origin url is modified
166 to a local path, may cause problem with scripts that do
167 "git fetch origin" or "git push origin".
168 * arbitrary refs such refs/whatever/not-fetched-by-default-to-cache
160 169
161 Returns: If the checkout was successful, this returns the commit hash of 170 Returns: If the checkout was successful, this returns the commit hash of
162 the checked-out-repo. Otherwise this returns None. 171 the checked-out-repo. Otherwise this returns None.
163 """ 172 """
164 retVal = None 173 retVal = None
165 174
166 # TODO(robertocn): Break this function and refactor calls to it. 175 # TODO(robertocn): Break this function and refactor calls to it.
167 # The problem is that there are way too many unrealated use cases for 176 # The problem is that there are way too many unrealated use cases for
168 # it, and the function's signature is getting unwieldy and its body 177 # it, and the function's signature is getting unwieldy and its body
169 # unreadable. 178 # unreadable.
(...skipping 22 matching lines...) Expand all
192 self.ensure_win_git_tooling() 201 self.ensure_win_git_tooling()
193 git_setup_args += [ 202 git_setup_args += [
194 '--git_cmd_path', self.package_repo_resource('git.bat')] 203 '--git_cmd_path', self.package_repo_resource('git.bat')]
195 204
196 step_suffix = '' if step_suffix is None else ' (%s)' % step_suffix 205 step_suffix = '' if step_suffix is None else ' (%s)' % step_suffix
197 self.m.python( 206 self.m.python(
198 'git setup%s' % step_suffix, 207 'git setup%s' % step_suffix,
199 self.resource('git_setup.py'), 208 self.resource('git_setup.py'),
200 git_setup_args) 209 git_setup_args)
201 210
211 if use_git_cache:
212 self('retry', 'cache', 'fetch', '-c', self.m.path['git_cache'],
213 cwd=dir_path,
214 name='fetch cache',
215 can_fail_build=can_fail_build)
216
202 # There are five kinds of refs we can be handed: 217 # There are five kinds of refs we can be handed:
203 # 0) None. In this case, we default to properties['branch']. 218 # 0) None. In this case, we default to properties['branch'].
204 # 1) A 40-character SHA1 hash. 219 # 1) A 40-character SHA1 hash.
205 # 2) A fully-qualifed arbitrary ref, e.g. 'refs/foo/bar/baz'. 220 # 2) A fully-qualifed arbitrary ref, e.g. 'refs/foo/bar/baz'.
206 # 3) A fully qualified branch name, e.g. 'refs/heads/master'. 221 # 3) A fully qualified branch name, e.g. 'refs/heads/master'.
207 # Chop off 'refs/heads' and now it matches case (4). 222 # Chop off 'refs/heads' and now it matches case (4).
208 # 4) A branch name, e.g. 'master'. 223 # 4) A branch name, e.g. 'master'.
209 # Note that 'FETCH_HEAD' can be many things (and therefore not a valid 224 # Note that 'FETCH_HEAD' can be many things (and therefore not a valid
210 # checkout target) if many refs are fetched, but we only explicitly fetch 225 # checkout target) if many refs are fetched, but we only explicitly fetch
211 # one ref here, so this is safe. 226 # one ref here, so this is safe.
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 384
370 Args: 385 Args:
371 bundle_path (Path): The path of the output bundle. 386 bundle_path (Path): The path of the output bundle.
372 refs (list): The list of refs to include in the bundle. If None, all 387 refs (list): The list of refs to include in the bundle. If None, all
373 refs in the Git checkout will be bundled. 388 refs in the Git checkout will be bundled.
374 kwargs: Forwarded to '__call__'. 389 kwargs: Forwarded to '__call__'.
375 """ 390 """
376 if not rev_list_args: 391 if not rev_list_args:
377 rev_list_args = ['--all'] 392 rev_list_args = ['--all']
378 self('bundle', 'create', bundle_path, *rev_list_args, **kwargs) 393 self('bundle', 'create', bundle_path, *rev_list_args, **kwargs)
OLDNEW
« no previous file with comments | « no previous file | recipe_modules/git/example.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698