1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-02-22 18:22:12 +01:00

64 lines
2.0 KiB
Python

import subprocess
import osc.commandline_git
class PullRequestCheckoutCommand(osc.commandline_git.GitObsCommand):
"""
Check out a pull request
"""
name = "checkout"
parent = "PullRequestCommand"
def init_arguments(self):
self.add_argument(
"pull",
type=int,
help="Number of the pull request",
)
self.add_argument(
"-f",
"--force",
action="store_true",
help="Reset the existing local branch to the latest state of the pull request",
)
def run(self, args):
from osc import gitea_api
self.print_gitea_settings()
git = gitea_api.Git(".")
owner, repo = git.get_owner_repo()
pr = gitea_api.PullRequest.get(self.gitea_conn, owner, repo, args.pull).json()
head_ssh_url = pr["head"]["repo"]["ssh_url"]
head_owner = pr["head"]["repo"]["owner"]["login"]
head_branch = pr["head"]["ref"]
try:
git.add_remote(head_owner, head_ssh_url)
except subprocess.CalledProcessError as e:
# TODO: check if the remote url matches
if e.returncode != 3:
# returncode 3 means that the remote exists; see `man git-remote`
raise
git.fetch(head_owner)
local_branch = git.fetch_pull_request(args.pull, force=args.force)
# LFS data may not be accessible in the "origin" remote, we need to allow searching in all remotes
git.set_config("lfs.remote.searchall", "1")
# configure branch for `git push`
git.set_config(f"branch.{local_branch}.remote", head_owner)
git.set_config(f"branch.{local_branch}.pushRemote", head_owner)
git.set_config(f"branch.{local_branch}.merge", f"refs/heads/{head_branch}")
# allow `git push` with no arguments to push to a remote branch that is named differently than the local branch
git.set_config("push.default", "upstream")
git.switch(local_branch)