def push_acl_config(project, remote_url, repo_path, gitid, env=None): env = env or {} cmd = "commit -a -m'Update project config.' --author='%s'" % gitid status, out = u.git_command_output(repo_path, cmd) if status != 0: log.error("Failed to commit config for project: %s" % project) log.error(out) return False status, out = u.git_command_output( repo_path, "push %s HEAD:refs/meta/config" % remote_url, env) if status != 0: log.error("Failed to push config for project: %s" % project) log.error(out) return False return True
def sync_upstream(repo_path, project, ssh_env, upstream_prefix): u.git_command( repo_path, "remote update upstream --prune", env=ssh_env) # Any branch that exists in the upstream remote, we want # a local branch of, optionally prefixed with the # upstream prefix value for branch in u.git_command_output( repo_path, "branch -a")[1].split('\n'): if not branch.strip().startswith("remotes/upstream"): continue if "->" in branch: continue local_branch = branch.split()[0][len('remotes/upstream/'):] if upstream_prefix: local_branch = "%s/%s" % ( upstream_prefix, local_branch) # Check out an up to date copy of the branch, so that # we can push it and it will get picked up below u.git_command( repo_path, "checkout -B %s %s" % (local_branch, branch)) try: # Push all of the local branches to similarly named # Branches on gerrit. Also, push all of the tags u.git_command( repo_path, "push origin refs/heads/*:refs/heads/*", env=ssh_env) u.git_command(repo_path, 'push origin --tags', env=ssh_env) except Exception: log.exception( "Error pushing %s to Gerrit." % project)
def update_local_copy(repo_path, track_upstream, git_opts, ssh_env): # first do a clean of the branch to prevent possible # problems due to previous runs u.git_command(repo_path, "clean -fdx") has_upstream_remote = ('upstream' in u.git_command_output(repo_path, 'remote')[1]) if track_upstream: # If we're configured to track upstream but the repo # does not have an upstream remote, add one if not has_upstream_remote: u.git_command(repo_path, "remote add upstream %(upstream)s" % git_opts) # If we're configured to track upstream, make sure that # the upstream URL matches the config else: u.git_command(repo_path, "remote set-url upstream %(upstream)s" % git_opts) # Now that we have any upstreams configured, fetch all of the refs # we might need, pruning remote branches that no longer exist u.git_command(repo_path, "remote update --prune", env=ssh_env) else: # If we are not tracking upstream, then we do not need # an upstream remote configured if has_upstream_remote: u.git_command(repo_path, "remote rm upstream") # TODO(mordred): This is here so that later we can # inspect the master branch for meta-info # Checkout master and reset to the state of origin/master u.git_command(repo_path, "checkout -B master origin/master")
def fsck_repo(repo_path): rc, out = u.git_command_output(repo_path, 'fsck --full') # Check for non zero return code or warnings which should # be treated as errors. In this case zeroPaddedFilemodes # will not be accepted by Gerrit/jgit but are accepted by C git. if rc != 0 or 'zeroPaddedFilemode' in out: log.error('git fsck of %s failed:\n%s' % (repo_path, out)) raise Exception('git fsck failed not importing')
def push_acl_config(project, remote_url, repo_path, gitid, env=None): env = env or {} cmd = "commit -a -m'Update project config.' --author='%s'" % gitid status = u.git_command(repo_path, cmd) if status != 0: log.error("Failed to commit config for project: %s" % project) return False status, out = u.git_command_output( repo_path, "push %s HEAD:refs/meta/config" % remote_url, env) if status != 0: log.error("Failed to push config for project: %s" % project) return False return True
def fetch_config(project, remote_url, repo_path, env=None): env = env or {} # Poll for refs/meta/config as gerrit may not have written it out for # us yet. for x in range(10): status = u.git_command( repo_path, "fetch %s +refs/meta/config:refs/remotes/gerrit-meta/config" % remote_url, env) if status == 0: break else: log.debug("Failed to fetch refs/meta/config for project: %s" % project) time.sleep(2) if status != 0: log.error("Failed to fetch refs/meta/config for project: %s" % project) raise FetchConfigException() # Poll for project.config as gerrit may not have committed an empty # one yet. output = "" for x in range(10): status = u.git_command(repo_path, "remote update --prune", env) if status != 0: log.error("Failed to update remote: %s" % remote_url) time.sleep(2) continue else: status, output = u.git_command_output( repo_path, "ls-files --with-tree=remotes/gerrit-meta/config " "project.config", env) if output.strip() != "project.config" or status != 0: log.debug("Failed to find project.config for project: %s" % project) time.sleep(2) else: break if output.strip() != "project.config" or status != 0: log.error("Failed to find project.config for project: %s" % project) raise FetchConfigException() # Because the following fails if executed more than once you should only # run fetch_config once in each repo. status = u.git_command(repo_path, "checkout -B config remotes/gerrit-meta/config") if status != 0: log.error("Failed to checkout config for project: %s" % project) raise FetchConfigException()
def fetch_config(project, remote_url, repo_path, env=None): env = env or {} # Poll for refs/meta/config as gerrit may not have written it out for # us yet. for x in range(10): status = u.git_command( repo_path, "fetch %s +refs/meta/config:refs/remotes/gerrit-meta/config" % remote_url, env) if status == 0: break else: log.debug("Failed to fetch refs/meta/config for project: %s" % project) time.sleep(2) if status != 0: log.error("Failed to fetch refs/meta/config for project: %s" % project) raise FetchConfigException() # Poll for project.config as gerrit may not have committed an empty # one yet. output = "" for x in range(10): status = u.git_command(repo_path, "remote update --prune", env) if status != 0: log.error("Failed to update remote: %s" % remote_url) time.sleep(2) continue else: status, output = u.git_command_output( repo_path, "ls-files --with-tree=remotes/gerrit-meta/config " "project.config", env) if output.strip() != "project.config" or status != 0: log.debug("Failed to find project.config for project: %s" % project) time.sleep(2) else: break if output.strip() != "project.config" or status != 0: log.error("Failed to find project.config for project: %s" % project) raise FetchConfigException() # Because the following fails if executed more than once you should only # run fetch_config once in each repo. status = u.git_command( repo_path, "checkout -B config remotes/gerrit-meta/config") if status != 0: log.error("Failed to checkout config for project: %s" % project) raise FetchConfigException()
def update_local_copy(repo_path, track_upstream, git_opts, ssh_env): # first do a clean of the branch to prevent possible # problems due to previous runs u.git_command(repo_path, "clean -fdx") has_upstream_remote = ( 'upstream' in u.git_command_output(repo_path, 'remote')[1]) if track_upstream: # If we're configured to track upstream but the repo # does not have an upstream remote, add one if not has_upstream_remote: u.git_command( repo_path, "remote add upstream %(upstream)s" % git_opts) # If we're configured to track upstream, make sure that # the upstream URL matches the config else: u.git_command( repo_path, "remote set-url upstream %(upstream)s" % git_opts) # Now that we have any upstreams configured, fetch all of the refs # we might need, pruning remote branches that no longer exist u.git_command( repo_path, "remote update --prune", env=ssh_env) else: # If we are not tracking upstream, then we do not need # an upstream remote configured if has_upstream_remote: u.git_command(repo_path, "remote rm upstream") # TODO(mordred): This is here so that later we can # inspect the master branch for meta-info # Checkout master and reset to the state of origin/master u.git_command(repo_path, "checkout -B master origin/master")