]> git.ipfire.org Git - thirdparty/git.git/blobdiff - perl/Git/SVN.pm
Merge branch 'bc/sha-256-cvs-svn-updates'
[thirdparty/git.git] / perl / Git / SVN.pm
index 4b28b8778474bec673dd7f82fde0aba7afcafab4..d1c352f92b58392961b8e958c5539cba65458856 100644 (file)
@@ -2,7 +2,7 @@ package Git::SVN;
 use strict;
 use warnings;
 use Fcntl qw/:DEFAULT :seek/;
-use constant rev_map_fmt => 'NH40';
+use constant rev_map_fmt => 'NH*';
 use vars qw/$_no_metadata
             $_repack $_repack_flags $_use_svm_props $_head
             $_use_svnsync_props $no_reuse_existing
@@ -874,7 +874,7 @@ sub assert_index_clean {
                command_noisy('read-tree', $treeish) unless -e $self->{index};
                my $x = command_oneline('write-tree');
                my ($y) = (command(qw/cat-file commit/, $treeish) =~
-                          /^tree ($::sha1)/mo);
+                          /^tree ($::oid)/mo);
                return if $y eq $x;
 
                warn "Index mismatch: $y != $x\nrereading $treeish\n";
@@ -1020,7 +1020,7 @@ sub do_git_commit {
                $tree = $self->tmp_index_do(sub {
                                            command_oneline('write-tree') });
        }
-       die "Tree is not a valid sha1: $tree\n" if $tree !~ /^$::sha1$/o;
+       die "Tree is not a valid oid $tree\n" if $tree !~ /^$::oid$/o;
 
        my @exec = ('git', 'commit-tree', $tree);
        foreach ($self->get_commit_parents($log_entry)) {
@@ -1048,8 +1048,8 @@ sub do_git_commit {
        close $out_fh or croak $!;
        waitpid $pid, 0;
        croak $? if $?;
-       if ($commit !~ /^$::sha1$/o) {
-               die "Failed to commit, invalid sha1: $commit\n";
+       if ($commit !~ /^$::oid$/o) {
+               die "Failed to commit, invalid oid: $commit\n";
        }
 
        $self->rev_map_set($log_entry->{revision}, $commit, 1);
@@ -2087,10 +2087,10 @@ sub rebuild_from_rev_db {
        open my $fh, '<', $path or croak "open: $!";
        binmode $fh or croak "binmode: $!";
        while (<$fh>) {
-               length($_) == 41 or croak "inconsistent size in ($_) != 41";
+               length($_) == $::oid_length + 1 or croak "inconsistent size in ($_)";
                chomp($_);
                ++$r;
-               next if $_ eq ('0' x 40);
+               next if $_ eq ('0' x $::oid_length);
                $self->rev_map_set($r, $_);
                print "r$r = $_\n";
        }
@@ -2150,7 +2150,7 @@ sub rebuild {
        my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid;
        my $c;
        while (<$log>) {
-               if ( m{^commit ($::sha1)$} ) {
+               if ( m{^commit ($::oid)$} ) {
                        $c = $1;
                        next;
                }
@@ -2196,9 +2196,9 @@ sub rebuild {
 # (mainly tags)
 #
 # The format is this:
-#   - 24 bytes for every record,
+#   - 24 or 36 bytes for every record,
 #     * 4 bytes for the integer representing an SVN revision number
-#     * 20 bytes representing the sha1 of a git commit
+#     * 20 or 32 bytes representing the oid of a git commit
 #   - No empty padding records like the old format
 #     (except the last record, which can be overwritten)
 #   - new records are written append-only since SVN revision numbers
@@ -2207,7 +2207,7 @@ sub rebuild {
 #   - Piping the file to xxd -c24 is a good way of dumping it for
 #     viewing or editing (piped back through xxd -r), should the need
 #     ever arise.
-#   - The last record can be padding revision with an all-zero sha1
+#   - The last record can be padding revision with an all-zero oid
 #     This is used to optimize fetch performance when using multiple
 #     "fetch" directives in .git/config
 #
@@ -2215,38 +2215,39 @@ sub rebuild {
 
 sub _rev_map_set {
        my ($fh, $rev, $commit) = @_;
+       my $record_size = ($::oid_length / 2) + 4;
 
        binmode $fh or croak "binmode: $!";
        my $size = (stat($fh))[7];
-       ($size % 24) == 0 or croak "inconsistent size: $size";
+       ($size % $record_size) == 0 or croak "inconsistent size: $size";
 
        my $wr_offset = 0;
        if ($size > 0) {
-               sysseek($fh, -24, SEEK_END) or croak "seek: $!";
-               my $read = sysread($fh, my $buf, 24) or croak "read: $!";
-               $read == 24 or croak "read only $read bytes (!= 24)";
+               sysseek($fh, -$record_size, SEEK_END) or croak "seek: $!";
+               my $read = sysread($fh, my $buf, $record_size) or croak "read: $!";
+               $read == $record_size or croak "read only $read bytes (!= $record_size)";
                my ($last_rev, $last_commit) = unpack(rev_map_fmt, $buf);
-               if ($last_commit eq ('0' x40)) {
-                       if ($size >= 48) {
-                               sysseek($fh, -48, SEEK_END) or croak "seek: $!";
-                               $read = sysread($fh, $buf, 24) or
+               if ($last_commit eq ('0' x $::oid_length)) {
+                       if ($size >= ($record_size * 2)) {
+                               sysseek($fh, -($record_size * 2), SEEK_END) or croak "seek: $!";
+                               $read = sysread($fh, $buf, $record_size) or
                                    croak "read: $!";
-                               $read == 24 or
-                                   croak "read only $read bytes (!= 24)";
+                               $read == $record_size or
+                                   croak "read only $read bytes (!= $record_size)";
                                ($last_rev, $last_commit) =
                                    unpack(rev_map_fmt, $buf);
-                               if ($last_commit eq ('0' x40)) {
+                               if ($last_commit eq ('0' x $::oid_length)) {
                                        croak "inconsistent .rev_map\n";
                                }
                        }
                        if ($last_rev >= $rev) {
                                croak "last_rev is higher!: $last_rev >= $rev";
                        }
-                       $wr_offset = -24;
+                       $wr_offset = -$record_size;
                }
        }
        sysseek($fh, $wr_offset, SEEK_END) or croak "seek: $!";
-       syswrite($fh, pack(rev_map_fmt, $rev, $commit), 24) == 24 or
+       syswrite($fh, pack(rev_map_fmt, $rev, $commit), $record_size) == $record_size or
          croak "write: $!";
 }
 
@@ -2271,7 +2272,7 @@ sub mkfile {
 sub rev_map_set {
        my ($self, $rev, $commit, $update_ref, $uuid) = @_;
        defined $commit or die "missing arg3\n";
-       length $commit == 40 or die "arg3 must be a full SHA1 hexsum\n";
+       $commit =~ /^$::oid$/ or die "arg3 must be a full hex object ID\n";
        my $db = $self->map_path($uuid);
        my $db_lock = "$db.lock";
        my $sigmask;
@@ -2344,29 +2345,30 @@ sub rev_map_max {
 
 sub rev_map_max_norebuild {
        my ($self, $want_commit) = @_;
+       my $record_size = ($::oid_length / 2) + 4;
        my $map_path = $self->map_path;
        stat $map_path or return $want_commit ? (0, undef) : 0;
        sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!";
        binmode $fh or croak "binmode: $!";
        my $size = (stat($fh))[7];
-       ($size % 24) == 0 or croak "inconsistent size: $size";
+       ($size % $record_size) == 0 or croak "inconsistent size: $size";
 
        if ($size == 0) {
                close $fh or croak "close: $!";
                return $want_commit ? (0, undef) : 0;
        }
 
-       sysseek($fh, -24, SEEK_END) or croak "seek: $!";
-       sysread($fh, my $buf, 24) == 24 or croak "read: $!";
+       sysseek($fh, -$record_size, SEEK_END) or croak "seek: $!";
+       sysread($fh, my $buf, $record_size) == $record_size or croak "read: $!";
        my ($r, $c) = unpack(rev_map_fmt, $buf);
-       if ($want_commit && $c eq ('0' x40)) {
-               if ($size < 48) {
+       if ($want_commit && $c eq ('0' x $::oid_length)) {
+               if ($size < $record_size * 2) {
                        return $want_commit ? (0, undef) : 0;
                }
-               sysseek($fh, -48, SEEK_END) or croak "seek: $!";
-               sysread($fh, $buf, 24) == 24 or croak "read: $!";
+               sysseek($fh, -($record_size * 2), SEEK_END) or croak "seek: $!";
+               sysread($fh, $buf, $record_size) == $record_size or croak "read: $!";
                ($r, $c) = unpack(rev_map_fmt, $buf);
-               if ($c eq ('0'x40)) {
+               if ($c eq ('0' x $::oid_length)) {
                        croak "Penultimate record is all-zeroes in $map_path";
                }
        }
@@ -2387,30 +2389,31 @@ sub rev_map_get {
 
 sub _rev_map_get {
        my ($fh, $rev) = @_;
+       my $record_size = ($::oid_length / 2) + 4;
 
        binmode $fh or croak "binmode: $!";
        my $size = (stat($fh))[7];
-       ($size % 24) == 0 or croak "inconsistent size: $size";
+       ($size % $record_size) == 0 or croak "inconsistent size: $size";
 
        if ($size == 0) {
                return undef;
        }
 
-       my ($l, $u) = (0, $size - 24);
+       my ($l, $u) = (0, $size - $record_size);
        my ($r, $c, $buf);
 
        while ($l <= $u) {
-               my $i = int(($l/24 + $u/24) / 2) * 24;
+               my $i = int(($l/$record_size + $u/$record_size) / 2) * $record_size;
                sysseek($fh, $i, SEEK_SET) or croak "seek: $!";
-               sysread($fh, my $buf, 24) == 24 or croak "read: $!";
+               sysread($fh, my $buf, $record_size) == $record_size or croak "read: $!";
                my ($r, $c) = unpack(rev_map_fmt, $buf);
 
                if ($r < $rev) {
-                       $l = $i + 24;
+                       $l = $i + $record_size;
                } elsif ($r > $rev) {
-                       $u = $i - 24;
+                       $u = $i - $record_size;
                } else { # $r == $rev
-                       return $c eq ('0' x 40) ? undef : $c;
+                       return $c eq ('0' x $::oid_length) ? undef : $c;
                }
        }
        undef;