Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
Make 'index_path()' use 'strbuf_readlink()'
author
Linus Torvalds
<torvalds@linux-foundation.org>
Wed, 17 Dec 2008 17:51:53 +0000
(09:51 -0800)
committer
Junio C Hamano
<gitster@pobox.com>
Wed, 17 Dec 2008 21:36:34 +0000
(13:36 -0800)
This makes us able to properly index symlinks even on filesystems where
st_size doesn't match the true size of the link.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (from parent 1:
a60272b
)
diff --git
a/sha1_file.c
b/sha1_file.c
index 0e021c5eca8ea1a85d7863c427e054fd24fcd95a..52d1ead15b4db62138d9cedd5fe04068bcd10461 100644
(file)
--- a/
sha1_file.c
+++ b/
sha1_file.c
@@
-2523,8
+2523,7
@@
int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object)
{
int fd;
int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object)
{
int fd;
- char *target;
- size_t len;
+ struct strbuf sb = STRBUF_INIT;
switch (st->st_mode & S_IFMT) {
case S_IFREG:
switch (st->st_mode & S_IFMT) {
case S_IFREG:
@@
-2537,20
+2536,17
@@
int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
path);
break;
case S_IFLNK:
path);
break;
case S_IFLNK:
- len = xsize_t(st->st_size);
- target = xmalloc(len + 1);
- if (readlink(path, target, len + 1) != st->st_size) {
+ if (strbuf_readlink(&sb, path, st->st_size)) {
char *errstr = strerror(errno);
char *errstr = strerror(errno);
- free(target);
return error("readlink(\"%s\"): %s", path,
errstr);
}
if (!write_object)
return error("readlink(\"%s\"): %s", path,
errstr);
}
if (!write_object)
- hash_sha1_file(
target,
len, blob_type, sha1);
- else if (write_sha1_file(
target,
len, blob_type, sha1))
+ hash_sha1_file(
sb.buf, sb.
len, blob_type, sha1);
+ else if (write_sha1_file(
sb.buf, sb.
len, blob_type, sha1))
return error("%s: failed to insert into database",
path);
return error("%s: failed to insert into database",
path);
-
free(target
);
+
strbuf_release(&sb
);
break;
case S_IFDIR:
return resolve_gitlink_ref(path, "HEAD", sha1);
break;
case S_IFDIR:
return resolve_gitlink_ref(path, "HEAD", sha1);