From 3c249c950649a37f2871a8b193f01a0640a20aef Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 1 May 2005 16:36:56 -0700 Subject: [PATCH] Add "get_sha1()" helper function. 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. --- cache.h | 1 + cat-file.c | 2 +- commit-tree.c | 2 +- convert-cache.c | 2 +- diff-cache.c | 2 +- diff-tree.c | 2 +- export.c | 4 ++-- fsck-cache.c | 2 +- ls-tree.c | 2 +- merge-base.c | 4 ++-- read-tree.c | 2 +- rev-list.c | 2 +- rev-tree.c | 2 +- sha1_file.c | 29 +++++++++++++++++++++++++++++ tar-tree.c | 2 +- unpack-file.c | 2 +- 16 files changed, 46 insertions(+), 16 deletions(-) diff --git a/cache.h b/cache.h index af6345820..940ced031 100644 --- 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! */ diff --git a/cat-file.c b/cat-file.c index 3c47d79a1..d253ff938 100644 --- a/cat-file.c +++ b/cat-file.c @@ -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] "); buf = read_sha1_file(sha1, type, &size); if (!buf) diff --git a/commit-tree.c b/commit-tree.c index 0c568d017..cfd6730fe 100644 --- a/commit-tree.c +++ b/commit-tree.c @@ -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++; diff --git a/convert-cache.c b/convert-cache.c index 631d1aa91..4d34d2d57 100644 --- a/convert-cache.c +++ b/convert-cache.c @@ -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 "); entry = convert_entry(sha1); diff --git a/diff-cache.c b/diff-cache.c index 899e37361..03dd69df3 100644 --- a/diff-cache.c +++ b/diff-cache.c @@ -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(); diff --git a/diff-tree.c b/diff-tree.c index e7a5b7cc7..1186c5ce6 100644 --- a/diff-tree.c +++ b/diff-tree.c @@ -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) { diff --git a/export.c b/export.c index 885f4e88f..78bfe9f22 100644 --- 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; diff --git a/fsck-cache.c b/fsck-cache.c index d8d2e594f..fbcd2b64f 100644 --- a/fsck-cache.c +++ b/fsck-cache.c @@ -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; diff --git a/ls-tree.c b/ls-tree.c index d2ab02e34..339ac36a4 100644 --- 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) diff --git a/merge-base.c b/merge-base.c index 2c4088130..2ea44970d 100644 --- a/merge-base.c +++ b/merge-base.c @@ -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 "); } rev1 = lookup_commit(rev1key); diff --git a/read-tree.c b/read-tree.c index 604884a98..f8dc509a1 100644 --- a/read-tree.c +++ b/read-tree.c @@ -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); diff --git a/rev-list.c b/rev-list.c index 77bfc29db..42fd154fc 100644 --- a/rev-list.c +++ b/rev-list.c @@ -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 = lookup_commit(sha1); diff --git a/rev-tree.c b/rev-tree.c index 95ec274fc..bfc8b1257 100644 --- a/rev-tree.c +++ b/rev-tree.c @@ -97,7 +97,7 @@ int main(int argc, char **argv) arg++; basemask |= 1<= MAX_COMMITS || get_sha1_hex(arg, sha1[nr])) + if (nr >= MAX_COMMITS || get_sha1(arg, sha1[nr])) usage("rev-tree [--edges] [--cache ] []"); process_commit(sha1[nr]); nr++; diff --git a/sha1_file.c b/sha1_file.c index 29f48d56b..d91e072f3 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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]; diff --git a/tar-tree.c b/tar-tree.c index ea7ea91ad..2c64f690e 100644 --- a/tar-tree.c +++ b/tar-tree.c @@ -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: diff --git a/unpack-file.c b/unpack-file.c index 6ff3d51c1..b7988c557 100644 --- a/unpack-file.c +++ b/unpack-file.c @@ -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 "); puts(create_temp_file(sha1)); -- 2.26.2