Files
git/t/t1900-repo.sh
Lucas Seiki Oshiro a81224d128 repo: add the --format flag
Add the --format flag to git-repo-info. By using this flag, the users
can choose the format for obtaining the data they requested.

Given that this command can be used for generating input for other
applications and for being read by end users, it requires at least two
formats: one for being read by humans and other for being read by
machines. Some other Git commands also have two output formats, notably
git-config which was the inspiration for the two formats that were
chosen here:

- keyvalue, where the retrieved data is printed one per line, using =
  for delimiting the key and the value. This is the default format,
  targeted for end users.
- nul, where the retrieved data is separated by NUL characters, using
  the newline character for delimiting the key and the value. This
  format is targeted for being read by machines.

Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Justin Tobler <jltobler@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Mentored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-08-17 09:13:41 -07:00

96 lines
2.8 KiB
Bash
Executable File

#!/bin/sh
test_description='test git repo-info'
. ./test-lib.sh
# Test whether a key-value pair is correctly returned
#
# Usage: test_repo_info <label> <init command> <repo_name> <key> <expected value>
#
# Arguments:
# label: the label of the test
# init_command: a command which creates a repository
# repo_name: the name of the repository that will be created in init_command
# key: the key of the field that is being tested
# expected_value: the value that the field should contain
test_repo_info () {
label=$1
init_command=$2
repo_name=$3
key=$4
expected_value=$5
test_expect_success "setup: $label" '
eval "$init_command $repo_name"
'
test_expect_success "keyvalue: $label" '
echo "$key=$expected_value" > expect &&
git -C "$repo_name" repo info "$key" >actual &&
test_cmp expect actual
'
test_expect_success "nul: $label" '
printf "%s\n%s\0" "$key" "$expected_value" >expect &&
git -C "$repo_name" repo info --format=nul "$key" >actual &&
test_cmp_bin expect actual
'
}
test_repo_info 'ref format files is retrieved correctly' \
'git init --ref-format=files' 'format-files' 'references.format' 'files'
test_repo_info 'ref format reftable is retrieved correctly' \
'git init --ref-format=reftable' 'format-reftable' 'references.format' 'reftable'
test_repo_info 'bare repository = false is retrieved correctly' \
'git init' 'nonbare' 'layout.bare' 'false'
test_repo_info 'bare repository = true is retrieved correctly' \
'git init --bare' 'bare' 'layout.bare' 'true'
test_repo_info 'shallow repository = false is retrieved correctly' \
'git init' 'nonshallow' 'layout.shallow' 'false'
test_expect_success 'setup remote' '
git init remote &&
echo x >remote/x &&
git -C remote add x &&
git -C remote commit -m x
'
test_repo_info 'shallow repository = true is retrieved correctly' \
'git clone --depth 1 "file://$PWD/remote"' 'shallow' 'layout.shallow' 'true'
test_expect_success 'values returned in order requested' '
cat >expect <<-\EOF &&
layout.bare=false
references.format=files
layout.bare=false
EOF
git init --ref-format=files ordered &&
git -C ordered repo info layout.bare references.format layout.bare >actual &&
test_cmp expect actual
'
test_expect_success 'git-repo-info fails if an invalid key is requested' '
echo "error: key ${SQ}foo${SQ} not found" >expect &&
test_must_fail git repo info foo 2>actual &&
test_cmp expect actual
'
test_expect_success 'git-repo-info outputs data even if there is an invalid field' '
echo "references.format=$(test_detect_ref_format)" >expect &&
test_must_fail git repo info foo references.format bar >actual &&
test_cmp expect actual
'
test_expect_success 'git-repo-info aborts when requesting an invalid format' '
echo "fatal: invalid format ${SQ}foo${SQ}" >expect &&
test_must_fail git repo info --format=foo 2>actual &&
test_cmp expect actual
'
test_done