feat: ngcp pick -i

This commit is contained in:
2026-08-11 17:31:00 +02:00
parent 2b005aee35
commit aadfc4c681
+47 -10
View File
@@ -43,6 +43,8 @@ for flag in "$@"; do
echo "Usage: ngcp [mode] [options]" echo "Usage: ngcp [mode] [options]"
echo "Mode:" echo "Mode:"
echo " pick <commit 1> <commit2> <...> Cherry-pick commits for the remote branch." echo " pick <commit 1> <commit2> <...> Cherry-pick commits for the remote branch."
echo " pick -i [n] Interactively select from the last 10 (or n) commits."
echo " pick --interactive [n] Interactively select from the last 10 (or n) commits."
echo " last <int n> Cherry-pick the last n commits." echo " last <int n> Cherry-pick the last n commits."
echo " pull Pulls the changes to the local branch." echo " pull Pulls the changes to the local branch."
echo "Options:" echo "Options:"
@@ -54,7 +56,51 @@ done
if [[ "$1" == "pick" || "$1" == "last" ]]; then if [[ "$1" == "pick" || "$1" == "last" ]]; then
if [[ "$1" == "last" ]]; then interactive=0
interactive_count=10
if [[ "$1" == "pick" && "${2:-}" == "-i" || "$1" == "pick" && "${2:-}" == "--interactive" ]]; then
interactive=1
if [[ -n "${3:-}" ]]; then
if ! [[ "$3" =~ ^[1-9][0-9]*$ ]]; then
echo "Invalid interactive commit count: $3"
exit 1
fi
interactive_count="$3"
fi
fi
if (( interactive )); then
if ! command -v fzf >/dev/null 2>&1; then
echo "Error: fzf is required for interactive mode."
echo "Please install fzf and try again."
exit 1
fi
mapfile -t commits < <(
git -C "$nixConfigPath" log \
--format='%H%x09%h%x09%s' \
-n "$interactive_count" \
HEAD |
fzf \
--multi \
--reverse \
--header="TAB select/deselect • ENTER confirm" \
--preview="git -C '$nixConfigPath' show --stat --oneline {1}" |
cut -f1
)
if [[ "${#commits[@]}" -eq 0 ]]; then
echo "No commits selected."
exit 0
fi
# fzf displays newest -> oldest, but cherry-picking should happen
# oldest -> newest.
mapfile -t commits < <(printf '%s\n' "${commits[@]}" | tac)
elif [[ "$1" == "last" ]]; then
if [[ "$#" -lt 2 ]] || ! [[ "$2" =~ ^[1-9][0-9]*$ ]]; then if [[ "$#" -lt 2 ]] || ! [[ "$2" =~ ^[1-9][0-9]*$ ]]; then
echo "Invalid arguments. Usage: ngcp last <number>" echo "Invalid arguments. Usage: ngcp last <number>"
exit 1 exit 1
@@ -68,17 +114,8 @@ if [[ "$1" == "pick" || "$1" == "last" ]]; then
printf ' %s\n' "${commits[@]}" printf ' %s\n' "${commits[@]}"
else else
if [[ "$#" -lt 2 ]]; then
echo "Invalid arguments, you must specify commit hashes"
exit 1
fi
commits=("${@:2}") commits=("${@:2}")
fi fi
if [[ "$#" -lt "2" ]]; then
echo "Invalid arguments, you must specify commit hashes".
exit
fi
#if doesnt exist, just get the branch from the remote #if doesnt exist, just get the branch from the remote
if ! git -C "$nixConfigPath" checkout "$remoteBranch"; then if ! git -C "$nixConfigPath" checkout "$remoteBranch"; then