am, rebase: teach quiet option

git-am and git-rebase are talkative scripts. Teach them to be quiet when
told, allowing them to speak only when they fail or experience errors.

The quiet option is maintained when git-am or git-rebase fails to apply
a patch. This means subsequent --resolved, --continue, --skip, --abort
invocations will be quiet if the original invocation was quiet.

Drop a handful of >&2 redirection; the rest of the program sends all the
info messages to stdout, not to stderr.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stephen Boyd 2009-06-16 15:33:01 -07:00 коммит произвёл Junio C Hamano
Родитель 2e6a30ef8f
Коммит 0e987a12fc
6 изменённых файлов: 97 добавлений и 24 удалений

Просмотреть файл

@ -13,7 +13,7 @@ SYNOPSIS
[--3way] [--interactive] [--committer-date-is-author-date] [--3way] [--interactive] [--committer-date-is-author-date]
[--ignore-date] [--ignore-date]
[--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>] [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
[--reject] [--reject] [-q | --quiet]
[<mbox> | <Maildir>...] [<mbox> | <Maildir>...]
'git am' (--skip | --resolved | --abort) 'git am' (--skip | --resolved | --abort)
@ -39,6 +39,10 @@ OPTIONS
--keep:: --keep::
Pass `-k` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]). Pass `-k` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]).
-q::
--quiet::
Be quiet. Only print error messages.
-u:: -u::
--utf8:: --utf8::
Pass `-u` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]). Pass `-u` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]).

Просмотреть файл

@ -236,6 +236,10 @@ OPTIONS
is used instead ('git-merge-recursive' when merging a single is used instead ('git-merge-recursive' when merging a single
head, 'git-merge-octopus' otherwise). This implies --merge. head, 'git-merge-octopus' otherwise). This implies --merge.
-q::
--quiet::
Be quiet. Implies --no-stat.
-v:: -v::
--verbose:: --verbose::
Be verbose. Implies --stat. Be verbose. Implies --stat.

Просмотреть файл

@ -11,6 +11,7 @@ git am [options] (--resolved | --skip | --abort)
i,interactive run interactively i,interactive run interactively
b,binary* (historical option -- no-op) b,binary* (historical option -- no-op)
3,3way allow fall back on 3way merging if needed 3,3way allow fall back on 3way merging if needed
q,quiet be quiet
s,signoff add a Signed-off-by line to the commit message s,signoff add a Signed-off-by line to the commit message
u,utf8 recode into utf8 (default) u,utf8 recode into utf8 (default)
k,keep pass -k flag to git-mailinfo k,keep pass -k flag to git-mailinfo
@ -99,7 +100,7 @@ fall_back_3way () {
git write-tree >"$dotest/patch-merge-base+" || git write-tree >"$dotest/patch-merge-base+" ||
cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge." cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
echo Using index info to reconstruct a base tree... say Using index info to reconstruct a base tree...
if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \ if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
git apply --cached <"$dotest/patch" git apply --cached <"$dotest/patch"
then then
@ -115,7 +116,7 @@ It does not apply to blobs recorded in its index."
orig_tree=$(cat "$dotest/patch-merge-base") && orig_tree=$(cat "$dotest/patch-merge-base") &&
rm -fr "$dotest"/patch-merge-* || exit 1 rm -fr "$dotest"/patch-merge-* || exit 1
echo Falling back to patching base and 3-way merge... say Falling back to patching base and 3-way merge...
# This is not so wrong. Depending on which base we picked, # This is not so wrong. Depending on which base we picked,
# orig_tree may be wildly different from ours, but his_tree # orig_tree may be wildly different from ours, but his_tree
@ -125,6 +126,10 @@ It does not apply to blobs recorded in its index."
eval GITHEAD_$his_tree='"$FIRSTLINE"' eval GITHEAD_$his_tree='"$FIRSTLINE"'
export GITHEAD_$his_tree export GITHEAD_$his_tree
if test -n "$GIT_QUIET"
then
export GIT_MERGE_VERBOSITY=0
fi
git-merge-recursive $orig_tree -- HEAD $his_tree || { git-merge-recursive $orig_tree -- HEAD $his_tree || {
git rerere git rerere
echo Failed to merge in the changes. echo Failed to merge in the changes.
@ -181,6 +186,8 @@ do
committer_date_is_author_date=t ;; committer_date_is_author_date=t ;;
--ignore-date) --ignore-date)
ignore_date=t ;; ignore_date=t ;;
-q|--quiet)
GIT_QUIET=t ;;
--) --)
shift; break ;; shift; break ;;
*) *)
@ -279,7 +286,7 @@ else
exit 1 exit 1
} }
# -s, -u, -k, --whitespace, -3, -C and -p flags are kept # -s, -u, -k, --whitespace, -3, -C, -q and -p flags are kept
# for the resuming session after a patch failure. # for the resuming session after a patch failure.
# -i can and must be given when resuming. # -i can and must be given when resuming.
echo " $git_apply_opt" >"$dotest/apply-opt" echo " $git_apply_opt" >"$dotest/apply-opt"
@ -287,6 +294,7 @@ else
echo "$sign" >"$dotest/sign" echo "$sign" >"$dotest/sign"
echo "$utf8" >"$dotest/utf8" echo "$utf8" >"$dotest/utf8"
echo "$keep" >"$dotest/keep" echo "$keep" >"$dotest/keep"
echo "$GIT_QUIET" >"$dotest/quiet"
echo 1 >"$dotest/next" echo 1 >"$dotest/next"
if test -n "$rebasing" if test -n "$rebasing"
then then
@ -327,6 +335,10 @@ if test "$(cat "$dotest/keep")" = t
then then
keep=-k keep=-k
fi fi
if test "$(cat "$dotest/quiet")" = t
then
GIT_QUIET=t
fi
if test "$(cat "$dotest/threeway")" = t if test "$(cat "$dotest/threeway")" = t
then then
threeway=t threeway=t
@ -352,7 +364,7 @@ fi
if test "$this" -gt "$last" if test "$this" -gt "$last"
then then
echo Nothing to do. say Nothing to do.
rm -fr "$dotest" rm -fr "$dotest"
exit exit
fi fi
@ -498,7 +510,7 @@ do
stop_here $this stop_here $this
fi fi
printf 'Applying: %s\n' "$FIRSTLINE" say "Applying: $FIRSTLINE"
case "$resolved" in case "$resolved" in
'') '')
@ -541,7 +553,7 @@ do
# Applying the patch to an earlier tree and merging the # Applying the patch to an earlier tree and merging the
# result may have produced the same tree as ours. # result may have produced the same tree as ours.
git diff-index --quiet --cached HEAD -- && { git diff-index --quiet --cached HEAD -- && {
echo No changes -- Patch already applied. say No changes -- Patch already applied.
go_next go_next
continue continue
} }
@ -567,7 +579,7 @@ do
GIT_AUTHOR_DATE= GIT_AUTHOR_DATE=
fi fi
parent=$(git rev-parse --verify -q HEAD) || parent=$(git rev-parse --verify -q HEAD) ||
echo >&2 "applying to an empty history" say >&2 "applying to an empty history"
if test -n "$committer_date_is_author_date" if test -n "$committer_date_is_author_date"
then then

Просмотреть файл

@ -3,7 +3,7 @@
# Copyright (c) 2005 Junio C Hamano. # Copyright (c) 2005 Junio C Hamano.
# #
USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--onto <newbase>] [<upstream>|--root] [<branch>]' USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--onto <newbase>] [<upstream>|--root] [<branch>] [--quiet | -q]'
LONG_USAGE='git-rebase replaces <branch> with a new branch of the LONG_USAGE='git-rebase replaces <branch> with a new branch of the
same name. When the --onto option is provided the new branch starts same name. When the --onto option is provided the new branch starts
out with a HEAD equal to <newbase>, otherwise it is equal to <upstream> out with a HEAD equal to <newbase>, otherwise it is equal to <upstream>
@ -72,11 +72,20 @@ continue_merge () {
echo "directly, but instead do one of the following: " echo "directly, but instead do one of the following: "
die "$RESOLVEMSG" die "$RESOLVEMSG"
fi fi
printf "Committed: %0${prec}d " $msgnum if test -z "$GIT_QUIET"
then
printf "Committed: %0${prec}d " $msgnum
fi
else else
printf "Already applied: %0${prec}d " $msgnum if test -z "$GIT_QUIET"
then
printf "Already applied: %0${prec}d " $msgnum
fi
fi
if test -z "$GIT_QUIET"
then
git rev-list --pretty=oneline -1 "$cmt" | sed -e 's/^[^ ]* //'
fi fi
git rev-list --pretty=oneline -1 "$cmt" | sed -e 's/^[^ ]* //'
prev_head=`git rev-parse HEAD^0` prev_head=`git rev-parse HEAD^0`
# save the resulting commit so we can read-tree on it later # save the resulting commit so we can read-tree on it later
@ -97,6 +106,10 @@ call_merge () {
eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"' eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"'
eval GITHEAD_$hd='$(cat "$dotest/onto_name")' eval GITHEAD_$hd='$(cat "$dotest/onto_name")'
export GITHEAD_$cmt GITHEAD_$hd export GITHEAD_$cmt GITHEAD_$hd
if test -n "$GIT_QUIET"
then
export GIT_MERGE_VERBOSITY=1
fi
git-merge-$strategy "$cmt^" -- "$hd" "$cmt" git-merge-$strategy "$cmt^" -- "$hd" "$cmt"
rv=$? rv=$?
case "$rv" in case "$rv" in
@ -138,7 +151,7 @@ move_to_original_branch () {
finish_rb_merge () { finish_rb_merge () {
move_to_original_branch move_to_original_branch
rm -r "$dotest" rm -r "$dotest"
echo "All done." say All done.
} }
is_interactive () { is_interactive () {
@ -209,6 +222,7 @@ do
end=$(cat "$dotest/end") end=$(cat "$dotest/end")
msgnum=$(cat "$dotest/msgnum") msgnum=$(cat "$dotest/msgnum")
onto=$(cat "$dotest/onto") onto=$(cat "$dotest/onto")
GIT_QUIET=$(cat "$dotest/quiet")
continue_merge continue_merge
while test "$msgnum" -le "$end" while test "$msgnum" -le "$end"
do do
@ -221,6 +235,7 @@ do
head_name=$(cat "$GIT_DIR"/rebase-apply/head-name) && head_name=$(cat "$GIT_DIR"/rebase-apply/head-name) &&
onto=$(cat "$GIT_DIR"/rebase-apply/onto) && onto=$(cat "$GIT_DIR"/rebase-apply/onto) &&
orig_head=$(cat "$GIT_DIR"/rebase-apply/orig-head) && orig_head=$(cat "$GIT_DIR"/rebase-apply/orig-head) &&
GIT_QUIET=$(cat "$GIT_DIR"/rebase-apply/quiet)
git am --resolved --3way --resolvemsg="$RESOLVEMSG" && git am --resolved --3way --resolvemsg="$RESOLVEMSG" &&
move_to_original_branch move_to_original_branch
exit exit
@ -238,6 +253,7 @@ do
msgnum=$(cat "$dotest/msgnum") msgnum=$(cat "$dotest/msgnum")
msgnum=$(($msgnum + 1)) msgnum=$(($msgnum + 1))
onto=$(cat "$dotest/onto") onto=$(cat "$dotest/onto")
GIT_QUIET=$(cat "$dotest/quiet")
while test "$msgnum" -le "$end" while test "$msgnum" -le "$end"
do do
call_merge "$msgnum" call_merge "$msgnum"
@ -249,6 +265,7 @@ do
head_name=$(cat "$GIT_DIR"/rebase-apply/head-name) && head_name=$(cat "$GIT_DIR"/rebase-apply/head-name) &&
onto=$(cat "$GIT_DIR"/rebase-apply/onto) && onto=$(cat "$GIT_DIR"/rebase-apply/onto) &&
orig_head=$(cat "$GIT_DIR"/rebase-apply/orig-head) && orig_head=$(cat "$GIT_DIR"/rebase-apply/orig-head) &&
GIT_QUIET=$(cat "$GIT_DIR"/rebase-apply/quiet)
git am -3 --skip --resolvemsg="$RESOLVEMSG" && git am -3 --skip --resolvemsg="$RESOLVEMSG" &&
move_to_original_branch move_to_original_branch
exit exit
@ -260,9 +277,11 @@ do
git rerere clear git rerere clear
if test -d "$dotest" if test -d "$dotest"
then then
GIT_QUIET=$(cat "$dotest/quiet")
move_to_original_branch move_to_original_branch
else else
dotest="$GIT_DIR"/rebase-apply dotest="$GIT_DIR"/rebase-apply
GIT_QUIET=$(cat "$dotest/quiet")
move_to_original_branch move_to_original_branch
fi fi
git reset --hard $(cat "$dotest/orig-head") git reset --hard $(cat "$dotest/orig-head")
@ -300,6 +319,13 @@ do
-v|--verbose) -v|--verbose)
verbose=t verbose=t
diffstat=t diffstat=t
GIT_QUIET=
;;
-q|--quiet)
GIT_QUIET=t
git_am_opt="$git_am_opt -q"
verbose=
diffstat=
;; ;;
--whitespace=*) --whitespace=*)
git_am_opt="$git_am_opt $1" git_am_opt="$git_am_opt $1"
@ -445,15 +471,15 @@ then
then then
# Lazily switch to the target branch if needed... # Lazily switch to the target branch if needed...
test -z "$switch_to" || git checkout "$switch_to" test -z "$switch_to" || git checkout "$switch_to"
echo >&2 "Current branch $branch_name is up to date." say "Current branch $branch_name is up to date."
exit 0 exit 0
else else
echo "Current branch $branch_name is up to date, rebase forced." say "Current branch $branch_name is up to date, rebase forced."
fi fi
fi fi
# Detach HEAD and reset the tree # Detach HEAD and reset the tree
echo "First, rewinding head to replay your work on top of it..." say "First, rewinding head to replay your work on top of it..."
git checkout -q "$onto^0" || die "could not detach HEAD" git checkout -q "$onto^0" || die "could not detach HEAD"
git update-ref ORIG_HEAD $branch git update-ref ORIG_HEAD $branch
@ -471,7 +497,7 @@ fi
# we just fast forwarded. # we just fast forwarded.
if test "$mb" = "$branch" if test "$mb" = "$branch"
then then
echo >&2 "Fast-forwarded $branch_name to $onto_name." say "Fast-forwarded $branch_name to $onto_name."
move_to_original_branch move_to_original_branch
exit 0 exit 0
fi fi
@ -493,7 +519,8 @@ then
test 0 != $ret -a -d "$GIT_DIR"/rebase-apply && test 0 != $ret -a -d "$GIT_DIR"/rebase-apply &&
echo $head_name > "$GIT_DIR"/rebase-apply/head-name && echo $head_name > "$GIT_DIR"/rebase-apply/head-name &&
echo $onto > "$GIT_DIR"/rebase-apply/onto && echo $onto > "$GIT_DIR"/rebase-apply/onto &&
echo $orig_head > "$GIT_DIR"/rebase-apply/orig-head echo $orig_head > "$GIT_DIR"/rebase-apply/orig-head &&
echo "$GIT_QUIET" > "$GIT_DIR"/rebase-apply/quiet
exit $ret exit $ret
fi fi
@ -507,6 +534,7 @@ prev_head=$orig_head
echo "$prev_head" > "$dotest/prev_head" echo "$prev_head" > "$dotest/prev_head"
echo "$orig_head" > "$dotest/orig-head" echo "$orig_head" > "$dotest/orig-head"
echo "$head_name" > "$dotest/head-name" echo "$head_name" > "$dotest/head-name"
echo "$GIT_QUIET" > "$dotest/quiet"
msgnum=0 msgnum=0
for cmt in `git rev-list --reverse --no-merges "$revisions"` for cmt in `git rev-list --reverse --no-merges "$revisions"`

Просмотреть файл

@ -54,8 +54,8 @@ test_expect_success 'rebase against master' '
git rebase master' git rebase master'
test_expect_success 'rebase against master twice' ' test_expect_success 'rebase against master twice' '
git rebase master 2>err && git rebase master >out &&
grep "Current branch my-topic-branch is up to date" err grep "Current branch my-topic-branch is up to date" out
' '
test_expect_success 'rebase against master twice with --force' ' test_expect_success 'rebase against master twice with --force' '
@ -65,14 +65,14 @@ test_expect_success 'rebase against master twice with --force' '
test_expect_success 'rebase against master twice from another branch' ' test_expect_success 'rebase against master twice from another branch' '
git checkout my-topic-branch^ && git checkout my-topic-branch^ &&
git rebase master my-topic-branch 2>err && git rebase master my-topic-branch >out &&
grep "Current branch my-topic-branch is up to date" err grep "Current branch my-topic-branch is up to date" out
' '
test_expect_success 'rebase fast-forward to master' ' test_expect_success 'rebase fast-forward to master' '
git checkout my-topic-branch^ && git checkout my-topic-branch^ &&
git rebase my-topic-branch 2>err && git rebase my-topic-branch >out &&
grep "Fast-forwarded HEAD to my-topic-branch" err grep "Fast-forwarded HEAD to my-topic-branch" out
' '
test_expect_success \ test_expect_success \
@ -126,4 +126,11 @@ test_expect_success 'Show verbose error when HEAD could not be detached' '
grep "Untracked working tree file .B. would be overwritten" output.err grep "Untracked working tree file .B. would be overwritten" output.err
' '
test_expect_success 'rebase -q is quiet' '
rm B &&
git checkout -b quiet topic &&
git rebase -q master > output.out 2>&1 &&
test ! -s output.out
'
test_done test_done

Просмотреть файл

@ -180,6 +180,17 @@ test_expect_success 'am -3 falls back to 3-way merge' '
test -z "$(git diff lorem)" test -z "$(git diff lorem)"
' '
test_expect_success 'am -3 -q is quiet' '
git reset master2 --hard &&
sed -n -e "3,\$p" msg >file &&
head -n 9 msg >>file &&
git add file &&
test_tick &&
git commit -m "copied stuff" &&
git am -3 -q lorem-move.patch > output.out 2>&1 &&
! test -s output.out
'
test_expect_success 'am pauses on conflict' ' test_expect_success 'am pauses on conflict' '
git checkout lorem2^^ && git checkout lorem2^^ &&
test_must_fail git am lorem-move.patch && test_must_fail git am lorem-move.patch &&
@ -313,4 +324,11 @@ test_expect_success 'am newline in subject' '
grep "^Applying: second \\\n foo$" output.out grep "^Applying: second \\\n foo$" output.out
' '
test_expect_success 'am -q is quiet' '
git checkout first &&
test_tick &&
git am -q < patch1 > output.out 2>&1 &&
! test -s output.out
'
test_done test_done