From owner-svn-src-user@FreeBSD.ORG Fri Jul 17 07:24:35 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3724A10656A6; Fri, 17 Jul 2009 07:24:35 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1B6438FC20; Fri, 17 Jul 2009 07:24:35 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n6H7OYh6059293; Fri, 17 Jul 2009 07:24:34 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6H7OYVr059291; Fri, 17 Jul 2009 07:24:34 GMT (envelope-from des@svn.freebsd.org) Message-Id: <200907170724.n6H7OYVr059291@svn.freebsd.org> From: Dag-Erling Smorgrav Date: Fri, 17 Jul 2009 07:24:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195734 - user/des/fmerge X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jul 2009 07:24:36 -0000 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(); }