Merge "Catch errors centrally, and bail out more"
This commit is contained in:
commit
e3903d9d13
@ -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'])
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user