Merge "Catch errors centrally, and bail out more"

This commit is contained in:
Jenkins 2013-12-02 19:23:19 +00:00 committed by Gerrit Code Review
commit e3903d9d13

View File

@ -302,13 +302,14 @@ def find_description_override(repo_path):
return None return None
def make_local_copy(repo_path, project_created, project, project_list, def make_local_copy(repo_path, project, project_list,
git_opts, ssh_env, upstream, GERRIT_HOST, GERRIT_PORT, git_opts, ssh_env, upstream, GERRIT_HOST, GERRIT_PORT,
project_git, GERRIT_GITID, track_upstream): project_git, GERRIT_GITID):
# If we don't have a local copy already, get one
if not os.path.exists(repo_path) or project_created: # Ensure that the base location exists
if not os.path.exists(os.path.dirname(repo_path)): if not os.path.exists(os.path.dirname(repo_path)):
os.makedirs(os.path.dirname(repo_path)) os.makedirs(os.path.dirname(repo_path))
# Three choices # Three choices
# - If gerrit has it, get from gerrit # - If gerrit has it, get from gerrit
# - If gerrit doesn't have it: # - If gerrit doesn't have it:
@ -316,6 +317,9 @@ def make_local_copy(repo_path, project_created, project, project_list,
# - If it doesn't, create it # - If it doesn't, create it
# Gerrit knows about the project, clone it # Gerrit knows about the project, clone it
# TODO(mordred): there is a possible failure condition here
# we should consider 'gerrit has it' to be
# 'gerrit repo has a master branch'
if project in project_list: if project in project_list:
run_command( run_command(
"git clone %(remote_url)s %(repo_path)s" % git_opts, "git clone %(remote_url)s %(repo_path)s" % git_opts,
@ -324,6 +328,7 @@ def make_local_copy(repo_path, project_created, project, project_list,
git_command( git_command(
repo_path, repo_path,
"remote add -f upstream %(upstream)s" % git_opts) "remote add -f upstream %(upstream)s" % git_opts)
return None
# Gerrit doesn't have it, but it has an upstream configured # Gerrit doesn't have it, but it has an upstream configured
# We're probably importing it for the first time, clone # We're probably importing it for the first time, clone
@ -343,7 +348,7 @@ def make_local_copy(repo_path, project_created, project, project_list,
git_command( git_command(
repo_path, repo_path,
"remote add origin %(remote_url)s" % git_opts) "remote add origin %(remote_url)s" % git_opts)
push_string = "push %s +refs/copy/heads/*:refs/heads/*" return "push %s +refs/copy/heads/*:refs/heads/*"
# Neither gerrit has it, nor does it have an upstream, # Neither gerrit has it, nor does it have an upstream,
# just create a whole new one # just create a whole new one
@ -364,13 +369,10 @@ project=%s
cmd = ("commit -a -m'Added .gitreview' --author='%s'" cmd = ("commit -a -m'Added .gitreview' --author='%s'"
% GERRIT_GITID) % GERRIT_GITID)
git_command(repo_path, cmd) git_command(repo_path, cmd)
push_string = "push %s HEAD:refs/heads/master" return "push %s HEAD:refs/heads/master"
# We do have a local copy of it already, make sure it's
# in shape to have work done.
else:
if project in project_list:
def update_local_copy(repo_path, track_upstream, git_opts, ssh_env):
# If we're configured to track upstream but the repo # If we're configured to track upstream but the repo
# does not have an upstream remote, add one # does not have an upstream remote, add one
if (track_upstream and if (track_upstream and
@ -387,9 +389,8 @@ project=%s
repo_path, repo_path,
"remote set-url upstream %(upstream)s" % git_opts) "remote set-url upstream %(upstream)s" % git_opts)
# Now that we have any upstreams configured, fetch all # Now that we have any upstreams configured, fetch all of the refs
# of the refs we might need, pruning remote branches # we might need, pruning remote branches that no longer exist
# that no longer exist
git_command( git_command(
repo_path, "remote update --prune", env=ssh_env) repo_path, "remote update --prune", env=ssh_env)
@ -397,16 +398,12 @@ project=%s
# inspect the master branch for meta-info # inspect the master branch for meta-info
# Checkout master and reset to the state of origin/master # Checkout master and reset to the state of origin/master
git_command(repo_path, "checkout -B master origin/master") git_command(repo_path, "checkout -B master origin/master")
return push_string
def push_to_gerrit(repo_path, project, push_string, remote_url, ssh_env): def push_to_gerrit(repo_path, project, push_string, remote_url, ssh_env):
try: try:
git_command(repo_path, git_command(repo_path, push_string % remote_url, env=ssh_env)
push_string % remote_url, git_command(repo_path, "push --tags %s" % remote_url, env=ssh_env)
env=ssh_env)
git_command(repo_path,
"push --tags %s" % remote_url, env=ssh_env)
except Exception: except Exception:
log.exception( log.exception(
"Error pushing %s to Gerrit." % project) "Error pushing %s to Gerrit." % project)
@ -478,7 +475,7 @@ def process_acls(acl_config, project, ACL_DIR, section,
git_command(repo_path, 'branch -D config') git_command(repo_path, 'branch -D config')
def create_local_project(project, project_list, gerrit): def create_gerrit_project(project, project_list, gerrit):
if project not in project_list: if project not in project_list:
try: try:
gerrit.createProject(project) gerrit.createProject(project)
@ -486,17 +483,22 @@ def create_local_project(project, project_list, gerrit):
except Exception: except Exception:
log.exception( log.exception(
"Exception creating %s in Gerrit." % project) "Exception creating %s in Gerrit." % project)
raise
return False return False
def create_local_mirror(LOCAL_GIT_DIR, project_git, def create_local_mirror(local_git_dir, project_git,
GERRIT_SYSTEM_USER, GERRIT_SYSTEM_GROUP): gerrit_system_user, gerrit_system_group):
git_mirror_path = os.path.join(LOCAL_GIT_DIR, project_git) git_mirror_path = os.path.join(local_git_dir, project_git)
if not os.path.exists(git_mirror_path): if not os.path.exists(git_mirror_path):
run_command("git --bare init %s" % git_mirror_path) (ret, output) = run_command_status(
"git --bare init %s" % git_mirror_path)
if ret:
run_command("rm -rf git_mirror_path")
raise Exception(output)
run_command("chown -R %s:%s %s" run_command("chown -R %s:%s %s"
% (GERRIT_SYSTEM_USER, GERRIT_SYSTEM_GROUP, % (gerrit_system_user, gerrit_system_group,
git_mirror_path)) git_mirror_path))
@ -544,9 +546,13 @@ def main():
project = section['project'] project = section['project']
if args.projects and project not in args.projects: if args.projects and project not in args.projects:
continue continue
try:
# Figure out all of the options
options = section.get('options', dict()) options = section.get('options', dict())
description = section.get('description', None) description = section.get('description', None)
homepage = section.get('homepage', defaults.get('homepage', None)) homepage = section.get(
'homepage', defaults.get('homepage', None))
upstream = section.get('upstream', None) upstream = section.get('upstream', None)
upstream_prefix = section.get('upstream-prefix', None) upstream_prefix = section.get('upstream-prefix', None)
track_upstream = 'track-upstream' in options track_upstream = 'track-upstream' in options
@ -557,17 +563,14 @@ def main():
git_opts = dict(upstream=upstream, git_opts = dict(upstream=upstream,
repo_path=repo_path, repo_path=repo_path,
remote_url=remote_url) remote_url=remote_url)
try: acl_config = section.get(
acl_config = section.get('acl-config', 'acl-config',
'%s.config' % os.path.join(ACL_DIR, '%s.config' % os.path.join(ACL_DIR, project))
project))
except AttributeError:
acl_config = None
# Create the project in Gerrit first, since it will fail # Create the project in Gerrit first, since it will fail
# spectacularly if its project directory or local replica # spectacularly if its project directory or local replica
# already exist on disk # already exist on disk
project_created = create_local_project( project_created = create_gerrit_project(
project, project_list, gerrit) project, project_list, gerrit)
# Create the repo for the local git mirror # Create the repo for the local git mirror
@ -575,13 +578,22 @@ def main():
LOCAL_GIT_DIR, project_git, LOCAL_GIT_DIR, project_git,
GERRIT_SYSTEM_USER, GERRIT_SYSTEM_GROUP) GERRIT_SYSTEM_USER, GERRIT_SYSTEM_GROUP)
if not os.path.exists(repo_path) or project_created:
# We don't have a local copy already, get one
# Make Local repo # Make Local repo
push_string = make_local_copy( push_string = make_local_copy(
repo_path, project_created, project, project_list, repo_path, project, project_list,
git_opts, ssh_env, upstream, GERRIT_HOST, GERRIT_PORT, git_opts, ssh_env, upstream, GERRIT_HOST, GERRIT_PORT,
project_git, GERRIT_GITID, track_upstream) project_git, GERRIT_GITID)
else:
# We do have a local copy of it already, make sure it's
# in shape to have work done.
update_local_copy(
repo_path, track_upstream, git_opts, ssh_env)
description = find_description_override(repo_path) or description description = (
find_description_override(repo_path) or description)
if 'has-github' in options or default_has_github: if 'has-github' in options or default_has_github:
create_github_project(defaults, options, project, create_github_project(defaults, options, project,
@ -602,6 +614,10 @@ def main():
acl_config, project, ACL_DIR, section, acl_config, project, ACL_DIR, section,
remote_url, repo_path, ssh_env, gerrit, GERRIT_GITID) remote_url, repo_path, ssh_env, gerrit, GERRIT_GITID)
except Exception:
log.exception(
"Problems creating %s, moving on." % project)
continue
finally: finally:
os.unlink(ssh_env['GIT_SSH']) os.unlink(ssh_env['GIT_SSH'])