Skip to content

Commit a69dd58

Browse files
author
Junio C Hamano
committed
ls-tree: chomp leading directories when run from a subdirectory
When run from a subdirectory, even though we filtered the output based on where we were using pathspec, we wrote out the repository relative paths, not subtree relative paths. This changes things so that it shows only the current subdirectory relative paths. For example, in Documentation subdirectory of git itself, this used to be the case: $ git-ls-tree --name-only HEAD | grep how Documentation/git-show-branch.txt Documentation/git-show-index.txt Documentation/howto-index.sh Documentation/howto But now it does this instead: $ git-ls-tree --name-only HEAD | grep how git-show-branch.txt git-show-index.txt howto-index.sh howto There are two things to keep in mind. 1. This shows nothing. $ git-ls-tree --name-only HEAD ../ppc/ This is to make things consistent with ls-files, which refuses relative path that goes uplevel. 2. These show things in full repository relative paths. In this case, paths outside the current subdirectory are also shown. $ git-ls-tree --name-only --full-name HEAD | grep how Documentation/git-show-branch.txt Documentation/git-show-index.txt Documentation/howto-index.sh Documentation/howto $ git-ls-tree --name-only --full-name HEAD ../ppc/ ppc/sha1.c ppc/sha1.h ppc/sha1ppc.S The flag --full-name gives the same behaviour as 1.0, so it ought to be the default if we really care about the backward compatibility, but in practice no Porcelain runs ls-tree from a subdirectory yet, and without --full-name is more human friendly, so hopefully the default being not --full-name would be acceptable. Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 797bd6f commit a69dd58

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

ls-tree.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ static int line_termination = '\n';
1515
#define LS_NAME_ONLY 8
1616
static int ls_options = 0;
1717
const char **pathspec;
18+
static int chomp_prefix = 0;
19+
static const char *prefix;
1820

1921
static const char ls_tree_usage[] =
20-
"git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] <tree-ish> [path...]";
22+
"git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] <tree-ish> [path...]";
2123

2224
static int show_recursive(const char *base, int baselen, const char *pathname)
2325
{
@@ -49,7 +51,8 @@ static int show_recursive(const char *base, int baselen, const char *pathname)
4951
}
5052
}
5153

52-
static int show_tree(unsigned char *sha1, const char *base, int baselen, const char *pathname, unsigned mode, int stage)
54+
static int show_tree(unsigned char *sha1, const char *base, int baselen,
55+
const char *pathname, unsigned mode, int stage)
5356
{
5457
int retval = 0;
5558
const char *type = "blob";
@@ -65,21 +68,28 @@ static int show_tree(unsigned char *sha1, const char *base, int baselen, const c
6568
else if (ls_options & LS_TREE_ONLY)
6669
return 0;
6770

71+
if (chomp_prefix &&
72+
(baselen < chomp_prefix || memcmp(prefix, base, chomp_prefix)))
73+
return 0;
74+
6875
if (!(ls_options & LS_NAME_ONLY))
6976
printf("%06o %s %s\t", mode, type, sha1_to_hex(sha1));
70-
write_name_quoted(base, baselen, pathname, line_termination, stdout);
77+
write_name_quoted(base + chomp_prefix, baselen - chomp_prefix,
78+
pathname,
79+
line_termination, stdout);
7180
putchar(line_termination);
7281
return retval;
7382
}
7483

7584
int main(int argc, const char **argv)
7685
{
77-
const char *prefix;
7886
unsigned char sha1[20];
7987
char *buf;
8088
unsigned long size;
8189

8290
prefix = setup_git_directory();
91+
if (prefix && *prefix)
92+
chomp_prefix = strlen(prefix);
8393
while (1 < argc && argv[1][0] == '-') {
8494
switch (argv[1][1]) {
8595
case 'z':
@@ -100,6 +110,10 @@ int main(int argc, const char **argv)
100110
ls_options |= LS_NAME_ONLY;
101111
break;
102112
}
113+
if (!strcmp(argv[1]+2, "full-name")) {
114+
chomp_prefix = 0;
115+
break;
116+
}
103117
/* otherwise fallthru */
104118
default:
105119
usage(ls_tree_usage);

0 commit comments

Comments
 (0)