diff mbox series

[1/2] ls-files: add %(objecttype) atom to format option

Message ID 3f8884457d3628439aa9e6800c976f5a597cdda3.1683969100.git.gitgitgadget@gmail.com (mailing list archive)
State New, archived
Headers show
Series ls-files: align format atoms with git ls-tree | expand

Commit Message

ZheNing Hu May 13, 2023, 9:11 a.m. UTC
From: ZheNing Hu <adlternative@gmail.com>

Sometimes users may want to align the feature of
`git ls-files --format` with that of `git ls-tree --format`,
but the %(objecttype) atom is missing in the format option
of git ls-files compared to git ls-tree.

Therefore, the %(objecttype) atom is added to the format option
of git ls-files, which can be used to obtain the object type
of the file which is recorded in the index.

Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
 Documentation/git-ls-files.txt | 2 ++
 builtin/ls-files.c             | 2 ++
 t/t3013-ls-files-format.sh     | 7 +++++++
 3 files changed, 11 insertions(+)

Comments

Junio C Hamano May 15, 2023, 5 a.m. UTC | #1
"ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: ZheNing Hu <adlternative@gmail.com>
>
> Sometimes users may want to align the feature of
> `git ls-files --format` with that of `git ls-tree --format`,
> but the %(objecttype) atom is missing in the format option
> of git ls-files compared to git ls-tree.

"Sometimes users may want to" sounds a bit awkward; even if no user
notices that the two very similar commands supports different subset
of the vocabulary without good reason, wouldn't we want to align the
feature set of these two commands?

> Therefore, the %(objecttype) atom is added to the format option
> of git ls-files, which can be used to obtain the object type
> of the file which is recorded in the index.

And from that point of view, this conclusion has a bit more to think
about.  Is the %(objecttype) singled out here only because somebody
happened to have complained on the list, or did somebody went into
the list of supported atoms between two commands and considered what
is missing from one but is supported by the other, and concluded that
only adding this one atom to ls-files would make the two consistent?

I would not complain if it were the former, but it must be explained
here in the proposed log message.  That would encourage others to do
a follow-on work to complete the comparison to fill the gaps on the
both sides.  If it were the former, saying so explicitly in the
proposed log message will save others---otherwise they may try to do
the comparison themselves only to find that this was the last one
remaining discrepancy.

> Signed-off-by: ZheNing Hu <adlternative@gmail.com>
> ---
>  Documentation/git-ls-files.txt | 2 ++
>  builtin/ls-files.c             | 2 ++
>  t/t3013-ls-files-format.sh     | 7 +++++++
>  3 files changed, 11 insertions(+)
>
> diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
> index 1abdd3c21c5..4356c094cec 100644
> --- a/Documentation/git-ls-files.txt
> +++ b/Documentation/git-ls-files.txt
> @@ -270,6 +270,8 @@ interpolated.  The following "fieldname" are understood:
>  
>  objectmode::
>  	The mode of the file which is recorded in the index.
> +objecttype::
> +	The object type of the file which is recorded in the index.
>  objectname::
>  	The name of the file which is recorded in the index.
>  stage::
> diff --git a/builtin/ls-files.c b/builtin/ls-files.c
> index 625f48f0d61..6ff764cda18 100644
> --- a/builtin/ls-files.c
> +++ b/builtin/ls-files.c
> @@ -272,6 +272,8 @@ static size_t expand_show_index(struct strbuf *sb, const char *start,
>  		strbuf_addf(sb, "%06o", data->ce->ce_mode);
>  	else if (skip_prefix(start, "(objectname)", &p))
>  		strbuf_add_unique_abbrev(sb, &data->ce->oid, abbrev);
> +	else if (skip_prefix(start, "(objecttype)", &p))
> +		strbuf_addstr(sb, type_name(object_type(data->ce->ce_mode)));
>  	else if (skip_prefix(start, "(stage)", &p))
>  		strbuf_addf(sb, "%d", ce_stage(data->ce));
>  	else if (skip_prefix(start, "(eolinfo:index)", &p))
> diff --git a/t/t3013-ls-files-format.sh b/t/t3013-ls-files-format.sh
> index ef6fb53f7f1..3a1da3d6697 100755
> --- a/t/t3013-ls-files-format.sh
> +++ b/t/t3013-ls-files-format.sh
> @@ -38,6 +38,13 @@ test_expect_success 'git ls-files --format objectname v.s. -s' '
>  	test_cmp expect actual
>  '
>  
> +test_expect_success 'git ls-files --format objecttype' '
> +	git ls-files --format="%(objectname)" o1.txt o4.txt o6.txt >objectname &&
> +	git cat-file --batch-check="%(objecttype)" >expect <objectname &&
> +	git ls-files --format="%(objecttype)" o1.txt o4.txt o6.txt >actual &&
> +	test_cmp expect actual
> +'
> +
>  test_expect_success 'git ls-files --format v.s. --eol' '
>  	git ls-files --eol >tmp &&
>  	sed -e "s/	/ /g" -e "s/  */ /g" tmp >expect 2>err &&
ZheNing Hu May 18, 2023, 10:02 a.m. UTC | #2
Junio C Hamano <gitster@pobox.com> 于2023年5月15日周一 13:00写道:
>
> "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > From: ZheNing Hu <adlternative@gmail.com>
> >
> > Sometimes users may want to align the feature of
> > `git ls-files --format` with that of `git ls-tree --format`,
> > but the %(objecttype) atom is missing in the format option
> > of git ls-files compared to git ls-tree.
>
> "Sometimes users may want to" sounds a bit awkward; even if no user
> notices that the two very similar commands supports different subset
> of the vocabulary without good reason, wouldn't we want to align the
> feature set of these two commands?
>
> > Therefore, the %(objecttype) atom is added to the format option
> > of git ls-files, which can be used to obtain the object type
> > of the file which is recorded in the index.
>
> And from that point of view, this conclusion has a bit more to think
> about.  Is the %(objecttype) singled out here only because somebody
> happened to have complained on the list, or did somebody went into
> the list of supported atoms between two commands and considered what
> is missing from one but is supported by the other, and concluded that
> only adding this one atom to ls-files would make the two consistent?
>
> I would not complain if it were the former, but it must be explained
> here in the proposed log message.  That would encourage others to do
> a follow-on work to complete the comparison to fill the gaps on the
> both sides.  If it were the former, saying so explicitly in the
> proposed log message will save others---otherwise they may try to do
> the comparison themselves only to find that this was the last one
> remaining discrepancy.
>
I think the original requirement is that users wanted to obtain a similar
output format to the default output format of git ls-tree directly through
git ls-files --format="%(objectmode) %(objecttype) %(objectname)%x09%(path)",
but found that the corresponding functionality was missing.

However, from a deeper perspective, the results displayed by git ls-files
for the index and git ls-tree -r for the tree are very similar. Making
git ls-files compatible with the atoms of git ls-tree can provide a
unified view here,
and can also be used for some conversion between the index and tree, such as
git ls-files --format | git mktree.
diff mbox series

Patch

diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index 1abdd3c21c5..4356c094cec 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -270,6 +270,8 @@  interpolated.  The following "fieldname" are understood:
 
 objectmode::
 	The mode of the file which is recorded in the index.
+objecttype::
+	The object type of the file which is recorded in the index.
 objectname::
 	The name of the file which is recorded in the index.
 stage::
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 625f48f0d61..6ff764cda18 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -272,6 +272,8 @@  static size_t expand_show_index(struct strbuf *sb, const char *start,
 		strbuf_addf(sb, "%06o", data->ce->ce_mode);
 	else if (skip_prefix(start, "(objectname)", &p))
 		strbuf_add_unique_abbrev(sb, &data->ce->oid, abbrev);
+	else if (skip_prefix(start, "(objecttype)", &p))
+		strbuf_addstr(sb, type_name(object_type(data->ce->ce_mode)));
 	else if (skip_prefix(start, "(stage)", &p))
 		strbuf_addf(sb, "%d", ce_stage(data->ce));
 	else if (skip_prefix(start, "(eolinfo:index)", &p))
diff --git a/t/t3013-ls-files-format.sh b/t/t3013-ls-files-format.sh
index ef6fb53f7f1..3a1da3d6697 100755
--- a/t/t3013-ls-files-format.sh
+++ b/t/t3013-ls-files-format.sh
@@ -38,6 +38,13 @@  test_expect_success 'git ls-files --format objectname v.s. -s' '
 	test_cmp expect actual
 '
 
+test_expect_success 'git ls-files --format objecttype' '
+	git ls-files --format="%(objectname)" o1.txt o4.txt o6.txt >objectname &&
+	git cat-file --batch-check="%(objecttype)" >expect <objectname &&
+	git ls-files --format="%(objecttype)" o1.txt o4.txt o6.txt >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'git ls-files --format v.s. --eol' '
 	git ls-files --eol >tmp &&
 	sed -e "s/	/ /g" -e "s/  */ /g" tmp >expect 2>err &&