Skip to content

Commit

Permalink
Merge branch 'ew/rerere'
Browse files Browse the repository at this point in the history
* ew/rerere:
  rerere: record (or avoid misrecording) resolved, skipped or aborted rebase/am
  git-rerere: add 'gc' command.
  rerere: add clear, diff, and status commands
  • Loading branch information
Junio C Hamano committed Dec 13, 2006
2 parents 78ba004 + f131dd4 commit d0085ad
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 2 deletions.
35 changes: 33 additions & 2 deletions Documentation/git-rerere.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ git-rerere - Reuse recorded resolve

SYNOPSIS
--------
'git-rerere'

'git-rerere' [clear|diff|status]

DESCRIPTION
-----------
Expand All @@ -27,6 +26,38 @@ results and applying the previously recorded hand resolution.
You need to create `$GIT_DIR/rr-cache` directory to enable this
command.


COMMANDS
--------

Normally, git-rerere is run without arguments or user-intervention.
However, it has several commands that allow it to interact with
its working state.

'clear'::

This resets the metadata used by rerere if a merge resolution is to be
is aborted. Calling gitlink:git-am[1] --skip or gitlink:git-rebase[1]
[--skip|--abort] will automatcally invoke this command.

'diff'::

This displays diffs for the current state of the resolution. It is
useful for tracking what has changed while the user is resolving
conflicts. Additional arguments are passed directly to the system
diff(1) command installed in PATH.

'status'::

Like diff, but this only prints the filenames that will be tracked
for resolutions.

'gc'::

This command is used to prune records of conflicted merge that
occurred long time ago.


DISCUSSION
----------

Expand Down
8 changes: 8 additions & 0 deletions git-am.sh
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ last=`cat "$dotest/last"`
this=`cat "$dotest/next"`
if test "$skip" = t
then
if test -d "$GIT_DIR/rr-cache"
then
git-rerere clear
fi
this=`expr "$this" + 1`
resume=
fi
Expand Down Expand Up @@ -408,6 +412,10 @@ do
stop_here_user_resolve $this
fi
apply_status=0
if test -d "$GIT_DIR/rr-cache"
then
git rerere
fi
;;
esac

Expand Down
8 changes: 8 additions & 0 deletions git-rebase.sh
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ do
--skip)
if test -d "$dotest"
then
if test -d "$GIT_DIR/rr-cache"
then
git-rerere clear
fi
prev_head="`cat $dotest/prev_head`"
end="`cat $dotest/end`"
msgnum="`cat $dotest/msgnum`"
Expand All @@ -157,6 +161,10 @@ do
exit
;;
--abort)
if test -d "$GIT_DIR/rr-cache"
then
git-rerere clear
fi
if test -d "$dotest"
then
rm -r "$dotest"
Expand Down
57 changes: 57 additions & 0 deletions git-rerere.perl
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,66 @@ sub merge {
return 0;
}

sub garbage_collect_rerere {
# We should allow specifying these from the command line and
# that is why the caller gives @ARGV to us, but I am lazy.

my $cutoff_noresolve = 15; # two weeks
my $cutoff_resolve = 60; # two months
my @to_remove;
while (<$rr_dir/*/preimage>) {
my ($dir) = /^(.*)\/preimage$/;
my $cutoff = ((-f "$dir/postimage")
? $cutoff_resolve
: $cutoff_noresolve);
my $age = -M "$_";
if ($cutoff <= $age) {
push @to_remove, $dir;
}
}
if (@to_remove) {
rmtree(\@to_remove);
}
}

-d "$rr_dir" || exit(0);

read_rr();

if (@ARGV) {
my $arg = shift @ARGV;
if ($arg eq 'clear') {
for my $path (keys %merge_rr) {
my $name = $merge_rr{$path};
if (-d "$rr_dir/$name" &&
! -f "$rr_dir/$name/postimage") {
rmtree(["$rr_dir/$name"]);
}
}
unlink $merge_rr;
}
elsif ($arg eq 'status') {
for my $path (keys %merge_rr) {
print $path, "\n";
}
}
elsif ($arg eq 'diff') {
for my $path (keys %merge_rr) {
my $name = $merge_rr{$path};
system('diff', ((@ARGV == 0) ? ('-u') : @ARGV),
'-L', "a/$path", '-L', "b/$path",
"$rr_dir/$name/preimage", $path);
}
}
elsif ($arg eq 'gc') {
garbage_collect_rerere(@ARGV);
}
else {
die "$0 unknown command: $arg\n";
}
exit 0;
}

my %conflict = map { $_ => 1 } find_conflict();

# MERGE_RR records paths with conflicts immediately after merge
Expand Down

0 comments on commit d0085ad

Please sign in to comment.