diff options
author | Jan Holesovsky <kendy@suse.cz> | 2007-10-05 08:20:15 +0000 |
---|---|---|
committer | Jan Holesovsky <kendy@suse.cz> | 2007-10-05 08:20:15 +0000 |
commit | d61d796c4d63b85d0c1078b2c53757a5f5104d8c (patch) | |
tree | 5a079e791af4b5fa2845efa2f66ba357364645b2 /git | |
parent | 05009ffa447c2bae459c23eed8799868f6eb9498 (diff) |
Use rcs to access version instead of local cvs server.
Diffstat (limited to 'git')
-rw-r--r-- | git/git-cvsimport-rcs.diff | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/git/git-cvsimport-rcs.diff b/git/git-cvsimport-rcs.diff new file mode 100644 index 000000000..0257cbe8b --- /dev/null +++ b/git/git-cvsimport-rcs.diff @@ -0,0 +1,437 @@ +--- git-1.4.3.1/git-cvsimport.perl 2006-10-21 05:12:36.000000000 +0200 ++++ git-cvsimport.rcs 2007-02-05 10:34:52.000000000 +0100 +@@ -1,4 +1,5 @@ + #!/usr/bin/perl -w ++use lib (split(/:/, $ENV{GITPERLLIB} || "/usr/lib/perl5/site_perl/5.8.8")); + + # This tool is copyright (c) 2005, Matthias Urlichs. + # It is released under the Gnu Public License, version 2. +@@ -123,7 +124,7 @@ if ($#ARGV == 0) { + + our @mergerx = (); + if ($opt_m) { +- @mergerx = ( qr/\W(?:from|of|merge|merging|merged) (\w+)/i ); ++ @mergerx = ( qr/\W(?:from|of|merge|merging|merged) ([\w-]+)/i ); + } + if ($opt_M) { + push (@mergerx, qr/$opt_M/); +@@ -132,266 +133,8 @@ if ($opt_M) { + select(STDERR); $|=1; select(STDOUT); + + +-package CVSconn; +-# Basic CVS dialog. +-# We're only interested in connecting and downloading, so ... +- +-use File::Spec; +-use File::Temp qw(tempfile); +-use POSIX qw(strftime dup2); +- +-sub new { +- my($what,$repo,$subdir) = @_; +- $what=ref($what) if ref($what); +- +- my $self = {}; +- $self->{'buffer'} = ""; +- bless($self,$what); +- +- $repo =~ s#/+$##; +- $self->{'fullrep'} = $repo; +- $self->conn(); +- +- $self->{'subdir'} = $subdir; +- $self->{'lines'} = undef; +- +- return $self; +-} +- +-sub conn { +- my $self = shift; +- my $repo = $self->{'fullrep'}; +- if($repo =~ s/^:pserver:(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?//) { +- my($user,$pass,$serv,$port) = ($1,$2,$3,$4); +- $user="anonymous" unless defined $user; +- my $rr2 = "-"; +- unless($port) { +- $rr2 = ":pserver:$user\@$serv:$repo"; +- $port=2401; +- } +- my $rr = ":pserver:$user\@$serv:$port$repo"; +- +- unless($pass) { +- open(H,$ENV{'HOME'}."/.cvspass") and do { +- # :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z +- while(<H>) { +- chomp; +- s/^\/\d+\s+//; +- my ($w,$p) = split(/\s/,$_,2); +- if($w eq $rr or $w eq $rr2) { +- $pass = $p; +- last; +- } +- } +- }; +- } +- $pass="A" unless $pass; +- +- my $s = IO::Socket::INET->new(PeerHost => $serv, PeerPort => $port); +- die "Socket to $serv: $!\n" unless defined $s; +- $s->write("BEGIN AUTH REQUEST\n$repo\n$user\n$pass\nEND AUTH REQUEST\n") +- or die "Write to $serv: $!\n"; +- $s->flush(); +- +- my $rep = <$s>; +- +- if($rep ne "I LOVE YOU\n") { +- $rep="<unknown>" unless $rep; +- die "AuthReply: $rep\n"; +- } +- $self->{'socketo'} = $s; +- $self->{'socketi'} = $s; +- } else { # local or ext: Fork off our own cvs server. +- my $pr = IO::Pipe->new(); +- my $pw = IO::Pipe->new(); +- my $pid = fork(); +- die "Fork: $!\n" unless defined $pid; +- my $cvs = 'cvs'; +- $cvs = $ENV{CVS_SERVER} if exists $ENV{CVS_SERVER}; +- my $rsh = 'rsh'; +- $rsh = $ENV{CVS_RSH} if exists $ENV{CVS_RSH}; +- +- my @cvs = ($cvs, 'server'); +- my ($local, $user, $host); +- $local = $repo =~ s/:local://; +- if (!$local) { +- $repo =~ s/:ext://; +- $local = !($repo =~ s/^(?:([^\@:]+)\@)?([^:]+)://); +- ($user, $host) = ($1, $2); +- } +- if (!$local) { +- if ($user) { +- unshift @cvs, $rsh, '-l', $user, $host; +- } else { +- unshift @cvs, $rsh, $host; +- } +- } +- +- unless($pid) { +- $pr->writer(); +- $pw->reader(); +- dup2($pw->fileno(),0); +- dup2($pr->fileno(),1); +- $pr->close(); +- $pw->close(); +- exec(@cvs); +- } +- $pw->writer(); +- $pr->reader(); +- $self->{'socketo'} = $pw; +- $self->{'socketi'} = $pr; +- } +- $self->{'socketo'}->write("Root $repo\n"); +- +- # Trial and error says that this probably is the minimum set +- $self->{'socketo'}->write("Valid-responses ok error Valid-requests Mode M Mbinary E Checked-in Created Updated Merged Removed\n"); +- +- $self->{'socketo'}->write("valid-requests\n"); +- $self->{'socketo'}->flush(); +- +- chomp(my $rep=$self->readline()); +- if($rep !~ s/^Valid-requests\s*//) { +- $rep="<unknown>" unless $rep; +- die "Expected Valid-requests from server, but got: $rep\n"; +- } +- chomp(my $res=$self->readline()); +- die "validReply: $res\n" if $res ne "ok"; +- +- $self->{'socketo'}->write("UseUnchanged\n") if $rep =~ /\bUseUnchanged\b/; +- $self->{'repo'} = $repo; +-} +- +-sub readline { +- my($self) = @_; +- return $self->{'socketi'}->getline(); +-} +- +-sub _file { +- # Request a file with a given revision. +- # Trial and error says this is a good way to do it. :-/ +- my($self,$fn,$rev) = @_; +- $self->{'socketo'}->write("Argument -N\n") or return undef; +- $self->{'socketo'}->write("Argument -P\n") or return undef; +- # -kk: Linus' version doesn't use it - defaults to off +- if ($opt_k) { +- $self->{'socketo'}->write("Argument -kk\n") or return undef; +- } +- $self->{'socketo'}->write("Argument -r\n") or return undef; +- $self->{'socketo'}->write("Argument $rev\n") or return undef; +- $self->{'socketo'}->write("Argument --\n") or return undef; +- $self->{'socketo'}->write("Argument $self->{'subdir'}/$fn\n") or return undef; +- $self->{'socketo'}->write("Directory .\n") or return undef; +- $self->{'socketo'}->write("$self->{'repo'}\n") or return undef; +- # $self->{'socketo'}->write("Sticky T1.0\n") or return undef; +- $self->{'socketo'}->write("co\n") or return undef; +- $self->{'socketo'}->flush() or return undef; +- $self->{'lines'} = 0; +- return 1; +-} +-sub _line { +- # Read a line from the server. +- # ... except that 'line' may be an entire file. ;-) +- my($self, $fh) = @_; +- die "Not in lines" unless defined $self->{'lines'}; +- +- my $line; +- my $res=0; +- while(defined($line = $self->readline())) { +- # M U gnupg-cvs-rep/AUTHORS +- # Updated gnupg-cvs-rep/ +- # /daten/src/rsync/gnupg-cvs-rep/AUTHORS +- # /AUTHORS/1.1///T1.1 +- # u=rw,g=rw,o=rw +- # 0 +- # ok +- +- if($line =~ s/^(?:Created|Updated) //) { +- $line = $self->readline(); # path +- $line = $self->readline(); # Entries line +- my $mode = $self->readline(); chomp $mode; +- $self->{'mode'} = $mode; +- defined (my $cnt = $self->readline()) +- or die "EOF from server after 'Changed'\n"; +- chomp $cnt; +- die "Duh: Filesize $cnt" if $cnt !~ /^\d+$/; +- $line=""; +- $res = $self->_fetchfile($fh, $cnt); +- } elsif($line =~ s/^ //) { +- print $fh $line; +- $res += length($line); +- } elsif($line =~ /^M\b/) { +- # output, do nothing +- } elsif($line =~ /^Mbinary\b/) { +- my $cnt; +- die "EOF from server after 'Mbinary'" unless defined ($cnt = $self->readline()); +- chomp $cnt; +- die "Duh: Mbinary $cnt" if $cnt !~ /^\d+$/ or $cnt<1; +- $line=""; +- $res += $self->_fetchfile($fh, $cnt); +- } else { +- chomp $line; +- if($line eq "ok") { +- # print STDERR "S: ok (".length($res).")\n"; +- return $res; +- } elsif($line =~ s/^E //) { +- # print STDERR "S: $line\n"; +- } elsif($line =~ /^(Remove-entry|Removed) /i) { +- $line = $self->readline(); # filename +- $line = $self->readline(); # OK +- chomp $line; +- die "Unknown: $line" if $line ne "ok"; +- return -1; +- } else { +- die "Unknown: $line\n"; +- } +- } +- } +- return undef; +-} +-sub file { +- my($self,$fn,$rev) = @_; +- my $res; +- +- my ($fh, $name) = tempfile('gitcvs.XXXXXX', +- DIR => File::Spec->tmpdir(), UNLINK => 1); +- +- $self->_file($fn,$rev) and $res = $self->_line($fh); +- +- if (!defined $res) { +- print STDERR "Server has gone away while fetching $fn $rev, retrying...\n"; +- truncate $fh, 0; +- $self->conn(); +- $self->_file($fn,$rev) or die "No file command send"; +- $res = $self->_line($fh); +- die "Retry failed" unless defined $res; +- } +- close ($fh); +- +- return ($name, $res); +-} +-sub _fetchfile { +- my ($self, $fh, $cnt) = @_; +- my $res = 0; +- my $bufsize = 1024 * 1024; +- while($cnt) { +- if ($bufsize > $cnt) { +- $bufsize = $cnt; +- } +- my $buf; +- my $num = $self->{'socketi'}->read($buf,$bufsize); +- die "Server: Filesize $cnt: $num: $!\n" if not defined $num or $num<=0; +- print $fh $buf; +- $res += $num; +- $cnt -= $num; +- } +- return $res; +-} +- +- + package main; + +-my $cvs = CVSconn->new($opt_d, $cvs_tree); +- + + sub pdate($) { + my($d) = @_; +@@ -401,30 +144,6 @@ sub pdate($) { + return timegm($6||0,$5,$4,$3,$2-1,$y); + } + +-sub pmode($) { +- my($mode) = @_; +- my $m = 0; +- my $mm = 0; +- my $um = 0; +- for my $x(split(//,$mode)) { +- if($x eq ",") { +- $m |= $mm&$um; +- $mm = 0; +- $um = 0; +- } elsif($x eq "u") { $um |= 0700; +- } elsif($x eq "g") { $um |= 0070; +- } elsif($x eq "o") { $um |= 0007; +- } elsif($x eq "r") { $mm |= 0444; +- } elsif($x eq "w") { $mm |= 0222; +- } elsif($x eq "x") { $mm |= 0111; +- } elsif($x eq "=") { # do nothing +- } else { die "Unknown mode: $mode\n"; +- } +- } +- $m |= $mm&$um; +- return $m; +-} +- + sub getwd() { + my $pwd = `pwd`; + chomp $pwd; +@@ -609,6 +328,9 @@ my(@old,@new,@skipped,%ignorebranch); + # commits that cvsps cannot place anywhere... + $ignorebranch{'#CVSPS_NO_BRANCH'} = 1; + ++# ooo specific ++$ignorebranch{'ausetestcwswarumgehtunderscorenicht'} = 1; ++ + sub commit { + if ($branch eq $opt_o && !$index{branch} && !get_headref($branch, $git_dir)) { + # looks like an initial commit +@@ -661,6 +383,12 @@ sub commit { + my $pid = open2(my $commit_read, my $commit_write, + 'git-commit-tree', $tree, @commit_args); + ++ # ooo specific: revert the order of lines in the 'INTEGRATION' logs ++ if ($logmsg =~ /^INTEGRATION:/) { ++ $logmsg = join("\n", reverse(split(/\n/,$logmsg))); ++ } ++ $logmsg =~ s/^\n+//; ++ + # compatibility with git2cvs + substr($logmsg,32767) = "" if length($logmsg) > 32767; + $logmsg =~ s/[\s\n]+\z//; +@@ -693,6 +421,14 @@ sub commit { + $xtag =~ tr/_/\./ if ( $opt_u ); + $xtag =~ s/[\/]/$opt_s/g; + ++ # ooo specific ++ if ( -f "$git_dir/refs/heads/$xtag" ) { ++ print STDERR "Ignoring tag '$xtag', already exists as a branch.\n"; ++ } ++ elsif ( -f "$git_dir/refs/tags/$xtag" ) { ++ print STDERR "Ignoring tag '$xtag', already exists.\n"; ++ } ++ else { + my $pid = open2($in, $out, 'git-mktag'); + print $out "object $cid\n". + "type commit\n". +@@ -719,6 +455,7 @@ sub commit { + or die "Cannot write tag $xtag: $!\n"; + + print "Created tag '$xtag' on '$branch'\n" if $opt_v; ++ } + } + }; + +@@ -751,10 +488,16 @@ while(<CVS>) { + } else { + $author_name = $author_email = $_; + } ++ # ooo specific ++ if ( !($author_email =~ /@/) ) { ++ $author_email .= '@openoffice.org'; ++ } + $state = 4; + } elsif($state == 4 and s/^Branch:\s+//) { + s/\s+$//; + s/[\/]/$opt_s/g; ++ # ooo specific ++ s/cws_...6.._//; + $branch = $_; + $state = 5; + } elsif($state == 5 and s/^Ancestor branch:\s+//) { +@@ -768,6 +511,9 @@ while(<CVS>) { + redo; + } elsif($state == 6 and s/^Tag:\s+//) { + s/\s+$//; ++ # ooo specific ++ s/CWS_...6.._(.*)_ANCHOR/$1/; ++ s/jimmac02/jimmac02_tag/; + if($_ eq "(none)") { + $tag = undef; + } else { +@@ -835,8 +581,23 @@ while(<CVS>) { + next; + } + print "Fetching $fn v $rev\n" if $opt_v; +- my ($tmpname, $size) = $cvs->file($fn,$rev); +- if($size == -1) { ++ #my ($tmpname, $size) = $cvs->file($fn,$rev); ++ my $rcs_fname = "$opt_d/$cvs_tree/$fn,v"; ++ if (! -e $rcs_fname ) { ++ $rcs_fname =~ s#/([^/]*)$#/Attic/$1#; ++ } ++ my ($tmpname,$revision) = split('\n', `co -r$rev -kk "$rcs_fname" 2>&1`); ++ if ( !($tmpname =~ s/^.* --> // ) ) { ++ die "Cannot get revision using 'co -r$rev -kk \"$rcs_fname\"'"; ++ } ++ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, ++ $atime,$mtime,$ctime,$blksize,$blocks) = lstat("$tmpname"); ++ # ooo specific - removes leading \t's ++ if ( $tmpname =~ "\.[ch]\$" || $tmpname =~ "\.[ch]xx\$" || $tmpname =~ "\.mk\$" || $tmpname =~ "\.src\$" ) ++ { ++ system("sed -i ':loop; s/^\\(\\t*\\)\\t/\\1 /; t loop' '$tmpname'"); ++ } ++ if( ($revision =~ /absent/) || ($revision =~ /no revisions present/) ) { + push(@old,$fn); + print "Drop $fn\n" if $opt_v; + } else { +@@ -850,10 +611,10 @@ while(<CVS>) { + my $sha = <$F>; + chomp $sha; + close $F; +- my $mode = pmode($cvs->{'mode'}); +- push(@new,[$mode, $sha, $fn]); # may be resurrected! ++ #my $mode = pmode($cvs->{'mode'}); ++ push(@new,[($mode & 0777), $sha, $fn]); # may be resurrected! + } +- unlink($tmpname); ++ unlink($tmpname) if (defined($tmpname)); + } elsif($state == 9 and /^\s+(.+?):\d+(?:\.\d+)+->(\d+(?:\.\d+)+)\(DEAD\)\s*$/) { + my $fn = $1; + $fn =~ s#^/+##; +@@ -867,7 +628,7 @@ while(<CVS>) { + last; + } + commit(); +- if (($commitcount & 1023) == 0) { ++ if (($commitcount & 2047) == 0) { + system("git repack -a -d"); + } + $state = 1; |