Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 57 additions & 7 deletions src/mod/github/branch.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@

branch-list () {

need git || return
git branch --no-color --all "$@"

}
branches () {

need git || return
isrepo || { err "Not a git repository"; return; }

git fetch --prune origin >/dev/null 2>&1 || true
git branch -r | grep -v 'origin/HEAD' | sed '/^[[:space:]]*$/d' | wc -l | tr -d ' '

}

branch-exists () {

need git || return
Expand Down Expand Up @@ -105,6 +121,47 @@ default-branch () {
gh repo view "${name}" --json defaultBranchRef -q '.defaultBranchRef.name' "$@" 2>/dev/null \
|| { err "Failed to detect default branch: ${name}"; return; }

}
sync-branch () {

need git || return

local branch="" main=""

isrepo || { err "Not a git repository"; return; }

git diff --quiet || { err "Working tree has unstaged changes"; return; }
git diff --cached --quiet || { err "Working tree has staged changes"; return; }

branch="$(current-branch)" || return
main="$(default-branch 2>/dev/null)"

[[ -n "${branch}" ]] || { err "Detached HEAD"; return; }
[[ -n "${main}" ]] || main="main"

git fetch --prune origin || { err "Failed to fetch origin"; return; }

if [[ "${branch}" == "${main}" ]]; then

git pull --ff-only origin "${main}" \
|| { err "Failed to sync ${main}"; return; }

else

if git rev-parse --abbrev-ref --symbolic-full-name "@{u}" >/dev/null 2>&1; then

git merge --ff-only "@{u}" >/dev/null 2>&1 \
|| { err "Branch diverged from remote: ${branch}"; return; }

fi

git rebase "origin/${main}" \
|| { err "Failed to rebase ${branch} on ${main}"; return; }

fi

succ "Branch synced -> ${branch}"

}

set-branch () {
Expand Down Expand Up @@ -140,10 +197,3 @@ set-default-branch () {
succ "Default branch set -> ${name}"

}

branch-list () {

need git || return
git branch --no-color --all "$@"

}
92 changes: 21 additions & 71 deletions src/mod/github/prs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pr-list () {
fi

name="$(repo "${name}")" || return

gh pr list --repo "${name}" --state "${state}" "$@"

return
Expand All @@ -38,6 +39,7 @@ prs () {
fi

name="$(repo "${name}")" || return

gh pr list --repo "${name}" --state "${state}" --json number -q 'length' "$@"

return
Expand All @@ -47,128 +49,76 @@ prs () {
gh pr list --json number -q 'length' "$@"

}

pr-open () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }

gh pr view "${id}" --web "$@" || { err "Failed to open PR: ${id}"; return; }
gh pr view "$@" --web || { err "Failed to open PR"; return; }

}
pr-view () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true
gh pr view "$@" || { err "Failed to view PR"; return; }

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }
}
pr-diff () {

need gh || return

gh pr view "${id}" "$@" || { err "Failed to view PR: ${id}"; return; }
gh pr diff "$@" || { err "Failed to diff PR"; return; }

}
pr-new () {
pr-checkout () {

need gh || return

gh pr create "$@" || { err "Failed to create PR"; return; }
gh pr checkout "$@" || { err "Failed to checkout PR"; return; }

}

pr-checks () {

need gh || return

gh pr checks "$@"
gh pr checks "$@" || { err "Failed to check PR"; return; }

}
pr-ready () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

if [[ -n "${id}" && "${id}" != --* ]]; then
gh pr ready "${id}" "$@" || { err "Failed to mark PR ready: ${id}"; return; }
else
gh pr ready "$@" || { err "Failed to mark PR ready"; return; }
fi

succ "PR ready"
gh pr ready "$@" || { err "Failed to mark PR ready"; return; }

}
pr-merge () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

if [[ -n "${id}" && "${id}" != --* ]]; then
gh pr merge "${id}" "$@" || { err "Failed to merge PR: ${id}"; return; }
else
gh pr merge "$@" || { err "Failed to merge PR"; return; }
fi

succ "PR merged"
gh pr merge --squash "$@" || { err "Failed to merge PR"; return; }

}
pr-close () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }

gh pr close "${id}" "$@" || { err "Failed to close PR: ${id}"; return; }

succ "PR closed: ${id}"

}

pr-reopen () {
pr-new () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }

gh pr reopen "${id}" "$@" || { err "Failed to reopen PR: ${id}"; return; }

succ "PR reopened: ${id}"
gh pr create "$@" || { err "Failed to create PR"; return; }

}
pr-diff () {
pr-close () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }
gh pr diff "${id}" "$@" || { err "Failed to diff PR: ${id}"; return; }
gh pr close "$@" || { err "Failed to close PR"; return; }

}
pr-checkout () {
pr-reopen () {

need gh || return

local id="${1:-}"
shift >/dev/null 2>&1 || true

[[ -n "${id}" ]] || { err "Missing PR number/url/branch"; return; }

gh pr checkout "${id}" "$@" || { err "Failed to checkout PR: ${id}"; return; }

succ "PR checked out: ${id}"
gh pr reopen "$@" || { err "Failed to reopen PR"; return; }

}