summaryrefslogtreecommitdiff
path: root/ls-tree.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-04-16 13:57:39 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 13:57:39 -0700
commit0f2303f71957ec68c92487f185435fbec6bd1c79 (patch)
treee022421aad3c90ef550eaa69b388df25ceb1686b /ls-tree.c
parenteec8c633c117c83a9fd2be7054b169d3cee5806d (diff)
downloadgit-0f2303f71957ec68c92487f185435fbec6bd1c79.tar.gz
[PATCH] Un unoptimize ls-tree behaviour
ls-tree unconditionally called read_sha1_file() for all paths even when not needed, which was a mistake introduced by me. Rectify this by first checking S_ISDIR(mode) and read the tree contents only when it is a tree and we are recursive. There is no need to read it in any other cases. The patch also removes the confusing comment that led to this incorrect implementation. Thanks to Peter Baudis for noticing this problem. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'ls-tree.c')
-rw-r--r--ls-tree.c41
1 files changed, 15 insertions, 26 deletions
diff --git a/ls-tree.c b/ls-tree.c
index e25de01678..c063640c11 100644
--- a/ls-tree.c
+++ b/ls-tree.c
@@ -48,30 +48,22 @@ static void list_recursive(void *buffer,
buffer = sha1 + 20;
size -= namelen + 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
- * ... that is, when we are not recursive -- junkio@cox.net
- */
- eltbuf = (recursive ? read_sha1_file(sha1, elttype, &eltsize) :
- NULL);
- if (! eltbuf) {
- if (recursive)
- error("cannot read %s", sha1_to_hex(sha1));
- type = S_ISDIR(mode) ? "tree" : "blob";
- }
- else
- type = elttype;
-
- printf("%03o\t%s\t%s\t", mode, type, sha1_to_hex(sha1));
+ printf("%06o\t%s\t%s\t", mode,
+ S_ISDIR(mode) ? "tree" : "blob",
+ sha1_to_hex(sha1));
print_path_prefix(prefix);
fputs(path, stdout);
putchar(line_termination);
- if (eltbuf && !strcmp(type, "tree")) {
- this_prefix.name = path;
- list_recursive(eltbuf, elttype, eltsize, &this_prefix);
+ if (! recursive || ! S_ISDIR(mode))
+ continue;
+
+ if (! (eltbuf = read_sha1_file(sha1, elttype, &eltsize)) ) {
+ error("cannot read %s", sha1_to_hex(sha1));
+ continue;
}
+ this_prefix.name = path;
+ list_recursive(eltbuf, elttype, eltsize, &this_prefix);
free(eltbuf);
}
}
@@ -89,10 +81,7 @@ static int list(unsigned char *sha1)
return 0;
}
-static void _usage(void)
-{
- usage("ls-tree [-r] [-z] <key>");
-}
+static const char *ls_tree_usage = "ls-tree [-r] [-z] <key>";
int main(int argc, char **argv)
{
@@ -107,15 +96,15 @@ int main(int argc, char **argv)
recursive = 1;
break;
default:
- _usage();
+ usage(ls_tree_usage);
}
argc--; argv++;
}
if (argc != 2)
- _usage();
+ usage(ls_tree_usage);
if (get_sha1_hex(argv[1], sha1) < 0)
- _usage();
+ usage(ls_tree_usage);
sha1_file_directory = getenv(DB_ENVIRONMENT);
if (!sha1_file_directory)
sha1_file_directory = DEFAULT_DB_ENVIRONMENT;