Add "get_sha1()" helper function.
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 1 May 2005 23:36:56 +0000 (16:36 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 1 May 2005 23:36:56 +0000 (16:36 -0700)
This allows the programs to use various simplified versions of
the SHA1 names, eg just say "HEAD" for the SHA1 pointed to by
the .git/HEAD file etc.

For example, this commit has been done with

git-commit-tree $(git-write-tree) -p HEAD

instead of the traditional "$(cat .git/HEAD)" syntax.

16 files changed:
cache.h
cat-file.c
commit-tree.c
convert-cache.c
diff-cache.c
diff-tree.c
export.c
fsck-cache.c
ls-tree.c
merge-base.c
read-tree.c
rev-list.c
rev-tree.c
sha1_file.c
tar-tree.c
unpack-file.c

diff --git a/cache.h b/cache.h
index af63458..940ced0 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -146,6 +146,7 @@ extern int write_sha1_from_fd(const unsigned char *sha1, int fd);
 extern int has_sha1_file(const unsigned char *sha1);
 
 /* Convert to/from hex/sha1 representation */
+extern int get_sha1(const char *str, unsigned char *sha1);
 extern int get_sha1_hex(const char *hex, unsigned char *sha1);
 extern char *sha1_to_hex(const unsigned char *sha1);   /* static buffer result! */
 
index 3c47d79..d253ff9 100644 (file)
@@ -12,7 +12,7 @@ int main(int argc, char **argv)
        void *buf;
        unsigned long size;
 
-       if (argc != 3 || get_sha1_hex(argv[2], sha1))
+       if (argc != 3 || get_sha1(argv[2], sha1))
                usage("cat-file [-t | tagname] <sha1>");
        buf = read_sha1_file(sha1, type, &size);
        if (!buf)
index 0c568d0..cfd6730 100644 (file)
@@ -123,7 +123,7 @@ int main(int argc, char **argv)
        for (i = 2; i < argc; i += 2) {
                char *a, *b;
                a = argv[i]; b = argv[i+1];
-               if (!b || strcmp(a, "-p") || get_sha1_hex(b, parent_sha1[parents]))
+               if (!b || strcmp(a, "-p") || get_sha1(b, parent_sha1[parents]))
                        usage(commit_tree_usage);
                check_valid(parent_sha1[parents], "commit");
                parents++;
index 631d1aa..4d34d2d 100644 (file)
@@ -303,7 +303,7 @@ int main(int argc, char **argv)
        unsigned char sha1[20];
        struct entry *entry;
 
-       if (argc != 2 || get_sha1_hex(argv[1], sha1))
+       if (argc != 2 || get_sha1(argv[1], sha1))
                usage("convert-cache <sha1>");
 
        entry = convert_entry(sha1);
index 899e373..03dd69d 100644 (file)
@@ -175,7 +175,7 @@ int main(int argc, char **argv)
                usage(diff_cache_usage);
        }
 
-       if (argc != 2 || get_sha1_hex(argv[1], tree_sha1))
+       if (argc != 2 || get_sha1(argv[1], tree_sha1))
                usage(diff_cache_usage);
 
        mark_merge_entries();
index e7a5b7c..1186c5c 100644 (file)
@@ -279,7 +279,7 @@ int main(int argc, char **argv)
                usage(diff_tree_usage);
        }
 
-       if (argc < 3 || get_sha1_hex(argv[1], old) || get_sha1_hex(argv[2], new))
+       if (argc < 3 || get_sha1(argv[1], old) || get_sha1(argv[2], new))
                usage(diff_tree_usage);
 
        if (argc > 3) {
index 885f4e8..78bfe9f 100644 (file)
--- a/export.c
+++ b/export.c
@@ -73,8 +73,8 @@ int main(int argc, char **argv)
        unsigned char top_sha1[20];
 
        if (argc < 2 || argc > 4 ||
-           get_sha1_hex(argv[1], top_sha1) ||
-           (argc == 3 && get_sha1_hex(argv[2], base_sha1)))
+           get_sha1(argv[1], top_sha1) ||
+           (argc == 3 && get_sha1(argv[2], base_sha1)))
                usage("git-export top [base]");
        export(get_commit(top_sha1), argc==3 ? get_commit(base_sha1) : NULL);
        return 0;
index d8d2e59..fbcd2b6 100644 (file)
@@ -178,7 +178,7 @@ int main(int argc, char **argv)
                if (*arg == '-')
                        continue;
 
-               if (!get_sha1_hex(arg, head_sha1)) {
+               if (!get_sha1(arg, head_sha1)) {
                        struct commit *commit = lookup_commit(head_sha1);
                        struct object *obj;
 
index d2ab02e..339ac36 100644 (file)
--- a/ls-tree.c
+++ b/ls-tree.c
@@ -102,7 +102,7 @@ int main(int argc, char **argv)
 
        if (argc != 2)
                usage(ls_tree_usage);
-       if (get_sha1_hex(argv[1], sha1) < 0)
+       if (get_sha1(argv[1], sha1) < 0)
                usage(ls_tree_usage);
        sha1_file_directory = getenv(DB_ENVIRONMENT);
        if (!sha1_file_directory)
index 2c40881..2ea4497 100644 (file)
@@ -58,8 +58,8 @@ int main(int argc, char **argv)
        unsigned char rev1key[20], rev2key[20];
 
        if (argc != 3 ||
-           get_sha1_hex(argv[1], rev1key) ||
-           get_sha1_hex(argv[2], rev2key)) {
+           get_sha1(argv[1], rev1key) ||
+           get_sha1(argv[2], rev2key)) {
                usage("merge-base <commit-id> <commit-id>");
        }
        rev1 = lookup_commit(rev1key);
index 604884a..f8dc509 100644 (file)
@@ -191,7 +191,7 @@ int main(int argc, char **argv)
                        merge = 1;
                        continue;
                }
-               if (get_sha1_hex(arg, sha1) < 0)
+               if (get_sha1(arg, sha1) < 0)
                        usage(read_tree_usage);
                if (stage > 3)
                        usage(read_tree_usage);
index 77bfc29..42fd154 100644 (file)
@@ -7,7 +7,7 @@ int main(int argc, char **argv)
        struct commit_list *list = NULL;
        struct commit *commit;
 
-       if (argc != 2 || get_sha1_hex(argv[1], sha1))
+       if (argc != 2 || get_sha1(argv[1], sha1))
                usage("rev-list <commit-id>");
 
        commit = lookup_commit(sha1);
index 95ec274..bfc8b12 100644 (file)
@@ -97,7 +97,7 @@ int main(int argc, char **argv)
                        arg++;
                        basemask |= 1<<nr;
                }
-               if (nr >= MAX_COMMITS || get_sha1_hex(arg, sha1[nr]))
+               if (nr >= MAX_COMMITS || get_sha1(arg, sha1[nr]))
                        usage("rev-tree [--edges] [--cache <cache-file>] <commit-id> [<commit-id>]");
                process_commit(sha1[nr]);
                nr++;
index 29f48d5..d91e072 100644 (file)
@@ -45,6 +45,35 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
        return 0;
 }
 
+int get_sha1_file(const char *path, unsigned char *result)
+{
+       char buffer[60];
+       int fd = open(path, O_RDONLY);
+       int len;
+
+       if (fd < 0)
+               return -1;
+       len = read(fd, buffer, sizeof(buffer));
+       close(fd);
+       if (len < 40)
+               return -1;
+       return get_sha1_hex(buffer, result);
+}
+
+int get_sha1(const char *str, unsigned char *sha1)
+{
+       static char pathname[PATH_MAX];
+
+       if (!get_sha1_hex(str, sha1))
+               return 0;
+       if (!get_sha1_file(str, sha1))
+               return 0;
+       snprintf(pathname, sizeof(pathname), ".git/%s", str);
+       if (!get_sha1_file(pathname, sha1))
+               return 0;
+       return -1;
+}
+
 char * sha1_to_hex(const unsigned char *sha1)
 {
        static char buffer[50];
index ea7ea91..2c64f69 100644 (file)
@@ -338,7 +338,7 @@ int main(int argc, char **argv)
                basedir = argv[2];
                /* FALLTHROUGH */
        case 2:
-               if (get_sha1_hex(argv[1], sha1) < 0)
+               if (get_sha1(argv[1], sha1) < 0)
                        usage(tar_tree_usage);
                break;
        default:
index 6ff3d51..b7988c5 100644 (file)
@@ -26,7 +26,7 @@ int main(int argc, char **argv)
 {
        unsigned char sha1[20];
 
-       if (argc != 2 || get_sha1_hex(argv[1], sha1))
+       if (argc != 2 || get_sha1(argv[1], sha1))
                usage("unpack-file.c <sha1>");
 
        puts(create_temp_file(sha1));