Merge branch 'maint-1.5.4' into maint

* maint-1.5.4:
  svn-git: Use binmode for reading/writing binary rev maps
  diff options documentation: refer to --diff-filter in --name-status
  git-svn bug with blank commits and author file
  archive.c: format_subst - fixed bogus argument to memchr
  copy.c: copy_fd - correctly report write errors
  gitattributes: Fix subdirectory attributes specified from root directory
This commit is contained in:
Junio C Hamano
2008-04-22 23:37:06 -07:00
6 changed files with 24 additions and 10 deletions

View File

@ -83,7 +83,8 @@ endif::git-format-patch[]
Show only names of changed files. Show only names of changed files.
--name-status:: --name-status::
Show only names and status of changed files. Show only names and status of changed files. See the description
of the `--diff-filter` option on what the status letters mean.
--color:: --color::
Show colored diff. Show colored diff.

View File

@ -16,9 +16,9 @@ static void format_subst(const struct commit *commit,
const char *b, *c; const char *b, *c;
b = memmem(src, len, "$Format:", 8); b = memmem(src, len, "$Format:", 8);
if (!b || src + len < b + 9) if (!b)
break; break;
c = memchr(b + 8, '$', len - 8); c = memchr(b + 8, '$', (src + len) - b - 8);
if (!c) if (!c)
break; break;

4
attr.c
View File

@ -546,7 +546,9 @@ static int path_matches(const char *pathname, int pathlen,
(baselen && pathname[baselen] != '/') || (baselen && pathname[baselen] != '/') ||
strncmp(pathname, base, baselen)) strncmp(pathname, base, baselen))
return 0; return 0;
return fnmatch(pattern, pathname + baselen + 1, FNM_PATHNAME) == 0; if (baselen != 0)
baselen++;
return fnmatch(pattern, pathname + baselen, FNM_PATHNAME) == 0;
} }
static int fill_one(const char *what, struct match_attr *a, int rem) static int fill_one(const char *what, struct match_attr *a, int rem)

8
copy.c
View File

@ -9,8 +9,7 @@ int copy_fd(int ifd, int ofd)
if (!len) if (!len)
break; break;
if (len < 0) { if (len < 0) {
int read_error; int read_error = errno;
read_error = errno;
close(ifd); close(ifd);
return error("copy-fd: read returned %s", return error("copy-fd: read returned %s",
strerror(read_error)); strerror(read_error));
@ -25,9 +24,10 @@ int copy_fd(int ifd, int ofd)
close(ifd); close(ifd);
return error("copy-fd: write returned 0"); return error("copy-fd: write returned 0");
} else { } else {
int write_error = errno;
close(ifd); close(ifd);
return error("copy-fd: write returned %s", return error("copy-fd: write returned %s",
strerror(errno)); strerror(write_error));
} }
} }
} }
@ -48,7 +48,7 @@ int copy_file(const char *dst, const char *src, int mode)
} }
status = copy_fd(fdi, fdo); status = copy_fd(fdi, fdo);
if (close(fdo) != 0) if (close(fdo) != 0)
return error("%s: write error: %s", dst, strerror(errno)); return error("%s: close error: %s", dst, strerror(errno));
if (!status && adjust_shared_perm(dst)) if (!status && adjust_shared_perm(dst))
return -1; return -1;

View File

@ -2375,8 +2375,7 @@ sub check_author {
my ($author) = @_; my ($author) = @_;
if (!defined $author || length $author == 0) { if (!defined $author || length $author == 0) {
$author = '(no author)'; $author = '(no author)';
} } elsif (defined $::_authors && ! defined $::users{$author}) {
if (defined $::_authors && ! defined $::users{$author}) {
die "Author: $author not defined in $::_authors file\n"; die "Author: $author not defined in $::_authors file\n";
} }
$author; $author;
@ -2519,6 +2518,7 @@ sub rebuild_from_rev_db {
my ($self, $path) = @_; my ($self, $path) = @_;
my $r = -1; my $r = -1;
open my $fh, '<', $path or croak "open: $!"; open my $fh, '<', $path or croak "open: $!";
binmode $fh or croak "binmode: $!";
while (<$fh>) { while (<$fh>) {
length($_) == 41 or croak "inconsistent size in ($_) != 41"; length($_) == 41 or croak "inconsistent size in ($_) != 41";
chomp($_); chomp($_);
@ -2616,6 +2616,7 @@ sub rebuild {
sub _rev_map_set { sub _rev_map_set {
my ($fh, $rev, $commit) = @_; my ($fh, $rev, $commit) = @_;
binmode $fh or croak "binmode: $!";
my $size = (stat($fh))[7]; my $size = (stat($fh))[7];
($size % 24) == 0 or croak "inconsistent size: $size"; ($size % 24) == 0 or croak "inconsistent size: $size";
@ -2719,6 +2720,7 @@ sub rev_map_max {
my $map_path = $self->map_path; my $map_path = $self->map_path;
stat $map_path or return $want_commit ? (0, undef) : 0; stat $map_path or return $want_commit ? (0, undef) : 0;
sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!"; sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!";
binmode $fh or croak "binmode: $!";
my $size = (stat($fh))[7]; my $size = (stat($fh))[7];
($size % 24) == 0 or croak "inconsistent size: $size"; ($size % 24) == 0 or croak "inconsistent size: $size";
@ -2751,6 +2753,7 @@ sub rev_map_get {
return undef unless -e $map_path; return undef unless -e $map_path;
sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!"; sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!";
binmode $fh or croak "binmode: $!";
my $size = (stat($fh))[7]; my $size = (stat($fh))[7];
($size % 24) == 0 or croak "inconsistent size: $size"; ($size % 24) == 0 or croak "inconsistent size: $size";

View File

@ -21,6 +21,7 @@ test_expect_success 'setup' '
mkdir -p a/b/d a/c && mkdir -p a/b/d a/c &&
( (
echo "f test=f" echo "f test=f"
echo "a/i test=a/i"
) >.gitattributes && ) >.gitattributes &&
( (
echo "g test=a/g" && echo "g test=a/g" &&
@ -46,4 +47,11 @@ test_expect_success 'attribute test' '
' '
test_expect_success 'root subdir attribute test' '
attr_check a/i a/i &&
attr_check subdir/a/i unspecified
'
test_done test_done