Date: Fri, 17 Jul 2009 07:24:34 +0000 (UTC) From: Dag-Erling Smorgrav <des@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r195734 - user/des/fmerge Message-ID: <200907170724.n6H7OYVr059291@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: des Date: Fri Jul 17 07:24:34 2009 New Revision: 195734 URL: http://svn.freebsd.org/changeset/base/195734 Log: Collapse ranges, eliminate duplicates, improve handling of reverse merges. Modified: user/des/fmerge/fmerge.pl Modified: user/des/fmerge/fmerge.pl ============================================================================== --- user/des/fmerge/fmerge.pl Fri Jul 17 07:07:38 2009 (r195733) +++ user/des/fmerge/fmerge.pl Fri Jul 17 07:24:34 2009 (r195734) @@ -37,7 +37,8 @@ our $pretend; our $branch = "head"; our $target = "."; -our @revs; +our %revs = (0 => 0); +our @ranges; our $svn_path; our $svn_url; @@ -126,13 +127,75 @@ sub examine() { debug("svn_path = '$svn_path'"); } +sub addrevs($$) { + my ($m, $n) = @_; + if ($m > $n) { + for (my $i = $m; $i > $n; --$i) { + $revs{$i} = -1; + } + } else { + for (my $i = $m + 1; $i <= $n; ++$i) { + $revs{$i} = +1; + } + } +} + +sub revs2ranges() { + my ($m, $n); + # process in reverse, 0 acts as a sentinel + foreach my $i (sort({ $b <=> $a } keys(%revs)), 0) { + if (!$m) { + $m = $n = $i; + next; + } elsif ($i == $m - 1 && $revs{$m} == +1 && $revs{$i} == +1) { + $m = $i; + next; + } elsif ($i == $m + 1 && $revs{$m} == -1 && $revs{$i} == -1) { + $m = $i; + next; + } else { + if ($revs{$m} == +1) { + push(@ranges, [ $m - 1, $n ]); + } elsif ($revs{$m} == -1) { + push(@ranges, [ $n, $m - 1 ]); + } + $m = $n = $i; + } + } +} + +sub printranges($) { + my ($fh) = @_; + my @print; + foreach my $range (@ranges) { + my ($m, $n) = @{$range}; + if ($n == $m + 1) { + push(@print, $n); + } elsif ($n == $m - 1) { + push(@print, "-$m"); + } else { + push(@print, "$m:$n"); + } + } + print($fh "merging ", join(', ', @print), "\n") + if @print; +} + sub fmerge() { - if (!@revs) { + if (!@ranges) { svn_merge("$svn_root/$branch/$svn_path", $target); } - foreach my $rev (@revs) { - my ($m, $n) = @{$rev}; - svn_merge("-r$m:$n", "$svn_root/$branch/$svn_path", $target); + foreach my $range (@ranges) { + my ($m, $n) = @{$range}; + my $spec; + if ($n == $m + 1) { + $spec = "-c$n"; + } elsif ($n == $m - 1) { + $spec = "-c-$n"; + } else { + $spec = "-r$m:$n"; + } + svn_merge($spec, "$svn_root/$branch/$svn_path", $target); } } @@ -166,11 +229,15 @@ MAIN:{ while (@ARGV && $ARGV[0] =~ m/^[cr]?\d+([-:][cr]?\d+)?(,[cr]?\d+([-:][cr]?\d+)?)*$/) { foreach my $rev (split(',', $ARGV[0])) { if ($rev =~ m/^[cr]?(\d+)$/) { - push(@revs, [ $1 - 1, $1 ]); + addrevs($1 - 1, $1); } elsif ($rev =~ m/^[cr]?-(\d+)$/) { - push(@revs, [ $1, $1 - 1 ]); + addrevs($1, $1 - 1); } elsif ($rev =~ m/^[cr]?(\d+)[-:][cr]?(\d+)$/) { - push(@revs, [ $1, $2 ]); + if ($1 < $2) { + addrevs($1 - 1, $2); + } else { + addrevs($1, $2 - 1); + } } else { usage(); } @@ -203,6 +270,9 @@ MAIN:{ } examine(); + revs2ranges(); + printranges(\*STDERR) + if $debug; fmerge(); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907170724.n6H7OYVr059291>