diff options
author | Petr Baudis <pasky@ucw.cz> | 2005-04-13 02:02:34 -0700 |
---|---|---|
committer | Petr Baudis <xpasky@machine> | 2005-04-13 02:02:34 -0700 |
commit | 7912c07037cf704394e9bcb7cb24c05ee03aa921 (patch) | |
tree | 69bfdfa541c368a47a86482dfe66e488b152fe3d /ls-tree.c | |
parent | c57a3a91f1cc0d037e7b7992cbfa6f4213dcf37e (diff) | |
download | git-7912c07037cf704394e9bcb7cb24c05ee03aa921.tar.gz git-7912c07037cf704394e9bcb7cb24c05ee03aa921.tar.xz |
[PATCH] ls-tree for listing trees
ls-tree tool provides just a way to export the binary tree objects
to a usable text format. This is bound to be useful in variety
of scripts, although none of those I have currently uses it.
But e.g. the simple script I've sent to HPA for purging the object
database uses it.
Signed-off-by: Petr Baudis <pasky@ucw.cz>
Diffstat (limited to 'ls-tree.c')
-rw-r--r-- | ls-tree.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/ls-tree.c b/ls-tree.c new file mode 100644 index 000000000..05c743ab6 --- /dev/null +++ b/ls-tree.c @@ -0,0 +1,53 @@ +/* + * GIT - The information manager from hell + * + * Copyright (C) Linus Torvalds, 2005 + */ +#include "cache.h" + +static int list(unsigned char *sha1) +{ + void *buffer; + unsigned long size; + char type[20]; + + buffer = read_sha1_file(sha1, type, &size); + if (!buffer) + usage("unable to read sha1 file"); + if (strcmp(type, "tree")) + usage("expected a 'tree' node"); + while (size) { + int len = strlen(buffer)+1; + unsigned char *sha1 = buffer + len; + char *path = strchr(buffer, ' ')+1; + unsigned int mode; + unsigned char *type; + + if (size < len + 20 || sscanf(buffer, "%o", &mode) != 1) + usage("corrupt 'tree' file"); + buffer = sha1 + 20; + size -= len + 20; + /* XXX: We do some ugly mode heuristics here. + * It seems not worth it to read each file just to get this + * and the file size. -- pasky@ucw.cz */ + type = S_ISDIR(mode) ? "tree" : "blob"; + printf("%03o\t%s\t%s\t%s\n", mode, type, sha1_to_hex(sha1), path); + } + return 0; +} + +int main(int argc, char **argv) +{ + unsigned char sha1[20]; + + if (argc != 2) + usage("ls-tree <key>"); + if (get_sha1_hex(argv[1], sha1) < 0) + usage("ls-tree <key>"); + sha1_file_directory = getenv(DB_ENVIRONMENT); + if (!sha1_file_directory) + sha1_file_directory = DEFAULT_DB_ENVIRONMENT; + if (list(sha1) < 0) + usage("list failed"); + return 0; +} |