#!/usr/bin/perl # expects to find versioned source files # how does it know when it is starting? (just assumes it is starting) use File::Basename; use File::Copy; my $svn = "svn"; # is there a module yet? my $added = 0; # fancier usage later? my $cleanup = 0; use Getopt::Long; GetOptions( 'added' => \$added, 'cleanup' => \$cleanup, 'help' => sub{usage()}, ); my ($source, $dest) = @ARGV; $dest =~ s#/*$#/#; unless((-e $source) and (-d $dest)) { usage(); } sub usage { print "usage:\n"; my $caller = $0; $caller =~ s#.*/##; print "\t$caller \n"; print "options:\n"; print " --added (it's already been added)\n"; print " --cleanup (cleanup existing versions)\n"; print " --help (show this message)\n"; die "\n"; } # end subroutine usage definition ######################################################################## my $file = basename($source); my $dfile = $dest . $file; my $sdir = dirname($source); my $pattern = "$sdir/.$file.???"; my @versions = glob($pattern); @versions = sort(grep({$_ !~ m/\.swp$/} @versions)); @versions or die "found no versions matching $pattern"; print "versions:\n\t", join("\n\t", @versions), "\n"; foreach my $version (@versions) { print "working: $version...\n"; open(IN, $version) or die "cannot read $version"; my $message = ; my @lines = ; close(IN); unless($message =~ m/^original file last modified on /) { unshift(@lines, $message); warn("$version had no message (really old)\n"); $message = "(really old version?)" . $message; } chomp($message); open(OUT, ">$dfile"); print OUT @lines; close(OUT); unless($added) { print "adding initial file...\n"; my $err = system($svn, "add", $dfile); $err and die "ERROR: $err $@ $!"; $added=1; } # XXX don't commit other local changes! (needs a test) my $err = system($svn, "commit", $dfile, "-m", $message); $err and die "ERROR: $err $@ $!"; if($cleanup) { warn("removing $version...\n"); unlink($version) or die "cannot remove $version"; } } copy($source, $dfile) or die "copy failed"; my $message = "last file in versioner->subversion transition"; my $err = system($svn, "commit", $dfile, "-m", $message); $err and die "ERROR: $err $@ $!"; if($cleanup) { warn("removing $source from original location\n"); unlink($source) or die "cannot remove $source"; }