[PATCH v4 0/1] ls-tree.c: support `--oid-only` option
From: Teng Long <hidden>
Date: 2021-11-23 04:58:22
Thanks for the discussions on v3 (even I send a patch with
wrong contents and the right cover). So I looked at them, and
I think I have to send a new patch first, so this includes:
1. Commit message modifications (Junio C Hamano's advice)
2. Documentation modifications (Peter Baumann's advice)
3. To use the MODE enum name instead (Đoàn Trần Công Danh's advice)
The other discussions I will reply today.
Teng Long (1):
ls-tree.c: support `--oid-only` option for "git-ls-tree"
Documentation/git-ls-tree.txt | 18 ++++++++++++---
builtin/ls-tree.c | 30 +++++++++++++++++-------
t/t3104-ls-tree-oid.sh | 43 +++++++++++++++++++++++++++++++++++
3 files changed, 80 insertions(+), 11 deletions(-)
create mode 100755 t/t3104-ls-tree-oid.sh
Range-diff against v3:
1: 8b68568d6c ! 1: 63876dbeb7 ls-tree.c: support `--oid-only` option for "git-ls-tree"
@@ Commit message
Sometimes, we only want to get the objects from output of `ls-tree`
and commands like `sed` or `cut` is usually used to intercept the
- origin output to achieve this purpose in practical.
+ origin output to achieve this purpose in practice.
- This commit supply an option names `--oid-only` to let `git ls-tree`
- only print out the OID of the object. `--oid-only` and `--name-only`
- are mutually exclusive in use.
+ This commit teach the "--oid-only" option to tell the command to
+ only show the object name, just like "--name-only" option tells the
+ command to only show the path component, for each entry. These two
+ options are mutually exclusive.
- Reviewed-by: Jeff King [off-list ref]
- Reviewed-by: Ævar Arnfjörð Bjarmason [off-list ref]
- Reviewed-by: Đoàn Trần Công Danh [off-list ref]
Signed-off-by: Teng Long [off-list ref]
## Documentation/git-ls-tree.txt ##
-@@ Documentation/git-ls-tree.txt: SYNOPSIS
+@@ Documentation/git-ls-tree.txt: git-ls-tree - List the contents of a tree object
+ SYNOPSIS
--------
[verse]
- 'git ls-tree' [-d] [-r] [-t] [-l] [-z]
+-'git ls-tree' [-d] [-r] [-t] [-l] [-z]
- [--name-only] [--name-status] [--full-name] [--full-tree] [--abbrev[=<n>]]
-+ [--name-only] [--name-status] [--oid-only]
++'git ls-tree' [-d] [-r] [-t] [-l] [-z] [-n] [-s] [-o]
++ [--name-only | --oid-only]
++ [--name-status | --oid-only]
+ [--full-name] [--full-tree] [--abbrev[=<n>]]
<tree-ish> [<path>...]
DESCRIPTION
@@ Documentation/git-ls-tree.txt: OPTIONS
+ \0 line termination on output and do not quote filenames.
+ See OUTPUT FORMAT below for more information.
+
++-n::
--name-only::
- --name-status::
+---name-status::
List only filenames (instead of the "long" output), one per line.
--
-+ Cannot be used with `--oid-only` together.
++ Cannot be combined with `--oid-only`.
++
++-s::
++--name-status::
++ Consistent behavior with `--name-only`.
++
++-o::
+--oid-only::
-+ List only OIDs of the objects, one per line. Cannot be used with
-+ `--name-only` or `--name-status` together.
++ List only names of the objects, one per line. Cannot be combined
++ with `--name-only` or `--name-status`.
+
--abbrev[=<n>]::
Instead of showing the full 40-byte hexadecimal object
- lines, show the shortest prefix that is at least '<n>'
## builtin/ls-tree.c ##
@@ builtin/ls-tree.c: static int line_termination = '\n';
@@ builtin/ls-tree.c: static int show_tree(const struct object_id *oid, struct strb
return 0;
- if (!(ls_options & LS_NAME_ONLY)) {
-+ if (cmdmode == 2) {
++ if (cmdmode == MODE_OID_ONLY) {
+ printf("%s\n", find_unique_abbrev(oid, abbrev));
+ return 0;
+ }
+
-+ if (cmdmode == 0) {
++ if (cmdmode == MODE_UNSPECIFIED) {
if (ls_options & LS_SHOW_SIZE) {
char size_text[24];
if (!strcmp(type, blob_type)) {
@@ builtin/ls-tree.c: int cmd_ls_tree(int argc, const char **argv, const char *pref
- LS_NAME_ONLY),
- OPT_BIT(0, "name-status", &ls_options, N_("list only filenames"),
- LS_NAME_ONLY),
-+ OPT_CMDMODE('n', "name-only", &cmdmode, N_("list only filenames"), MODE_NAME_ONLY),
-+ OPT_CMDMODE('s', "name-status", &cmdmode, N_("list only filenames"), MODE_NAME_ONLY),
-+ OPT_CMDMODE('o', "oid-only", &cmdmode, N_("list only oids"), MODE_OID_ONLY),
++ OPT_CMDMODE('n', "name-only", &cmdmode,
++ N_("list only filenames"), MODE_NAME_ONLY),
++ OPT_CMDMODE('s', "name-status", &cmdmode,
++ N_("list only filenames"), MODE_NAME_ONLY),
++ OPT_CMDMODE('o', "oid-only", &cmdmode,
++ N_("list only oids"), MODE_OID_ONLY),
OPT_SET_INT(0, "full-name", &chomp_prefix,
N_("use full path names"), 0),
OPT_BOOL(0, "full-tree", &full_tree,
@@ t/t3104-ls-tree-oid.sh (new)
+. ./test-lib.sh
+
+test_expect_success 'setup' '
-+ echo 111 >1.txt &&
-+ echo 222 >2.txt &&
-+ mkdir -p path0/a/b/c &&
-+ echo 333 >path0/a/b/c/3.txt &&
++ test_commit A &&
++ test_commit B &&
++ mkdir -p C &&
++ test_commit C/D.txt &&
+ find *.txt path* \( -type f -o -type l \) -print |
+ xargs git update-index --add &&
+ tree=$(git write-tree) &&
@@ t/t3104-ls-tree-oid.sh (new)
+
+test_expect_success 'usage: --oid-only' '
+ git ls-tree --oid-only $tree >current &&
-+ git ls-tree $tree | awk "{print \$3}" >expected &&
++ git ls-tree $tree >result &&
++ cut -f1 result | cut -d " " -f3 >expected &&
+ test_cmp current expected
+'
+
+test_expect_success 'usage: --oid-only with -r' '
+ git ls-tree --oid-only -r $tree >current &&
-+ git ls-tree -r $tree | awk "{print \$3}" >expected &&
++ git ls-tree -r $tree >result &&
++ cut -f1 result | cut -d " " -f3 >expected &&
+ test_cmp current expected
+'
+
+test_expect_success 'usage: --oid-only with --abbrev' '
+ git ls-tree --oid-only --abbrev=6 $tree >current &&
-+ git ls-tree --abbrev=6 $tree | awk "{print \$3}" > expected &&
++ git ls-tree --abbrev=6 $tree >result &&
++ cut -f1 result | cut -d " " -f3 >expected &&
+ test_cmp current expected
+'
+
-+test_expect_failure 'usage: incompatible options: --name-only with --oid-only' '
-+ test_incompatible_usage git ls-tree --oid-only --name-only
++test_expect_success 'usage: incompatible options: --name-only with --oid-only' '
++ test_expect_code 129 git ls-tree --oid-only --name-only
+'
+
+test_done
--
2.33.1.10.g75523f744f.dirty