diff options
author | Daniel Barkalow <barkalow@iabervon.org> | 2005-12-10 17:25:24 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-12-10 18:57:57 -0800 |
commit | 024510c8d947be6ae4765840e21a89d5a21271c4 (patch) | |
tree | 3a0912f20177e68e9e1e0e60b3aaea46ddc2fa32 /sha1_file.c | |
parent | 10945e006a9567f4da1dac15cfdc1035752c5c5e (diff) | |
download | git-024510c8d947be6ae4765840e21a89d5a21271c4.tar.gz |
Allow saving an object from a pipe
In order to support getting data into git with scripts, this adds a
--stdin option to git-hash-object, which will make it read from stdin.
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r-- | sha1_file.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/sha1_file.c b/sha1_file.c index 111a71de6b..fa22e9c71a 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1528,6 +1528,40 @@ int has_sha1_file(const unsigned char *sha1) return find_sha1_file(sha1, &st) ? 1 : 0; } +int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object) +{ + unsigned long size = 4096; + char *buf = malloc(size); + int iret, ret; + unsigned long off = 0; + unsigned char hdr[50]; + int hdrlen; + do { + iret = read(fd, buf + off, size - off); + if (iret > 0) { + off += iret; + if (off == size) { + size *= 2; + buf = realloc(buf, size); + } + } + } while (iret > 0); + if (iret < 0) { + free(buf); + return -1; + } + if (!type) + type = "blob"; + if (write_object) + ret = write_sha1_file(buf, off, type, sha1); + else { + write_sha1_file_prepare(buf, off, type, sha1, hdr, &hdrlen); + ret = 0; + } + free(buf); + return ret; +} + int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type) { unsigned long size = st->st_size; |