Allow saving an object from a pipe
authorDaniel Barkalow <barkalow@iabervon.org>
Sat, 10 Dec 2005 22:25:24 +0000 (17:25 -0500)
committerJunio C Hamano <junkio@cox.net>
Sun, 11 Dec 2005 02:57:57 +0000 (18:57 -0800)
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>
Documentation/git-hash-object.txt
cache.h
hash-object.c
sha1_file.c

index db12e92..0924931 100644 (file)
@@ -8,7 +8,7 @@ git-hash-object - Computes object ID and optionally creates a blob from a file.
 
 SYNOPSIS
 --------
-'git-hash-object' [-t <type>] [-w] <file>
+'git-hash-object' [-t <type>] [-w] [--stdin] [--] <file>...
 
 DESCRIPTION
 -----------
@@ -29,6 +29,9 @@ OPTIONS
 -w::
        Actually write the object into the object database.
 
+--stdin::
+       Read the object from standard input instead of from a file.
+
 Author
 ------
 Written by Junio C Hamano <junkio@cox.net>
diff --git a/cache.h b/cache.h
index 86fc250..c78d8ae 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -144,6 +144,7 @@ extern int ce_match_stat(struct cache_entry *ce, struct stat *st);
 extern int ce_modified(struct cache_entry *ce, struct stat *st);
 extern int ce_path_match(const struct cache_entry *ce, const char **pathspec);
 extern int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type);
+extern int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object);
 extern int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object);
 extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
 
index 6227936..6502b5b 100644 (file)
@@ -21,8 +21,16 @@ static void hash_object(const char *path, const char *type, int write_object)
        printf("%s\n", sha1_to_hex(sha1));
 }
 
+static void hash_stdin(const char *type, int write_object)
+{
+       unsigned char sha1[20];
+       if (index_pipe(sha1, 0, type, write_object))
+               die("Unable to add stdin to database");
+       printf("%s\n", sha1_to_hex(sha1));
+}
+
 static const char hash_object_usage[] =
-"git-hash-object [-t <type>] [-w] <file>...";
+"git-hash-object [-t <type>] [-w] [--stdin] <file>...";
 
 int main(int argc, char **argv)
 {
@@ -53,9 +61,12 @@ int main(int argc, char **argv)
                        }
                        else if (!strcmp(argv[i], "--help"))
                                usage(hash_object_usage);
+                       else if (!strcmp(argv[i], "--stdin")) {
+                               hash_stdin(type, write_object);
+                       }
                        else
                                die(hash_object_usage);
-               }
+               } 
                else {
                        const char *arg = argv[i];
                        if (0 <= prefix_length)
index 111a71d..fa22e9c 100644 (file)
@@ -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;