{"thread":{"id":"4258","subject":"[PATCH 2/8] Builtin git-ls-tree.","startedAt":"2006-05-23T08:31:14Z","lastAt":"2006-05-23T08:31:14Z","messageCount":1,"participants":["Peter Eriksen"],"isPatch":true,"patchVersion":1,"patchTotal":8},"messages":[{"id":"20525","messageId":"10383.0593442128$1148373112@news.gmane.org","threadId":"4258","inReplyTo":"11483730802025-git-send-email-","subject":"[PATCH 2/8] Builtin git-ls-tree.","fromName":"Peter Eriksen","fromEmail":"s022018@student.dtu.dk","sentAt":"2006-05-23T08:31:14Z","receivedAt":"2006-05-23T08:31:14Z","isPatch":true,"sender":{"key":"s022018@student.dtu.dk","avatar":null},"body":"From: Peter Eriksen <s022018@student.dtu.dk>\n\nSigned-off-by: Peter Eriksen <s022018@student.dtu.dk>\n\n\n---\n\n419257801e5bc91fc435bd4ff9eb42aa8063ffbb\n Makefile          |    6 +-\n builtin-ls-tree.c |  156 +++++++++++++++++++++++++++++++++++++++++++++++++++++\n builtin.h         |    1 \n git.c             |    3 +\n ls-tree.c         |  155 -----------------------------------------------------\n 5 files changed, 162 insertions(+), 159 deletions(-)\n create mode 100644 builtin-ls-tree.c\n delete mode 100644 ls-tree.c\n\n419257801e5bc91fc435bd4ff9eb42aa8063ffbb\ndiff --git a/Makefile b/Makefile\nindex e522730..9b02264 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -155,7 +155,7 @@ PROGRAMS = \\\n \tgit-diff-index$X git-diff-stages$X \\\n \tgit-diff-tree$X git-fetch-pack$X git-fsck-objects$X \\\n \tgit-hash-object$X git-index-pack$X git-local-fetch$X \\\n-\tgit-ls-tree$X git-mailinfo$X git-merge-base$X \\\n+\tgit-mailinfo$X git-merge-base$X \\\n \tgit-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \\\n \tgit-peek-remote$X git-prune-packed$X git-read-tree$X \\\n \tgit-receive-pack$X git-rev-parse$X \\\n@@ -171,7 +171,7 @@ PROGRAMS = \\\n BUILT_INS = git-log$X git-whatchanged$X git-show$X \\\n \tgit-count-objects$X git-diff$X git-push$X \\\n \tgit-grep$X git-rev-list$X git-check-ref-format$X \\\n-\tgit-init-db$X git-ls-files$X\n+\tgit-init-db$X git-ls-files$X git-ls-tree$X\n \n # what 'all' will build and 'install' will install, in gitexecdir\n ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)\n@@ -220,7 +220,7 @@ LIB_OBJS = \\\n BUILTIN_OBJS = \\\n \tbuiltin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \\\n \tbuiltin-grep.o builtin-rev-list.o builtin-check-ref-format.o \\\n-\tbuiltin-init-db.o builtin-ls-files.o\n+\tbuiltin-init-db.o builtin-ls-files.o builtin-ls-tree.o\n \n GITLIBS = $(LIB_FILE) $(XDIFF_LIB)\n LIBS = $(GITLIBS) -lz\ndiff --git a/builtin-ls-tree.c b/builtin-ls-tree.c\nnew file mode 100644\nindex 0000000..b515307\n--- /dev/null\n+++ b/builtin-ls-tree.c\n@@ -0,0 +1,156 @@\n+/*\n+ * GIT - The information manager from hell\n+ *\n+ * Copyright (C) Linus Torvalds, 2005\n+ */\n+#include \"cache.h\"\n+#include \"blob.h\"\n+#include \"tree.h\"\n+#include \"quote.h\"\n+#include \"builtin.h\"\n+\n+static int line_termination = '\\n';\n+#define LS_RECURSIVE 1\n+#define LS_TREE_ONLY 2\n+#define LS_SHOW_TREES 4\n+#define LS_NAME_ONLY 8\n+static int abbrev = 0;\n+static int ls_options = 0;\n+const char **pathspec;\n+static int chomp_prefix = 0;\n+static const char *prefix;\n+\n+static const char ls_tree_usage[] =\n+\t\"git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [--abbrev[=<n>]] <tree-ish> [path...]\";\n+\n+static int show_recursive(const char *base, int baselen, const char *pathname)\n+{\n+\tconst char **s;\n+\n+\tif (ls_options & LS_RECURSIVE)\n+\t\treturn 1;\n+\n+\ts = pathspec;\n+\tif (!s)\n+\t\treturn 0;\n+\n+\tfor (;;) {\n+\t\tconst char *spec = *s++;\n+\t\tint len, speclen;\n+\n+\t\tif (!spec)\n+\t\t\treturn 0;\n+\t\tif (strncmp(base, spec, baselen))\n+\t\t\tcontinue;\n+\t\tlen = strlen(pathname);\n+\t\tspec += baselen;\n+\t\tspeclen = strlen(spec);\n+\t\tif (speclen <= len)\n+\t\t\tcontinue;\n+\t\tif (memcmp(pathname, spec, len))\n+\t\t\tcontinue;\n+\t\treturn 1;\n+\t}\n+}\n+\n+static int show_tree(unsigned char *sha1, const char *base, int baselen,\n+\t\t     const char *pathname, unsigned mode, int stage)\n+{\n+\tint retval = 0;\n+\tconst char *type = blob_type;\n+\n+\tif (S_ISDIR(mode)) {\n+\t\tif (show_recursive(base, baselen, pathname)) {\n+\t\t\tretval = READ_TREE_RECURSIVE;\n+\t\t\tif (!(ls_options & LS_SHOW_TREES))\n+\t\t\t\treturn retval;\n+\t\t}\n+\t\ttype = tree_type;\n+\t}\n+\telse if (ls_options & LS_TREE_ONLY)\n+\t\treturn 0;\n+\n+\tif (chomp_prefix &&\n+\t    (baselen < chomp_prefix || memcmp(prefix, base, chomp_prefix)))\n+\t\treturn 0;\n+\n+\tif (!(ls_options & LS_NAME_ONLY))\n+\t\tprintf(\"%06o %s %s\\t\", mode, type,\n+\t\t\t\tabbrev ? find_unique_abbrev(sha1,abbrev)\n+\t\t\t\t\t: sha1_to_hex(sha1));\n+\twrite_name_quoted(base + chomp_prefix, baselen - chomp_prefix,\n+\t\t\t  pathname,\n+\t\t\t  line_termination, stdout);\n+\tputchar(line_termination);\n+\treturn retval;\n+}\n+\n+int cmd_ls_tree(int argc, const char **argv, char **envp)\n+{\n+\tunsigned char sha1[20];\n+\tstruct tree *tree;\n+\n+\tprefix = setup_git_directory();\n+\tgit_config(git_default_config);\n+\tif (prefix && *prefix)\n+\t\tchomp_prefix = strlen(prefix);\n+\twhile (1 < argc && argv[1][0] == '-') {\n+\t\tswitch (argv[1][1]) {\n+\t\tcase 'z':\n+\t\t\tline_termination = 0;\n+\t\t\tbreak;\n+\t\tcase 'r':\n+\t\t\tls_options |= LS_RECURSIVE;\n+\t\t\tbreak;\n+\t\tcase 'd':\n+\t\t\tls_options |= LS_TREE_ONLY;\n+\t\t\tbreak;\n+\t\tcase 't':\n+\t\t\tls_options |= LS_SHOW_TREES;\n+\t\t\tbreak;\n+\t\tcase '-':\n+\t\t\tif (!strcmp(argv[1]+2, \"name-only\") ||\n+\t\t\t    !strcmp(argv[1]+2, \"name-status\")) {\n+\t\t\t\tls_options |= LS_NAME_ONLY;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tif (!strcmp(argv[1]+2, \"full-name\")) {\n+\t\t\t\tchomp_prefix = 0;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tif (!strncmp(argv[1]+2, \"abbrev=\",7)) {\n+\t\t\t\tabbrev = strtoul(argv[1]+9, NULL, 10);\n+\t\t\t\tif (abbrev && abbrev < MINIMUM_ABBREV)\n+\t\t\t\t\tabbrev = MINIMUM_ABBREV;\n+\t\t\t\telse if (abbrev > 40)\n+\t\t\t\t\tabbrev = 40;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tif (!strcmp(argv[1]+2, \"abbrev\")) {\n+\t\t\t\tabbrev = DEFAULT_ABBREV;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\t/* otherwise fallthru */\n+\t\tdefault:\n+\t\t\tusage(ls_tree_usage);\n+\t\t}\n+\t\targc--; argv++;\n+\t}\n+\t/* -d -r should imply -t, but -d by itself should not have to. */\n+\tif ( (LS_TREE_ONLY|LS_RECURSIVE) ==\n+\t    ((LS_TREE_ONLY|LS_RECURSIVE) & ls_options))\n+\t\tls_options |= LS_SHOW_TREES;\n+\n+\tif (argc < 2)\n+\t\tusage(ls_tree_usage);\n+\tif (get_sha1(argv[1], sha1))\n+\t\tdie(\"Not a valid object name %s\", argv[1]);\n+\n+\tpathspec = get_pathspec(prefix, argv + 2);\n+\ttree = parse_tree_indirect(sha1);\n+\tif (!tree)\n+\t\tdie(\"not a tree object\");\n+\tread_tree_recursive(tree, \"\", 0, 0, pathspec, show_tree);\n+\n+\treturn 0;\n+}\ndiff --git a/builtin.h b/builtin.h\nindex a0713d3..951f206 100644\n--- a/builtin.h\n+++ b/builtin.h\n@@ -28,5 +28,6 @@ extern int cmd_rev_list(int argc, const \n extern int cmd_check_ref_format(int argc, const char **argv, char **envp);\n extern int cmd_init_db(int argc, const char **argv, char **envp);\n extern int cmd_ls_files(int argc, const char **argv, char **envp);\n+extern int cmd_ls_tree(int argc, const char **argv, char **envp);\n \n #endif\ndiff --git a/git.c b/git.c\nindex 9cfa9eb..8574775 100644\n--- a/git.c\n+++ b/git.c\n@@ -53,7 +53,8 @@ static void handle_internal_command(int \n \t\t{ \"rev-list\", cmd_rev_list },\n \t\t{ \"init-db\", cmd_init_db },\n \t\t{ \"check-ref-format\", cmd_check_ref_format },\n-\t\t{ \"ls-files\", cmd_ls_files }\n+\t\t{ \"ls-files\", cmd_ls_files },\n+\t\t{ \"ls-tree\", cmd_ls_tree }\n \t};\n \tint i;\n \ndiff --git a/ls-tree.c b/ls-tree.c\ndeleted file mode 100644\nindex f2b3bc1..0000000\n--- a/ls-tree.c\n+++ /dev/null\n@@ -1,155 +0,0 @@\n-/*\n- * GIT - The information manager from hell\n- *\n- * Copyright (C) Linus Torvalds, 2005\n- */\n-#include \"cache.h\"\n-#include \"blob.h\"\n-#include \"tree.h\"\n-#include \"quote.h\"\n-\n-static int line_termination = '\\n';\n-#define LS_RECURSIVE 1\n-#define LS_TREE_ONLY 2\n-#define LS_SHOW_TREES 4\n-#define LS_NAME_ONLY 8\n-static int abbrev = 0;\n-static int ls_options = 0;\n-const char **pathspec;\n-static int chomp_prefix = 0;\n-static const char *prefix;\n-\n-static const char ls_tree_usage[] =\n-\t\"git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [--abbrev[=<n>]] <tree-ish> [path...]\";\n-\n-static int show_recursive(const char *base, int baselen, const char *pathname)\n-{\n-\tconst char **s;\n-\n-\tif (ls_options & LS_RECURSIVE)\n-\t\treturn 1;\n-\n-\ts = pathspec;\n-\tif (!s)\n-\t\treturn 0;\n-\n-\tfor (;;) {\n-\t\tconst char *spec = *s++;\n-\t\tint len, speclen;\n-\n-\t\tif (!spec)\n-\t\t\treturn 0;\n-\t\tif (strncmp(base, spec, baselen))\n-\t\t\tcontinue;\n-\t\tlen = strlen(pathname);\n-\t\tspec += baselen;\n-\t\tspeclen = strlen(spec);\n-\t\tif (speclen <= len)\n-\t\t\tcontinue;\n-\t\tif (memcmp(pathname, spec, len))\n-\t\t\tcontinue;\n-\t\treturn 1;\n-\t}\n-}\n-\n-static int show_tree(unsigned char *sha1, const char *base, int baselen,\n-\t\t     const char *pathname, unsigned mode, int stage)\n-{\n-\tint retval = 0;\n-\tconst char *type = blob_type;\n-\n-\tif (S_ISDIR(mode)) {\n-\t\tif (show_recursive(base, baselen, pathname)) {\n-\t\t\tretval = READ_TREE_RECURSIVE;\n-\t\t\tif (!(ls_options & LS_SHOW_TREES))\n-\t\t\t\treturn retval;\n-\t\t}\n-\t\ttype = tree_type;\n-\t}\n-\telse if (ls_options & LS_TREE_ONLY)\n-\t\treturn 0;\n-\n-\tif (chomp_prefix &&\n-\t    (baselen < chomp_prefix || memcmp(prefix, base, chomp_prefix)))\n-\t\treturn 0;\n-\n-\tif (!(ls_options & LS_NAME_ONLY))\n-\t\tprintf(\"%06o %s %s\\t\", mode, type,\n-\t\t\t\tabbrev ? find_unique_abbrev(sha1,abbrev)\n-\t\t\t\t\t: sha1_to_hex(sha1));\n-\twrite_name_quoted(base + chomp_prefix, baselen - chomp_prefix,\n-\t\t\t  pathname,\n-\t\t\t  line_termination, stdout);\n-\tputchar(line_termination);\n-\treturn retval;\n-}\n-\n-int main(int argc, const char **argv)\n-{\n-\tunsigned char sha1[20];\n-\tstruct tree *tree;\n-\n-\tprefix = setup_git_directory();\n-\tgit_config(git_default_config);\n-\tif (prefix && *prefix)\n-\t\tchomp_prefix = strlen(prefix);\n-\twhile (1 < argc && argv[1][0] == '-') {\n-\t\tswitch (argv[1][1]) {\n-\t\tcase 'z':\n-\t\t\tline_termination = 0;\n-\t\t\tbreak;\n-\t\tcase 'r':\n-\t\t\tls_options |= LS_RECURSIVE;\n-\t\t\tbreak;\n-\t\tcase 'd':\n-\t\t\tls_options |= LS_TREE_ONLY;\n-\t\t\tbreak;\n-\t\tcase 't':\n-\t\t\tls_options |= LS_SHOW_TREES;\n-\t\t\tbreak;\n-\t\tcase '-':\n-\t\t\tif (!strcmp(argv[1]+2, \"name-only\") ||\n-\t\t\t    !strcmp(argv[1]+2, \"name-status\")) {\n-\t\t\t\tls_options |= LS_NAME_ONLY;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t\tif (!strcmp(argv[1]+2, \"full-name\")) {\n-\t\t\t\tchomp_prefix = 0;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t\tif (!strncmp(argv[1]+2, \"abbrev=\",7)) {\n-\t\t\t\tabbrev = strtoul(argv[1]+9, NULL, 10);\n-\t\t\t\tif (abbrev && abbrev < MINIMUM_ABBREV)\n-\t\t\t\t\tabbrev = MINIMUM_ABBREV;\n-\t\t\t\telse if (abbrev > 40)\n-\t\t\t\t\tabbrev = 40;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t\tif (!strcmp(argv[1]+2, \"abbrev\")) {\n-\t\t\t\tabbrev = DEFAULT_ABBREV;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t\t/* otherwise fallthru */\n-\t\tdefault:\n-\t\t\tusage(ls_tree_usage);\n-\t\t}\n-\t\targc--; argv++;\n-\t}\n-\t/* -d -r should imply -t, but -d by itself should not have to. */\n-\tif ( (LS_TREE_ONLY|LS_RECURSIVE) ==\n-\t    ((LS_TREE_ONLY|LS_RECURSIVE) & ls_options))\n-\t\tls_options |= LS_SHOW_TREES;\n-\n-\tif (argc < 2)\n-\t\tusage(ls_tree_usage);\n-\tif (get_sha1(argv[1], sha1))\n-\t\tdie(\"Not a valid object name %s\", argv[1]);\n-\n-\tpathspec = get_pathspec(prefix, argv + 2);\n-\ttree = parse_tree_indirect(sha1);\n-\tif (!tree)\n-\t\tdie(\"not a tree object\");\n-\tread_tree_recursive(tree, \"\", 0, 0, pathspec, show_tree);\n-\n-\treturn 0;\n-}\n-- \n1.3.3.g288c\n"}]}