Raman Gupta <rocketraman@xxxxxxxxx> writes: > Provide the user an option to overwrite existing resolutions using an > `--overwrite` flag. This might be used, for example, if the user knows > that they already have an entry in their rerere cache for a conflict, > but wish to drop it and retrain based on the merge commit(s) passed to > the rerere-train script. > > Signed-off-by: Raman Gupta <rocketraman@xxxxxxxxx> > --- > contrib/rerere-train.sh | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/contrib/rerere-train.sh b/contrib/rerere-train.sh > index 52ad9e4..e25bf8a 100755 > --- a/contrib/rerere-train.sh > +++ b/contrib/rerere-train.sh > @@ -3,10 +3,38 @@ > # Prime rerere database from existing merge commits > > me=rerere-train > -USAGE="$me rev-list-args" > > SUBDIRECTORY_OK=Yes > -OPTIONS_SPEC= > +OPTS_SPEC="\ > +$me [--overwrite] <rev-list-args> > +-- > +h,help show the help > +o,overwrite overwrite any existing rerere cache > +" > +eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" > + > +overwrite=0 It is very good that you initialize overwrite explicitly here, to prevent it from seeping through from the caller's environment. > +while test $# -gt 0 > +do > + opt="$1" > + case "$opt" in > + -o) > + overwrite=1 > + shift > + shift > + ;; > + --) > + shift > + break > + ;; > + *) > + break > + exit 1 > + ;; > + esac > +done I haven't tried this patch, but would this work well with options meant for the 'git rev-list --parents "$@"' that grabs the list of merge commits to learn from? e.g. $ contrib/rerere-train.sh -n 4 --merges master $ contrib/rerere-train.sh --overwrite -n 4 --merges master $ contrib/rerere-train.sh -n 4 --overwrite --merges master I do not think it is necessary to make the last one work; as long as the first two work as expected, we are good even if the last one dies with a sensible message e.g. "options X, Y and Z must be given before other options" (currently "X, Y and Z" consists only of "--overwrite", but I think you get what I mean). > . "$(git --exec-path)/git-sh-setup" > require_work_tree > cd_to_toplevel > @@ -34,6 +62,10 @@ do > # Cleanly merges > continue > fi > + if [ $overwrite == 1 ] if test "$overwrite" = 1 cf. Documentation/CodingGuidelines. > + then > + git rerere forget . > + fi > if test -s "$GIT_DIR/MERGE_RR" > then > git show -s --pretty=format:"Learning from %h %s" "$commit"