Skip to content

Commit

Permalink
t6601: add helper for testing path-walk API
Browse files Browse the repository at this point in the history
Add some tests based on the current behavior, doing interesting checks
for different sets of branches, ranges, and the --boundary option. This
sets a baseline for the behavior and we can extend it as new options are
introduced.

Signed-off-by: Derrick Stolee <[email protected]>
  • Loading branch information
derrickstolee authored and dscho committed Dec 30, 2024
1 parent 717d2ea commit 5712852
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Documentation/technical/api-path-walk.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,5 @@ commits are emitted.
Examples
--------

See example usages in future changes.
See example usages in:
`t/helper/test-path-walk.c`
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,7 @@ TEST_BUILTINS_OBJS += test-parse-options.o
TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
TEST_BUILTINS_OBJS += test-partial-clone.o
TEST_BUILTINS_OBJS += test-path-utils.o
TEST_BUILTINS_OBJS += test-path-walk.o
TEST_BUILTINS_OBJS += test-pcre2-config.o
TEST_BUILTINS_OBJS += test-pkt-line.o
TEST_BUILTINS_OBJS += test-proc-receive.o
Expand Down
1 change: 1 addition & 0 deletions t/helper/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ test_tool_sources = [
'test-parse-pathspec-file.c',
'test-partial-clone.c',
'test-path-utils.c',
'test-path-walk.c',
'test-pcre2-config.c',
'test-pkt-line.c',
'test-proc-receive.c',
Expand Down
86 changes: 86 additions & 0 deletions t/helper/test-path-walk.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#define USE_THE_REPOSITORY_VARIABLE

#include "test-tool.h"
#include "environment.h"
#include "hex.h"
#include "object-name.h"
#include "object.h"
#include "pretty.h"
#include "revision.h"
#include "setup.h"
#include "parse-options.h"
#include "path-walk.h"
#include "oid-array.h"

static const char * const path_walk_usage[] = {
N_("test-tool path-walk <options> -- <revision-options>"),
NULL
};

struct path_walk_test_data {
uintmax_t tree_nr;
uintmax_t blob_nr;
};

static int emit_block(const char *path, struct oid_array *oids,
enum object_type type, void *data)
{
struct path_walk_test_data *tdata = data;
const char *typestr;

switch (type) {
case OBJ_TREE:
typestr = "TREE";
tdata->tree_nr += oids->nr;
break;

case OBJ_BLOB:
typestr = "BLOB";
tdata->blob_nr += oids->nr;
break;

default:
BUG("we do not understand this type");
}

for (size_t i = 0; i < oids->nr; i++)
printf("%s:%s:%s\n", typestr, path, oid_to_hex(&oids->oid[i]));

return 0;
}

int cmd__path_walk(int argc, const char **argv)
{
int res;
struct rev_info revs = REV_INFO_INIT;
struct path_walk_info info = PATH_WALK_INFO_INIT;
struct path_walk_test_data data = { 0 };
struct option options[] = {
OPT_END(),
};

setup_git_directory();
revs.repo = the_repository;

argc = parse_options(argc, argv, NULL,
options, path_walk_usage,
PARSE_OPT_KEEP_UNKNOWN_OPT | PARSE_OPT_KEEP_ARGV0);

if (argc > 1)
setup_revisions(argc, argv, &revs, NULL);
else
usage(path_walk_usage[0]);

info.revs = &revs;
info.path_fn = emit_block;
info.path_fn_data = &data;

res = walk_objects_by_path(&info);

printf("trees:%" PRIuMAX "\n"
"blobs:%" PRIuMAX "\n",
data.tree_nr, data.blob_nr);

release_revisions(&revs);
return res;
}
1 change: 1 addition & 0 deletions t/helper/test-tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ static struct test_cmd cmds[] = {
{ "parse-subcommand", cmd__parse_subcommand },
{ "partial-clone", cmd__partial_clone },
{ "path-utils", cmd__path_utils },
{ "path-walk", cmd__path_walk },
{ "pcre2-config", cmd__pcre2_config },
{ "pkt-line", cmd__pkt_line },
{ "proc-receive", cmd__proc_receive },
Expand Down
1 change: 1 addition & 0 deletions t/helper/test-tool.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ int cmd__parse_pathspec_file(int argc, const char** argv);
int cmd__parse_subcommand(int argc, const char **argv);
int cmd__partial_clone(int argc, const char **argv);
int cmd__path_utils(int argc, const char **argv);
int cmd__path_walk(int argc, const char **argv);
int cmd__pcre2_config(int argc, const char **argv);
int cmd__pkt_line(int argc, const char **argv);
int cmd__proc_receive(int argc, const char **argv);
Expand Down
1 change: 1 addition & 0 deletions t/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,7 @@ integration_tests = [
't6500-gc.sh',
't6501-freshen-objects.sh',
't6600-test-reach.sh',
't6601-path-walk.sh',
't6700-tree-depth.sh',
't7001-mv.sh',
't7002-mv-sparse-checkout.sh',
Expand Down
130 changes: 130 additions & 0 deletions t/t6601-path-walk.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#!/bin/sh

test_description='direct path-walk API tests'

. ./test-lib.sh

test_expect_success 'setup test repository' '
git checkout -b base &&
mkdir left &&
mkdir right &&
echo a >a &&
echo b >left/b &&
echo c >right/c &&
git add . &&
git commit -m "first" &&
echo d >right/d &&
git add right &&
git commit -m "second" &&
echo bb >left/b &&
git commit -a -m "third" &&
git checkout -b topic HEAD~1 &&
echo cc >right/c &&
git commit -a -m "topic"
'

test_expect_success 'all' '
test-tool path-walk -- --all >out &&
cat >expect <<-EOF &&
TREE::$(git rev-parse topic^{tree})
TREE::$(git rev-parse base^{tree})
TREE::$(git rev-parse base~1^{tree})
TREE::$(git rev-parse base~2^{tree})
TREE:left/:$(git rev-parse base:left)
TREE:left/:$(git rev-parse base~2:left)
TREE:right/:$(git rev-parse topic:right)
TREE:right/:$(git rev-parse base~1:right)
TREE:right/:$(git rev-parse base~2:right)
trees:9
BLOB:a:$(git rev-parse base~2:a)
BLOB:left/b:$(git rev-parse base~2:left/b)
BLOB:left/b:$(git rev-parse base:left/b)
BLOB:right/c:$(git rev-parse base~2:right/c)
BLOB:right/c:$(git rev-parse topic:right/c)
BLOB:right/d:$(git rev-parse base~1:right/d)
blobs:6
EOF
sort expect >expect.sorted &&
sort out >out.sorted &&
test_cmp expect.sorted out.sorted
'

test_expect_success 'topic only' '
test-tool path-walk -- topic >out &&
cat >expect <<-EOF &&
TREE::$(git rev-parse topic^{tree})
TREE::$(git rev-parse base~1^{tree})
TREE::$(git rev-parse base~2^{tree})
TREE:left/:$(git rev-parse base~2:left)
TREE:right/:$(git rev-parse topic:right)
TREE:right/:$(git rev-parse base~1:right)
TREE:right/:$(git rev-parse base~2:right)
trees:7
BLOB:a:$(git rev-parse base~2:a)
BLOB:left/b:$(git rev-parse base~2:left/b)
BLOB:right/c:$(git rev-parse base~2:right/c)
BLOB:right/c:$(git rev-parse topic:right/c)
BLOB:right/d:$(git rev-parse base~1:right/d)
blobs:5
EOF
sort expect >expect.sorted &&
sort out >out.sorted &&
test_cmp expect.sorted out.sorted
'

test_expect_success 'topic, not base' '
test-tool path-walk -- topic --not base >out &&
cat >expect <<-EOF &&
TREE::$(git rev-parse topic^{tree})
TREE:left/:$(git rev-parse topic:left)
TREE:right/:$(git rev-parse topic:right)
trees:3
BLOB:a:$(git rev-parse topic:a)
BLOB:left/b:$(git rev-parse topic:left/b)
BLOB:right/c:$(git rev-parse topic:right/c)
BLOB:right/d:$(git rev-parse topic:right/d)
blobs:4
EOF
sort expect >expect.sorted &&
sort out >out.sorted &&
test_cmp expect.sorted out.sorted
'

test_expect_success 'topic, not base, boundary' '
test-tool path-walk -- --boundary topic --not base >out &&
cat >expect <<-EOF &&
TREE::$(git rev-parse topic^{tree})
TREE::$(git rev-parse base~1^{tree})
TREE:left/:$(git rev-parse base~1:left)
TREE:right/:$(git rev-parse topic:right)
TREE:right/:$(git rev-parse base~1:right)
trees:5
BLOB:a:$(git rev-parse base~1:a)
BLOB:left/b:$(git rev-parse base~1:left/b)
BLOB:right/c:$(git rev-parse base~1:right/c)
BLOB:right/c:$(git rev-parse topic:right/c)
BLOB:right/d:$(git rev-parse base~1:right/d)
blobs:5
EOF
sort expect >expect.sorted &&
sort out >out.sorted &&
test_cmp expect.sorted out.sorted
'

test_done

0 comments on commit 5712852

Please sign in to comment.