mirror of
https://github.com/git/git.git
synced 2026-08-08 17:11:48 +00:00
cat-file: add remote-object-info to batch-command
Since the info command in cat-file --batch-command prints object
info for a given object, it is natural to add another command in
cat-file --batch-command to print object info for a given object
from a remote.
Add remote-object-info command to cat-file --batch-command.
While info takes object ids one at a time, this creates overhead when
making requests to a server. So remote-object-info instead can take
multiple object ids at once.
The cat-file --batch-command command is generally implemented in the
following manner:
- Receive and parse input from user
- Call respective function attached to command
- Get object info, print object info
In --buffer mode, this changes to:
- Receive and parse input from user
- Store respective function attached to command in a queue
- After flush, loop through commands in queue
- Call respective function attached to command
- Get object info, print object info
Notice how the getting and printing of object info is accomplished one
at a time. As described above, this creates a problem for making
requests to a server. Therefore, remote-object-info is implemented in
the following manner:
- Receive and parse input from user
If command is remote-object-info:
- Get object info from remote
- Loop through and print each object info
Else:
- Call respective function attached to command
- Parse input, get object info, print object info
And finally for --buffer mode remote-object-info:
- Receive and parse input from user
- Store respective function attached to command in a queue
- After flush, loop through commands in queue:
If command is remote-object-info:
- Get object info from remote
- Loop through and print each object info
Else:
- Call respective function attached to command
- Get object info, print object info
To summarize, remote-object-info gets object info from the remote and
then loops through the object info passed in, printing the info.
In order for remote-object-info to avoid remote communication
overhead in the non-buffer mode, the objects are passed in as such:
remote-object-info <remote> <oid> <oid> ... <oid>
rather than
remote-object-info <remote> <oid>
remote-object-info <remote> <oid>
...
remote-object-info <remote> <oid>
Placeholders in the format are validated against an allow-list of the
atoms the remote path supports: "objectname" and "objectsize".
Unsupported atoms expand to an empty string, honoring how for-each-ref
handles known but inapplicable atoms.
Without this, atoms like %(objecttype) would mark data->info.typep and
because the server only sends size, type_name() would later crash.
As extra safety, even outside of the remote path, initialize
expand_data's type to OBJ_BAD and handle type_name() returning NULL.
Helped-by: Jonathan Tan <jonathantanmy@google.com>
Helped-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Mentored-by: Chandra Pratap <chandrapratap3519@gmail.com>
Signed-off-by: Calvin Wan <calvinwan@google.com>
Signed-off-by: Eric Ju <eric.peijian@gmail.com>
[pablo: added the atom allow-list validation]
Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@@ -169,6 +169,13 @@ info <object>::
|
||||
Print object info for object reference `<object>`. This corresponds to the
|
||||
output of `--batch-check`.
|
||||
|
||||
remote-object-info <remote> <object>...::
|
||||
Print object info for object references `<object>` at specified
|
||||
`<remote>` without downloading objects from the remote.
|
||||
Raise an error when the `object-info` capability is not supported by the remote.
|
||||
Raise an error when no object references are provided.
|
||||
This command may be combined with `--buffer`.
|
||||
|
||||
flush::
|
||||
Used with `--buffer` to execute all preceding commands that were issued
|
||||
since the beginning or since the last flush was issued. When `--buffer`
|
||||
@@ -301,7 +308,8 @@ one per line, and print information based on the command given. With
|
||||
`--batch-command`, the `info` command followed by an object will print
|
||||
information about the object the same way `--batch-check` would, and the
|
||||
`contents` command followed by an object prints contents in the same way
|
||||
`--batch` would.
|
||||
`--batch` would. The `remote-object-info` command followed by a remote and
|
||||
object IDs prints object info from the remote without downloading the objects.
|
||||
|
||||
You can specify the information shown for each object by using a custom
|
||||
`<format>`. The `<format>` is copied literally to stdout for each
|
||||
@@ -340,8 +348,15 @@ newline. The available atoms are:
|
||||
after that first run of whitespace (i.e., the "rest" of the
|
||||
line) are output in place of the `%(rest)` atom.
|
||||
|
||||
The command `remote-object-info` only supports the `%(objectname)` and
|
||||
`%(objectsize)` placeholders. See `CAVEATS` below for more information.
|
||||
|
||||
If no format is specified, the default format is `%(objectname)
|
||||
%(objecttype) %(objectsize)`.
|
||||
%(objecttype) %(objectsize)`, except for `remote-object-info` commands which
|
||||
use `%(objectname) %(objectsize)` because `%(objecttype)` is not supported yet.
|
||||
|
||||
WARNING: When "%(objecttype)" is supported, the default format WILL be unified,
|
||||
so DO NOT RELY on the current default format to stay the same!!!
|
||||
|
||||
If `--batch` is specified, or if `--batch-command` is used with the `contents`
|
||||
command, the object information is followed by the object contents (consisting
|
||||
@@ -438,6 +453,10 @@ scripting purposes.
|
||||
CAVEATS
|
||||
-------
|
||||
|
||||
Note that only `%(objectname)` and `%(objectsize)` are currently
|
||||
supported by the `remote-object-info` command. Using any other placeholder in
|
||||
the format string will return an empty string in its position.
|
||||
|
||||
Note that the sizes of objects on disk are reported accurately, but care
|
||||
should be taken in drawing conclusions about which refs or objects are
|
||||
responsible for disk usage. The size of a packed non-delta object may be
|
||||
|
||||
@@ -29,6 +29,22 @@
|
||||
#include "promisor-remote.h"
|
||||
#include "mailmap.h"
|
||||
#include "write-or-die.h"
|
||||
#include "alias.h"
|
||||
#include "remote.h"
|
||||
#include "transport.h"
|
||||
|
||||
/*
|
||||
* Maximum length for a remote URL. While no universal standard exists,
|
||||
* 8K is assumed to be a reasonable limit.
|
||||
*/
|
||||
#define MAX_REMOTE_URL_LEN (8 * 1024)
|
||||
|
||||
/* Maximum number of objects allowed in a single remote-object-info request. */
|
||||
#define MAX_ALLOWED_OBJ_LIMIT 10000
|
||||
|
||||
/* Maximum input size permitted for the remote-object-info command. */
|
||||
#define MAX_REMOTE_OBJ_INFO_LINE \
|
||||
(MAX_REMOTE_URL_LEN + MAX_ALLOWED_OBJ_LIMIT * (GIT_MAX_HEXSZ + 1))
|
||||
|
||||
enum batch_mode {
|
||||
BATCH_MODE_CONTENTS,
|
||||
@@ -317,8 +333,19 @@ struct expand_data {
|
||||
* optimized out.
|
||||
*/
|
||||
unsigned skip_object_info : 1;
|
||||
|
||||
/*
|
||||
* Flags about when an object info is being fetched from remote.
|
||||
*/
|
||||
unsigned is_remote:1;
|
||||
};
|
||||
|
||||
#define EXPAND_DATA_INIT { .mode = S_IFINVALID, .type = OBJ_BAD }
|
||||
|
||||
static const char *remote_object_info_atoms[] = {
|
||||
"objectname",
|
||||
"objectsize",
|
||||
};
|
||||
#define EXPAND_DATA_INIT { .mode = S_IFINVALID }
|
||||
|
||||
static int is_atom(const char *atom, const char *s, int slen)
|
||||
{
|
||||
@@ -329,14 +356,31 @@ static int is_atom(const char *atom, const char *s, int slen)
|
||||
static int expand_atom(struct strbuf *sb, const char *atom, int len,
|
||||
struct expand_data *data)
|
||||
{
|
||||
if (data->is_remote) {
|
||||
size_t i, allowed_nr = ARRAY_SIZE(remote_object_info_atoms);
|
||||
for (i = 0; i < allowed_nr; i++)
|
||||
if (is_atom(remote_object_info_atoms[i], atom, len))
|
||||
break;
|
||||
|
||||
/*
|
||||
* On remote, skip unsupported atoms returning an empty sb,
|
||||
* honoring how for-each-ref handles known but inapplicable
|
||||
* atoms (e.g. %(tagger)).
|
||||
*/
|
||||
if (i == allowed_nr)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (is_atom("objectname", atom, len)) {
|
||||
if (!data->mark_query)
|
||||
strbuf_add_oid_hex(sb, &data->oid);
|
||||
} else if (is_atom("objecttype", atom, len)) {
|
||||
if (data->mark_query)
|
||||
if (data->mark_query) {
|
||||
data->info.typep = &data->type;
|
||||
else
|
||||
strbuf_addstr(sb, type_name(data->type));
|
||||
} else {
|
||||
const char *t = type_name(data->type);
|
||||
strbuf_addstr(sb, t ? t : "");
|
||||
}
|
||||
} else if (is_atom("objectsize", atom, len)) {
|
||||
if (data->mark_query)
|
||||
data->info.sizep = &data->size;
|
||||
@@ -636,6 +680,65 @@ out:
|
||||
object_context_release(&ctx);
|
||||
}
|
||||
|
||||
static int get_remote_info(int argc,
|
||||
const char **argv,
|
||||
struct object_info **remote_object_info,
|
||||
struct oid_array *object_info_oids)
|
||||
{
|
||||
int retval = 0;
|
||||
struct remote *remote = NULL;
|
||||
struct object_id oid;
|
||||
struct string_list object_info_options = STRING_LIST_INIT_NODUP;
|
||||
struct transport *gtransport;
|
||||
|
||||
remote = remote_get(argv[0]);
|
||||
if (!remote)
|
||||
die(_("must supply valid remote when using remote-object-info"));
|
||||
|
||||
oid_array_clear(object_info_oids);
|
||||
for (size_t i = 1; i < argc; i++) {
|
||||
if (get_oid_hex(argv[i], &oid)) {
|
||||
size_t len = strlen(argv[i]);
|
||||
|
||||
if (len < the_hash_algo->hexsz && len >= 4) {
|
||||
size_t j;
|
||||
for (j = 0; j < len; j++)
|
||||
if (!isxdigit(argv[i][j]))
|
||||
break;
|
||||
if (j == len)
|
||||
die(_("remote-object-info does not support "
|
||||
"short oids, %d characters required"),
|
||||
(int)the_hash_algo->hexsz);
|
||||
}
|
||||
die(_("not a valid object name '%s'"), argv[i]);
|
||||
}
|
||||
oid_array_append(object_info_oids, &oid);
|
||||
}
|
||||
|
||||
if (!object_info_oids->nr)
|
||||
die(_("remote-object-info requires objects"));
|
||||
|
||||
gtransport = transport_get(remote, NULL);
|
||||
|
||||
if (!gtransport->smart_options) {
|
||||
retval = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
CALLOC_ARRAY(*remote_object_info, object_info_oids->nr);
|
||||
gtransport->smart_options->object_info_oids = object_info_oids;
|
||||
|
||||
string_list_append(&object_info_options, "size");
|
||||
|
||||
gtransport->smart_options->object_info_options = &object_info_options;
|
||||
gtransport->smart_options->object_info_data = *remote_object_info;
|
||||
retval = transport_fetch_object_info(gtransport);
|
||||
cleanup:
|
||||
string_list_clear(&object_info_options, 0);
|
||||
transport_disconnect(gtransport);
|
||||
return retval;
|
||||
}
|
||||
|
||||
struct object_cb_data {
|
||||
struct batch_options *opt;
|
||||
struct expand_data *expand;
|
||||
@@ -717,6 +820,73 @@ static void parse_cmd_mailmap(struct batch_options *opt UNUSED,
|
||||
load_mailmap();
|
||||
}
|
||||
|
||||
static void parse_cmd_remote_object_info(struct batch_options *opt,
|
||||
const char *line, struct strbuf *output,
|
||||
struct expand_data *data)
|
||||
{
|
||||
int count;
|
||||
const char **argv;
|
||||
char *line_to_split;
|
||||
struct object_info *remote_object_info = NULL;
|
||||
struct oid_array object_info_oids = OID_ARRAY_INIT;
|
||||
const char *saved_format = opt->format;
|
||||
|
||||
if (strlen(line) >= MAX_REMOTE_OBJ_INFO_LINE)
|
||||
die(_("remote-object-info command too long"));
|
||||
/*
|
||||
* TODO: Use the default format once %(objecttype) is supported.
|
||||
*/
|
||||
if (!opt->format)
|
||||
opt->format = "%(objectname) %(objectsize)";
|
||||
|
||||
line_to_split = xstrdup(line);
|
||||
count = split_cmdline(line_to_split, &argv);
|
||||
if (count < 0)
|
||||
die(_("remote-object-info: failed to parse command line: %s"),
|
||||
split_cmdline_strerror(count));
|
||||
if (count - 1 > MAX_ALLOWED_OBJ_LIMIT)
|
||||
die(_("remote-object-info supports at most %d objects"),
|
||||
MAX_ALLOWED_OBJ_LIMIT);
|
||||
|
||||
if (get_remote_info(count, argv, &remote_object_info,
|
||||
&object_info_oids))
|
||||
die(_("failed to get object info from the remote: %s"), argv[0]);
|
||||
|
||||
data->skip_object_info = 1;
|
||||
for (size_t i = 0; i < object_info_oids.nr; i++) {
|
||||
data->oid = object_info_oids.oid[i];
|
||||
|
||||
if (remote_object_info[i].unrecognized) {
|
||||
report_object_status(opt, oid_to_hex(&data->oid),
|
||||
&data->oid, "missing");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (remote_object_info[i].sizep) {
|
||||
/*
|
||||
* When reaching here, it means remote-object-info can retrieve
|
||||
* information from server without downloading them.
|
||||
*/
|
||||
data->size = *remote_object_info[i].sizep;
|
||||
opt->batch_mode = BATCH_MODE_INFO;
|
||||
data->is_remote = 1;
|
||||
batch_object_write(argv[i + 1], output, opt, data, NULL, 0);
|
||||
data->is_remote = 0;
|
||||
} else {
|
||||
report_object_status(opt, oid_to_hex(&data->oid), &data->oid, "missing");
|
||||
}
|
||||
}
|
||||
data->skip_object_info = 0;
|
||||
opt->format = saved_format;
|
||||
|
||||
for (size_t i = 0; i < object_info_oids.nr; i++)
|
||||
free_object_info_contents(&remote_object_info[i]);
|
||||
free(line_to_split);
|
||||
free(argv);
|
||||
free(remote_object_info);
|
||||
oid_array_clear(&object_info_oids);
|
||||
}
|
||||
|
||||
static void dispatch_calls(struct batch_options *opt,
|
||||
struct strbuf *output,
|
||||
struct expand_data *data,
|
||||
@@ -747,9 +917,10 @@ static const struct parse_cmd {
|
||||
unsigned takes_args;
|
||||
} commands[] = {
|
||||
{ "contents", parse_cmd_contents, 1 },
|
||||
{ "info", parse_cmd_info, 1 },
|
||||
{ "flush", NULL, 0 },
|
||||
{ "info", parse_cmd_info, 1 },
|
||||
{ "mailmap", parse_cmd_mailmap, 1 },
|
||||
{ "remote-object-info", parse_cmd_remote_object_info, 1 },
|
||||
};
|
||||
|
||||
static void batch_objects_command(struct batch_options *opt,
|
||||
|
||||
@@ -1698,3 +1698,13 @@ struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
|
||||
|
||||
return &transaction->base;
|
||||
}
|
||||
|
||||
void free_object_info_contents(struct object_info *object_info)
|
||||
{
|
||||
if (!object_info)
|
||||
return;
|
||||
free(object_info->typep);
|
||||
free(object_info->sizep);
|
||||
free(object_info->disk_sizep);
|
||||
free(object_info->delta_base_oid);
|
||||
}
|
||||
|
||||
3
odb.h
3
odb.h
@@ -623,4 +623,7 @@ void parse_alternates(const char *string,
|
||||
const char *relative_base,
|
||||
struct strvec *out);
|
||||
|
||||
/* Free pointers inside of object_info, but not object_info itself */
|
||||
void free_object_info_contents(struct object_info *object_info);
|
||||
|
||||
#endif /* ODB_H */
|
||||
|
||||
@@ -171,6 +171,7 @@ integration_tests = [
|
||||
't1014-read-tree-confusing.sh',
|
||||
't1015-read-index-unmerged.sh',
|
||||
't1016-compatObjectFormat.sh',
|
||||
't1017-cat-file-remote-object-info.sh',
|
||||
't1020-subdirectory.sh',
|
||||
't1022-read-tree-partial-clone.sh',
|
||||
't1050-large.sh',
|
||||
|
||||
719
t/t1017-cat-file-remote-object-info.sh
Executable file
719
t/t1017-cat-file-remote-object-info.sh
Executable file
@@ -0,0 +1,719 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='git cat-file --batch-command with remote-object-info command'
|
||||
|
||||
. ./test-lib.sh
|
||||
. "$TEST_DIRECTORY"/lib-cat-file.sh
|
||||
|
||||
hello_content="Hello World"
|
||||
hello_size=$(strlen "$hello_content")
|
||||
hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin)
|
||||
hello_short_oid=$(git rev-parse --short "$hello_oid")
|
||||
|
||||
unstored_content="Hello Git"
|
||||
unstored_oid=$(echo_without_newline "$unstored_content" | git hash-object --stdin)
|
||||
|
||||
# This is how we get 13:
|
||||
# 13 = <file mode> + <a_space> + <file name> + <a_null>, where
|
||||
# file mode is 100644, which is 6 characters;
|
||||
# file name is hello, which is 5 characters
|
||||
# a space is 1 character and a null is 1 character
|
||||
tree_size=$(($(test_oid rawsz) + 13))
|
||||
|
||||
commit_message="Initial commit"
|
||||
|
||||
# This is how we get 137:
|
||||
# 137 = <tree header> + <a_space> + <a newline> +
|
||||
# <Author line> + <a newline> +
|
||||
# <Committer line> + <a newline> +
|
||||
# <a newline> +
|
||||
# <commit message length>
|
||||
# An easier way to calculate is: 1. use `git cat-file commit <commit hash> | wc -c`,
|
||||
# to get 177, 2. then deduct 40 hex characters to get 137
|
||||
commit_size=$(($(test_oid hexsz) + 137))
|
||||
|
||||
tag_header_without_oid="type blob
|
||||
tag hellotag
|
||||
tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
|
||||
tag_header_without_timestamp="object $hello_oid
|
||||
$tag_header_without_oid"
|
||||
tag_description="This is a tag"
|
||||
tag_content="$tag_header_without_timestamp 0 +0000
|
||||
|
||||
$tag_description"
|
||||
|
||||
tag_oid=$(echo_without_newline "$tag_content" | git hash-object -t tag --stdin -w)
|
||||
tag_size=$(strlen "$tag_content")
|
||||
|
||||
set_transport_variables () {
|
||||
hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin)
|
||||
tree_oid=$(git -C "$1" write-tree)
|
||||
commit_oid=$(echo_without_newline "$commit_message" | git -C "$1" commit-tree $tree_oid)
|
||||
tag_oid=$(echo_without_newline "$tag_content" | git -C "$1" hash-object -t tag --stdin -w)
|
||||
tag_size=$(strlen "$tag_content")
|
||||
}
|
||||
|
||||
# This section tests --batch-command with remote-object-info command
|
||||
# Since "%(objecttype)" is currently not supported by the command remote-object-info ,
|
||||
# the filters are set to "%(objectname) %(objectsize)" in some test cases.
|
||||
|
||||
# Test --batch-command remote-object-info with 'git://' transport with
|
||||
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability
|
||||
. "$TEST_DIRECTORY"/lib-git-daemon.sh
|
||||
start_git_daemon --export-all
|
||||
daemon_parent=$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent
|
||||
|
||||
test_expect_success 'create repo to be served by git-daemon' '
|
||||
git init "$daemon_parent" &&
|
||||
echo_without_newline "$hello_content" > $daemon_parent/hello &&
|
||||
git -C "$daemon_parent" update-index --add hello &&
|
||||
git -C "$daemon_parent" config transfer.advertiseobjectinfo true &&
|
||||
git clone "$GIT_DAEMON_URL/parent" -n "$daemon_parent/daemon_client_empty"
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info git://' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $tree_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info git:// multiple sha1 per line' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info git:// default filter' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
git cat-file --batch-command >actual <<-EOF &&
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info does not change the default format of info' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
local_content="local object" &&
|
||||
local_oid=$(echo_without_newline "$local_content" | git hash-object -w --stdin) &&
|
||||
local_size=$(strlen "$local_content") &&
|
||||
|
||||
echo "$local_oid blob $local_size" >expect &&
|
||||
echo "$hello_oid $hello_size" >>expect &&
|
||||
echo "$local_oid blob $local_size" >>expect &&
|
||||
|
||||
git cat-file --batch-command >actual <<-EOF &&
|
||||
info $local_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
|
||||
info $local_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command --buffer remote-object-info git://' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
flush
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command -Z remote-object-info git:// default filter' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
printf "%s\0" "$hello_oid $hello_size" >expect &&
|
||||
printf "%s\0" "$tree_oid $tree_size" >>expect &&
|
||||
printf "%s\0" "$commit_oid $commit_size" >>expect &&
|
||||
printf "%s\0" "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
printf "%s\0" "$hello_oid missing" >>expect &&
|
||||
printf "%s\0" "$tree_oid missing" >>expect &&
|
||||
printf "%s\0" "$commit_oid missing" >>expect &&
|
||||
printf "%s\0" "$tag_oid missing" >>expect &&
|
||||
|
||||
batch_input="remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid
|
||||
remote-object-info $GIT_DAEMON_URL/parent $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
" &&
|
||||
echo_without_newline_nul "$batch_input" >commands_null_delimited &&
|
||||
|
||||
git cat-file --batch-command -Z < commands_null_delimited >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info does not support short oids' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
test_must_fail git cat-file --batch-command 2>err <<-EOF &&
|
||||
remote-object-info $GIT_DAEMON_URL/parent $hello_short_oid
|
||||
EOF
|
||||
test_grep "does not support short oids" err
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info does not die on missing oid like info' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
git cat-file --batch-command >local <<-EOF &&
|
||||
info $unstored_oid
|
||||
EOF
|
||||
git cat-file --batch-command >remote <<-EOF &&
|
||||
remote-object-info $GIT_DAEMON_URL/parent $unstored_oid
|
||||
EOF
|
||||
test_cmp local remote
|
||||
)
|
||||
'
|
||||
|
||||
# This tests depends on %(objecttype) not being supported yet, once supported
|
||||
# it needs to be updated.
|
||||
test_expect_success 'unsupported placeholder on remote returns empty string' '
|
||||
(
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
cd "$daemon_parent/daemon_client_empty" &&
|
||||
|
||||
echo "" >expect &&
|
||||
git cat-file --batch-command="%(objecttype)" >actual <<-EOF &&
|
||||
remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
# Test --batch-command remote-object-info with 'git://' and
|
||||
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
|
||||
test_expect_success 'batch-command remote-object-info git:// fails when transfer.advertiseobjectinfo=false' '
|
||||
(
|
||||
git -C "$daemon_parent" config transfer.advertiseobjectinfo false &&
|
||||
set_transport_variables "$daemon_parent" &&
|
||||
|
||||
test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
EOF
|
||||
test_grep "object-info capability is not enabled on the server" err &&
|
||||
|
||||
# revert server state back
|
||||
git -C "$daemon_parent" config transfer.advertiseobjectinfo true
|
||||
|
||||
)
|
||||
'
|
||||
|
||||
stop_git_daemon
|
||||
|
||||
# Test --batch-command remote-object-info with 'file://' transport with
|
||||
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability
|
||||
# shellcheck disable=SC2016
|
||||
test_expect_success 'create repo to be served by file:// transport' '
|
||||
git init server &&
|
||||
git -C server config protocol.version 2 &&
|
||||
git -C server config transfer.advertiseobjectinfo true &&
|
||||
echo_without_newline "$hello_content" > server/hello &&
|
||||
git -C server update-index --add hello &&
|
||||
git clone -n "file://$(pwd)/server" file_client_empty
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info file://' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
cd file_client_empty &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "file://${server_path}" $hello_oid
|
||||
remote-object-info "file://${server_path}" $tree_oid
|
||||
remote-object-info "file://${server_path}" $commit_oid
|
||||
remote-object-info "file://${server_path}" $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info file:// multiple sha1 per line' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
cd file_client_empty &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command --buffer remote-object-info file://' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
cd file_client_empty &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
|
||||
remote-object-info "file://${server_path}" $hello_oid $tree_oid
|
||||
remote-object-info "file://${server_path}" $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
flush
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info file:// default filter' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
cd file_client_empty &&
|
||||
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
git cat-file --batch-command >actual <<-EOF &&
|
||||
remote-object-info "file://${server_path}" $hello_oid $tree_oid
|
||||
remote-object-info "file://${server_path}" $commit_oid $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command -Z remote-object-info file:// default filter' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
cd file_client_empty &&
|
||||
|
||||
printf "%s\0" "$hello_oid $hello_size" >expect &&
|
||||
printf "%s\0" "$tree_oid $tree_size" >>expect &&
|
||||
printf "%s\0" "$commit_oid $commit_size" >>expect &&
|
||||
printf "%s\0" "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
printf "%s\0" "$hello_oid missing" >>expect &&
|
||||
printf "%s\0" "$tree_oid missing" >>expect &&
|
||||
printf "%s\0" "$commit_oid missing" >>expect &&
|
||||
printf "%s\0" "$tag_oid missing" >>expect &&
|
||||
|
||||
batch_input="remote-object-info \"file://${server_path}\" $hello_oid $tree_oid
|
||||
remote-object-info \"file://${server_path}\" $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
" &&
|
||||
echo_without_newline_nul "$batch_input" >commands_null_delimited &&
|
||||
|
||||
git cat-file --batch-command -Z < commands_null_delimited >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
# Test --batch-command remote-object-info with 'file://' and
|
||||
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
|
||||
test_expect_success 'batch-command remote-object-info file:// fails when transfer.advertiseobjectinfo=false' '
|
||||
(
|
||||
set_transport_variables "server" &&
|
||||
server_path="$(pwd)/server" &&
|
||||
git -C "${server_path}" config transfer.advertiseobjectinfo false &&
|
||||
|
||||
test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
EOF
|
||||
test_grep "object-info capability is not enabled on the server" err &&
|
||||
|
||||
# revert server state back
|
||||
git -C "${server_path}" config transfer.advertiseobjectinfo true
|
||||
)
|
||||
'
|
||||
|
||||
# Test --batch-command remote-object-info with 'http://' transport with
|
||||
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability
|
||||
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
||||
test_expect_success 'create repo to be served by http:// transport' '
|
||||
git init "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config http.receivepack true &&
|
||||
git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true &&
|
||||
echo_without_newline "$hello_content" > $HTTPD_DOCUMENT_ROOT_PATH/http_parent/hello &&
|
||||
git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" update-index --add hello &&
|
||||
git clone "$HTTPD_URL/smart/http_parent" -n "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty"
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info http://' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $tree_oid
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info http:// one line' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command --buffer remote-object-info http://' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&
|
||||
|
||||
# These results prove remote-object-info can get object info from the remote
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
# These results prove remote-object-info did not download objects from the remote
|
||||
echo "$hello_oid missing" >>expect &&
|
||||
echo "$tree_oid missing" >>expect &&
|
||||
echo "$commit_oid missing" >>expect &&
|
||||
echo "$tag_oid missing" >>expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid
|
||||
info $hello_oid
|
||||
info $tree_oid
|
||||
info $commit_oid
|
||||
info $tag_oid
|
||||
flush
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command remote-object-info http:// default filter' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&
|
||||
|
||||
echo "$hello_oid $hello_size" >expect &&
|
||||
echo "$tree_oid $tree_size" >>expect &&
|
||||
echo "$commit_oid $commit_size" >>expect &&
|
||||
echo "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
git cat-file --batch-command >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'batch-command -Z remote-object-info http:// default filter' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&
|
||||
|
||||
printf "%s\0" "$hello_oid $hello_size" >expect &&
|
||||
printf "%s\0" "$tree_oid $tree_size" >>expect &&
|
||||
printf "%s\0" "$commit_oid $commit_size" >>expect &&
|
||||
printf "%s\0" "$tag_oid $tag_size" >>expect &&
|
||||
|
||||
batch_input="remote-object-info $HTTPD_URL/smart/http_parent $hello_oid $tree_oid
|
||||
remote-object-info $HTTPD_URL/smart/http_parent $commit_oid $tag_oid
|
||||
" &&
|
||||
echo_without_newline_nul "$batch_input" >commands_null_delimited &&
|
||||
|
||||
git cat-file --batch-command -Z < commands_null_delimited >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on unsupported filter option (objectsize:disk)' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
|
||||
echo "$hello_oid " >expect &&
|
||||
|
||||
git cat-file --batch-command="%(objectname) %(objectsize:disk)" >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on unsupported filter option (deltabase)' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
|
||||
echo "" >expect &&
|
||||
|
||||
git cat-file --batch-command="%(deltabase)" >actual <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on server with legacy protocol' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
|
||||
test_must_fail git -c protocol.version=0 cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
|
||||
EOF
|
||||
test_grep "object-info requires protocol v2" err
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on server with legacy protocol with default filter' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
|
||||
test_must_fail git -c protocol.version=0 cat-file --batch-command 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
|
||||
EOF
|
||||
test_grep "object-info requires protocol v2" err
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on malformed OID' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
malformed_object_id="this_id_is_not_valid" &&
|
||||
|
||||
test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id
|
||||
EOF
|
||||
test_grep "not a valid object name '$malformed_object_id'" err
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on malformed OID with default filter' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
malformed_object_id="this_id_is_not_valid" &&
|
||||
|
||||
test_must_fail git cat-file --batch-command 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id
|
||||
EOF
|
||||
test_grep "not a valid object name '$malformed_object_id'" err
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remote-object-info fails on not providing OID' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
|
||||
test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent"
|
||||
EOF
|
||||
test_grep "remote-object-info requires objects" err
|
||||
)
|
||||
'
|
||||
|
||||
|
||||
# Test --batch-command remote-object-info with 'http://' transport and
|
||||
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
|
||||
test_expect_success 'batch-command remote-object-info http:// fails when transfer.advertiseobjectinfo=false ' '
|
||||
(
|
||||
set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
|
||||
git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo false &&
|
||||
|
||||
test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
|
||||
remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid
|
||||
EOF
|
||||
test_grep "object-info capability is not enabled on the server" err &&
|
||||
|
||||
# revert server state back
|
||||
git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true
|
||||
)
|
||||
'
|
||||
|
||||
# DO NOT add non-httpd-specific tests here, because the last part of this
|
||||
# test script is only executed when httpd is available and enabled.
|
||||
|
||||
test_done
|
||||
Reference in New Issue
Block a user