git-arc: Add list mode support for the update command

This can be particularly useful to do bulk-updates of multiple commits
using the same message, e.g.

  git arc update -lm "Move function xyz to libfoo" main..myfeature

Similar to the list mode for the create command, git arc will list all
the candidate revisions with a single prompt.  Once that is confirmed,
all the revisions are updated without showing the diffs or pausing
further prompts.

Reviewed by:	markj
Differential Revision:	https://reviews.freebsd.org/D45050
This commit is contained in:
John Baldwin 2024-05-06 10:49:04 -07:00
parent 3f0b80bc15
commit 2f68f6474e
2 changed files with 44 additions and 12 deletions

View File

@ -50,6 +50,7 @@
.Op Ar commit ... Ns | Ns Ar commit-range
.Nm
.Cm update
.Op Fl l
.Op Fl m Ar message
.Op Ar commit ... Ns | Ns Ar commit-range
.Sh DESCRIPTION
@ -117,6 +118,11 @@ each revision.
If an empty message is supplied via
.Fl m ,
then no notes will be added when updating Differential Revisions.
.Pp
If
.Fl l
is used, display list of commits to be updated and wait for confirmation
of the list rather than prompting for each commit.
.El
.Sh CONFIGURATION
These are manipulated by
@ -138,9 +144,9 @@ Defaults to false.
Always use
.Dq list mode
.Pq Fl l
with create.
In this mode, the list of git revisions to create reviews for
is listed with a single prompt before creating reviews.
with create and update.
In this mode, the list of git revisions to use
is listed with a single prompt before creating or updating reviews.
The diffs for individual commits are not shown.
Defaults to false.
.It Va arc.verbose
@ -227,6 +233,13 @@ List the status of reviews for all the commits in the branch
.Bd -literal -offset indent
$ git arc list main..feature
.Ed
.Pp
Update reviews for all commits in the branch
.Dq feature
after rebasing:
.Bd -literal -offset indent
$ git arc update -lm "Rebase" main..feature
.Ed
.Sh SEE ALSO
.Xr build 7 ,
.Xr development 7

View File

@ -53,7 +53,7 @@ Commands:
list <commit>|<commit range>
patch [-c] <diff1> [<diff2> ...]
stage [-b branch] [<commit>|<commit range>]
update [-m message] [<commit>|<commit range>]
update [-l] [-m message] [<commit>|<commit range>]
Description:
Create or manage FreeBSD Phabricator reviews based on git commits. There
@ -100,11 +100,11 @@ Config Variables:
arc.browse [bool] -- Try to open newly created reviews in a browser tab.
Defaults to false.
arc.list [bool] -- Always use "list mode" (-l) with create. In this
mode, the list of git revisions to create reviews for
is listed with a single prompt before creating
reviews. The diffs for individual commits are not
shown.
arc.list [bool] -- Always use "list mode" (-l) with create and update.
In this mode, the list of git revisions to use
is listed with a single prompt before creating or
updating reviews. The diffs for individual commits
are not shown.
arc.verbose [bool] -- Verbose output. Equivalent to the -v flag.
@ -669,10 +669,18 @@ gitarc__stage()
gitarc__update()
{
local commit commits diff have_msg msg
local commit commits diff doprompt have_msg list o msg
while getopts m: o; do
list=
if [ "$(git config --bool --get arc.list 2>/dev/null || echo false)" != "false" ]; then
list=1
fi
doprompt=1
while getopts lm: o; do
case "$o" in
l)
list=1
;;
m)
msg="$OPTARG"
have_msg=1
@ -685,10 +693,21 @@ gitarc__update()
shift $((OPTIND-1))
commits=$(build_commit_list "$@")
if [ "$list" ]; then
for commit in ${commits}; do
git --no-pager show --oneline --no-patch "$commit"
done | git_pager
if ! prompt; then
return
fi
doprompt=
fi
for commit in ${commits}; do
diff=$(commit2diff "$commit")
if ! show_and_prompt "$commit"; then
if [ "$doprompt" ] && ! show_and_prompt "$commit"; then
break
fi