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

Side by Side Diff: gclient_scm.py

Issue 14826003: Refactor nag functionality in to NagTimer class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Fix nag_max Created 7 years, 7 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 | gclient_utils.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 (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 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 """Gclient-specific SCM-specific operations.""" 5 """Gclient-specific SCM-specific operations."""
6 6
7 import logging 7 import logging
8 import os 8 import os
9 import posixpath 9 import posixpath
10 import re 10 import re
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 return scm_class(url, root_dir, relpath) 109 return scm_class(url, root_dir, relpath)
110 110
111 111
112 # SCMWrapper base class 112 # SCMWrapper base class
113 113
114 class SCMWrapper(object): 114 class SCMWrapper(object):
115 """Add necessary glue between all the supported SCM. 115 """Add necessary glue between all the supported SCM.
116 116
117 This is the abstraction layer to bind to different SCM. 117 This is the abstraction layer to bind to different SCM.
118 """ 118 """
119 nag_timer = 30
120 nag_max = 3
121
119 def __init__(self, url=None, root_dir=None, relpath=None): 122 def __init__(self, url=None, root_dir=None, relpath=None):
120 self.url = url 123 self.url = url
121 self._root_dir = root_dir 124 self._root_dir = root_dir
122 if self._root_dir: 125 if self._root_dir:
123 self._root_dir = self._root_dir.replace('/', os.sep) 126 self._root_dir = self._root_dir.replace('/', os.sep)
124 self.relpath = relpath 127 self.relpath = relpath
125 if self.relpath: 128 if self.relpath:
126 self.relpath = self.relpath.replace('/', os.sep) 129 self.relpath = self.relpath.replace('/', os.sep)
127 if self.relpath and self._root_dir: 130 if self.relpath and self._root_dir:
128 self.checkout_path = os.path.join(self._root_dir, self.relpath) 131 self.checkout_path = os.path.join(self._root_dir, self.relpath)
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 """Generates a patch file which can be applied to the root of the 191 """Generates a patch file which can be applied to the root of the
189 repository. 192 repository.
190 193
191 The patch file is generated from a diff of the merge base of HEAD and 194 The patch file is generated from a diff of the merge base of HEAD and
192 its upstream branch. 195 its upstream branch.
193 """ 196 """
194 merge_base = self._Capture(['merge-base', 'HEAD', 'origin']) 197 merge_base = self._Capture(['merge-base', 'HEAD', 'origin'])
195 gclient_utils.CheckCallAndFilter( 198 gclient_utils.CheckCallAndFilter(
196 ['git', 'diff', merge_base], 199 ['git', 'diff', merge_base],
197 cwd=self.checkout_path, 200 cwd=self.checkout_path,
201 nag_timer=self.nag_timer,
202 nag_max=self.nag_max,
198 filter_fn=GitDiffFilterer(self.relpath).Filter) 203 filter_fn=GitDiffFilterer(self.relpath).Filter)
199 204
200 def UpdateSubmoduleConfig(self): 205 def UpdateSubmoduleConfig(self):
201 submod_cmd = ['git', 'config', '-f', '$toplevel/.git/config', 206 submod_cmd = ['git', 'config', '-f', '$toplevel/.git/config',
202 'submodule.$name.ignore', '||', 207 'submodule.$name.ignore', '||',
203 'git', 'config', '-f', '$toplevel/.git/config', 208 'git', 'config', '-f', '$toplevel/.git/config',
204 'submodule.$name.ignore', 'all'] 209 'submodule.$name.ignore', 'all']
205 cmd = ['git', 'submodule', '--quiet', 'foreach', ' '.join(submod_cmd)] 210 cmd = ['git', 'submodule', '--quiet', 'foreach', ' '.join(submod_cmd)]
206 cmd2 = ['git', 'config', 'diff.ignoreSubmodules', 'all'] 211 cmd2 = ['git', 'config', 'diff.ignoreSubmodules', 'all']
207 cmd3 = ['git', 'config', 'branch.autosetupmerge'] 212 cmd3 = ['git', 'config', 'branch.autosetupmerge']
208 cmd4 = ['git', 'config', 'fetch.recurseSubmodules', 'false'] 213 cmd4 = ['git', 'config', 'fetch.recurseSubmodules', 'false']
209 kwargs = {'cwd': self.checkout_path, 214 kwargs = {'cwd': self.checkout_path,
210 'print_stdout': False, 215 'print_stdout': False,
216 'nag_timer': self.nag_timer,
217 'nag_max': self.nag_max,
211 'filter_fn': lambda x: None} 218 'filter_fn': lambda x: None}
212 try: 219 try:
213 gclient_utils.CheckCallAndFilter(cmd, **kwargs) 220 gclient_utils.CheckCallAndFilter(cmd, **kwargs)
214 gclient_utils.CheckCallAndFilter(cmd2, **kwargs) 221 gclient_utils.CheckCallAndFilter(cmd2, **kwargs)
215 except subprocess2.CalledProcessError: 222 except subprocess2.CalledProcessError:
216 # Not a fatal error, or even very interesting in a non-git-submodule 223 # Not a fatal error, or even very interesting in a non-git-submodule
217 # world. So just keep it quiet. 224 # world. So just keep it quiet.
218 pass 225 pass
219 try: 226 try:
220 gclient_utils.CheckCallAndFilter(cmd3, **kwargs) 227 gclient_utils.CheckCallAndFilter(cmd3, **kwargs)
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 # Returns name of current branch or None for detached HEAD 852 # Returns name of current branch or None for detached HEAD
846 branch = self._Capture(['rev-parse', '--abbrev-ref=strict', 'HEAD']) 853 branch = self._Capture(['rev-parse', '--abbrev-ref=strict', 'HEAD'])
847 if branch == 'HEAD': 854 if branch == 'HEAD':
848 return None 855 return None
849 return branch 856 return branch
850 857
851 def _Capture(self, args): 858 def _Capture(self, args):
852 return subprocess2.check_output( 859 return subprocess2.check_output(
853 ['git'] + args, 860 ['git'] + args,
854 stderr=subprocess2.PIPE, 861 stderr=subprocess2.PIPE,
862 nag_timer=self.nag_timer,
863 nag_max=self.nag_max,
855 cwd=self.checkout_path).strip() 864 cwd=self.checkout_path).strip()
856 865
857 def _UpdateBranchHeads(self, options, fetch=False): 866 def _UpdateBranchHeads(self, options, fetch=False):
858 """Adds, and optionally fetches, "branch-heads" refspecs if requested.""" 867 """Adds, and optionally fetches, "branch-heads" refspecs if requested."""
859 if hasattr(options, 'with_branch_heads') and options.with_branch_heads: 868 if hasattr(options, 'with_branch_heads') and options.with_branch_heads:
860 backoff_time = 5 869 backoff_time = 5
861 for _ in range(3): 870 for _ in range(3):
862 try: 871 try:
863 config_cmd = ['config', 'remote.origin.fetch', 872 config_cmd = ['config', 'remote.origin.fetch',
864 '+refs/branch-heads/*:refs/remotes/branch-heads/*', 873 '+refs/branch-heads/*:refs/remotes/branch-heads/*',
865 '^\\+refs/branch-heads/\\*:.*$'] 874 '^\\+refs/branch-heads/\\*:.*$']
866 self._Run(config_cmd, options) 875 self._Run(config_cmd, options)
867 if fetch: 876 if fetch:
868 fetch_cmd = ['fetch', 'origin'] 877 fetch_cmd = ['fetch', 'origin']
869 if options.verbose: 878 if options.verbose:
870 fetch_cmd.append('--verbose') 879 fetch_cmd.append('--verbose')
871 self._Run(fetch_cmd, options) 880 self._Run(fetch_cmd, options)
872 break 881 break
873 except subprocess2.CalledProcessError, e: 882 except subprocess2.CalledProcessError, e:
874 print(str(e)) 883 print(str(e))
875 print('Retrying in %.1f seconds...' % backoff_time) 884 print('Retrying in %.1f seconds...' % backoff_time)
876 time.sleep(backoff_time) 885 time.sleep(backoff_time)
877 backoff_time *= 1.3 886 backoff_time *= 1.3
878 887
879 def _Run(self, args, options, **kwargs): 888 def _Run(self, args, options, **kwargs):
880 kwargs.setdefault('cwd', self.checkout_path) 889 kwargs.setdefault('cwd', self.checkout_path)
881 kwargs.setdefault('print_stdout', True) 890 kwargs.setdefault('print_stdout', True)
891 kwargs.setdefault('nag_timer', self.nag_timer)
892 kwargs.setdefault('nag_max', self.nag_max)
882 stdout = kwargs.get('stdout', sys.stdout) 893 stdout = kwargs.get('stdout', sys.stdout)
883 stdout.write('\n________ running \'git %s\' in \'%s\'\n' % ( 894 stdout.write('\n________ running \'git %s\' in \'%s\'\n' % (
884 ' '.join(args), kwargs['cwd'])) 895 ' '.join(args), kwargs['cwd']))
885 gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs) 896 gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs)
886 897
887 898
888 class SVNWrapper(SCMWrapper): 899 class SVNWrapper(SCMWrapper):
889 """ Wrapper for SVN """ 900 """ Wrapper for SVN """
890 901
891 @staticmethod 902 @staticmethod
(...skipping 29 matching lines...) Expand all
921 def pack(self, options, args, file_list): 932 def pack(self, options, args, file_list):
922 """Generates a patch file which can be applied to the root of the 933 """Generates a patch file which can be applied to the root of the
923 repository.""" 934 repository."""
924 if not os.path.isdir(self.checkout_path): 935 if not os.path.isdir(self.checkout_path):
925 raise gclient_utils.Error('Directory %s is not present.' % 936 raise gclient_utils.Error('Directory %s is not present.' %
926 self.checkout_path) 937 self.checkout_path)
927 gclient_utils.CheckCallAndFilter( 938 gclient_utils.CheckCallAndFilter(
928 ['svn', 'diff', '-x', '--ignore-eol-style'] + args, 939 ['svn', 'diff', '-x', '--ignore-eol-style'] + args,
929 cwd=self.checkout_path, 940 cwd=self.checkout_path,
930 print_stdout=False, 941 print_stdout=False,
942 nag_timer=self.nag_timer,
943 nag_max=self.nag_max,
931 filter_fn=SvnDiffFilterer(self.relpath).Filter) 944 filter_fn=SvnDiffFilterer(self.relpath).Filter)
932 945
933 def update(self, options, args, file_list): 946 def update(self, options, args, file_list):
934 """Runs svn to update or transparently checkout the working copy. 947 """Runs svn to update or transparently checkout the working copy.
935 948
936 All updated files will be appended to file_list. 949 All updated files will be appended to file_list.
937 950
938 Raises: 951 Raises:
939 Error: if can't get URL for relative path. 952 Error: if can't get URL for relative path.
940 """ 953 """
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 'correct.') % rev) 1231 'correct.') % rev)
1219 return rev 1232 return rev
1220 1233
1221 def FullUrlForRelativeUrl(self, url): 1234 def FullUrlForRelativeUrl(self, url):
1222 # Find the forth '/' and strip from there. A bit hackish. 1235 # Find the forth '/' and strip from there. A bit hackish.
1223 return '/'.join(self.url.split('/')[:4]) + url 1236 return '/'.join(self.url.split('/')[:4]) + url
1224 1237
1225 def _Run(self, args, options, **kwargs): 1238 def _Run(self, args, options, **kwargs):
1226 """Runs a commands that goes to stdout.""" 1239 """Runs a commands that goes to stdout."""
1227 kwargs.setdefault('cwd', self.checkout_path) 1240 kwargs.setdefault('cwd', self.checkout_path)
1241 kwargs.setdefault('nag_timer', self.nag_timer)
1242 kwargs.setdefault('nag_max', self.nag_max)
1228 gclient_utils.CheckCallAndFilterAndHeader(['svn'] + args, 1243 gclient_utils.CheckCallAndFilterAndHeader(['svn'] + args,
1229 always=options.verbose, **kwargs) 1244 always=options.verbose, **kwargs)
1230 1245
1231 def _RunAndGetFileList(self, args, options, file_list, cwd=None): 1246 def _RunAndGetFileList(self, args, options, file_list, cwd=None):
1232 """Runs a commands that goes to stdout and grabs the file listed.""" 1247 """Runs a commands that goes to stdout and grabs the file listed."""
1233 cwd = cwd or self.checkout_path 1248 cwd = cwd or self.checkout_path
1234 scm.SVN.RunAndGetFileList( 1249 scm.SVN.RunAndGetFileList(
1235 options.verbose, 1250 options.verbose,
1236 args + ['--ignore-externals'], 1251 args + ['--ignore-externals'],
1237 cwd=cwd, 1252 cwd=cwd,
(...skipping 22 matching lines...) Expand all
1260 new_command.append('--force') 1275 new_command.append('--force')
1261 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1276 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1262 new_command.extend(('--accept', 'theirs-conflict')) 1277 new_command.extend(('--accept', 'theirs-conflict'))
1263 elif options.manually_grab_svn_rev: 1278 elif options.manually_grab_svn_rev:
1264 new_command.append('--force') 1279 new_command.append('--force')
1265 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1280 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1266 new_command.extend(('--accept', 'postpone')) 1281 new_command.extend(('--accept', 'postpone'))
1267 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1282 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1268 new_command.extend(('--accept', 'postpone')) 1283 new_command.extend(('--accept', 'postpone'))
1269 return new_command 1284 return new_command
OLDNEW
« no previous file with comments | « no previous file | gclient_utils.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698