2008-09-27 13:44:15 +02:00
|
|
|
#!/bin/sh
|
|
|
|
# Copyright (c) 2008, Nanako Shiraishi
|
|
|
|
# Prime rerere database from existing merge commits
|
|
|
|
|
|
|
|
me=rerere-train
|
2017-07-26 21:08:38 +02:00
|
|
|
USAGE=$(cat <<-EOF
|
|
|
|
usage: $me [--overwrite] <rev-list-args>
|
|
|
|
|
|
|
|
-h, --help show the help
|
|
|
|
-o, --overwrite overwrite any existing rerere cache
|
|
|
|
EOF
|
|
|
|
)
|
2008-09-27 13:44:15 +02:00
|
|
|
|
|
|
|
SUBDIRECTORY_OK=Yes
|
2017-07-26 21:08:38 +02:00
|
|
|
|
|
|
|
overwrite=0
|
|
|
|
|
|
|
|
while test $# -gt 0
|
|
|
|
do
|
|
|
|
opt="$1"
|
|
|
|
case "$opt" in
|
|
|
|
-h|--help)
|
|
|
|
echo "$USAGE"
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
-o|--overwrite)
|
|
|
|
overwrite=1
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Overwrite or help options are not valid except as first arg
|
|
|
|
for opt in "$@"
|
|
|
|
do
|
|
|
|
case "$opt" in
|
|
|
|
-h|--help)
|
|
|
|
echo "$USAGE"
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
-o|--overwrite)
|
|
|
|
echo "$USAGE"
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2015-11-08 12:27:55 +01:00
|
|
|
. "$(git --exec-path)/git-sh-setup"
|
2008-09-27 13:44:15 +02:00
|
|
|
require_work_tree
|
|
|
|
cd_to_toplevel
|
|
|
|
|
|
|
|
# Remember original branch
|
|
|
|
branch=$(git symbolic-ref -q HEAD) ||
|
|
|
|
original_HEAD=$(git rev-parse --verify HEAD) || {
|
|
|
|
echo >&2 "Not on any branch and no commit yet?"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
mkdir -p "$GIT_DIR/rr-cache" || exit
|
|
|
|
|
|
|
|
git rev-list --parents "$@" |
|
|
|
|
while read commit parent1 other_parents
|
|
|
|
do
|
|
|
|
if test -z "$other_parents"
|
|
|
|
then
|
|
|
|
# Skip non-merges
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
git checkout -q "$parent1^0"
|
2022-07-19 19:21:44 +02:00
|
|
|
if git merge --no-gpg-sign $other_parents >/dev/null 2>&1
|
2008-09-27 13:44:15 +02:00
|
|
|
then
|
|
|
|
# Cleanly merges
|
|
|
|
continue
|
|
|
|
fi
|
2017-07-26 21:08:38 +02:00
|
|
|
if test $overwrite = 1
|
|
|
|
then
|
|
|
|
git rerere forget .
|
|
|
|
fi
|
2008-09-27 13:44:15 +02:00
|
|
|
if test -s "$GIT_DIR/MERGE_RR"
|
|
|
|
then
|
rerere-train: two fixes to the use of "git show -s"
The script uses "git show -s" to display the title of the merge
commit being studied, without explicitly disabling the pager, which
is not a safe thing to do in a script.
For example, when the pager is set to "less" with "-SF" options (-S
tells the pager not to fold lines but allow horizontal scrolling to
show the overly long lines, -F tells the pager not to wait if the
output in its entirety is shown on a single page), and the title of
the merge commit is longer than the width of the terminal, the pager
will wait until the end-user tells it to quit after showing the
single line.
Explicitly disable the pager with this "git show" invocation to fix
this.
The command uses the "--pretty=format:..." format, which adds LF in
between each pair of commits it outputs, which means that the label
for the merge being learned from will be followed by the next
message on the same line. "--pretty=tformat:..." is what we should
instead, which adds LF after each commit, or a more modern way to
spell it, i.e. "--format=...". This existing breakage becomes
easier to see, now we no longer use the pager.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-02-27 23:09:24 +01:00
|
|
|
git --no-pager show -s --format="Learning from %h %s" "$commit"
|
2008-09-27 13:44:15 +02:00
|
|
|
git rerere
|
|
|
|
git checkout -q $commit -- .
|
|
|
|
git rerere
|
|
|
|
fi
|
Comment important codepaths regarding nuking untracked files/dirs
In the last few commits we focused on code in unpack-trees.c that
mistakenly removed untracked files or directories. There may be more of
those, but in this commit we change our focus: callers of toplevel
commands that are expected to remove untracked files or directories.
As noted previously, we have toplevel commands that are expected to
delete untracked files such as 'read-tree --reset', 'reset --hard', and
'checkout --force'. However, that does not mean that other highlevel
commands that happen to call these other commands thought about or
conveyed to users the possibility that untracked files could be removed.
Audit the code for such callsites, and add comments near existing
callsites to mention whether these are safe or not.
My auditing is somewhat incomplete, though; it skipped several cases:
* git-rebase--preserve-merges.sh: is in the process of being
deprecated/removed, so I won't leave a note that there are
likely more bugs in that script.
* contrib/git-new-workdir: why is the -f flag being used in a new
empty directory?? It shouldn't hurt, but it seems useless.
* git-p4.py: Don't see why -f is needed for a new dir (maybe it's
not and is just superfluous), but I'm not at all familiar with
the p4 stuff
* git-archimport.perl: Don't care; arch is long since dead
* git-cvs*.perl: Don't care; cvs is long since dead
Also, the reset --hard in builtin/worktree.c looks safe, due to only
running in an empty directory.
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-09-27 18:33:47 +02:00
|
|
|
git reset -q --hard # Might nuke untracked files...
|
2008-09-27 13:44:15 +02:00
|
|
|
done
|
|
|
|
|
|
|
|
if test -z "$branch"
|
|
|
|
then
|
|
|
|
git checkout "$original_HEAD"
|
|
|
|
else
|
|
|
|
git checkout "${branch#refs/heads/}"
|
|
|
|
fi
|