#!/pro/bin/perl use strict; use warnings; use VCS::SCCS; my @sccs = glob ("SCCS/s.*") or die "No SCCS source files to convert\n"; -d ".git" and die ".git already exists\n"; system "git init"; # http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html # could be explored to write checkout hooks that translate SCCS # keywords to actual content. Would be hard to translate back sub pr_date { my @dt = localtime shift; sprintf "%s %02d-%02d-%4d %02d:%02d:%02d", (qw( Sun Mon Tue Wed Thu Fri Sat ))[$dt[6]], $dt[3], $dt[4] + 1, $dt[5] + 1900, $dt[2], $dt[1], $dt[0]; } # pr_date # Submit in the same sequence as the original my %sccs; my %file; foreach my $f (@sccs) { my $sccs = VCS::SCCS->new ($f) or die "Cannot convert $f\n"; my $fn = $sccs->file (); $file{$fn}++; foreach my $rm (@{$sccs->revision_map ()}) { my ($rev, $vsn) = @{$rm}; $sccs{pack "NA*", $sccs->delta ($rev)->{stamp}} = [ $sccs, $rev ]; } } foreach my $c (sort keys %sccs) { my ($sccs, $rev) = @{$sccs{$c}}; # GIT supports get-hooks, to translate on retrieval # $sccs->set_translate ("git"); my $fn = $sccs->file (); my %delta = %{$sccs->delta ($rev)}; my $stamp = pr_date ($delta{stamp}); my $vsn = $delta{version}; printf STDERR "%-20s %3d %6s %s %s %s\n", $fn, $rev, $vsn, $stamp, $delta{date}, $delta{"time"}; open my $fh, ">", $fn or die "Cannot write: $!"; print $fh scalar $sccs->body ($rev); close $fh; system "git", "add", $fn; # Do the git actions to put this file in git ... my $mr = $delta{mr} || ""; $mr =~ s/^-$//; my $cmnt = $delta{comment} || ""; my $msg = join ("\n", grep m/\S/, $cmnt, $mr) || "Checkin"; $msg .= "\nrev $rev ($vsn) by $delta{committer} on $stamp"; system "git", "commit", "-m", $msg, $fn; }