diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-01 16:36:56 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-01 16:36:56 -0700 |
commit | 3c249c950649a37f2871a8b193f01a0640a20aef (patch) | |
tree | 8ce5c715973ddb7ed553be593c090de979c4a5ce | |
parent | 68849b544258cafdf42f3ebe9772ee7a346f7147 (diff) | |
download | git-3c249c950649a37f2871a8b193f01a0640a20aef.tar.gz |
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.
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | cat-file.c | 2 | ||||
-rw-r--r-- | commit-tree.c | 2 | ||||
-rw-r--r-- | convert-cache.c | 2 | ||||
-rw-r--r-- | diff-cache.c | 2 | ||||
-rw-r--r-- | diff-tree.c | 2 | ||||
-rw-r--r-- | export.c | 4 | ||||
-rw-r--r-- | fsck-cache.c | 2 | ||||
-rw-r--r-- | ls-tree.c | 2 | ||||
-rw-r--r-- | merge-base.c | 4 | ||||
-rw-r--r-- | read-tree.c | 2 | ||||
-rw-r--r-- | rev-list.c | 2 | ||||
-rw-r--r-- | rev-tree.c | 2 | ||||
-rw-r--r-- | sha1_file.c | 29 | ||||
-rw-r--r-- | tar-tree.c | 2 | ||||
-rw-r--r-- | unpack-file.c | 2 |
16 files changed, 46 insertions, 16 deletions
@@ -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 3c47d79a16..d253ff9380 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] <sha1>"); buf = read_sha1_file(sha1, type, &size); if (!buf) diff --git a/commit-tree.c b/commit-tree.c index 0c568d0179..cfd6730fe8 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 631d1aa910..4d34d2d57e 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 <sha1>"); entry = convert_entry(sha1); diff --git a/diff-cache.c b/diff-cache.c index 899e37361e..03dd69df3e 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 e7a5b7cc76..1186c5ce6d 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) { @@ -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 d8d2e594fc..fbcd2b64f4 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; @@ -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 2c40881302..2ea44970d2 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 <commit-id> <commit-id>"); } rev1 = lookup_commit(rev1key); diff --git a/read-tree.c b/read-tree.c index 604884a983..f8dc509a1f 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 77bfc29db1..42fd154fc1 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-id>"); commit = lookup_commit(sha1); diff --git a/rev-tree.c b/rev-tree.c index 95ec274fc7..bfc8b12579 100644 --- a/rev-tree.c +++ b/rev-tree.c @@ -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++; diff --git a/sha1_file.c b/sha1_file.c index 29f48d56b1..d91e072f3e 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 ea7ea91add..2c64f690e5 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 6ff3d51c18..b7988c5575 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 <sha1>"); puts(create_temp_file(sha1)); |