68 lines
1.4 KiB
Nu
68 lines
1.4 KiB
Nu
#!/usr/bin/env nu
|
|
|
|
const repo = "tuist/tuist"
|
|
|
|
def fail [msg: string] {
|
|
error make {msg: $msg}
|
|
}
|
|
|
|
def clean [s: string] {
|
|
$s | str replace --all "\t" " " | str replace --all "\n" " "
|
|
}
|
|
|
|
def pick-pr [] {
|
|
let prs = (
|
|
gh pr list --repo $repo --state open --limit 200 --json number,title,headRefName,author
|
|
| from json
|
|
)
|
|
|
|
if ($prs | is-empty) {
|
|
fail $"No open PRs found for ($repo)"
|
|
}
|
|
|
|
let choice = (
|
|
$prs
|
|
| each {|pr|
|
|
let title = (clean $pr.title)
|
|
let branch = (clean $pr.headRefName)
|
|
let author = $pr.author.login
|
|
$"($pr.number)\t($title)\t($author)\t($branch)"
|
|
}
|
|
| str join (char newline)
|
|
| fzf --prompt "tuist pr > " --delimiter "\t" --with-nth "1,2,3,4" --preview "gh pr view --repo tuist/tuist {1}" --preview-window "right:70%"
|
|
)
|
|
|
|
if ($choice | str trim | is-empty) {
|
|
exit 130
|
|
}
|
|
|
|
$choice | split row "\t" | first | into int
|
|
}
|
|
|
|
def main [pr_number?: int] {
|
|
let number = if ($pr_number | is-empty) { pick-pr } else { $pr_number }
|
|
let pr = (
|
|
gh pr view --repo $repo $number --json number,title,url
|
|
| from json
|
|
)
|
|
|
|
let base = ([$env.HOME "Projects" "Work"] | path join)
|
|
let dest = ([$base $"tuist-pr-($pr.number)"] | path join)
|
|
|
|
if ($dest | path exists) {
|
|
fail $"Destination already exists: ($dest)"
|
|
}
|
|
|
|
^mkdir -p $base
|
|
|
|
print $"Cloning ($repo) PR #($pr.number): ($pr.title)"
|
|
jj git clone $"https://github.com/($repo).git" $dest
|
|
|
|
do {
|
|
cd $dest
|
|
gh pr checkout $pr.number
|
|
}
|
|
|
|
print $"Ready: ($dest)"
|
|
}
|