Wed 2 Aug 2006
All my projects use Subversion for revision control, but on my laptop, I use SVK so I can keep working and committing even when away from an Internet connection. (Also: SVK’s merge support and branch tracking beats SVN’s hands down).
(This isn’t an SVK tutorial. For that, you should check out Ron Bieber’s excellent series of SVK tutorials.)
One part of SVK’s everyday workflow is having a mirrored repository, which represents the remote SVN repository, and a local repository, where you normally commit to. You then merge between these repositories — from local to mirrored to push changes to the main repository, mirrored to local to sync with the main repository.
For each project I work on, I name the mirrored and local repositories //$project_name/main and //$project_name/local, respectively. This means every time I want to push changes up to the main SVN repositories, I type svk sm -I //$project_name/local //$project_name/main — automatically merge all changes between branches, incremental commits.
Because that command never changes, and because I’m lazy, I wrote a mymerge “macro” to save myself the trouble of all that typing. Now, instead of that big, long command, I type svk mm $project_name. Much better.
mymerge works by subclassing SVK’s SVK::Command::Smerge class and overriding the parse_args() method. It does some monkeying around with the arguments, then hands control off to smerge.
package SVK::Command::Mymerge;
use strict;
use SVK::Version; our $VERSION = $SVK::VERSION;
use base qw( SVK::Command::Smerge );
sub options { () }
sub parse_arg {
my $self = shift;
my @arg = @_;
return if $#arg < 0;
my $depot = $arg[0];
$self->{incremental} = 1;
return $self->SUPER::parse_arg(”//$depot/local”,
“//$depot/main”);
}
The $self->{incremental} = 1; assignment is the same as supplying the -I flag to smerge in the original example. The last line does the important argument-mucking before passing control up to smerge.
If you’re interested in doing something similar, put this code in /usr/lib/perl5/site_perl/*/SVK/Commands/Mymerge.pm or wherever your SVK command modules happen to be. If you want to use a shortcut (I use mm), you’ll need to add a line to the %alias hash in SVK::Command, something like “mm mymerge”.
August 6th, 2006 at 05:39
I have an idea - checkout path tagging. Imagine you tag some //local checkouts with “work”, and then use a special flag in svk command for running the command with paths tagged that way. For example checkouts of //local/{foo,bar} are tagged as work, then “svk push –targets-from-tag work” => svk push //local/foo; svk push //local/bar, and this can be used for other commands as well.
Would you like to help impmlementing that?
November 17th, 2006 at 18:13
[…] Since I’m forever reinventing stuff that SVK already does, I thought I’d ask before coding up this idea: […]