|
|
|
|
@ -69,7 +69,6 @@ import watchlists
|
|
|
|
|
__version__ = '2.0'
|
|
|
|
|
|
|
|
|
|
COMMIT_BOT_EMAIL = 'commit-bot@chromium.org'
|
|
|
|
|
DEFAULT_SERVER = 'https://codereview.chromium.org'
|
|
|
|
|
POSTUPSTREAM_HOOK = '.git/hooks/post-cl-land'
|
|
|
|
|
DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup'
|
|
|
|
|
REFS_THAT_ALIAS_TO_OTHER_REFS = {
|
|
|
|
|
@ -807,7 +806,6 @@ class BuildbucketResponseException(Exception):
|
|
|
|
|
|
|
|
|
|
class Settings(object):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.default_server = None
|
|
|
|
|
self.cc = None
|
|
|
|
|
self.root = None
|
|
|
|
|
self.tree_status_url = None
|
|
|
|
|
@ -817,8 +815,6 @@ class Settings(object):
|
|
|
|
|
self.squash_gerrit_uploads = None
|
|
|
|
|
self.gerrit_skip_ensure_authenticated = None
|
|
|
|
|
self.git_editor = None
|
|
|
|
|
self.project = None
|
|
|
|
|
self.force_https_commit_url = None
|
|
|
|
|
|
|
|
|
|
def LazyUpdateIfNeeded(self):
|
|
|
|
|
"""Updates the settings from a codereview.settings file, if available."""
|
|
|
|
|
@ -834,20 +830,6 @@ class Settings(object):
|
|
|
|
|
LoadCodereviewSettingsFromFile(cr_settings_file)
|
|
|
|
|
self.updated = True
|
|
|
|
|
|
|
|
|
|
def GetDefaultServerUrl(self, error_ok=False):
|
|
|
|
|
if not self.default_server:
|
|
|
|
|
self.LazyUpdateIfNeeded()
|
|
|
|
|
self.default_server = gclient_utils.UpgradeToHttps(
|
|
|
|
|
self._GetRietveldConfig('server', error_ok=True))
|
|
|
|
|
if error_ok:
|
|
|
|
|
return self.default_server
|
|
|
|
|
if not self.default_server:
|
|
|
|
|
error_message = ('Could not find settings file. You must configure '
|
|
|
|
|
'your review setup by running "git cl config".')
|
|
|
|
|
self.default_server = gclient_utils.UpgradeToHttps(
|
|
|
|
|
self._GetRietveldConfig('server', error_message=error_message))
|
|
|
|
|
return self.default_server
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def GetRelativeRoot():
|
|
|
|
|
return RunGit(['rev-parse', '--show-cdup']).strip()
|
|
|
|
|
@ -857,50 +839,30 @@ class Settings(object):
|
|
|
|
|
self.root = os.path.abspath(self.GetRelativeRoot())
|
|
|
|
|
return self.root
|
|
|
|
|
|
|
|
|
|
def GetGitMirror(self, remote='origin'):
|
|
|
|
|
"""If this checkout is from a local git mirror, return a Mirror object."""
|
|
|
|
|
local_url = RunGit(['config', '--get', 'remote.%s.url' % remote]).strip()
|
|
|
|
|
if not os.path.isdir(local_url):
|
|
|
|
|
return None
|
|
|
|
|
git_cache.Mirror.SetCachePath(os.path.dirname(local_url))
|
|
|
|
|
remote_url = git_cache.Mirror.CacheDirToUrl(local_url)
|
|
|
|
|
# Use the /dev/null print_func to avoid terminal spew.
|
|
|
|
|
mirror = git_cache.Mirror(remote_url, print_func=lambda *args: None)
|
|
|
|
|
if mirror.exists():
|
|
|
|
|
return mirror
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def GetTreeStatusUrl(self, error_ok=False):
|
|
|
|
|
if not self.tree_status_url:
|
|
|
|
|
error_message = ('You must configure your tree status URL by running '
|
|
|
|
|
'"git cl config".')
|
|
|
|
|
self.tree_status_url = self._GetRietveldConfig(
|
|
|
|
|
'tree-status-url', error_ok=error_ok, error_message=error_message)
|
|
|
|
|
self.tree_status_url = self._GetConfig(
|
|
|
|
|
'rietveld.tree-status-url', error_ok=error_ok,
|
|
|
|
|
error_message=error_message)
|
|
|
|
|
return self.tree_status_url
|
|
|
|
|
|
|
|
|
|
def GetViewVCUrl(self):
|
|
|
|
|
if not self.viewvc_url:
|
|
|
|
|
self.viewvc_url = self._GetRietveldConfig('viewvc-url', error_ok=True)
|
|
|
|
|
self.viewvc_url = self._GetConfig('rietveld.viewvc-url', error_ok=True)
|
|
|
|
|
return self.viewvc_url
|
|
|
|
|
|
|
|
|
|
def GetBugPrefix(self):
|
|
|
|
|
return self._GetRietveldConfig('bug-prefix', error_ok=True)
|
|
|
|
|
|
|
|
|
|
def GetIsSkipDependencyUpload(self, branch_name):
|
|
|
|
|
"""Returns true if specified branch should skip dep uploads."""
|
|
|
|
|
return self._GetBranchConfig(branch_name, 'skip-deps-uploads',
|
|
|
|
|
error_ok=True)
|
|
|
|
|
return self._GetConfig('rietveld.bug-prefix', error_ok=True)
|
|
|
|
|
|
|
|
|
|
def GetRunPostUploadHook(self):
|
|
|
|
|
run_post_upload_hook = self._GetRietveldConfig(
|
|
|
|
|
'run-post-upload-hook', error_ok=True)
|
|
|
|
|
run_post_upload_hook = self._GetConfig(
|
|
|
|
|
'rietveld.run-post-upload-hook', error_ok=True)
|
|
|
|
|
return run_post_upload_hook == "True"
|
|
|
|
|
|
|
|
|
|
def GetDefaultCCList(self):
|
|
|
|
|
return self._GetRietveldConfig('cc', error_ok=True)
|
|
|
|
|
|
|
|
|
|
def GetDefaultPrivateFlag(self):
|
|
|
|
|
return self._GetRietveldConfig('private', error_ok=True)
|
|
|
|
|
return self._GetConfig('rietveld.cc', error_ok=True)
|
|
|
|
|
|
|
|
|
|
def GetIsGerrit(self):
|
|
|
|
|
"""Return true if this repo is associated with gerrit code review system."""
|
|
|
|
|
@ -950,24 +912,13 @@ class Settings(object):
|
|
|
|
|
return self.git_editor or None
|
|
|
|
|
|
|
|
|
|
def GetLintRegex(self):
|
|
|
|
|
return (self._GetRietveldConfig('cpplint-regex', error_ok=True) or
|
|
|
|
|
return (self._GetConfig('rietveld.cpplint-regex', error_ok=True) or
|
|
|
|
|
DEFAULT_LINT_REGEX)
|
|
|
|
|
|
|
|
|
|
def GetLintIgnoreRegex(self):
|
|
|
|
|
return (self._GetRietveldConfig('cpplint-ignore-regex', error_ok=True) or
|
|
|
|
|
return (self._GetConfig('rietveld.cpplint-ignore-regex', error_ok=True) or
|
|
|
|
|
DEFAULT_LINT_IGNORE_REGEX)
|
|
|
|
|
|
|
|
|
|
def GetProject(self):
|
|
|
|
|
if not self.project:
|
|
|
|
|
self.project = self._GetRietveldConfig('project', error_ok=True)
|
|
|
|
|
return self.project
|
|
|
|
|
|
|
|
|
|
def _GetRietveldConfig(self, param, **kwargs):
|
|
|
|
|
return self._GetConfig('rietveld.' + param, **kwargs)
|
|
|
|
|
|
|
|
|
|
def _GetBranchConfig(self, branch_name, param, **kwargs):
|
|
|
|
|
return self._GetConfig('branch.' + branch_name + '.' + param, **kwargs)
|
|
|
|
|
|
|
|
|
|
def _GetConfig(self, param, **kwargs):
|
|
|
|
|
self.LazyUpdateIfNeeded()
|
|
|
|
|
return RunGit(['config', param], **kwargs).strip()
|
|
|
|
|
@ -3344,13 +3295,11 @@ def LoadCodereviewSettingsFromFile(fileobj):
|
|
|
|
|
# Only server setting is required. Other settings can be absent.
|
|
|
|
|
# In that case, we ignore errors raised during option deletion attempt.
|
|
|
|
|
SetProperty('cc', 'CC_LIST', unset_error_ok=True)
|
|
|
|
|
SetProperty('private', 'PRIVATE', unset_error_ok=True)
|
|
|
|
|
SetProperty('tree-status-url', 'STATUS', unset_error_ok=True)
|
|
|
|
|
SetProperty('viewvc-url', 'VIEW_VC', unset_error_ok=True)
|
|
|
|
|
SetProperty('bug-prefix', 'BUG_PREFIX', unset_error_ok=True)
|
|
|
|
|
SetProperty('cpplint-regex', 'LINT_REGEX', unset_error_ok=True)
|
|
|
|
|
SetProperty('cpplint-ignore-regex', 'LINT_IGNORE_REGEX', unset_error_ok=True)
|
|
|
|
|
SetProperty('project', 'PROJECT', unset_error_ok=True)
|
|
|
|
|
SetProperty('run-post-upload-hook', 'RUN_POST_UPLOAD_HOOK',
|
|
|
|
|
unset_error_ok=True)
|
|
|
|
|
|
|
|
|
|
@ -3422,43 +3371,6 @@ def DownloadGerritHook(force):
|
|
|
|
|
'chmod +x .git/hooks/commit-msg' % src)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def GetRietveldCodereviewSettingsInteractively():
|
|
|
|
|
"""Prompt the user for settings."""
|
|
|
|
|
server = settings.GetDefaultServerUrl(error_ok=True)
|
|
|
|
|
prompt = 'Rietveld server (host[:port])'
|
|
|
|
|
prompt += ' [%s]' % (server or DEFAULT_SERVER)
|
|
|
|
|
newserver = ask_for_data(prompt + ':')
|
|
|
|
|
if not server and not newserver:
|
|
|
|
|
newserver = DEFAULT_SERVER
|
|
|
|
|
if newserver:
|
|
|
|
|
newserver = gclient_utils.UpgradeToHttps(newserver)
|
|
|
|
|
if newserver != server:
|
|
|
|
|
RunGit(['config', 'rietveld.server', newserver])
|
|
|
|
|
|
|
|
|
|
def SetProperty(initial, caption, name, is_url):
|
|
|
|
|
prompt = caption
|
|
|
|
|
if initial:
|
|
|
|
|
prompt += ' ("x" to clear) [%s]' % initial
|
|
|
|
|
new_val = ask_for_data(prompt + ':')
|
|
|
|
|
if new_val == 'x':
|
|
|
|
|
RunGit(['config', '--unset-all', 'rietveld.' + name], error_ok=True)
|
|
|
|
|
elif new_val:
|
|
|
|
|
if is_url:
|
|
|
|
|
new_val = gclient_utils.UpgradeToHttps(new_val)
|
|
|
|
|
if new_val != initial:
|
|
|
|
|
RunGit(['config', 'rietveld.' + name, new_val])
|
|
|
|
|
|
|
|
|
|
SetProperty(settings.GetDefaultCCList(), 'CC list', 'cc', False)
|
|
|
|
|
SetProperty(settings.GetDefaultPrivateFlag(),
|
|
|
|
|
'Private flag (rietveld only)', 'private', False)
|
|
|
|
|
SetProperty(settings.GetTreeStatusUrl(error_ok=True), 'Tree status URL',
|
|
|
|
|
'tree-status-url', False)
|
|
|
|
|
SetProperty(settings.GetViewVCUrl(), 'ViewVC URL', 'viewvc-url', True)
|
|
|
|
|
SetProperty(settings.GetBugPrefix(), 'Bug Prefix', 'bug-prefix', False)
|
|
|
|
|
SetProperty(settings.GetRunPostUploadHook(), 'Run Post Upload Hook',
|
|
|
|
|
'run-post-upload-hook', False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _GitCookiesChecker(object):
|
|
|
|
|
"""Provides facilities for validating and suggesting fixes to .gitcookies."""
|
|
|
|
|
|
|
|
|
|
@ -3766,43 +3678,6 @@ def CMDcreds_check(parser, args):
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@subcommand.usage('[repo root containing codereview.settings]')
|
|
|
|
|
@metrics.collector.collect_metrics('git cl config')
|
|
|
|
|
def CMDconfig(parser, args):
|
|
|
|
|
"""Edits configuration for this tree."""
|
|
|
|
|
|
|
|
|
|
print('WARNING: git cl config works for Rietveld only.')
|
|
|
|
|
# TODO(tandrii): remove this once we switch to Gerrit.
|
|
|
|
|
# See bugs http://crbug.com/637561 and http://crbug.com/600469.
|
|
|
|
|
parser.add_option('--activate-update', action='store_true',
|
|
|
|
|
help='activate auto-updating [rietveld] section in '
|
|
|
|
|
'.git/config')
|
|
|
|
|
parser.add_option('--deactivate-update', action='store_true',
|
|
|
|
|
help='deactivate auto-updating [rietveld] section in '
|
|
|
|
|
'.git/config')
|
|
|
|
|
options, args = parser.parse_args(args)
|
|
|
|
|
|
|
|
|
|
if options.deactivate_update:
|
|
|
|
|
RunGit(['config', 'rietveld.autoupdate', 'false'])
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if options.activate_update:
|
|
|
|
|
RunGit(['config', '--unset', 'rietveld.autoupdate'])
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if len(args) == 0:
|
|
|
|
|
GetRietveldCodereviewSettingsInteractively()
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
url = args[0]
|
|
|
|
|
if not url.endswith('codereview.settings'):
|
|
|
|
|
url = os.path.join(url, 'codereview.settings')
|
|
|
|
|
|
|
|
|
|
# Load code review settings and download hooks (if available).
|
|
|
|
|
LoadCodereviewSettingsFromFile(urllib2.urlopen(url))
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@metrics.collector.collect_metrics('git cl baseurl')
|
|
|
|
|
def CMDbaseurl(parser, args):
|
|
|
|
|
"""Gets or sets base-url for this branch."""
|
|
|
|
|
|