r3725 - branches/nexuiz-2.0

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Jun 28 11:20:43 EDT 2008


Author: div0
Date: 2008-06-28 11:20:43 -0400 (Sat, 28 Jun 2008)
New Revision: 3725

Added:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/branch-manager
Log:
Added a script to manage this branch. Always use this script when merging over stuff from trunk!


Added: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	                        (rev 0)
+++ branches/nexuiz-2.0/.patchsets	2008-06-28 15:20:43 UTC (rev 3725)
@@ -0,0 +1,2 @@
+master = svn://svn.icculus.org/nexuiz/trunk
+revisions_applied = 1-3721

Added: branches/nexuiz-2.0/branch-manager
===================================================================
--- branches/nexuiz-2.0/branch-manager	                        (rev 0)
+++ branches/nexuiz-2.0/branch-manager	2008-06-28 15:20:43 UTC (rev 3725)
@@ -0,0 +1,270 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+sub OutputOf($@)
+{
+	my ($cmd, @args) = @_;
+	$cmd =~ s/#(\d)/"\$ARG$1"/g;
+	$ENV{"ARG$_"} = $args[$_-1]
+		for 1.. at args;
+
+	open my $fh, '-|', $cmd
+		or die "popen $cmd: $!";
+
+	$ENV{"ARG$_"} = ''
+		for 1.. at args;
+
+	undef local $/;
+	my $ret = <$fh>;
+	close $fh;
+
+	return $ret;
+}
+
+my %conf = 
+(
+	master => '',
+	revisions_applied => ''
+);
+my @revisions_applied = (); # array of [first, last] ranges
+
+sub LoadSettings()
+{
+	open my $fh, '<', ".patchsets"
+		or return;
+	while(<$fh>)
+	{
+		chomp;
+		/^([^=]*?)\s*=\s*(.*?)$/s
+			or next;
+		die "Invalid config item: $1 (allowed: @{[sort keys %conf]})"
+			if not exists $conf{$1};
+		$conf{$1} = $2;
+	}
+
+	@revisions_applied = map { /^(\d+)-(\d+)$/s or die "Invalid revision spec $_"; [$1, $2]; } split /,/, $conf{revisions_applied};
+}
+
+sub WriteSettings()
+{
+	$conf{revisions_applied} = join ',', map { "$_->[0]-$_->[1]" } @revisions_applied;
+
+	open my $fh, '>', ".patchsets"
+		or die "writing settings: $!";
+	for(sort keys %conf)
+	{
+		print $fh "$_ = $conf{$_}\n";
+	}
+}
+
+sub AddPatch($$)
+{
+	my ($first, $last) = @_;
+	die "Invalid range" if $first > $last;
+
+	my @rev = sort { $a->[0] <=> $b->[0] } (@revisions_applied, [$first, $last]);
+
+	my $i = 0;
+	while($i < @rev - 1)
+	{
+		my $a = $rev[$i][0];
+		my $b = $rev[$i][1];
+		my $c = $rev[$i+1][0];
+		my $d = $rev[$i+1][1];
+
+		if($b >= $c)
+		{
+			die "overlapping patch: $a-$b overlaps $c-$d";
+		}
+		if($b == $c - 1)
+		{
+			splice @rev, $i, 2, [$a, $d];
+			next;
+		}
+		++$i;
+	}
+
+	@revisions_applied = @rev;
+}
+
+sub RemovePatch($$)
+{
+	my ($first, $last) = @_;
+	die "Invalid range" if $first > $last;
+
+	my @rev = sort { $a->[0] <=> $b->[0] } (@revisions_applied);
+
+	my $i = 0;
+	while($i < @rev)
+	{
+		my $a = $rev[$i][0];
+		my $b = $rev[$i][1];
+
+		if($first >= $a && $last <= $b)
+		{
+			# this is the range
+			my @replacement;
+
+			if($first == $a && $last == $b)
+			{
+				@replacement = ();
+			}
+			elsif($first == $a)
+			{
+				@replacement = ([$last + 1, $b]);
+			}
+			elsif($last == $b)
+			{
+				@replacement = ([$a, $first - 1]);
+			}
+			else
+			{
+				@replacement = ([$a, $first - 1], [$last + 1, $b]);
+			}
+			splice @rev, $i, 1, @replacement;
+			@revisions_applied = @rev;
+			return;
+		}
+	}
+
+	die "could not remove range: not in set";
+}
+
+sub GetUnappliedRanges($)
+{
+	my ($lastrev) = @_;
+	my @unapplied = ();
+
+	my $cur = 0;
+	for(@revisions_applied)
+	{
+		my ($a, $b) = @$_;
+		if($a - 1 >= $cur + 1)
+		{
+			push @unapplied, [$cur + 1, $a - 1];
+		}
+		$cur = $b;
+	}
+	if($lastrev >= $cur + 1)
+	{
+		push @unapplied, [$cur + 1, $lastrev];
+	}
+	return @unapplied;
+}
+
+sub GetMasterRev()
+{
+	my $svninfo = OutputOf 'svn info #1', $conf{master};
+	$svninfo =~ /^Last Changed Rev: (\d+)$/m
+		or die "could not get svn info";
+	return $1;
+}
+
+my ($cmd, @args) = @ARGV;
+$cmd = 'help' if not defined $cmd;
+
+if($cmd eq 'info')
+{
+	LoadSettings();
+	for(@revisions_applied)
+	{
+		my ($a, $b) = @$_;
+		print "Applied: $a to $b\n";
+	}
+	for(GetUnappliedRanges(GetMasterRev()))
+	{
+		my ($a, $b) = @$_;
+		print "Unapplied: $a to $b\n";
+	}
+}
+elsif($cmd eq 'unmerged')
+{
+	LoadSettings();
+	for(GetUnappliedRanges(GetMasterRev()))
+	{
+		my ($a, $b) = @$_;
+		print "Unapplied: $a to $b\n";
+		my $log = OutputOf 'svn log -r#1:#2 #3', $a, $b, $conf{master};
+		$log =~ s/^/  /gm;
+		print "$log\n\n";
+	}
+}
+elsif($cmd eq 'merge')
+{
+	my ($first, $last) = @args;
+	$last = $first if not defined $last;
+
+	die "There is an uncommitted merge"
+		if -f '.commitmsg';
+
+	LoadSettings();
+	AddPatch $first, $last;
+
+	print OutputOf 'svn merge -r#1:#2 #3', ($first - 1), $last, $conf{master};
+	
+	open my $fh, '>', '.commitmsg'
+		or die "open .commitmsg";
+	print $fh OutputOf 'svn log -r#1:#2 #3', $first, $last, $conf{master};
+	close $fh;
+
+	WriteSettings();
+}
+elsif($cmd eq 'undo')
+{
+	my ($first, $last) = @args;
+	$last = $first if not defined $last;
+	
+	die "There is an uncommitted merge"
+		if -f '.commitmsg';
+
+	LoadSettings();
+	RemovePatch $first, $last;
+
+	print OutputOf 'svn merge -r#2:#1 #3', ($first - 1), $last, $conf{master};
+
+	open my $fh, '>', '.commitmsg'
+		or die "open .commitmsg";
+	print $fh OutputOf 'svn log -r#1:#2 #3', $first, $last, $conf{master};
+	close $fh;
+
+	WriteSettings();
+}
+elsif($cmd eq 'commit')
+{
+	system 'vim .commitmsg';
+	print "Hit Enter if OK to commit, Ctrl-C otherwise...\n";
+	my $ok = <STDIN>;
+	if(system 'svn commit -F .commitmsg')
+	{
+		unlink '.commitmsg';
+	}
+}
+elsif($cmd eq 'revert')
+{
+	if(system 'svn revert -R .')
+	{
+		unlink '.commitmsg';
+	}
+}
+elsif($cmd eq 'init')
+{
+	my ($master, $rev) = @args;
+	$conf{master} = $master;
+	@revisions_applied = [1, $rev];
+	WriteSettings();
+}
+else
+{
+	print <<EOF;
+Usage:
+  $0 init masterrepo rev
+  $0 info
+  $0 unmerged
+  $0 merge rev1 rev2
+  $0 undo rev1 rev2
+  $0 commit
+  $0 revert
+EOF
+}


Property changes on: branches/nexuiz-2.0/branch-manager
___________________________________________________________________
Name: svn:executable
   + *




More information about the nexuiz-commits mailing list