svn commit: r195734 - user/des/fmerge

Dag-Erling Smorgrav des at FreeBSD.org
Fri Jul 17 07:24:36 UTC 2009


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();
 }
 


More information about the svn-src-user mailing list