diff options
Diffstat (limited to 't')
804 files changed, 31376 insertions, 9188 deletions
diff --git a/t/.gitattributes b/t/.gitattributes index df05434d32..dafa17c3e6 100644 --- a/t/.gitattributes +++ b/t/.gitattributes @@ -1,13 +1,13 @@ t[0-9][0-9][0-9][0-9]/* -whitespace /chainlint/*.expect eol=lf -/diff-lib/* eol=lf +/lib-diff/* eol=lf /t0110/url-* binary /t3206/* eol=lf /t3900/*.txt eol=lf /t3901/*.txt eol=lf -/t4034/*/* eol=lf /t4013/* eol=lf /t4018/* eol=lf +/t4034/*/* eol=lf /t4051/* eol=lf /t4100/* eol=lf /t4101/* eol=lf diff --git a/t/Makefile b/t/Makefile index c83fd18861..882d26eee3 100644 --- a/t/Makefile +++ b/t/Makefile @@ -34,6 +34,7 @@ CHAINLINTTMP_SQ = $(subst ','\'',$(CHAINLINTTMP)) T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)) TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh)) THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh))) +TPERF = $(sort $(wildcard perf/p[0-9][0-9][0-9][0-9]-*.sh)) CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.test))) CHAINLINT = sed -f chainlint.sed @@ -81,17 +82,17 @@ test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \ test-lint-filenames test-lint-duplicates: - @dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \ + @dups=`echo $(T) $(TPERF) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \ test -z "$$dups" || { \ echo >&2 "duplicate test numbers:" $$dups; exit 1; } test-lint-executable: - @bad=`for i in $(T); do test -x "$$i" || echo $$i; done` && \ + @bad=`for i in $(T) $(TPERF); do test -x "$$i" || echo $$i; done` && \ test -z "$$bad" || { \ echo >&2 "non-executable tests:" $$bad; exit 1; } test-lint-shell-syntax: - @'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS) + @'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS) $(TPERF) test-lint-filenames: @# We do *not* pass a glob to ls-files but use grep instead, to catch @@ -196,6 +196,11 @@ appropriately before running "make". Short options can be bundled, i.e. this feature by setting the GIT_TEST_CHAIN_LINT environment variable to "1" or "0", respectively. + A few test scripts disable some of the more advanced + chain-linting detection in the name of efficiency. You can + override this by setting the GIT_TEST_CHAIN_LINT_HARDER + environment variable to "1". + --stress:: Run the test script repeatedly in multiple parallel jobs until one of them fails. Useful for reproducing rare failures in @@ -258,16 +263,21 @@ For an individual test suite --run could be used to specify that only some tests should be run or that some tests should be excluded from a run. -The argument for --run is a list of individual test numbers or -ranges with an optional negation prefix that define what tests in -a test suite to include in the run. A range is two numbers -separated with a dash and matches a range of tests with both ends -been included. You may omit the first or the second number to -mean "from the first test" or "up to the very last test" -respectively. - -Optional prefix of '!' means that the test or a range of tests -should be excluded from the run. +The argument for --run, <test-selector>, is a list of description +substrings or globs or individual test numbers or ranges with an +optional negation prefix (of '!') that define what tests in a test +suite to include (or exclude, if negated) in the run. A range is two +numbers separated with a dash and matches a range of tests with both +ends been included. You may omit the first or the second number to +mean "from the first test" or "up to the very last test" respectively. + +The argument to --run is split on commas into separate strings, +numbers, and ranges, and picks all tests that match any of the +individual selection criteria. If the substring of the description +text that you want to match includes a comma, use the glob character +'?' instead. For example --run='rebase,merge?cherry-pick' would match +on all tests that match either the glob *rebase* or the glob +*merge?cherry-pick*. If --run starts with an unprefixed number or range the initial set of tests to run is empty. If the first item starts with '!' @@ -275,9 +285,6 @@ all the tests are added to the initial set. After initial set is determined every test number or range is added or excluded from the set one by one, from left to right. -Individual numbers or ranges could be separated either by a space -or a comma. - For example, to run only tests up to a specific test (21), one could do this: @@ -290,7 +297,7 @@ or this: Common case is to run several setup tests (1, 2, 3) and then a specific test (21) that relies on that setup: - $ sh ./t9200-git-cvsexport-commit.sh --run='1 2 3 21' + $ sh ./t9200-git-cvsexport-commit.sh --run='1,2,3,21' or: @@ -298,17 +305,17 @@ or: or: - $ sh ./t9200-git-cvsexport-commit.sh --run='-3 21' + $ sh ./t9200-git-cvsexport-commit.sh --run='-3,21' As noted above, the test set is built by going through the items from left to right, so this: - $ sh ./t9200-git-cvsexport-commit.sh --run='1-4 !3' + $ sh ./t9200-git-cvsexport-commit.sh --run='1-4,!3' will run tests 1, 2, and 4. Items that come later have higher precedence. It means that this: - $ sh ./t9200-git-cvsexport-commit.sh --run='!3 1-4' + $ sh ./t9200-git-cvsexport-commit.sh --run='!3,1-4' would just run tests from 1 to 4, including 3. @@ -317,6 +324,18 @@ test in the test suite except from 7 up to 11: $ sh ./t9200-git-cvsexport-commit.sh --run='!7-11' +Sometimes there may be multiple tests with e.g. "setup" in their name +that are needed and rather than figuring out the number for all of them +we can just use "setup" as a substring/glob to match against the test +description: + + $ sh ./t0050-filesystem.sh --run=setup,9-11 + +or one could select both the setup tests and the rename ones (assuming all +relevant tests had those words in their descriptions): + + $ sh ./t0050-filesystem.sh --run=setup,rename + Some tests in a test suite rely on the previous tests performing certain actions, specifically some tests are designated as "setup" test, so you cannot _arbitrarily_ disable one test and @@ -344,12 +363,6 @@ whether this mode is active, and e.g. skip some tests that are hard to refactor to deal with it. The "SYMLINKS" prerequisite is currently excluded as so much relies on it, but this might change in the future. -GIT_TEST_GETTEXT_POISON=<boolean> turns all strings marked for -translation into gibberish if true. Used for spotting those tests that -need to be marked with a C_LOCALE_OUTPUT prerequisite when adding more -strings for translation. See "Testing marked strings" in po/README for -details. - GIT_TEST_SPLIT_INDEX=<boolean> forces split-index mode on the whole test suite. Accept any boolean values that are accepted by git-config. @@ -425,6 +438,16 @@ GIT_TEST_DEFAULT_HASH=<hash-algo> specifies which hash algorithm to use in the test scripts. Recognized values for <hash-algo> are "sha1" and "sha256". +GIT_TEST_WRITE_REV_INDEX=<boolean>, when true enables the +'pack.writeReverseIndex' setting. + +GIT_TEST_SPARSE_INDEX=<boolean>, when true enables index writes to use the +sparse-index format by default. + +GIT_TEST_CHECKOUT_WORKERS=<n> overrides the 'checkout.workers' setting +to <n> and 'checkout.thresholdForParallelism' to 0, forcing the +execution of the parallel-checkout code. + Naming Tests ------------ @@ -903,13 +926,13 @@ library for your script to use. Check whether a file has the length it is expected to. - - test_path_is_file <path> [<diagnosis>] - test_path_is_dir <path> [<diagnosis>] - test_path_is_missing <path> [<diagnosis>] + - test_path_is_file <path> + test_path_is_dir <path> + test_path_is_missing <path> Check if the named path is a file, if the named path is a directory, or if the named path does not exist, respectively, - and fail otherwise, showing the <diagnosis> text. + and fail otherwise. - test_when_finished <script> @@ -1090,18 +1113,6 @@ use these, and "test_set_prereq" for how to define your own. Git was compiled with support for PCRE. Wrap any tests that use git-grep --perl-regexp or git-grep -P in these. - - LIBPCRE1 - - Git was compiled with PCRE v1 support via - USE_LIBPCRE1=YesPlease. Wrap any PCRE using tests that for some - reason need v1 of the PCRE library instead of v2 in these. - - - LIBPCRE2 - - Git was compiled with PCRE v2 support via - USE_LIBPCRE2=YesPlease. Wrap any PCRE using tests that for some - reason need v2 of the PCRE library instead of v1 in these. - - CASE_INSENSITIVE_FS Test is run on a case insensitive file system. @@ -1115,6 +1126,12 @@ use these, and "test_set_prereq" for how to define your own. Git wasn't compiled with NO_PTHREADS=YesPlease. + - REFFILES + + Test is specific to packed/loose ref storage, and should be + disabled for other ref storage backends + + Tips for Writing Tests ---------------------- diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh index d933af5714..d3b299e75c 100644 --- a/t/annotate-tests.sh +++ b/t/annotate-tests.sh @@ -95,7 +95,7 @@ test_expect_success 'blame 2 authors' ' ' test_expect_success 'setup B1 lines (branch1)' ' - git checkout -b branch1 master && + git checkout -b branch1 main && echo "3A slow green fox jumps into the" >>file && echo "well." >>file && GIT_AUTHOR_NAME="B1" GIT_AUTHOR_EMAIL="B1@test.git" \ @@ -107,7 +107,7 @@ test_expect_success 'blame 2 authors + 1 branch1 author' ' ' test_expect_success 'setup B2 lines (branch2)' ' - git checkout -b branch2 master && + git checkout -b branch2 main && sed -e "s/2A quick brown/4A quick brown lazy dog/" <file >file.new && mv file.new file && GIT_AUTHOR_NAME="B2" GIT_AUTHOR_EMAIL="B2@test.git" \ @@ -131,11 +131,11 @@ test_expect_success 'blame --first-parent blames merge for branch1' ' ' test_expect_success 'blame ancestor' ' - check_count -h master A 2 B 2 + check_count -h main A 2 B 2 ' test_expect_success 'blame great-ancestor' ' - check_count -h master^ A 2 + check_count -h main^ A 2 ' test_expect_success 'setup evil merge' ' @@ -479,6 +479,28 @@ test_expect_success 'blame -L ^:RE (absolute: end-of-file)' ' check_count -f hello.c -L$n -L^:ma.. F 4 G 1 H 1 ' +test_expect_success 'blame -L :funcname with userdiff driver' ' + cat >file.template <<-\EOF && + DO NOT MATCH THIS LINE + function RIGHT(a, b) result(c) + AS THE DEFAULT DRIVER WOULD + + integer, intent(in) :: ChangeMe + EOF + + fortran_file=file.f03 && + test_when_finished "rm .gitattributes" && + echo "$fortran_file diff=fortran" >.gitattributes && + + test_commit --author "A <A@test.git>" \ + "add" "$fortran_file" \ + "$(cat file.template)" && + test_commit --author "B <B@test.git>" \ + "change" "$fortran_file" \ + "$(cat file.template | sed -e s/ChangeMe/IWasChanged/)" && + check_count -f "$fortran_file" -L:RIGHT A 3 B 1 +' + test_expect_success 'setup incremental' ' ( GIT_AUTHOR_NAME=I && diff --git a/t/chainlint.sed b/t/chainlint.sed index 70df40e34b..8a25c5b855 100644 --- a/t/chainlint.sed +++ b/t/chainlint.sed @@ -117,7 +117,7 @@ /^[ ]*!*[ ]*(..*)[ ]*[0-9]*[<>|&]/boneline # multi-line "(...\n...)" -/^[ ]*(/bsubshell +/^[ ]*(/bsubsh # innocuous line -- print it and advance to next line b @@ -130,11 +130,11 @@ b } b -:subshell +:subsh # bare "(" line? -- stash for later printing /^[ ]*([ ]*$/ { h - bnextline + bnextln } # "(..." line -- split off and stash "(", then process "..." as its own line x @@ -143,7 +143,7 @@ x s/(// bslurp -:nextline +:nextln N s/.*\n// @@ -151,10 +151,10 @@ s/.*\n// # incomplete line "...\" /\\$/bicmplte # multi-line quoted string "...\n..."? -/"/bdqstring +/"/bdqstr # multi-line quoted string '...\n...'? (but not contraction in string "it's") /'/{ - /"[^'"]*'[^'"]*"/!bsqstring + /"[^'"]*'[^'"]*"/!bsqstr } :folded # here-doc -- swallow it @@ -163,8 +163,8 @@ s/.*\n// # before closing ")", "done", "elsif", "else", or "fi" will need to be # re-visited to drop "suspect" marking since final line of those constructs # legitimately lacks "&&", so "suspect" mark must be removed -/^[ ]*#/bnextline -/^[ ]*$/bnextline +/^[ ]*#/bnextln +/^[ ]*$/bnextln # in-line comment -- strip it (but not "#" in a string, Bash ${#...} array # length, or Perforce "//depot/path#42" revision in filespec) /[ ]#/{ @@ -175,22 +175,22 @@ s/.*\n// # multi-line "case ... esac" /^[ ]*case[ ]..*[ ]in/bcase # multi-line "for ... done" or "while ... done" -/^[ ]*for[ ]..*[ ]in/bcontinue -/^[ ]*while[ ]/bcontinue -/^[ ]*do[ ]/bcontinue -/^[ ]*do[ ]*$/bcontinue -/;[ ]*do/bcontinue +/^[ ]*for[ ]..*[ ]in/bcont +/^[ ]*while[ ]/bcont +/^[ ]*do[ ]/bcont +/^[ ]*do[ ]*$/bcont +/;[ ]*do/bcont /^[ ]*done[ ]*&&[ ]*$/bdone /^[ ]*done[ ]*$/bdone /^[ ]*done[ ]*[<>|]/bdone /^[ ]*done[ ]*)/bdone -/||[ ]*exit[ ]/bcontinue -/||[ ]*exit[ ]*$/bcontinue +/||[ ]*exit[ ]/bcont +/||[ ]*exit[ ]*$/bcont # multi-line "if...elsif...else...fi" -/^[ ]*if[ ]/bcontinue -/^[ ]*then[ ]/bcontinue -/^[ ]*then[ ]*$/bcontinue -/;[ ]*then/bcontinue +/^[ ]*if[ ]/bcont +/^[ ]*then[ ]/bcont +/^[ ]*then[ ]*$/bcont +/;[ ]*then/bcont /^[ ]*elif[ ]/belse /^[ ]*elif[ ]*$/belse /^[ ]*else[ ]/belse @@ -234,10 +234,10 @@ s/.*\n// } } # line ends with pipe "...|" -- valid; not missing "&&" -/|[ ]*$/bcontinue +/|[ ]*$/bcont # missing end-of-line "&&" -- mark suspect /&&[ ]*$/!s/^/?!AMP?!/ -:continue +:cont # retrieve and print previous line x n @@ -250,7 +250,7 @@ s/\\\n// bslurp # check for multi-line double-quoted string "...\n..." -- fold to one line -:dqstring +:dqstr # remove all quote pairs s/"\([^"]*\)"/@!\1@!/g # done if no dangling quote @@ -258,13 +258,13 @@ s/"\([^"]*\)"/@!\1@!/g # otherwise, slurp next line and try again N s/\n// -bdqstring +bdqstr :dqdone s/@!/"/g bfolded # check for multi-line single-quoted string '...\n...' -- fold to one line -:sqstring +:sqstr # remove all quote pairs s/'\([^']*\)'/@!\1@!/g # done if no dangling quote @@ -272,7 +272,7 @@ s/'\([^']*\)'/@!\1@!/g # otherwise, slurp next line and try again N s/\n// -bsqstring +bsqstr :sqdone s/@!/'/g bfolded @@ -282,11 +282,11 @@ bfolded :heredoc s/^\(.*\)<<[ ]*[-\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\2>\1<</ s/[ ]*<<// -:heredsub +:hdocsub N /^<\([^>]*\)>.*\n[ ]*\1[ ]*$/!{ s/\n.*$// - bheredsub + bhdocsub } s/^<[^>]*>// s/\n.*$// @@ -305,7 +305,7 @@ bcase x s/?!AMP?!// x -bcontinue +bcont # found "done" closing for-loop or while-loop, or "fi" closing if-then -- drop # "suspect" from final contained line since that line legitimately lacks "&&" @@ -321,10 +321,10 @@ bchkchn # found nested multi-line "(...\n...)" -- pass through untouched :nest x -:nstslurp +:nstslrp n # closing ")" on own line -- stop nested slurp -/^[ ]*)/bnstclose +/^[ ]*)/bnstcl # comment -- not closing ")" if in comment /^[ ]*#/bnstcnt # "$((...))" -- arithmetic expansion; not closing ")" @@ -332,11 +332,11 @@ n # "$(...)" -- command substitution; not closing ")" /\$([^)][^)]*)[^)]*$/bnstcnt # closing "...)" -- stop nested slurp -/)/bnstclose +/)/bnstcl :nstcnt x -bnstslurp -:nstclose +bnstslrp +:nstcl s/^/>>/ # is it "))" which closes nested and parent subshells? /)[ ]*)/bslurp diff --git a/t/helper/test-advise.c b/t/helper/test-advise.c index 38cdc2884e..cb881139f7 100644 --- a/t/helper/test-advise.c +++ b/t/helper/test-advise.c @@ -5,8 +5,8 @@ int cmd__advise_if_enabled(int argc, const char **argv) { - if (!argv[1]) - die("usage: %s <advice>", argv[0]); + if (argc != 2) + die("usage: %s <advice>", argv[0]); setup_git_directory(); git_config(git_default_config, NULL); @@ -16,7 +16,7 @@ int cmd__advise_if_enabled(int argc, const char **argv) * selected here and in t0018 where this command is being * executed. */ - advise_if_enabled(ADVICE_NESTED_TAG, argv[1]); + advise_if_enabled(ADVICE_NESTED_TAG, "%s", argv[1]); return 0; } diff --git a/t/helper/test-bitmap.c b/t/helper/test-bitmap.c new file mode 100644 index 0000000000..134a1e9d76 --- /dev/null +++ b/t/helper/test-bitmap.c @@ -0,0 +1,24 @@ +#include "test-tool.h" +#include "cache.h" +#include "pack-bitmap.h" + +static int bitmap_list_commits(void) +{ + return test_bitmap_commits(the_repository); +} + +int cmd__bitmap(int argc, const char **argv) +{ + setup_git_directory(); + + if (argc != 2) + goto usage; + + if (!strcmp(argv[1], "list-commits")) + return bitmap_list_commits(); + +usage: + usage("\ttest-tool bitmap list-commits"); + + return -1; +} diff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c index 5e77d56f59..ad3ef1cd77 100644 --- a/t/helper/test-bloom.c +++ b/t/helper/test-bloom.c @@ -39,14 +39,16 @@ static void get_bloom_filter_for_commit(const struct object_id *commit_oid) struct bloom_filter *filter; setup_git_directory(); c = lookup_commit(the_repository, commit_oid); - filter = get_bloom_filter(the_repository, c, 1); + filter = get_or_compute_bloom_filter(the_repository, c, 1, + &settings, + NULL); print_bloom_filter(filter); } static const char *bloom_usage = "\n" " test-tool bloom get_murmur3 <string>\n" " test-tool bloom generate_filter <string> [<string>...]\n" -" test-tool get_filter_for_commit <commit-hex>\n"; +" test-tool bloom get_filter_for_commit <commit-hex>\n"; int cmd__bloom(int argc, const char **argv) { @@ -67,7 +69,7 @@ int cmd__bloom(int argc, const char **argv) struct bloom_filter filter; int i = 2; filter.len = (settings.bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD; - filter.data = xcalloc(filter.len, sizeof(unsigned char)); + CALLOC_ARRAY(filter.data, filter.len); if (argc - 1 < i) usage(bloom_usage); diff --git a/t/helper/test-chmtime.c b/t/helper/test-chmtime.c index aa22af48c2..524b55ca49 100644 --- a/t/helper/test-chmtime.c +++ b/t/helper/test-chmtime.c @@ -109,9 +109,9 @@ int cmd__chmtime(int argc, const char **argv) uintmax_t mtime; if (stat(argv[i], &sb) < 0) { - fprintf(stderr, "Failed to stat %s: %s\n", + fprintf(stderr, "Failed to stat %s: %s. Skipping\n", argv[i], strerror(errno)); - return 1; + continue; } #ifdef GIT_WINDOWS_NATIVE diff --git a/t/helper/test-crontab.c b/t/helper/test-crontab.c new file mode 100644 index 0000000000..e7c0137a47 --- /dev/null +++ b/t/helper/test-crontab.c @@ -0,0 +1,35 @@ +#include "test-tool.h" +#include "cache.h" + +/* + * Usage: test-tool cron <file> [-l] + * + * If -l is specified, then write the contents of <file> to stdout. + * Otherwise, write from stdin into <file>. + */ +int cmd__crontab(int argc, const char **argv) +{ + int a; + FILE *from, *to; + + if (argc == 3 && !strcmp(argv[2], "-l")) { + from = fopen(argv[1], "r"); + if (!from) + return 0; + to = stdout; + } else if (argc == 2) { + from = stdin; + to = fopen(argv[1], "w"); + } else + return error("unknown arguments"); + + while ((a = fgetc(from)) != EOF) + fputc(a, to); + + if (argc == 3) + fclose(from); + else + fclose(to); + + return 0; +} diff --git a/t/helper/test-example-decorate.c b/t/helper/test-example-decorate.c index c8a1cde7d2..b9d1200eb9 100644 --- a/t/helper/test-example-decorate.c +++ b/t/helper/test-example-decorate.c @@ -26,8 +26,8 @@ int cmd__example_decorate(int argc, const char **argv) * Add 2 objects, one with a non-NULL decoration and one with a NULL * decoration. */ - one = lookup_unknown_object(&one_oid); - two = lookup_unknown_object(&two_oid); + one = lookup_unknown_object(the_repository, &one_oid); + two = lookup_unknown_object(the_repository, &two_oid); ret = add_decoration(&n, one, &decoration_a); if (ret) BUG("when adding a brand-new object, NULL should be returned"); @@ -56,7 +56,7 @@ int cmd__example_decorate(int argc, const char **argv) ret = lookup_decoration(&n, two); if (ret != &decoration_b) BUG("lookup should return added declaration"); - three = lookup_unknown_object(&three_oid); + three = lookup_unknown_object(the_repository, &three_oid); ret = lookup_decoration(&n, three); if (ret) BUG("lookup for unknown object should return NULL"); diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c new file mode 100644 index 0000000000..fc2d460904 --- /dev/null +++ b/t/helper/test-fast-rebase.c @@ -0,0 +1,225 @@ +/* + * "git fast-rebase" builtin command + * + * FAST: Forking Any Subprocesses (is) Taboo + * + * This is meant SOLELY as a demo of what is possible. sequencer.c and + * rebase.c should be refactored to use the ideas here, rather than attempting + * to extend this file to replace those (unless Phillip or Dscho say that + * refactoring is too hard and we need a clean slate, but I'm guessing that + * refactoring is the better route). + */ + +#define USE_THE_INDEX_COMPATIBILITY_MACROS +#include "test-tool.h" + +#include "cache-tree.h" +#include "commit.h" +#include "lockfile.h" +#include "merge-ort.h" +#include "refs.h" +#include "revision.h" +#include "sequencer.h" +#include "strvec.h" +#include "tree.h" + +static const char *short_commit_name(struct commit *commit) +{ + return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV); +} + +static struct commit *peel_committish(const char *name) +{ + struct object *obj; + struct object_id oid; + + if (get_oid(name, &oid)) + return NULL; + obj = parse_object(the_repository, &oid); + return (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT); +} + +static char *get_author(const char *message) +{ + size_t len; + const char *a; + + a = find_commit_header(message, "author", &len); + if (a) + return xmemdupz(a, len); + + return NULL; +} + +static struct commit *create_commit(struct tree *tree, + struct commit *based_on, + struct commit *parent) +{ + struct object_id ret; + struct object *obj; + struct commit_list *parents = NULL; + char *author; + char *sign_commit = NULL; + struct commit_extra_header *extra; + struct strbuf msg = STRBUF_INIT; + const char *out_enc = get_commit_output_encoding(); + const char *message = logmsg_reencode(based_on, NULL, out_enc); + const char *orig_message = NULL; + const char *exclude_gpgsig[] = { "gpgsig", NULL }; + + commit_list_insert(parent, &parents); + extra = read_commit_extra_headers(based_on, exclude_gpgsig); + find_commit_subject(message, &orig_message); + strbuf_addstr(&msg, orig_message); + author = get_author(message); + reset_ident_date(); + if (commit_tree_extended(msg.buf, msg.len, &tree->object.oid, parents, + &ret, author, NULL, sign_commit, extra)) { + error(_("failed to write commit object")); + return NULL; + } + free(author); + strbuf_release(&msg); + + obj = parse_object(the_repository, &ret); + return (struct commit *)obj; +} + +int cmd__fast_rebase(int argc, const char **argv) +{ + struct commit *onto; + struct commit *last_commit = NULL, *last_picked_commit = NULL; + struct object_id head; + struct lock_file lock = LOCK_INIT; + struct strvec rev_walk_args = STRVEC_INIT; + struct rev_info revs; + struct commit *commit; + struct merge_options merge_opt; + struct tree *next_tree, *base_tree, *head_tree; + struct merge_result result; + struct strbuf reflog_msg = STRBUF_INIT; + struct strbuf branch_name = STRBUF_INIT; + + /* + * test-tool stuff doesn't set up the git directory by default; need to + * do that manually. + */ + setup_git_directory(); + + if (argc == 2 && !strcmp(argv[1], "-h")) { + printf("Sorry, I am not a psychiatrist; I can not give you the help you need. Oh, you meant usage...\n"); + exit(129); + } + + if (argc != 5 || strcmp(argv[1], "--onto")) + die("usage: read the code, figure out how to use it, then do so"); + + onto = peel_committish(argv[2]); + strbuf_addf(&branch_name, "refs/heads/%s", argv[4]); + + /* Sanity check */ + if (get_oid("HEAD", &head)) + die(_("Cannot read HEAD")); + assert(oideq(&onto->object.oid, &head)); + + hold_locked_index(&lock, LOCK_DIE_ON_ERROR); + if (repo_read_index(the_repository) < 0) + BUG("Could not read index"); + + repo_init_revisions(the_repository, &revs, NULL); + revs.verbose_header = 1; + revs.max_parents = 1; + revs.cherry_mark = 1; + revs.limited = 1; + revs.reverse = 1; + revs.right_only = 1; + revs.sort_order = REV_SORT_IN_GRAPH_ORDER; + revs.topo_order = 1; + strvec_pushl(&rev_walk_args, "", argv[4], "--not", argv[3], NULL); + + if (setup_revisions(rev_walk_args.nr, rev_walk_args.v, &revs, NULL) > 1) + return error(_("unhandled options")); + + strvec_clear(&rev_walk_args); + + if (prepare_revision_walk(&revs) < 0) + return error(_("error preparing revisions")); + + init_merge_options(&merge_opt, the_repository); + memset(&result, 0, sizeof(result)); + merge_opt.show_rename_progress = 1; + merge_opt.branch1 = "HEAD"; + head_tree = get_commit_tree(onto); + result.tree = head_tree; + last_commit = onto; + while ((commit = get_revision(&revs))) { + struct commit *base; + + fprintf(stderr, "Rebasing %s...\r", + oid_to_hex(&commit->object.oid)); + assert(commit->parents && !commit->parents->next); + base = commit->parents->item; + + next_tree = get_commit_tree(commit); + base_tree = get_commit_tree(base); + + merge_opt.branch2 = short_commit_name(commit); + merge_opt.ancestor = xstrfmt("parent of %s", merge_opt.branch2); + + merge_incore_nonrecursive(&merge_opt, + base_tree, + result.tree, + next_tree, + &result); + + free((char*)merge_opt.ancestor); + merge_opt.ancestor = NULL; + if (!result.clean) + break; + last_picked_commit = commit; + last_commit = create_commit(result.tree, commit, last_commit); + } + /* TODO: There should be some kind of rev_info_free(&revs) call... */ + memset(&revs, 0, sizeof(revs)); + + merge_switch_to_result(&merge_opt, head_tree, &result, 1, !result.clean); + + if (result.clean < 0) + exit(128); + + if (result.clean) { + fprintf(stderr, "\nDone.\n"); + strbuf_addf(&reflog_msg, "finish rebase %s onto %s", + oid_to_hex(&last_picked_commit->object.oid), + oid_to_hex(&last_commit->object.oid)); + if (update_ref(reflog_msg.buf, branch_name.buf, + &last_commit->object.oid, + &last_picked_commit->object.oid, + REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) { + error(_("could not update %s"), argv[4]); + die("Failed to update %s", argv[4]); + } + if (create_symref("HEAD", branch_name.buf, reflog_msg.buf) < 0) + die(_("unable to update HEAD")); + strbuf_release(&reflog_msg); + strbuf_release(&branch_name); + + prime_cache_tree(the_repository, the_repository->index, + result.tree); + } else { + fprintf(stderr, "\nAborting: Hit a conflict.\n"); + strbuf_addf(&reflog_msg, "rebase progress up to %s", + oid_to_hex(&last_picked_commit->object.oid)); + if (update_ref(reflog_msg.buf, "HEAD", + &last_commit->object.oid, + &head, + REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) { + error(_("could not update %s"), argv[4]); + die("Failed to update %s", argv[4]); + } + } + if (write_locked_index(&the_index, &lock, + COMMIT_LOCK | SKIP_IF_UNCHANGED)) + die(_("unable to write %s"), get_index_file()); + return (result.clean == 0); +} diff --git a/t/helper/test-hash-speed.c b/t/helper/test-hash-speed.c index 432233c7f0..f40d9ad0c2 100644 --- a/t/helper/test-hash-speed.c +++ b/t/helper/test-hash-speed.c @@ -57,5 +57,5 @@ int cmd__hash_speed(int ac, const char **av) free(p); } - exit(0); + return 0; } diff --git a/t/helper/test-hash.c b/t/helper/test-hash.c index 0a31de66f3..261c545b9d 100644 --- a/t/helper/test-hash.c +++ b/t/helper/test-hash.c @@ -54,5 +54,5 @@ int cmd_hash_impl(int ac, const char **av, int algo) fwrite(hash, 1, algop->rawsz, stdout); else puts(hash_to_hex_algop(hash, algop)); - exit(0); + return 0; } diff --git a/t/helper/test-hashmap.c b/t/helper/test-hashmap.c index f38706216f..36ff07bd4b 100644 --- a/t/helper/test-hashmap.c +++ b/t/helper/test-hashmap.c @@ -110,7 +110,7 @@ static void perf_hashmap(unsigned int method, unsigned int rounds) hashmap_add(&map, &entries[i]->ent); } - hashmap_free(&map); + hashmap_clear(&map); } } else { /* test map lookups */ @@ -130,7 +130,7 @@ static void perf_hashmap(unsigned int method, unsigned int rounds) } } - hashmap_free(&map); + hashmap_clear(&map); } } @@ -151,12 +151,11 @@ static void perf_hashmap(unsigned int method, unsigned int rounds) int cmd__hashmap(int argc, const char **argv) { struct strbuf line = STRBUF_INIT; - struct hashmap map; int icase; + struct hashmap map = HASHMAP_INIT(test_entry_cmp, &icase); /* init hash map */ icase = argc > 1 && !strcmp("ignorecase", argv[1]); - hashmap_init(&map, test_entry_cmp, &icase, 0); /* process commands from stdin */ while (strbuf_getline(&line, stdin) != EOF) { @@ -262,6 +261,6 @@ int cmd__hashmap(int argc, const char **argv) } strbuf_release(&line); - hashmap_free_entries(&map, struct test_entry, ent); + hashmap_clear_and_free(&map, struct test_entry, ent); return 0; } diff --git a/t/helper/test-match-trees.c b/t/helper/test-match-trees.c index b9fd427571..4079fdee06 100644 --- a/t/helper/test-match-trees.c +++ b/t/helper/test-match-trees.c @@ -23,5 +23,5 @@ int cmd__match_trees(int ac, const char **av) shift_tree(the_repository, &one->object.oid, &two->object.oid, &shifted, -1); printf("shifted: %s\n", oid_to_hex(&shifted)); - exit(0); + return 0; } diff --git a/t/helper/test-oidtree.c b/t/helper/test-oidtree.c new file mode 100644 index 0000000000..180ee28dd9 --- /dev/null +++ b/t/helper/test-oidtree.c @@ -0,0 +1,49 @@ +#include "test-tool.h" +#include "cache.h" +#include "oidtree.h" + +static enum cb_next print_oid(const struct object_id *oid, void *data) +{ + puts(oid_to_hex(oid)); + return CB_CONTINUE; +} + +int cmd__oidtree(int argc, const char **argv) +{ + struct oidtree ot; + struct strbuf line = STRBUF_INIT; + int nongit_ok; + int algo = GIT_HASH_UNKNOWN; + + oidtree_init(&ot); + setup_git_directory_gently(&nongit_ok); + + while (strbuf_getline(&line, stdin) != EOF) { + const char *arg; + struct object_id oid; + + if (skip_prefix(line.buf, "insert ", &arg)) { + if (get_oid_hex_any(arg, &oid) == GIT_HASH_UNKNOWN) + die("insert not a hexadecimal oid: %s", arg); + algo = oid.algo; + oidtree_insert(&ot, &oid); + } else if (skip_prefix(line.buf, "contains ", &arg)) { + if (get_oid_hex(arg, &oid)) + die("contains not a hexadecimal oid: %s", arg); + printf("%d\n", oidtree_contains(&ot, &oid)); + } else if (skip_prefix(line.buf, "each ", &arg)) { + char buf[GIT_MAX_HEXSZ + 1] = { '0' }; + memset(&oid, 0, sizeof(oid)); + memcpy(buf, arg, strlen(arg)); + buf[hash_algos[algo].hexsz] = '\0'; + get_oid_hex_any(buf, &oid); + oid.algo = algo; + oidtree_each(&ot, &oid, strlen(arg), print_oid, NULL); + } else if (!strcmp(line.buf, "clear")) { + oidtree_clear(&ot); + } else { + die("unknown command: %s", line.buf); + } + } + return 0; +} diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c new file mode 100644 index 0000000000..3f102cfddd --- /dev/null +++ b/t/helper/test-partial-clone.c @@ -0,0 +1,43 @@ +#include "cache.h" +#include "test-tool.h" +#include "repository.h" +#include "object-store.h" + +/* + * Prints the size of the object corresponding to the given hash in a specific + * gitdir. This is similar to "git -C gitdir cat-file -s", except that this + * exercises the code that accesses the object of an arbitrary repository that + * is not the_repository. ("git -C gitdir" makes it so that the_repository is + * the one in gitdir.) + */ +static void object_info(const char *gitdir, const char *oid_hex) +{ + struct repository r; + struct object_id oid; + unsigned long size; + struct object_info oi = {.sizep = &size}; + const char *p; + + if (repo_init(&r, gitdir, NULL)) + die("could not init repo"); + if (parse_oid_hex(oid_hex, &oid, &p)) + die("could not parse oid"); + if (oid_object_info_extended(&r, &oid, &oi, 0)) + die("could not obtain object info"); + printf("%d\n", (int) size); +} + +int cmd__partial_clone(int argc, const char **argv) +{ + setup_git_directory(); + + if (argc < 4) + die("too few arguments"); + + if (!strcmp(argv[1], "object-info")) + object_info(argv[2], argv[3]); + else + die("invalid argument '%s'", argv[1]); + + return 0; +} diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c index 313a153209..229ed416b0 100644 --- a/t/helper/test-path-utils.c +++ b/t/helper/test-path-utils.c @@ -172,9 +172,22 @@ static struct test_data dirname_data[] = { { NULL, NULL } }; -static int is_dotgitmodules(const char *path) +static int check_dotfile(const char *x, const char **argv, + int (*is_hfs)(const char *), + int (*is_ntfs)(const char *)) { - return is_hfs_dotgitmodules(path) || is_ntfs_dotgitmodules(path); + int res = 0, expect = 1; + for (; *argv; argv++) { + if (!strcmp("--not", *argv)) + expect = !expect; + else if (expect != (is_hfs(*argv) || is_ntfs(*argv))) + res = error("'%s' is %s.git%s", *argv, + expect ? "not " : "", x); + else + fprintf(stderr, "ok: '%s' is %s.git%s\n", + *argv, expect ? "" : "not ", x); + } + return !!res; } static int cmp_by_st_size(const void *a, const void *b) @@ -382,17 +395,24 @@ int cmd__path_utils(int argc, const char **argv) return test_function(dirname_data, posix_dirname, argv[1]); if (argc > 2 && !strcmp(argv[1], "is_dotgitmodules")) { - int res = 0, expect = 1, i; - for (i = 2; i < argc; i++) - if (!strcmp("--not", argv[i])) - expect = !expect; - else if (expect != is_dotgitmodules(argv[i])) - res = error("'%s' is %s.gitmodules", argv[i], - expect ? "not " : ""); - else - fprintf(stderr, "ok: '%s' is %s.gitmodules\n", - argv[i], expect ? "" : "not "); - return !!res; + return check_dotfile("modules", argv + 2, + is_hfs_dotgitmodules, + is_ntfs_dotgitmodules); + } + if (argc > 2 && !strcmp(argv[1], "is_dotgitignore")) { + return check_dotfile("ignore", argv + 2, + is_hfs_dotgitignore, + is_ntfs_dotgitignore); + } + if (argc > 2 && !strcmp(argv[1], "is_dotgitattributes")) { + return check_dotfile("attributes", argv + 2, + is_hfs_dotgitattributes, + is_ntfs_dotgitattributes); + } + if (argc > 2 && !strcmp(argv[1], "is_dotmailmap")) { + return check_dotfile("mailmap", argv + 2, + is_hfs_dotmailmap, + is_ntfs_dotmailmap); } if (argc > 2 && !strcmp(argv[1], "file-size")) { diff --git a/t/helper/test-pcre2-config.c b/t/helper/test-pcre2-config.c new file mode 100644 index 0000000000..5258fdddba --- /dev/null +++ b/t/helper/test-pcre2-config.c @@ -0,0 +1,12 @@ +#include "test-tool.h" +#include "cache.h" +#include "grep.h" + +int cmd__pcre2_config(int argc, const char **argv) +{ + if (argc == 2 && !strcmp(argv[1], "has-PCRE2_MATCH_INVALID_UTF")) { + int value = PCRE2_MATCH_INVALID_UTF; + return !value; + } + return 1; +} diff --git a/t/helper/test-pkt-line.c b/t/helper/test-pkt-line.c index 69152958e5..5e638f0b97 100644 --- a/t/helper/test-pkt-line.c +++ b/t/helper/test-pkt-line.c @@ -84,6 +84,25 @@ static void unpack_sideband(void) } } +static int send_split_sideband(void) +{ + const char *part1 = "Hello,"; + const char *primary = "\001primary: regular output\n"; + const char *part2 = " world!\n"; + + send_sideband(1, 2, part1, strlen(part1), LARGE_PACKET_MAX); + packet_write(1, primary, strlen(primary)); + send_sideband(1, 2, part2, strlen(part2), LARGE_PACKET_MAX); + packet_response_end(1); + + return 0; +} + +static int receive_sideband(void) +{ + return recv_sideband("sideband", 0, 1); +} + int cmd__pkt_line(int argc, const char **argv) { if (argc < 2) @@ -95,6 +114,10 @@ int cmd__pkt_line(int argc, const char **argv) unpack(); else if (!strcmp(argv[1], "unpack-sideband")) unpack_sideband(); + else if (!strcmp(argv[1], "send-split-sideband")) + send_split_sideband(); + else if (!strcmp(argv[1], "receive-sideband")) + receive_sideband(); else die("invalid argument '%s'", argv[1]); diff --git a/t/helper/test-proc-receive.c b/t/helper/test-proc-receive.c new file mode 100644 index 0000000000..cc08506cf0 --- /dev/null +++ b/t/helper/test-proc-receive.c @@ -0,0 +1,202 @@ +#include "cache.h" +#include "connect.h" +#include "parse-options.h" +#include "pkt-line.h" +#include "sigchain.h" +#include "test-tool.h" + +static const char *proc_receive_usage[] = { + "test-tool proc-receive [<options>...]", + NULL +}; + +static int die_read_version; +static int die_write_version; +static int die_read_commands; +static int die_read_push_options; +static int die_write_report; +static int no_push_options; +static int use_atomic; +static int use_push_options; +static int verbose; +static int version = 1; +static struct string_list returns = STRING_LIST_INIT_NODUP; + +struct command { + struct command *next; + const char *error_string; + unsigned int skip_update:1, + did_not_exist:1; + int index; + struct object_id old_oid; + struct object_id new_oid; + char ref_name[FLEX_ARRAY]; /* more */ +}; + +static void proc_receive_verison(struct packet_reader *reader) { + int server_version = 0; + + if (die_read_version) + die("die with the --die-read-version option"); + + for (;;) { + int linelen; + + if (packet_reader_read(reader) != PACKET_READ_NORMAL) + break; + + /* Ignore version negotiation for version 0 */ + if (version == 0) + continue; + + if (reader->pktlen > 8 && starts_with(reader->line, "version=")) { + server_version = atoi(reader->line+8); + if (server_version != 1) + die("bad protocol version: %d", server_version); + linelen = strlen(reader->line); + if (linelen < reader->pktlen) { + const char *feature_list = reader->line + linelen + 1; + if (parse_feature_request(feature_list, "atomic")) + use_atomic= 1; + if (parse_feature_request(feature_list, "push-options")) + use_push_options = 1; + } + } + } + + if (die_write_version) + die("die with the --die-write-version option"); + + if (version != 0) + packet_write_fmt(1, "version=%d%c%s\n", + version, '\0', + use_push_options && !no_push_options ? "push-options": ""); + packet_flush(1); +} + +static void proc_receive_read_commands(struct packet_reader *reader, + struct command **commands) +{ + struct command **tail = commands; + + for (;;) { + struct object_id old_oid, new_oid; + struct command *cmd; + const char *refname; + const char *p; + + if (packet_reader_read(reader) != PACKET_READ_NORMAL) + break; + + if (die_read_commands) + die("die with the --die-read-commands option"); + + if (parse_oid_hex(reader->line, &old_oid, &p) || + *p++ != ' ' || + parse_oid_hex(p, &new_oid, &p) || + *p++ != ' ') + die("protocol error: expected 'old new ref', got '%s'", + reader->line); + refname = p; + FLEX_ALLOC_STR(cmd, ref_name, refname); + oidcpy(&cmd->old_oid, &old_oid); + oidcpy(&cmd->new_oid, &new_oid); + + *tail = cmd; + tail = &cmd->next; + } +} + +static void proc_receive_read_push_options(struct packet_reader *reader, + struct string_list *options) +{ + + if (no_push_options || !use_push_options) + return; + + if (die_read_push_options) + die("die with the --die-read-push-options option"); + + while (1) { + if (packet_reader_read(reader) != PACKET_READ_NORMAL) + break; + + string_list_append(options, reader->line); + } +} + +int cmd__proc_receive(int argc, const char **argv) +{ + int nongit_ok = 0; + struct packet_reader reader; + struct command *commands = NULL; + struct string_list push_options = STRING_LIST_INIT_DUP; + struct string_list_item *item; + struct option options[] = { + OPT_BOOL(0, "no-push-options", &no_push_options, + "disable push options"), + OPT_BOOL(0, "die-read-version", &die_read_version, + "die when reading version"), + OPT_BOOL(0, "die-write-version", &die_write_version, + "die when writing version"), + OPT_BOOL(0, "die-read-commands", &die_read_commands, + "die when reading commands"), + OPT_BOOL(0, "die-read-push-options", &die_read_push_options, + "die when reading push-options"), + OPT_BOOL(0, "die-write-report", &die_write_report, + "die when writing report"), + OPT_STRING_LIST('r', "return", &returns, "old/new/ref/status/msg", + "return of results"), + OPT__VERBOSE(&verbose, "be verbose"), + OPT_INTEGER('V', "version", &version, + "use this protocol version number"), + OPT_END() + }; + + setup_git_directory_gently(&nongit_ok); + + argc = parse_options(argc, argv, "test-tools", options, proc_receive_usage, 0); + if (argc > 0) + usage_msg_opt("Too many arguments.", proc_receive_usage, options); + packet_reader_init(&reader, 0, NULL, 0, + PACKET_READ_CHOMP_NEWLINE | + PACKET_READ_GENTLE_ON_EOF); + + sigchain_push(SIGPIPE, SIG_IGN); + proc_receive_verison(&reader); + proc_receive_read_commands(&reader, &commands); + proc_receive_read_push_options(&reader, &push_options); + + if (verbose) { + struct command *cmd; + + if (use_push_options || use_atomic) + fprintf(stderr, "proc-receive:%s%s\n", + use_atomic? " atomic": "", + use_push_options ? " push_options": ""); + + for (cmd = commands; cmd; cmd = cmd->next) + fprintf(stderr, "proc-receive< %s %s %s\n", + oid_to_hex(&cmd->old_oid), + oid_to_hex(&cmd->new_oid), + cmd->ref_name); + + if (push_options.nr > 0) + for_each_string_list_item(item, &push_options) + fprintf(stderr, "proc-receive< %s\n", item->string); + + if (returns.nr) + for_each_string_list_item(item, &returns) + fprintf(stderr, "proc-receive> %s\n", item->string); + } + + if (die_write_report) + die("die with the --die-write-report option"); + if (returns.nr) + for_each_string_list_item(item, &returns) + packet_write_fmt(1, "%s\n", item->string); + packet_flush(1); + sigchain_pop(SIGPIPE); + + return 0; +} diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c index 14a3655442..2f65c7f6a5 100644 --- a/t/helper/test-reach.c +++ b/t/helper/test-reach.c @@ -107,6 +107,8 @@ int cmd__reach(int ac, const char **av) printf("%s(A,B):%d\n", av[1], ref_newer(&oid_A, &oid_B)); else if (!strcmp(av[1], "in_merge_bases")) printf("%s(A,B):%d\n", av[1], in_merge_bases(A, B)); + else if (!strcmp(av[1], "in_merge_bases_many")) + printf("%s(A,X):%d\n", av[1], in_merge_bases_many(A, X_nr, X_array)); else if (!strcmp(av[1], "is_descendant_of")) printf("%s(A,X):%d\n", av[1], repo_is_descendant_of(r, A, X)); else if (!strcmp(av[1], "get_merge_bases_many")) { @@ -164,5 +166,5 @@ int cmd__reach(int ac, const char **av) print_sorted_commit_ids(list); } - exit(0); + return 0; } diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c index 244977a29b..b52c174acc 100644 --- a/t/helper/test-read-cache.c +++ b/t/helper/test-read-cache.c @@ -1,36 +1,82 @@ #include "test-tool.h" #include "cache.h" #include "config.h" +#include "blob.h" +#include "commit.h" +#include "tree.h" +#include "sparse-index.h" + +static void print_cache_entry(struct cache_entry *ce) +{ + const char *type; + printf("%06o ", ce->ce_mode & 0177777); + + if (S_ISSPARSEDIR(ce->ce_mode)) + type = tree_type; + else if (S_ISGITLINK(ce->ce_mode)) + type = commit_type; + else + type = blob_type; + + printf("%s %s\t%s\n", + type, + oid_to_hex(&ce->oid), + ce->name); +} + +static void print_cache(struct index_state *istate) +{ + int i; + for (i = 0; i < istate->cache_nr; i++) + print_cache_entry(istate->cache[i]); +} int cmd__read_cache(int argc, const char **argv) { + struct repository *r = the_repository; int i, cnt = 1; const char *name = NULL; + int table = 0, expand = 0; + + initialize_the_repository(); + prepare_repo_settings(r); + r->settings.command_requires_full_index = 0; - if (argc > 1 && skip_prefix(argv[1], "--print-and-refresh=", &name)) { - argc--; - argv++; + for (++argv, --argc; *argv && starts_with(*argv, "--"); ++argv, --argc) { + if (skip_prefix(*argv, "--print-and-refresh=", &name)) + continue; + if (!strcmp(*argv, "--table")) + table = 1; + else if (!strcmp(*argv, "--expand")) + expand = 1; } - if (argc == 2) - cnt = strtol(argv[1], NULL, 0); + if (argc == 1) + cnt = strtol(argv[0], NULL, 0); setup_git_directory(); git_config(git_default_config, NULL); + for (i = 0; i < cnt; i++) { - read_cache(); + repo_read_index(r); + + if (expand) + ensure_full_index(r->index); + if (name) { int pos; - refresh_index(&the_index, REFRESH_QUIET, + refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL); - pos = index_name_pos(&the_index, name, strlen(name)); + pos = index_name_pos(r->index, name, strlen(name)); if (pos < 0) die("%s not in index", name); printf("%s is%s up to date\n", name, - ce_uptodate(the_index.cache[pos]) ? "" : " not"); + ce_uptodate(r->index->cache[pos]) ? "" : " not"); write_file(name, "%d\n", i); } - discard_cache(); + if (table) + print_cache(r->index); + discard_index(r->index); } return 0; } diff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c index 6d0c962438..75927b2c81 100644 --- a/t/helper/test-read-graph.c +++ b/t/helper/test-read-graph.c @@ -12,11 +12,12 @@ int cmd__read_graph(int argc, const char **argv) setup_git_directory(); odb = the_repository->objects->odb; + prepare_repo_settings(the_repository); + graph = read_commit_graph_one(the_repository, odb); if (!graph) return 1; - printf("header: %08x %d %d %d %d\n", ntohl(*(uint32_t*)graph->data), *(unsigned char*)(graph->data + 4), @@ -32,6 +33,10 @@ int cmd__read_graph(int argc, const char **argv) printf(" oid_lookup"); if (graph->chunk_commit_data) printf(" commit_metadata"); + if (graph->chunk_generation_data) + printf(" generation_data"); + if (graph->chunk_generation_data_overflow) + printf(" generation_data_overflow"); if (graph->chunk_extra_edges) printf(" extra_edges"); if (graph->chunk_bloom_indexes) diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c index 2430880f78..7c2eb11a8e 100644 --- a/t/helper/test-read-midx.c +++ b/t/helper/test-read-midx.c @@ -4,7 +4,7 @@ #include "repository.h" #include "object-store.h" -static int read_midx_file(const char *object_dir) +static int read_midx_file(const char *object_dir, int show_objects) { uint32_t i; struct multi_pack_index *m; @@ -43,13 +43,29 @@ static int read_midx_file(const char *object_dir) printf("object-dir: %s\n", m->object_dir); + if (show_objects) { + struct object_id oid; + struct pack_entry e; + + for (i = 0; i < m->num_objects; i++) { + nth_midxed_object_oid(&oid, m, i); + fill_midx_entry(the_repository, &oid, &e, m); + + printf("%s %"PRIu64"\t%s\n", + oid_to_hex(&oid), e.offset, e.p->pack_name); + } + return 0; + } + return 0; } int cmd__read_midx(int argc, const char **argv) { - if (argc != 2) - usage("read-midx <object-dir>"); + if (!(argc == 2 || argc == 3)) + usage("read-midx [--show-objects] <object-dir>"); - return read_midx_file(argv[1]); + if (!strcmp(argv[1], "--show-objects")) + return read_midx_file(argv[2], 1); + return read_midx_file(argv[1], 0); } diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index 759e69dc54..b314b81a45 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -72,18 +72,6 @@ static int cmd_pack_refs(struct ref_store *refs, const char **argv) return refs_pack_refs(refs, flags); } -static int cmd_peel_ref(struct ref_store *refs, const char **argv) -{ - const char *refname = notnull(*argv++, "refname"); - struct object_id oid; - int ret; - - ret = refs_peel_ref(refs, refname, &oid); - if (!ret) - puts(oid_to_hex(&oid)); - return ret; -} - static int cmd_create_symref(struct ref_store *refs, const char **argv) { const char *refname = notnull(*argv++, "refname"); @@ -130,7 +118,7 @@ static int cmd_for_each_ref(struct ref_store *refs, const char **argv) static int cmd_resolve_ref(struct ref_store *refs, const char **argv) { - struct object_id oid; + struct object_id oid = *null_oid(); const char *refname = notnull(*argv++, "refname"); int resolve_flags = arg_flags(*argv++, "resolve-flags"); int flags; @@ -255,7 +243,6 @@ struct command { static struct command commands[] = { { "pack-refs", cmd_pack_refs }, - { "peel-ref", cmd_peel_ref }, { "create-symref", cmd_create_symref }, { "delete-refs", cmd_delete_refs }, { "rename-ref", cmd_rename_ref }, diff --git a/t/helper/test-simple-ipc.c b/t/helper/test-simple-ipc.c new file mode 100644 index 0000000000..42040ef81b --- /dev/null +++ b/t/helper/test-simple-ipc.c @@ -0,0 +1,787 @@ +/* + * test-simple-ipc.c: verify that the Inter-Process Communication works. + */ + +#include "test-tool.h" +#include "cache.h" +#include "strbuf.h" +#include "simple-ipc.h" +#include "parse-options.h" +#include "thread-utils.h" +#include "strvec.h" + +#ifndef SUPPORTS_SIMPLE_IPC +int cmd__simple_ipc(int argc, const char **argv) +{ + die("simple IPC not available on this platform"); +} +#else + +/* + * The test daemon defines an "application callback" that supports a + * series of commands (see `test_app_cb()`). + * + * Unknown commands are caught here and we send an error message back + * to the client process. + */ +static int app__unhandled_command(const char *command, + ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + struct strbuf buf = STRBUF_INIT; + int ret; + + strbuf_addf(&buf, "unhandled command: %s", command); + ret = reply_cb(reply_data, buf.buf, buf.len); + strbuf_release(&buf); + + return ret; +} + +/* + * Reply with a single very large buffer. This is to ensure that + * long response are properly handled -- whether the chunking occurs + * in the kernel or in the (probably pkt-line) layer. + */ +#define BIG_ROWS (10000) +static int app__big_command(ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + struct strbuf buf = STRBUF_INIT; + int row; + int ret; + + for (row = 0; row < BIG_ROWS; row++) + strbuf_addf(&buf, "big: %.75d\n", row); + + ret = reply_cb(reply_data, buf.buf, buf.len); + strbuf_release(&buf); + + return ret; +} + +/* + * Reply with a series of lines. This is to ensure that we can incrementally + * compute the response and chunk it to the client. + */ +#define CHUNK_ROWS (10000) +static int app__chunk_command(ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + struct strbuf buf = STRBUF_INIT; + int row; + int ret; + + for (row = 0; row < CHUNK_ROWS; row++) { + strbuf_setlen(&buf, 0); + strbuf_addf(&buf, "big: %.75d\n", row); + ret = reply_cb(reply_data, buf.buf, buf.len); + } + + strbuf_release(&buf); + + return ret; +} + +/* + * Slowly reply with a series of lines. This is to model an expensive to + * compute chunked response (which might happen if this callback is running + * in a thread and is fighting for a lock with other threads). + */ +#define SLOW_ROWS (1000) +#define SLOW_DELAY_MS (10) +static int app__slow_command(ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + struct strbuf buf = STRBUF_INIT; + int row; + int ret; + + for (row = 0; row < SLOW_ROWS; row++) { + strbuf_setlen(&buf, 0); + strbuf_addf(&buf, "big: %.75d\n", row); + ret = reply_cb(reply_data, buf.buf, buf.len); + sleep_millisec(SLOW_DELAY_MS); + } + + strbuf_release(&buf); + + return ret; +} + +/* + * The client sent a command followed by a (possibly very) large buffer. + */ +static int app__sendbytes_command(const char *received, + ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + struct strbuf buf_resp = STRBUF_INIT; + const char *p = "?"; + int len_ballast = 0; + int k; + int errs = 0; + int ret; + + if (skip_prefix(received, "sendbytes ", &p)) + len_ballast = strlen(p); + + /* + * Verify that the ballast is n copies of a single letter. + * And that the multi-threaded IO layer didn't cross the streams. + */ + for (k = 1; k < len_ballast; k++) + if (p[k] != p[0]) + errs++; + + if (errs) + strbuf_addf(&buf_resp, "errs:%d\n", errs); + else + strbuf_addf(&buf_resp, "rcvd:%c%08d\n", p[0], len_ballast); + + ret = reply_cb(reply_data, buf_resp.buf, buf_resp.len); + + strbuf_release(&buf_resp); + + return ret; +} + +/* + * An arbitrary fixed address to verify that the application instance + * data is handled properly. + */ +static int my_app_data = 42; + +static ipc_server_application_cb test_app_cb; + +/* + * This is the "application callback" that sits on top of the + * "ipc-server". It completely defines the set of commands supported + * by this application. + */ +static int test_app_cb(void *application_data, + const char *command, + ipc_server_reply_cb *reply_cb, + struct ipc_server_reply_data *reply_data) +{ + /* + * Verify that we received the application-data that we passed + * when we started the ipc-server. (We have several layers of + * callbacks calling callbacks and it's easy to get things mixed + * up (especially when some are "void*").) + */ + if (application_data != (void*)&my_app_data) + BUG("application_cb: application_data pointer wrong"); + + if (!strcmp(command, "quit")) { + /* + * The client sent a "quit" command. This is an async + * request for the server to shutdown. + * + * We DO NOT send the client a response message + * (because we have nothing to say and the other + * server threads have not yet stopped). + * + * Tell the ipc-server layer to start shutting down. + * This includes: stop listening for new connections + * on the socket/pipe and telling all worker threads + * to finish/drain their outgoing responses to other + * clients. + * + * This DOES NOT force an immediate sync shutdown. + */ + return SIMPLE_IPC_QUIT; + } + + if (!strcmp(command, "ping")) { + const char *answer = "pong"; + return reply_cb(reply_data, answer, strlen(answer)); + } + + if (!strcmp(command, "big")) + return app__big_command(reply_cb, reply_data); + + if (!strcmp(command, "chunk")) + return app__chunk_command(reply_cb, reply_data); + + if (!strcmp(command, "slow")) + return app__slow_command(reply_cb, reply_data); + + if (starts_with(command, "sendbytes ")) + return app__sendbytes_command(command, reply_cb, reply_data); + + return app__unhandled_command(command, reply_cb, reply_data); +} + +struct cl_args +{ + const char *subcommand; + const char *path; + const char *token; + + int nr_threads; + int max_wait_sec; + int bytecount; + int batchsize; + + char bytevalue; +}; + +static struct cl_args cl_args = { + .subcommand = NULL, + .path = "ipc-test", + .token = NULL, + + .nr_threads = 5, + .max_wait_sec = 60, + .bytecount = 1024, + .batchsize = 10, + + .bytevalue = 'x', +}; + +/* + * This process will run as a simple-ipc server and listen for IPC commands + * from client processes. + */ +static int daemon__run_server(void) +{ + int ret; + + struct ipc_server_opts opts = { + .nr_threads = cl_args.nr_threads, + }; + + /* + * Synchronously run the ipc-server. We don't need any application + * instance data, so pass an arbitrary pointer (that we'll later + * verify made the round trip). + */ + ret = ipc_server_run(cl_args.path, &opts, test_app_cb, (void*)&my_app_data); + if (ret == -2) + error(_("socket/pipe already in use: '%s'"), cl_args.path); + else if (ret == -1) + error_errno(_("could not start server on: '%s'"), cl_args.path); + + return ret; +} + +#ifndef GIT_WINDOWS_NATIVE +/* + * This is adapted from `daemonize()`. Use `fork()` to directly create and + * run the daemon in a child process. + */ +static int spawn_server(pid_t *pid) +{ + struct ipc_server_opts opts = { + .nr_threads = cl_args.nr_threads, + }; + + *pid = fork(); + + switch (*pid) { + case 0: + if (setsid() == -1) + error_errno(_("setsid failed")); + close(0); + close(1); + close(2); + sanitize_stdfds(); + + return ipc_server_run(cl_args.path, &opts, test_app_cb, + (void*)&my_app_data); + + case -1: + return error_errno(_("could not spawn daemon in the background")); + + default: + return 0; + } +} +#else +/* + * Conceptually like `daemonize()` but different because Windows does not + * have `fork(2)`. Spawn a normal Windows child process but without the + * limitations of `start_command()` and `finish_command()`. + */ +static int spawn_server(pid_t *pid) +{ + char test_tool_exe[MAX_PATH]; + struct strvec args = STRVEC_INIT; + int in, out; + + GetModuleFileNameA(NULL, test_tool_exe, MAX_PATH); + + in = open("/dev/null", O_RDONLY); + out = open("/dev/null", O_WRONLY); + + strvec_push(&args, test_tool_exe); + strvec_push(&args, "simple-ipc"); + strvec_push(&args, "run-daemon"); + strvec_pushf(&args, "--name=%s", cl_args.path); + strvec_pushf(&args, "--threads=%d", cl_args.nr_threads); + + *pid = mingw_spawnvpe(args.v[0], args.v, NULL, NULL, in, out, out); + close(in); + close(out); + + strvec_clear(&args); + + if (*pid < 0) + return error(_("could not spawn daemon in the background")); + + return 0; +} +#endif + +/* + * This is adapted from `wait_or_whine()`. Watch the child process and + * let it get started and begin listening for requests on the socket + * before reporting our success. + */ +static int wait_for_server_startup(pid_t pid_child) +{ + int status; + pid_t pid_seen; + enum ipc_active_state s; + time_t time_limit, now; + + time(&time_limit); + time_limit += cl_args.max_wait_sec; + + for (;;) { + pid_seen = waitpid(pid_child, &status, WNOHANG); + + if (pid_seen == -1) + return error_errno(_("waitpid failed")); + + else if (pid_seen == 0) { + /* + * The child is still running (this should be + * the normal case). Try to connect to it on + * the socket and see if it is ready for + * business. + * + * If there is another daemon already running, + * our child will fail to start (possibly + * after a timeout on the lock), but we don't + * care (who responds) if the socket is live. + */ + s = ipc_get_active_state(cl_args.path); + if (s == IPC_STATE__LISTENING) + return 0; + + time(&now); + if (now > time_limit) + return error(_("daemon not online yet")); + + continue; + } + + else if (pid_seen == pid_child) { + /* + * The new child daemon process shutdown while + * it was starting up, so it is not listening + * on the socket. + * + * Try to ping the socket in the odd chance + * that another daemon started (or was already + * running) while our child was starting. + * + * Again, we don't care who services the socket. + */ + s = ipc_get_active_state(cl_args.path); + if (s == IPC_STATE__LISTENING) + return 0; + + /* + * We don't care about the WEXITSTATUS() nor + * any of the WIF*(status) values because + * `cmd__simple_ipc()` does the `!!result` + * trick on all function return values. + * + * So it is sufficient to just report the + * early shutdown as an error. + */ + return error(_("daemon failed to start")); + } + + else + return error(_("waitpid is confused")); + } +} + +/* + * This process will start a simple-ipc server in a background process and + * wait for it to become ready. This is like `daemonize()` but gives us + * more control and better error reporting (and makes it easier to write + * unit tests). + */ +static int daemon__start_server(void) +{ + pid_t pid_child; + int ret; + + /* + * Run the actual daemon in a background process. + */ + ret = spawn_server(&pid_child); + if (pid_child <= 0) + return ret; + + /* + * Let the parent wait for the child process to get started + * and begin listening for requests on the socket. + */ + ret = wait_for_server_startup(pid_child); + + return ret; +} + +/* + * This process will run a quick probe to see if a simple-ipc server + * is active on this path. + * + * Returns 0 if the server is alive. + */ +static int client__probe_server(void) +{ + enum ipc_active_state s; + + s = ipc_get_active_state(cl_args.path); + switch (s) { + case IPC_STATE__LISTENING: + return 0; + + case IPC_STATE__NOT_LISTENING: + return error("no server listening at '%s'", cl_args.path); + + case IPC_STATE__PATH_NOT_FOUND: + return error("path not found '%s'", cl_args.path); + + case IPC_STATE__INVALID_PATH: + return error("invalid pipe/socket name '%s'", cl_args.path); + + case IPC_STATE__OTHER_ERROR: + default: + return error("other error for '%s'", cl_args.path); + } +} + +/* + * Send an IPC command token to an already-running server daemon and + * print the response. + * + * This is a simple 1 word command/token that `test_app_cb()` (in the + * daemon process) will understand. + */ +static int client__send_ipc(void) +{ + const char *command = "(no-command)"; + struct strbuf buf = STRBUF_INIT; + struct ipc_client_connect_options options + = IPC_CLIENT_CONNECT_OPTIONS_INIT; + + if (cl_args.token && *cl_args.token) + command = cl_args.token; + + options.wait_if_busy = 1; + options.wait_if_not_found = 0; + + if (!ipc_client_send_command(cl_args.path, &options, command, &buf)) { + if (buf.len) { + printf("%s\n", buf.buf); + fflush(stdout); + } + strbuf_release(&buf); + + return 0; + } + + return error("failed to send '%s' to '%s'", command, cl_args.path); +} + +/* + * Send an IPC command to an already-running server and ask it to + * shutdown. "send quit" is an async request and queues a shutdown + * event in the server, so we spin and wait here for it to actually + * shutdown to make the unit tests a little easier to write. + */ +static int client__stop_server(void) +{ + int ret; + time_t time_limit, now; + enum ipc_active_state s; + + time(&time_limit); + time_limit += cl_args.max_wait_sec; + + cl_args.token = "quit"; + + ret = client__send_ipc(); + if (ret) + return ret; + + for (;;) { + sleep_millisec(100); + + s = ipc_get_active_state(cl_args.path); + + if (s != IPC_STATE__LISTENING) { + /* + * The socket/pipe is gone and/or has stopped + * responding. Lets assume that the daemon + * process has exited too. + */ + return 0; + } + + time(&now); + if (now > time_limit) + return error(_("daemon has not shutdown yet")); + } +} + +/* + * Send an IPC command followed by ballast to confirm that a large + * message can be sent and that the kernel or pkt-line layers will + * properly chunk it and that the daemon receives the entire message. + */ +static int do_sendbytes(int bytecount, char byte, const char *path, + const struct ipc_client_connect_options *options) +{ + struct strbuf buf_send = STRBUF_INIT; + struct strbuf buf_resp = STRBUF_INIT; + + strbuf_addstr(&buf_send, "sendbytes "); + strbuf_addchars(&buf_send, byte, bytecount); + + if (!ipc_client_send_command(path, options, buf_send.buf, &buf_resp)) { + strbuf_rtrim(&buf_resp); + printf("sent:%c%08d %s\n", byte, bytecount, buf_resp.buf); + fflush(stdout); + strbuf_release(&buf_send); + strbuf_release(&buf_resp); + + return 0; + } + + return error("client failed to sendbytes(%d, '%c') to '%s'", + bytecount, byte, path); +} + +/* + * Send an IPC command with ballast to an already-running server daemon. + */ +static int client__sendbytes(void) +{ + struct ipc_client_connect_options options + = IPC_CLIENT_CONNECT_OPTIONS_INIT; + + options.wait_if_busy = 1; + options.wait_if_not_found = 0; + options.uds_disallow_chdir = 0; + + return do_sendbytes(cl_args.bytecount, cl_args.bytevalue, cl_args.path, + &options); +} + +struct multiple_thread_data { + pthread_t pthread_id; + struct multiple_thread_data *next; + const char *path; + int bytecount; + int batchsize; + int sum_errors; + int sum_good; + char letter; +}; + +static void *multiple_thread_proc(void *_multiple_thread_data) +{ + struct multiple_thread_data *d = _multiple_thread_data; + int k; + struct ipc_client_connect_options options + = IPC_CLIENT_CONNECT_OPTIONS_INIT; + + options.wait_if_busy = 1; + options.wait_if_not_found = 0; + /* + * A multi-threaded client should not be randomly calling chdir(). + * The test will pass without this restriction because the test is + * not otherwise accessing the filesystem, but it makes us honest. + */ + options.uds_disallow_chdir = 1; + + trace2_thread_start("multiple"); + + for (k = 0; k < d->batchsize; k++) { + if (do_sendbytes(d->bytecount + k, d->letter, d->path, &options)) + d->sum_errors++; + else + d->sum_good++; + } + + trace2_thread_exit(); + return NULL; +} + +/* + * Start a client-side thread pool. Each thread sends a series of + * IPC requests. Each request is on a new connection to the server. + */ +static int client__multiple(void) +{ + struct multiple_thread_data *list = NULL; + int k; + int sum_join_errors = 0; + int sum_thread_errors = 0; + int sum_good = 0; + + for (k = 0; k < cl_args.nr_threads; k++) { + struct multiple_thread_data *d = xcalloc(1, sizeof(*d)); + d->next = list; + d->path = cl_args.path; + d->bytecount = cl_args.bytecount + cl_args.batchsize*(k/26); + d->batchsize = cl_args.batchsize; + d->sum_errors = 0; + d->sum_good = 0; + d->letter = 'A' + (k % 26); + + if (pthread_create(&d->pthread_id, NULL, multiple_thread_proc, d)) { + warning("failed to create thread[%d] skipping remainder", k); + free(d); + break; + } + + list = d; + } + + while (list) { + struct multiple_thread_data *d = list; + + if (pthread_join(d->pthread_id, NULL)) + sum_join_errors++; + + sum_thread_errors += d->sum_errors; + sum_good += d->sum_good; + + list = d->next; + free(d); + } + + printf("client (good %d) (join %d), (errors %d)\n", + sum_good, sum_join_errors, sum_thread_errors); + + return (sum_join_errors + sum_thread_errors) ? 1 : 0; +} + +int cmd__simple_ipc(int argc, const char **argv) +{ + const char * const simple_ipc_usage[] = { + N_("test-helper simple-ipc is-active [<name>] [<options>]"), + N_("test-helper simple-ipc run-daemon [<name>] [<threads>]"), + N_("test-helper simple-ipc start-daemon [<name>] [<threads>] [<max-wait>]"), + N_("test-helper simple-ipc stop-daemon [<name>] [<max-wait>]"), + N_("test-helper simple-ipc send [<name>] [<token>]"), + N_("test-helper simple-ipc sendbytes [<name>] [<bytecount>] [<byte>]"), + N_("test-helper simple-ipc multiple [<name>] [<threads>] [<bytecount>] [<batchsize>]"), + NULL + }; + + const char *bytevalue = NULL; + + struct option options[] = { +#ifndef GIT_WINDOWS_NATIVE + OPT_STRING(0, "name", &cl_args.path, N_("name"), N_("name or pathname of unix domain socket")), +#else + OPT_STRING(0, "name", &cl_args.path, N_("name"), N_("named-pipe name")), +#endif + OPT_INTEGER(0, "threads", &cl_args.nr_threads, N_("number of threads in server thread pool")), + OPT_INTEGER(0, "max-wait", &cl_args.max_wait_sec, N_("seconds to wait for daemon to start or stop")), + + OPT_INTEGER(0, "bytecount", &cl_args.bytecount, N_("number of bytes")), + OPT_INTEGER(0, "batchsize", &cl_args.batchsize, N_("number of requests per thread")), + + OPT_STRING(0, "byte", &bytevalue, N_("byte"), N_("ballast character")), + OPT_STRING(0, "token", &cl_args.token, N_("token"), N_("command token to send to the server")), + + OPT_END() + }; + + if (argc < 2) + usage_with_options(simple_ipc_usage, options); + + if (argc == 2 && !strcmp(argv[1], "-h")) + usage_with_options(simple_ipc_usage, options); + + if (argc == 2 && !strcmp(argv[1], "SUPPORTS_SIMPLE_IPC")) + return 0; + + cl_args.subcommand = argv[1]; + + argc--; + argv++; + + argc = parse_options(argc, argv, NULL, options, simple_ipc_usage, 0); + + if (cl_args.nr_threads < 1) + cl_args.nr_threads = 1; + if (cl_args.max_wait_sec < 0) + cl_args.max_wait_sec = 0; + if (cl_args.bytecount < 1) + cl_args.bytecount = 1; + if (cl_args.batchsize < 1) + cl_args.batchsize = 1; + + if (bytevalue && *bytevalue) + cl_args.bytevalue = bytevalue[0]; + + /* + * Use '!!' on all dispatch functions to map from `error()` style + * (returns -1) style to `test_must_fail` style (expects 1). This + * makes shell error messages less confusing. + */ + + if (!strcmp(cl_args.subcommand, "is-active")) + return !!client__probe_server(); + + if (!strcmp(cl_args.subcommand, "run-daemon")) + return !!daemon__run_server(); + + if (!strcmp(cl_args.subcommand, "start-daemon")) + return !!daemon__start_server(); + + /* + * Client commands follow. Ensure a server is running before + * sending any data. This might be overkill, but then again + * this is a test harness. + */ + + if (!strcmp(cl_args.subcommand, "stop-daemon")) { + if (client__probe_server()) + return 1; + return !!client__stop_server(); + } + + if (!strcmp(cl_args.subcommand, "send")) { + if (client__probe_server()) + return 1; + return !!client__send_ipc(); + } + + if (!strcmp(cl_args.subcommand, "sendbytes")) { + if (client__probe_server()) + return 1; + return !!client__sendbytes(); + } + + if (!strcmp(cl_args.subcommand, "multiple")) { + if (client__probe_server()) + return 1; + return !!client__multiple(); + } + + die("Unhandled subcommand: '%s'", cl_args.subcommand); +} +#endif diff --git a/t/helper/test-submodule-nested-repo-config.c b/t/helper/test-submodule-nested-repo-config.c index bc97929bbc..e3f11ff5a7 100644 --- a/t/helper/test-submodule-nested-repo-config.c +++ b/t/helper/test-submodule-nested-repo-config.c @@ -1,7 +1,7 @@ #include "test-tool.h" #include "submodule-config.h" -static void die_usage(int argc, const char **argv, const char *msg) +static void die_usage(const char **argv, const char *msg) { fprintf(stderr, "%s\n", msg); fprintf(stderr, "Usage: %s <submodulepath> <config name>\n", argv[0]); @@ -14,13 +14,13 @@ int cmd__submodule_nested_repo_config(int argc, const char **argv) const struct submodule *sub; if (argc < 3) - die_usage(argc, argv, "Wrong number of arguments."); + die_usage(argv, "Wrong number of arguments."); setup_git_directory(); - sub = submodule_from_path(the_repository, &null_oid, argv[1]); + sub = submodule_from_path(the_repository, null_oid(), argv[1]); if (repo_submodule_init(&subrepo, the_repository, sub)) { - die_usage(argc, argv, "Submodule not found."); + die_usage(argv, "Submodule not found."); } /* Read the config of _child_ submodules. */ diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index 590b2efca7..490ac026c5 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -15,9 +15,11 @@ struct test_cmd { static struct test_cmd cmds[] = { { "advise", cmd__advise_if_enabled }, + { "bitmap", cmd__bitmap }, { "bloom", cmd__bloom }, { "chmtime", cmd__chmtime }, { "config", cmd__config }, + { "crontab", cmd__crontab }, { "ctype", cmd__ctype }, { "date", cmd__date }, { "delta", cmd__delta }, @@ -28,6 +30,7 @@ static struct test_cmd cmds[] = { { "dump-split-index", cmd__dump_split_index }, { "dump-untracked-cache", cmd__dump_untracked_cache }, { "example-decorate", cmd__example_decorate }, + { "fast-rebase", cmd__fast_rebase }, { "genrandom", cmd__genrandom }, { "genzeros", cmd__genzeros }, { "hashmap", cmd__hashmap }, @@ -40,12 +43,16 @@ static struct test_cmd cmds[] = { { "mktemp", cmd__mktemp }, { "oid-array", cmd__oid_array }, { "oidmap", cmd__oidmap }, + { "oidtree", cmd__oidtree }, { "online-cpus", cmd__online_cpus }, { "parse-options", cmd__parse_options }, { "parse-pathspec-file", cmd__parse_pathspec_file }, + { "partial-clone", cmd__partial_clone }, { "path-utils", cmd__path_utils }, + { "pcre2-config", cmd__pcre2_config }, { "pkt-line", cmd__pkt_line }, { "prio-queue", cmd__prio_queue }, + { "proc-receive", cmd__proc_receive}, { "progress", cmd__progress }, { "reach", cmd__reach }, { "read-cache", cmd__read_cache }, @@ -61,12 +68,14 @@ static struct test_cmd cmds[] = { { "sha1", cmd__sha1 }, { "sha256", cmd__sha256 }, { "sigchain", cmd__sigchain }, + { "simple-ipc", cmd__simple_ipc }, { "strcmp-offset", cmd__strcmp_offset }, { "string-list", cmd__string_list }, { "submodule-config", cmd__submodule_config }, { "submodule-nested-repo-config", cmd__submodule_nested_repo_config }, { "subprocess", cmd__subprocess }, { "trace2", cmd__trace2 }, + { "userdiff", cmd__userdiff }, { "urlmatch-normalization", cmd__urlmatch_normalization }, { "xml-encode", cmd__xml_encode }, { "wildmatch", cmd__wildmatch }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index ddc8e990e9..f8dc266721 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -5,9 +5,11 @@ #include "git-compat-util.h" int cmd__advise_if_enabled(int argc, const char **argv); +int cmd__bitmap(int argc, const char **argv); int cmd__bloom(int argc, const char **argv); int cmd__chmtime(int argc, const char **argv); int cmd__config(int argc, const char **argv); +int cmd__crontab(int argc, const char **argv); int cmd__ctype(int argc, const char **argv); int cmd__date(int argc, const char **argv); int cmd__delta(int argc, const char **argv); @@ -18,6 +20,7 @@ int cmd__dump_fsmonitor(int argc, const char **argv); int cmd__dump_split_index(int argc, const char **argv); int cmd__dump_untracked_cache(int argc, const char **argv); int cmd__example_decorate(int argc, const char **argv); +int cmd__fast_rebase(int argc, const char **argv); int cmd__genrandom(int argc, const char **argv); int cmd__genzeros(int argc, const char **argv); int cmd__hashmap(int argc, const char **argv); @@ -29,12 +32,16 @@ int cmd__match_trees(int argc, const char **argv); int cmd__mergesort(int argc, const char **argv); int cmd__mktemp(int argc, const char **argv); int cmd__oidmap(int argc, const char **argv); +int cmd__oidtree(int argc, const char **argv); int cmd__online_cpus(int argc, const char **argv); int cmd__parse_options(int argc, const char **argv); int cmd__parse_pathspec_file(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__pcre2_config(int argc, const char **argv); int cmd__pkt_line(int argc, const char **argv); int cmd__prio_queue(int argc, const char **argv); +int cmd__proc_receive(int argc, const char **argv); int cmd__progress(int argc, const char **argv); int cmd__reach(int argc, const char **argv); int cmd__read_cache(int argc, const char **argv); @@ -51,12 +58,14 @@ int cmd__sha1(int argc, const char **argv); int cmd__oid_array(int argc, const char **argv); int cmd__sha256(int argc, const char **argv); int cmd__sigchain(int argc, const char **argv); +int cmd__simple_ipc(int argc, const char **argv); int cmd__strcmp_offset(int argc, const char **argv); int cmd__string_list(int argc, const char **argv); int cmd__submodule_config(int argc, const char **argv); int cmd__submodule_nested_repo_config(int argc, const char **argv); int cmd__subprocess(int argc, const char **argv); int cmd__trace2(int argc, const char **argv); +int cmd__userdiff(int argc, const char **argv); int cmd__urlmatch_normalization(int argc, const char **argv); int cmd__xml_encode(int argc, const char **argv); int cmd__wildmatch(int argc, const char **argv); diff --git a/t/helper/test-trace2.c b/t/helper/test-trace2.c index 823f33ceff..f93633f895 100644 --- a/t/helper/test-trace2.c +++ b/t/helper/test-trace2.c @@ -198,6 +198,14 @@ static int ut_006data(int argc, const char **argv) return 0; } +static int ut_007bug(int argc, const char **argv) +{ + /* + * Exercise BUG() to ensure that the message is printed to trace2. + */ + BUG("the bug message"); +} + /* * Usage: * test-tool trace2 <ut_name_1> <ut_usage_1> @@ -214,6 +222,7 @@ static struct unit_test ut_table[] = { { ut_004child, "004child", "[<child_command_line>]" }, { ut_005exec, "005exec", "<git_command_args>" }, { ut_006data, "006data", "[<category> <key> <value>]+" }, + { ut_007bug, "007bug", "" }, }; /* clang-format on */ diff --git a/t/helper/test-userdiff.c b/t/helper/test-userdiff.c new file mode 100644 index 0000000000..f013f8a31e --- /dev/null +++ b/t/helper/test-userdiff.c @@ -0,0 +1,46 @@ +#include "test-tool.h" +#include "cache.h" +#include "userdiff.h" +#include "config.h" + +static int driver_cb(struct userdiff_driver *driver, + enum userdiff_driver_type type, void *priv) +{ + enum userdiff_driver_type *want_type = priv; + if (type & *want_type && driver->funcname.pattern) + puts(driver->name); + return 0; +} + +static int cmd__userdiff_config(const char *var, const char *value, void *cb) +{ + if (userdiff_config(var, value) < 0) + return -1; + return 0; +} + +int cmd__userdiff(int argc, const char **argv) +{ + enum userdiff_driver_type want = 0; + if (argc != 2) + return 1; + + if (!strcmp(argv[1], "list-drivers")) + want = (USERDIFF_DRIVER_TYPE_BUILTIN | + USERDIFF_DRIVER_TYPE_CUSTOM); + else if (!strcmp(argv[1], "list-builtin-drivers")) + want = USERDIFF_DRIVER_TYPE_BUILTIN; + else if (!strcmp(argv[1], "list-custom-drivers")) + want = USERDIFF_DRIVER_TYPE_CUSTOM; + else + return error("unknown argument %s", argv[1]); + + if (want & USERDIFF_DRIVER_TYPE_CUSTOM) { + setup_git_directory(); + git_config(cmd__userdiff_config, NULL); + } + + for_each_userdiff_driver(driver_cb, &want); + + return 0; +} diff --git a/t/lib-bitmap.sh b/t/lib-bitmap.sh new file mode 100644 index 0000000000..fe3f98be24 --- /dev/null +++ b/t/lib-bitmap.sh @@ -0,0 +1,26 @@ +# Compare a file containing rev-list bitmap traversal output to its non-bitmap +# counterpart. You can't just use test_cmp for this, because the two produce +# subtly different output: +# +# - regular output is in traversal order, whereas bitmap is split by type, +# with non-packed objects at the end +# +# - regular output has a space and the pathname appended to non-commit +# objects; bitmap output omits this +# +# This function normalizes and compares the two. The second file should +# always be the bitmap output. +test_bitmap_traversal () { + if test "$1" = "--no-confirm-bitmaps" + then + shift + elif cmp "$1" "$2" + then + echo >&2 "identical raw outputs; are you sure bitmaps were used?" + return 1 + fi && + cut -d' ' -f1 "$1" | sort >"$1.normalized" && + sort "$2" >"$2.normalized" && + test_cmp "$1.normalized" "$2.normalized" && + rm -f "$1.normalized" "$2.normalized" +} diff --git a/t/lib-bundle.sh b/t/lib-bundle.sh new file mode 100644 index 0000000000..cf7ed818b2 --- /dev/null +++ b/t/lib-bundle.sh @@ -0,0 +1,42 @@ +# Library of git-bundle related functions. + +# Display the pack data contained in the bundle file, bypassing the +# header that contains the signature, prerequisites and references. +convert_bundle_to_pack () { + while read x && test -n "$x" + do + :; + done + cat +} + +# Check count of objects in a bundle file. +# We can use "--thin" opiton to check thin pack, which must be fixed by +# command `git-index-pack --fix-thin --stdin`. +test_bundle_object_count () { + thin= + if test "$1" = "--thin" + then + thin=t + shift + fi + if test $# -ne 2 + then + echo >&2 "args should be: <bundle> <count>" + return 1 + fi + bundle=$1 + pack=$bundle.pack + convert_bundle_to_pack <"$bundle" >"$pack" && + if test -n "$thin" + then + mv "$pack" "$bundle.thin.pack" && + git index-pack --stdin --fix-thin "$pack" <"$bundle.thin.pack" + else + git index-pack "$pack" + fi || return 1 + count=$(git show-index <"${pack%pack}idx" | wc -l) && + test $2 = $count && return 0 + echo >&2 "error: object count for $bundle is $count, not $2" + return 1 +} diff --git a/t/lib-credential.sh b/t/lib-credential.sh index dea2cbef51..5ea8bc9f1d 100644 --- a/t/lib-credential.sh +++ b/t/lib-credential.sh @@ -20,7 +20,7 @@ check() { false fi && test_cmp expect-stdout stdout && - test_i18ncmp expect-stderr stderr + test_cmp expect-stderr stderr } read_chunk() { diff --git a/t/lib-cvs.sh b/t/lib-cvs.sh index 9b2bcfb1b0..32b3473379 100644 --- a/t/lib-cvs.sh +++ b/t/lib-cvs.sh @@ -36,7 +36,7 @@ setup_cvs_test_repository () { test_cvs_co () { # Usage: test_cvs_co BRANCH_NAME rm -rf module-cvs-"$1" - if [ "$1" = "master" ] + if [ "$1" = "main" ] then $CVS co -P -d module-cvs-"$1" -A module else diff --git a/t/diff-lib.sh b/t/lib-diff.sh index 2de880f7a5..2de880f7a5 100644 --- a/t/diff-lib.sh +++ b/t/lib-diff.sh diff --git a/t/diff-lib/COPYING b/t/lib-diff/COPYING index 6ff87c4664..6ff87c4664 100644 --- a/t/diff-lib/COPYING +++ b/t/lib-diff/COPYING diff --git a/t/diff-lib/README b/t/lib-diff/README index 548142c327..548142c327 100644 --- a/t/diff-lib/README +++ b/t/lib-diff/README diff --git a/t/lib-encoding.sh b/t/lib-encoding.sh new file mode 100644 index 0000000000..2dabc8c73e --- /dev/null +++ b/t/lib-encoding.sh @@ -0,0 +1,25 @@ +# Encoding helpers + +test_lazy_prereq NO_UTF16_BOM ' + test $(printf abc | iconv -f UTF-8 -t UTF-16 | wc -c) = 6 +' + +test_lazy_prereq NO_UTF32_BOM ' + test $(printf abc | iconv -f UTF-8 -t UTF-32 | wc -c) = 12 +' + +write_utf16 () { + if test_have_prereq NO_UTF16_BOM + then + printf '\376\377' + fi && + iconv -f UTF-8 -t UTF-16 +} + +write_utf32 () { + if test_have_prereq NO_UTF32_BOM + then + printf '\0\0\376\377' + fi && + iconv -f UTF-8 -t UTF-32 +} diff --git a/t/lib-gettext.sh b/t/lib-gettext.sh index 2139b427ca..cc6bb2cdea 100644 --- a/t/lib-gettext.sh +++ b/t/lib-gettext.sh @@ -17,7 +17,7 @@ else . "$GIT_BUILD_DIR"/git-sh-i18n fi -if test_have_prereq GETTEXT && test_have_prereq C_LOCALE_OUTPUT +if test_have_prereq GETTEXT then # is_IS.UTF-8 on Solaris and FreeBSD, is_IS.utf8 on Debian is_IS_locale=$(locale -a 2>/dev/null | diff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh index 547eb3c31a..2fde2353fd 100644 --- a/t/lib-git-svn.sh +++ b/t/lib-git-svn.sh @@ -121,12 +121,22 @@ start_svnserve () { --listen-host 127.0.0.1 & } -prepare_a_utf8_locale () { - a_utf8_locale=$(locale -a | sed -n '/\.[uU][tT][fF]-*8$/{ - p - q -}') - if test -n "$a_utf8_locale" +prepare_utf8_locale () { + if test -z "$GIT_TEST_UTF8_LOCALE" + then + case "${LC_ALL:-$LANG}" in + *.[Uu][Tt][Ff]8 | *.[Uu][Tt][Ff]-8) + GIT_TEST_UTF8_LOCALE="${LC_ALL:-$LANG}" + ;; + *) + GIT_TEST_UTF8_LOCALE=$(locale -a | sed -n '/\.[uU][tT][fF]-*8$/{ + p + q + }') + ;; + esac + fi + if test -n "$GIT_TEST_UTF8_LOCALE" then test_set_prereq UTF8 else diff --git a/t/gitweb-lib.sh b/t/lib-gitweb.sh index 1f32ca66ea..1f32ca66ea 100644 --- a/t/gitweb-lib.sh +++ b/t/lib-gitweb.sh diff --git a/t/lib-log-graph.sh b/t/lib-log-graph.sh index 1184cceef2..bf952ef920 100644 --- a/t/lib-log-graph.sh +++ b/t/lib-log-graph.sh @@ -12,13 +12,13 @@ sanitize_log_output () { lib_test_cmp_graph () { git log --graph "$@" >output && sed 's/ *$//' >output.sanitized <output && - test_i18ncmp expect output.sanitized + test_cmp expect output.sanitized } lib_test_cmp_short_graph () { git log --graph --pretty=short "$@" >output && sanitize_log_output >output.sanitized <output && - test_i18ncmp expect output.sanitized + test_cmp expect output.sanitized } lib_test_cmp_colored_graph () { diff --git a/t/lib-merge.sh b/t/lib-merge.sh new file mode 100644 index 0000000000..8734ebfc17 --- /dev/null +++ b/t/lib-merge.sh @@ -0,0 +1,13 @@ +# Helper functions used by merge tests. + +test_expect_merge_algorithm () { + status_for_recursive=$1 status_for_ort=$2 + shift 2 + + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_expect_${status_for_ort} "$@" + else + test_expect_${status_for_recursive} "$@" + fi +} diff --git a/t/lib-parallel-checkout.sh b/t/lib-parallel-checkout.sh new file mode 100644 index 0000000000..83b279a846 --- /dev/null +++ b/t/lib-parallel-checkout.sh @@ -0,0 +1,45 @@ +# Helpers for tests invoking parallel-checkout + +# Parallel checkout tests need full control of the number of workers +unset GIT_TEST_CHECKOUT_WORKERS + +set_checkout_config () { + if test $# -ne 2 + then + BUG "usage: set_checkout_config <workers> <threshold>" + fi && + + test_config_global checkout.workers $1 && + test_config_global checkout.thresholdForParallelism $2 +} + +# Run "${@:2}" and check that $1 checkout workers were used +test_checkout_workers () { + if test $# -lt 2 + then + BUG "too few arguments to test_checkout_workers" + fi && + + local expected_workers=$1 && + shift && + + local trace_file=trace-test-checkout-workers && + rm -f "$trace_file" && + GIT_TRACE2="$(pwd)/$trace_file" "$@" 2>&8 && + + local workers="$(grep "child_start\[..*\] git checkout--worker" "$trace_file" | wc -l)" && + test $workers -eq $expected_workers && + rm "$trace_file" +} 8>&2 2>&4 + +# Verify that both the working tree and the index were created correctly +verify_checkout () { + if test $# -ne 1 + then + BUG "usage: verify_checkout <repository path>" + fi && + + git -C "$1" diff-index --ignore-submodules=none --exit-code HEAD -- && + git -C "$1" status --porcelain >"$1".status && + test_must_be_empty "$1".status +} diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh index b72c051f47..dc75b83451 100644 --- a/t/lib-rebase.sh +++ b/t/lib-rebase.sh @@ -4,6 +4,7 @@ # # - override the commit message with $FAKE_COMMIT_MESSAGE # - amend the commit message with $FAKE_COMMIT_AMEND +# - copy the original commit message to a file with $FAKE_MESSAGE_COPY # - check that non-commit messages have a certain line count with $EXPECT_COUNT # - check the commit count in the commit message header with $EXPECT_HEADER_COUNT # - rewrite a rebase -i script as directed by $FAKE_LINES. @@ -14,10 +15,11 @@ # specified line. # # "<cmd> <lineno>" -- add a line with the specified command -# ("pick", "squash", "fixup", "edit", "reword" or "drop") and the -# SHA1 taken from the specified line. +# ("pick", "squash", "fixup"|"fixup_-C"|"fixup_-c", "edit", "reword" or "drop") +# and the SHA1 taken from the specified line. # -# "exec_cmd_with_args" -- add an "exec cmd with args" line. +# "_" -- add a space, like "fixup_-C" implies "fixup -C" and +# "exec_cmd_with_args" add an "exec cmd with args" line. # # "#" -- Add a comment line. # @@ -29,10 +31,10 @@ set_fake_editor () { */COMMIT_EDITMSG) test -z "$EXPECT_HEADER_COUNT" || test "$EXPECT_HEADER_COUNT" = "$(sed -n '1s/^# This is a combination of \(.*\) commits\./\1/p' < "$1")" || - test "# # GETTEXT POISON #" = "$(sed -n '1p' < "$1")" || exit test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1" test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1" + test -z "$FAKE_MESSAGE_COPY" || cat "$1" >"$FAKE_MESSAGE_COPY" exit ;; esac @@ -51,6 +53,8 @@ set_fake_editor () { action="$line";; exec_*|x_*|break|b) echo "$line" | sed 's/_/ /g' >> "$1";; + merge_*|fixup_*) + action=$(echo "$line" | sed 's/_/ /g');; "#") echo '# comment' >> "$1";; ">") diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh index 87a759149f..f7c7df0ca4 100644 --- a/t/lib-submodule-update.sh +++ b/t/lib-submodule-update.sh @@ -63,6 +63,7 @@ create_lib_submodule_repo () { git init submodule_update_repo && ( cd submodule_update_repo && + branch=$(git symbolic-ref --short HEAD) && echo "expect" >>.gitignore && echo "actual" >>.gitignore && echo "x" >file1 && @@ -144,7 +145,7 @@ create_lib_submodule_repo () { git checkout -b valid_sub1 && git revert HEAD && - git checkout master + git checkout "$branch" ) } @@ -316,14 +317,7 @@ test_submodule_switch_common () { command="$1" ######################### Appearing submodule ######################### # Switching to a commit letting a submodule appear creates empty dir ... - if test "$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES" = 1 - then - # Restoring stash fails to restore submodule index entry - RESULT="failure" - else - RESULT="success" - fi - test_expect_$RESULT "$command: added submodule creates empty directory" ' + test_expect_success "$command: added submodule creates empty directory" ' prolog && reset_work_tree_to no_submodule && ( @@ -337,6 +331,13 @@ test_submodule_switch_common () { ) ' # ... and doesn't care if it already exists. + if test "$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES" = 1 + then + # Restoring stash fails to restore submodule index entry + RESULT="failure" + else + RESULT="success" + fi test_expect_$RESULT "$command: added submodule leaves existing empty directory alone" ' prolog && reset_work_tree_to no_submodule && diff --git a/t/oid-info/README b/t/oid-info/README index 27f843fc00..ca56a74b1e 100644 --- a/t/oid-info/README +++ b/t/oid-info/README @@ -5,7 +5,7 @@ starting with `#` are ignored. The key and value are separated by whitespace (specifically, those whitespace in the default `$IFS`). The key consists only of shell identifier characters, and the value consists of a hash algorithm, colon, and value. The hash algorithm also consists only of shell identifier -characters; it should match the value in sha1-file.c. +characters; it should match the value in object-file.c. For example, the following lines map the key "rawsz" to "20" if SHA-1 is in use and to "32" if SHA-256 is in use: diff --git a/t/perf/.gitignore b/t/perf/.gitignore index 982eb8e3a9..72f5d0d314 100644 --- a/t/perf/.gitignore +++ b/t/perf/.gitignore @@ -1,3 +1,4 @@ /build/ /test-results/ +/test-trace/ /trash directory*/ diff --git a/t/perf/Makefile b/t/perf/Makefile index 8c47155a7c..2465770a78 100644 --- a/t/perf/Makefile +++ b/t/perf/Makefile @@ -1,15 +1,18 @@ -include ../../config.mak export GIT_TEST_OPTIONS -all: perf +all: test-lint perf perf: pre-clean ./run pre-clean: - rm -rf test-results + rm -rf test-results test-trace clean: - rm -rf build "trash directory".* test-results + rm -rf build "trash directory".* test-results test-trace + +test-lint: + $(MAKE) -C .. test-lint .PHONY: all perf pre-clean clean diff --git a/t/perf/README b/t/perf/README index bd649afa97..fb9127a66f 100644 --- a/t/perf/README +++ b/t/perf/README @@ -28,6 +28,8 @@ the tests on the current git repository. 7810.3: grep --cached, cheap regex 3.07(3.02+0.25) 7810.4: grep --cached, expensive regex 9.39(30.57+0.24) +Output format is in seconds "Elapsed(User + System)" + You can compare multiple repositories and even git revisions with the 'run' script: diff --git a/t/perf/p1400-update-ref.sh b/t/perf/p1400-update-ref.sh index ce5ac3ed85..dda8a74866 100755 --- a/t/perf/p1400-update-ref.sh +++ b/t/perf/p1400-update-ref.sh @@ -7,13 +7,14 @@ test_description="Tests performance of update-ref" test_perf_fresh_repo test_expect_success "setup" ' - git init --bare target-repo.git && test_commit PRE && test_commit POST && - printf "create refs/heads/%d PRE\n" $(test_seq 1000) >create && - printf "update refs/heads/%d POST PRE\n" $(test_seq 1000) >update && - printf "delete refs/heads/%d POST\n" $(test_seq 1000) >delete && - git update-ref --stdin <create + for i in $(test_seq 5000) + do + printf "start\ncreate refs/heads/%d PRE\ncommit\n" $i && + printf "start\nupdate refs/heads/%d POST PRE\ncommit\n" $i && + printf "start\ndelete refs/heads/%d POST\ncommit\n" $i + done >instructions ' test_perf "update-ref" ' @@ -26,14 +27,7 @@ test_perf "update-ref" ' ' test_perf "update-ref --stdin" ' - git update-ref --stdin <update && - git update-ref --stdin <delete && - git update-ref --stdin <create -' - -test_perf "nonatomic push" ' - git push ./target-repo.git $(test_seq 1000) && - git push --delete ./target-repo.git $(test_seq 1000) + git update-ref --stdin <instructions >/dev/null ' test_done diff --git a/t/perf/p2000-sparse-operations.sh b/t/perf/p2000-sparse-operations.sh new file mode 100755 index 0000000000..94513c9774 --- /dev/null +++ b/t/perf/p2000-sparse-operations.sh @@ -0,0 +1,101 @@ +#!/bin/sh + +test_description="test performance of Git operations using the index" + +. ./perf-lib.sh + +test_perf_default_repo + +SPARSE_CONE=f2/f4/f1 + +test_expect_success 'setup repo and indexes' ' + git reset --hard HEAD && + + # Remove submodules from the example repo, because our + # duplication of the entire repo creates an unlikely data shape. + if git config --file .gitmodules --get-regexp "submodule.*.path" >modules + then + git rm $(awk "{print \$2}" modules) && + git commit -m "remove submodules" || return 1 + fi && + + echo bogus >a && + cp a b && + git add a b && + git commit -m "level 0" && + BLOB=$(git rev-parse HEAD:a) && + OLD_COMMIT=$(git rev-parse HEAD) && + OLD_TREE=$(git rev-parse HEAD^{tree}) && + + for i in $(test_seq 1 4) + do + cat >in <<-EOF && + 100755 blob $BLOB a + 040000 tree $OLD_TREE f1 + 040000 tree $OLD_TREE f2 + 040000 tree $OLD_TREE f3 + 040000 tree $OLD_TREE f4 + EOF + NEW_TREE=$(git mktree <in) && + NEW_COMMIT=$(git commit-tree $NEW_TREE -p $OLD_COMMIT -m "level $i") && + OLD_TREE=$NEW_TREE && + OLD_COMMIT=$NEW_COMMIT || return 1 + done && + + git sparse-checkout init --cone && + git branch -f wide $OLD_COMMIT && + git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-index-v3 && + ( + cd full-index-v3 && + git sparse-checkout init --cone && + git sparse-checkout set $SPARSE_CONE && + git config index.version 3 && + git update-index --index-version=3 + ) && + git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . full-index-v4 && + ( + cd full-index-v4 && + git sparse-checkout init --cone && + git sparse-checkout set $SPARSE_CONE && + git config index.version 4 && + git update-index --index-version=4 + ) && + git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-index-v3 && + ( + cd sparse-index-v3 && + git sparse-checkout init --cone --sparse-index && + git sparse-checkout set $SPARSE_CONE && + git config index.version 3 && + git update-index --index-version=3 + ) && + git -c core.sparseCheckoutCone=true clone --branch=wide --sparse . sparse-index-v4 && + ( + cd sparse-index-v4 && + git sparse-checkout init --cone --sparse-index && + git sparse-checkout set $SPARSE_CONE && + git config index.version 4 && + git update-index --index-version=4 + ) +' + +test_perf_on_all () { + command="$@" + for repo in full-index-v3 full-index-v4 \ + sparse-index-v3 sparse-index-v4 + do + test_perf "$command ($repo)" " + ( + cd $repo && + echo >>$SPARSE_CONE/a && + $command + ) + " + done +} + +test_perf_on_all git status +test_perf_on_all git add -A +test_perf_on_all git add . +test_perf_on_all git commit -a -m A + +test_done diff --git a/t/perf/p3400-rebase.sh b/t/perf/p3400-rebase.sh index d202aaed06..7a0bb29448 100755 --- a/t/perf/p3400-rebase.sh +++ b/t/perf/p3400-rebase.sh @@ -9,16 +9,16 @@ test_expect_success 'setup rebasing on top of a lot of changes' ' git checkout -f -B base && git checkout -B to-rebase && git checkout -B upstream && - for i in $(seq 100) + for i in $(test_seq 100) do # simulate huge diffs echo change$i >unrelated-file$i && - seq 1000 >>unrelated-file$i && + test_seq 1000 >>unrelated-file$i && git add unrelated-file$i && test_tick && git commit -m commit$i unrelated-file$i && echo change$i >unrelated-file$i && - seq 1000 | tac >>unrelated-file$i && + test_seq 1000 | tac >>unrelated-file$i && git add unrelated-file$i && test_tick && git commit -m commit$i-reverse unrelated-file$i || diff --git a/t/perf/p4205-log-pretty-formats.sh b/t/perf/p4205-log-pretty-formats.sh index 7c26f4f337..609fecd65d 100755 --- a/t/perf/p4205-log-pretty-formats.sh +++ b/t/perf/p4205-log-pretty-formats.sh @@ -6,7 +6,7 @@ test_description='Tests the performance of various pretty format placeholders' test_perf_default_repo -for format in %H %h %T %t %P %p %h-%h-%h +for format in %H %h %T %t %P %p %h-%h-%h %an-%ae-%s do test_perf "log with $format" " git log --format=\"$format\" >/dev/null diff --git a/t/perf/p4209-pickaxe.sh b/t/perf/p4209-pickaxe.sh new file mode 100755 index 0000000000..f585a4465a --- /dev/null +++ b/t/perf/p4209-pickaxe.sh @@ -0,0 +1,70 @@ +#!/bin/sh + +test_description="Test pickaxe performance" + +. ./perf-lib.sh + +test_perf_default_repo + +# Not --max-count, as that's the number of matching commit, so it's +# unbounded. We want to limit our revision walk here. +from_rev_desc= +from_rev= +max_count=1000 +if test_have_prereq EXPENSIVE +then + max_count=10000 +fi +from_rev=" $(git rev-list HEAD | head -n $max_count | tail -n 1).." +from_rev_desc=" <limit-rev>.." + +for icase in \ + '' \ + '-i ' +do + # -S (no regex) + for pattern in \ + 'int main' \ + 'æ' + do + for opts in \ + '-S' + do + test_perf "git log $icase$opts'$pattern'$from_rev_desc" " + git log --pretty=format:%H $icase$opts'$pattern'$from_rev + " + done + done + + # -S (regex) + for pattern in \ + '(int|void|null)' \ + 'if *\([^ ]+ & ' \ + '[à áâãäåæñøùúûüýþ]' + do + for opts in \ + '--pickaxe-regex -S' + do + test_perf "git log $icase$opts'$pattern'$from_rev_desc" " + git log --pretty=format:%H $icase$opts'$pattern'$from_rev + " + done + done + + # -G + for pattern in \ + '(int|void|null)' \ + 'if *\([^ ]+ & ' \ + '[à áâãäåæñøùúûüýþ]' + do + for opts in \ + '-G' + do + test_perf "git log $icase$opts'$pattern'$from_rev_desc" " + git log --pretty=format:%H $icase$opts'$pattern'$from_rev + " + done + done +done + +test_done diff --git a/t/perf/p5303-many-packs.sh b/t/perf/p5303-many-packs.sh index 7ee791669a..35c0cbdf49 100755 --- a/t/perf/p5303-many-packs.sh +++ b/t/perf/p5303-many-packs.sh @@ -21,14 +21,25 @@ repack_into_n () { mkdir staging && git rev-list --first-parent HEAD | - sed -n '1~5p' | - head -n "$1" | - perl -e 'print reverse <>' \ - >pushes + perl -e ' + my $n = shift; + while (<>) { + last unless @commits < $n; + push @commits, $_ if $. % 5 == 1; + } + print reverse @commits; + ' "$1" >pushes && # create base packfile - head -n 1 pushes | - git pack-objects --delta-base-offset --revs staging/pack + base_pack=$( + head -n 1 pushes | + git pack-objects --delta-base-offset --revs staging/pack + ) && + test_export base_pack && + + # create an empty packfile + empty_pack=$(git pack-objects staging/pack </dev/null) && + test_export empty_pack && # and then incrementals between each pair of commits last= && @@ -45,6 +56,12 @@ repack_into_n () { last=$rev done <pushes && + ( + find staging -type f -name 'pack-*.pack' | + xargs -n 1 basename | grep -v "$base_pack" && + printf "^pack-%s.pack\n" $base_pack + ) >stdin.packs + # and install the whole thing rm -f .git/objects/pack/* && mv staging/* .git/objects/pack/ @@ -73,6 +90,10 @@ do git rev-list --objects --all >/dev/null ' + test_perf "abbrev-commit ($nr_packs)" ' + git rev-list --abbrev-commit HEAD >/dev/null + ' + # This simulates the interesting part of the repack, which is the # actual pack generation, without smudging the on-disk setup # between trials. @@ -83,6 +104,23 @@ do --reflog --indexed-objects --delta-base-offset \ --stdout </dev/null >/dev/null ' + + test_perf "repack with kept ($nr_packs)" ' + git pack-objects --keep-true-parents \ + --keep-pack=pack-$empty_pack.pack \ + --honor-pack-keep --non-empty --all \ + --reflog --indexed-objects --delta-base-offset \ + --stdout </dev/null >/dev/null + ' + + test_perf "repack with --stdin-packs ($nr_packs)" ' + git pack-objects \ + --keep-true-parents \ + --stdin-packs \ + --non-empty \ + --delta-base-offset \ + --stdout <stdin.packs >/dev/null + ' done # Measure pack loading with 10,000 packs. diff --git a/t/perf/p5310-pack-bitmaps.sh b/t/perf/p5310-pack-bitmaps.sh index b3e725f031..452be01056 100755 --- a/t/perf/p5310-pack-bitmaps.sh +++ b/t/perf/p5310-pack-bitmaps.sh @@ -15,6 +15,12 @@ test_expect_success 'setup bitmap config' ' git config pack.writebitmaps true ' +# we need to create the tag up front such that it is covered by the repack and +# thus by generated bitmaps. +test_expect_success 'create tags' ' + git tag --message="tag pointing to HEAD" perf-tag HEAD +' + test_perf 'repack to disk' ' git repack -ad ' @@ -43,6 +49,14 @@ test_perf 'rev-list (objects)' ' git rev-list --all --use-bitmap-index --objects >/dev/null ' +test_perf 'rev-list with tag negated via --not --all (objects)' ' + git rev-list perf-tag --not --all --use-bitmap-index --objects >/dev/null +' + +test_perf 'rev-list with negative tag (objects)' ' + git rev-list HEAD --not perf-tag --use-bitmap-index --objects >/dev/null +' + test_perf 'rev-list count with blob:none' ' git rev-list --use-bitmap-index --count --objects --all \ --filter=blob:none >/dev/null diff --git a/t/perf/p5600-partial-clone.sh b/t/perf/p5600-partial-clone.sh index 3e04bd2ae1..a965f2c4d6 100755 --- a/t/perf/p5600-partial-clone.sh +++ b/t/perf/p5600-partial-clone.sh @@ -23,4 +23,20 @@ test_perf 'checkout of result' ' git -C worktree checkout -f ' +test_perf 'fsck' ' + git -C bare.git fsck +' + +test_perf 'count commits' ' + git -C bare.git rev-list --all --count +' + +test_perf 'count non-promisor commits' ' + git -C bare.git rev-list --all --count --exclude-promisor-objects +' + +test_perf 'gc' ' + git -C bare.git gc +' + test_done diff --git a/t/perf/p7519-fsmonitor.sh b/t/perf/p7519-fsmonitor.sh index def7ecdbc7..5eb5044a10 100755 --- a/t/perf/p7519-fsmonitor.sh +++ b/t/perf/p7519-fsmonitor.sh @@ -22,7 +22,9 @@ test_description="Test core.fsmonitor" # # GIT_PERF_7519_UNTRACKED_CACHE: used to configure core.untrackedCache # GIT_PERF_7519_SPLIT_INDEX: used to configure core.splitIndex -# GIT_PERF_7519_FSMONITOR: used to configure core.fsMonitor +# GIT_PERF_7519_FSMONITOR: used to configure core.fsMonitor. May be an +# absolute path to an integration. May be a space delimited list of +# absolute paths to integrations. # # The big win for using fsmonitor is the elimination of the need to scan the # working directory looking for changed and untracked files. If the file @@ -30,6 +32,8 @@ test_description="Test core.fsmonitor" # # GIT_PERF_7519_DROP_CACHE: if set, the OS caches are dropped between tests # +# GIT_PERF_7519_TRACE: if set, enable trace logging during the test. +# Trace logs will be grouped by fsmonitor provider. test_perf_large_repo test_checkout_worktree @@ -68,7 +72,33 @@ then fi fi -test_expect_success "setup for fsmonitor" ' +trace_start() { + if test -n "$GIT_PERF_7519_TRACE" + then + name="$1" + TEST_TRACE_DIR="$TEST_OUTPUT_DIRECTORY/test-trace/p7519/" + echo "Writing trace logging to $TEST_TRACE_DIR" + + mkdir -p "$TEST_TRACE_DIR" + + # Start Trace2 logging and any other GIT_TRACE_* logs that you + # want for this named test case. + + GIT_TRACE2_PERF="$TEST_TRACE_DIR/$name.trace2perf" + export GIT_TRACE2_PERF + + >"$GIT_TRACE2_PERF" + fi +} + +trace_stop() { + if test -n "$GIT_PERF_7519_TRACE" + then + unset GIT_TRACE2_PERF + fi +} + +test_expect_success "one time repo setup" ' # set untrackedCache depending on the environment if test -n "$GIT_PERF_7519_UNTRACKED_CACHE" then @@ -88,24 +118,36 @@ test_expect_success "setup for fsmonitor" ' git config core.splitIndex "$GIT_PERF_7519_SPLIT_INDEX" fi && + mkdir 1_file 10_files 100_files 1000_files 10000_files && + for i in $(test_seq 1 10); do touch 10_files/$i; done && + for i in $(test_seq 1 100); do touch 100_files/$i; done && + for i in $(test_seq 1 1000); do touch 1000_files/$i; done && + for i in $(test_seq 1 10000); do touch 10000_files/$i; done && + git add 1_file 10_files 100_files 1000_files 10000_files && + git commit -qm "Add files" && + + # If Watchman exists, watch the work tree and attempt a query. + if test_have_prereq WATCHMAN; then + watchman watch "$GIT_WORK_TREE" && + watchman watch-list | grep -q -F "p7519-fsmonitor" + fi +' + +setup_for_fsmonitor() { # set INTEGRATION_SCRIPT depending on the environment - if test -n "$GIT_PERF_7519_FSMONITOR" + if test -n "$INTEGRATION_PATH" then - INTEGRATION_SCRIPT="$GIT_PERF_7519_FSMONITOR" + INTEGRATION_SCRIPT="$INTEGRATION_PATH" else # # Choose integration script based on existence of Watchman. - # If Watchman exists, watch the work tree and attempt a query. - # If everything succeeds, use Watchman integration script, - # else fall back to an empty integration script. + # Fall back to an empty integration script. # mkdir .git/hooks && if test_have_prereq WATCHMAN then INTEGRATION_SCRIPT=".git/hooks/fsmonitor-watchman" && - cp "$TEST_DIRECTORY/../templates/hooks--fsmonitor-watchman.sample" "$INTEGRATION_SCRIPT" && - watchman watch "$GIT_WORK_TREE" && - watchman watch-list | grep -q -F "$GIT_WORK_TREE" + cp "$TEST_DIRECTORY/../templates/hooks--fsmonitor-watchman.sample" "$INTEGRATION_SCRIPT" else INTEGRATION_SCRIPT=".git/hooks/fsmonitor-empty" && write_script "$INTEGRATION_SCRIPT"<<-\EOF @@ -114,62 +156,110 @@ test_expect_success "setup for fsmonitor" ' fi && git config core.fsmonitor "$INTEGRATION_SCRIPT" && - git update-index --fsmonitor -' + git update-index --fsmonitor 2>error && + if test_have_prereq WATCHMAN + then + test_must_be_empty error # ensure no silent error + else + grep "Empty last update token" error + fi +} -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi +test_perf_w_drop_caches () { + if test -n "$GIT_PERF_7519_DROP_CACHE"; then + test-tool drop-caches + fi -test_perf "status (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -' + test_perf "$@" +} -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi +test_fsmonitor_suite() { + if test -n "$INTEGRATION_SCRIPT"; then + DESC="fsmonitor=$(basename $INTEGRATION_SCRIPT)" + else + DESC="fsmonitor=disabled" + fi -test_perf "status -uno (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -uno -' + test_expect_success "test_initialization" ' + git reset --hard && + git status # Warm caches + ' -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi + test_perf_w_drop_caches "status ($DESC)" ' + git status + ' -test_perf "status -uall (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -uall -' + test_perf_w_drop_caches "status -uno ($DESC)" ' + git status -uno + ' -test_expect_success "setup without fsmonitor" ' - unset INTEGRATION_SCRIPT && - git config --unset core.fsmonitor && - git update-index --no-fsmonitor -' + test_perf_w_drop_caches "status -uall ($DESC)" ' + git status -uall + ' -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi + # Update the mtimes on upto 100k files to make status think + # that they are dirty. For simplicity, omit any files with + # LFs (i.e. anything that ls-files thinks it needs to dquote). + # Then fully backslash-quote the paths to capture any + # whitespace so that they pass thru xargs properly. + # + test_perf_w_drop_caches "status (dirty) ($DESC)" ' + git ls-files | \ + head -100000 | \ + grep -v \" | \ + sed '\''s/\(.\)/\\\1/g'\'' | \ + xargs test-tool chmtime -300 && + git status + ' -test_perf "status (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -' + test_perf_w_drop_caches "diff ($DESC)" ' + git diff + ' -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi + test_perf_w_drop_caches "diff HEAD ($DESC)" ' + git diff HEAD + ' -test_perf "status -uno (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -uno -' + test_perf_w_drop_caches "diff -- 0_files ($DESC)" ' + git diff -- 1_file + ' -if test -n "$GIT_PERF_7519_DROP_CACHE"; then - test-tool drop-caches -fi + test_perf_w_drop_caches "diff -- 10_files ($DESC)" ' + git diff -- 10_files + ' -test_perf "status -uall (fsmonitor=$INTEGRATION_SCRIPT)" ' - git status -uall -' + test_perf_w_drop_caches "diff -- 100_files ($DESC)" ' + git diff -- 100_files + ' + + test_perf_w_drop_caches "diff -- 1000_files ($DESC)" ' + git diff -- 1000_files + ' + + test_perf_w_drop_caches "diff -- 10000_files ($DESC)" ' + git diff -- 10000_files + ' + + test_perf_w_drop_caches "add ($DESC)" ' + git add --all + ' +} + +# +# Run a full set of perf tests using each Hook-based fsmonitor provider, +# such as Watchman. +# + +trace_start fsmonitor-watchman +if test -n "$GIT_PERF_7519_FSMONITOR"; then + for INTEGRATION_PATH in $GIT_PERF_7519_FSMONITOR; do + test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor' + test_fsmonitor_suite + done +else + test_expect_success "setup for fsmonitor" 'setup_for_fsmonitor' + test_fsmonitor_suite +fi if test_have_prereq WATCHMAN then @@ -179,5 +269,20 @@ then # preventing the removal of the trash directory watchman shutdown-server >/dev/null 2>&1 fi +trace_stop + +# +# Run a full set of perf tests with the fsmonitor feature disabled. +# + +trace_start fsmonitor-disabled +test_expect_success "setup without fsmonitor" ' + unset INTEGRATION_SCRIPT && + git config --unset core.fsmonitor && + git update-index --no-fsmonitor +' + +test_fsmonitor_suite +trace_stop test_done diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh index 821581a885..601d9f67dd 100644 --- a/t/perf/perf-lib.sh +++ b/t/perf/perf-lib.sh @@ -70,6 +70,19 @@ test_perf_do_repo_symlink_config_ () { test_have_prereq SYMLINKS || git config core.symlinks false } +test_perf_copy_repo_contents () { + for stuff in "$1"/* + do + case "$stuff" in + */objects|*/hooks|*/config|*/commondir|*/gitdir|*/worktrees) + ;; + *) + cp -R "$stuff" "$repo/.git/" || exit 1 + ;; + esac + done +} + test_perf_create_repo_from () { test "$#" = 2 || BUG "not 2 parameters to test-create-repo" @@ -77,20 +90,20 @@ test_perf_create_repo_from () { source="$2" source_git="$("$MODERN_GIT" -C "$source" rev-parse --git-dir)" objects_dir="$("$MODERN_GIT" -C "$source" rev-parse --git-path objects)" + common_dir="$("$MODERN_GIT" -C "$source" rev-parse --git-common-dir)" mkdir -p "$repo/.git" ( cd "$source" && { cp -Rl "$objects_dir" "$repo/.git/" 2>/dev/null || cp -R "$objects_dir" "$repo/.git/"; } && - for stuff in "$source_git"/*; do - case "$stuff" in - */objects|*/hooks|*/config|*/commondir) - ;; - *) - cp -R "$stuff" "$repo/.git/" || exit 1 - ;; - esac - done + + # common_dir must come first here, since we want source_git to + # take precedence and overwrite any overlapping files + test_perf_copy_repo_contents "$common_dir" + if test "$source_git" != "$common_dir" + then + test_perf_copy_repo_contents "$source_git" + fi ) && ( cd "$repo" && @@ -147,14 +160,16 @@ test_run_perf_ () { "$GTIME" -f "%E %U %S" -o test_time.$i "$SHELL" -c ' . '"$TEST_DIRECTORY"/test-lib-functions.sh' test_export () { - [ $# != 0 ] || return 0 - test_export_="$test_export_\\|$1" - shift - test_export "$@" + test_export_="$test_export_ $*" } '"$1"' ret=$? -set | sed -n "s'"/'/'\\\\''/g"';s/^\\($test_export_\\)/export '"'&'"'/p" >test_vars +needles= +for v in $test_export_ +do + needles="$needles;s/^$v=/export $v=/p" +done +set | sed -n "s'"/'/'\\\\''/g"'$needles" >test_vars exit $ret' >&3 2>&4 eval_ret=$? diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index 923281af93..2c6e34b947 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -84,10 +84,6 @@ _run_sub_test_lib_test_common () { passing metrics ' - # Tell the framework that we are self-testing to make sure - # it yields a stable result. - GIT_TEST_FRAMEWORK_SELFTEST=t && - # Point to the t/test-lib.sh, which isn't in ../ as usual . "\$TEST_DIRECTORY"/test-lib.sh EOF @@ -135,32 +131,32 @@ check_sub_test_lib_test_err () { ) } -test_expect_success 'pretend we have a fully passing test suite' " - run_sub_test_lib_test full-pass '3 passing tests' <<-\\EOF && +test_expect_success 'pretend we have a fully passing test suite' ' + run_sub_test_lib_test full-pass "3 passing tests" <<-\EOF && for i in 1 2 3 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test full-pass <<-\\EOF + check_sub_test_lib_test full-pass <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 - passing test #3 > # passed all 3 test(s) > 1..3 EOF -" +' -test_expect_success 'pretend we have a partially passing test suite' " +test_expect_success 'pretend we have a partially passing test suite' ' run_sub_test_lib_test_err \ - partial-pass '2/3 tests passing' <<-\\EOF && - test_expect_success 'passing test #1' 'true' - test_expect_success 'failing test #2' 'false' - test_expect_success 'passing test #3' 'true' + partial-pass "2/3 tests passing" <<-\EOF && + test_expect_success "passing test #1" "true" + test_expect_success "failing test #2" "false" + test_expect_success "passing test #3" "true" test_done EOF - check_sub_test_lib_test partial-pass <<-\\EOF + check_sub_test_lib_test partial-pass <<-\EOF > ok 1 - passing test #1 > not ok 2 - failing test #2 # false @@ -168,44 +164,44 @@ test_expect_success 'pretend we have a partially passing test suite' " > # failed 1 among 3 test(s) > 1..3 EOF -" +' -test_expect_success 'pretend we have a known breakage' " - run_sub_test_lib_test failing-todo 'A failing TODO test' <<-\\EOF && - test_expect_success 'passing test' 'true' - test_expect_failure 'pretend we have a known breakage' 'false' +test_expect_success 'pretend we have a known breakage' ' + run_sub_test_lib_test failing-todo "A failing TODO test" <<-\EOF && + test_expect_success "passing test" "true" + test_expect_failure "pretend we have a known breakage" "false" test_done EOF - check_sub_test_lib_test failing-todo <<-\\EOF + check_sub_test_lib_test failing-todo <<-\EOF > ok 1 - passing test > not ok 2 - pretend we have a known breakage # TODO known breakage > # still have 1 known breakage(s) > # passed all remaining 1 test(s) > 1..2 EOF -" +' -test_expect_success 'pretend we have fixed a known breakage' " - run_sub_test_lib_test passing-todo 'A passing TODO test' <<-\\EOF && - test_expect_failure 'pretend we have fixed a known breakage' 'true' +test_expect_success 'pretend we have fixed a known breakage' ' + run_sub_test_lib_test passing-todo "A passing TODO test" <<-\EOF && + test_expect_failure "pretend we have fixed a known breakage" "true" test_done EOF - check_sub_test_lib_test passing-todo <<-\\EOF + check_sub_test_lib_test passing-todo <<-\EOF > ok 1 - pretend we have fixed a known breakage # TODO known breakage vanished > # 1 known breakage(s) vanished; please update test(s) > 1..1 EOF -" +' -test_expect_success 'pretend we have fixed one of two known breakages (run in sub test-lib)' " +test_expect_success 'pretend we have fixed one of two known breakages (run in sub test-lib)' ' run_sub_test_lib_test partially-passing-todos \ - '2 TODO tests, one passing' <<-\\EOF && - test_expect_failure 'pretend we have a known breakage' 'false' - test_expect_success 'pretend we have a passing test' 'true' - test_expect_failure 'pretend we have fixed another known breakage' 'true' + "2 TODO tests, one passing" <<-\EOF && + test_expect_failure "pretend we have a known breakage" "false" + test_expect_success "pretend we have a passing test" "true" + test_expect_failure "pretend we have fixed another known breakage" "true" test_done EOF - check_sub_test_lib_test partially-passing-todos <<-\\EOF + check_sub_test_lib_test partially-passing-todos <<-\EOF > not ok 1 - pretend we have a known breakage # TODO known breakage > ok 2 - pretend we have a passing test > ok 3 - pretend we have fixed another known breakage # TODO known breakage vanished @@ -214,17 +210,17 @@ test_expect_success 'pretend we have fixed one of two known breakages (run in su > # passed all remaining 1 test(s) > 1..3 EOF -" +' -test_expect_success 'pretend we have a pass, fail, and known breakage' " +test_expect_success 'pretend we have a pass, fail, and known breakage' ' run_sub_test_lib_test_err \ - mixed-results1 'mixed results #1' <<-\\EOF && - test_expect_success 'passing test' 'true' - test_expect_success 'failing test' 'false' - test_expect_failure 'pretend we have a known breakage' 'false' + mixed-results1 "mixed results #1" <<-\EOF && + test_expect_success "passing test" "true" + test_expect_success "failing test" "false" + test_expect_failure "pretend we have a known breakage" "false" test_done EOF - check_sub_test_lib_test mixed-results1 <<-\\EOF + check_sub_test_lib_test mixed-results1 <<-\EOF > ok 1 - passing test > not ok 2 - failing test > # false @@ -233,24 +229,24 @@ test_expect_success 'pretend we have a pass, fail, and known breakage' " > # failed 1 among remaining 2 test(s) > 1..3 EOF -" +' -test_expect_success 'pretend we have a mix of all possible results' " +test_expect_success 'pretend we have a mix of all possible results' ' run_sub_test_lib_test_err \ - mixed-results2 'mixed results #2' <<-\\EOF && - test_expect_success 'passing test' 'true' - test_expect_success 'passing test' 'true' - test_expect_success 'passing test' 'true' - test_expect_success 'passing test' 'true' - test_expect_success 'failing test' 'false' - test_expect_success 'failing test' 'false' - test_expect_success 'failing test' 'false' - test_expect_failure 'pretend we have a known breakage' 'false' - test_expect_failure 'pretend we have a known breakage' 'false' - test_expect_failure 'pretend we have fixed a known breakage' 'true' + mixed-results2 "mixed results #2" <<-\EOF && + test_expect_success "passing test" "true" + test_expect_success "passing test" "true" + test_expect_success "passing test" "true" + test_expect_success "passing test" "true" + test_expect_success "failing test" "false" + test_expect_success "failing test" "false" + test_expect_success "failing test" "false" + test_expect_failure "pretend we have a known breakage" "false" + test_expect_failure "pretend we have a known breakage" "false" + test_expect_failure "pretend we have fixed a known breakage" "true" test_done EOF - check_sub_test_lib_test mixed-results2 <<-\\EOF + check_sub_test_lib_test mixed-results2 <<-\EOF > ok 1 - passing test > ok 2 - passing test > ok 3 - passing test @@ -269,9 +265,9 @@ test_expect_success 'pretend we have a mix of all possible results' " > # failed 3 among remaining 7 test(s) > 1..10 EOF -" +' -test_expect_success C_LOCALE_OUTPUT 'test --verbose' ' +test_expect_success 'test --verbose' ' run_sub_test_lib_test_err \ t1234-verbose "test verbose" --verbose <<-\EOF && test_expect_success "passing test" true @@ -321,18 +317,18 @@ test_expect_success 'test --verbose-only' ' EOF ' -test_expect_success 'GIT_SKIP_TESTS' " +test_expect_success 'GIT_SKIP_TESTS' ' ( - GIT_SKIP_TESTS='git.2' && export GIT_SKIP_TESTS && + GIT_SKIP_TESTS="git.2" && export GIT_SKIP_TESTS && run_sub_test_lib_test git-skip-tests-basic \ - 'GIT_SKIP_TESTS' <<-\\EOF && + "GIT_SKIP_TESTS" <<-\EOF && for i in 1 2 3 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test git-skip-tests-basic <<-\\EOF + check_sub_test_lib_test git-skip-tests-basic <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS) > ok 3 - passing test #3 @@ -340,20 +336,20 @@ test_expect_success 'GIT_SKIP_TESTS' " > 1..3 EOF ) -" +' -test_expect_success 'GIT_SKIP_TESTS several tests' " +test_expect_success 'GIT_SKIP_TESTS several tests' ' ( - GIT_SKIP_TESTS='git.2 git.5' && export GIT_SKIP_TESTS && + GIT_SKIP_TESTS="git.2 git.5" && export GIT_SKIP_TESTS && run_sub_test_lib_test git-skip-tests-several \ - 'GIT_SKIP_TESTS several tests' <<-\\EOF && + "GIT_SKIP_TESTS several tests" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test git-skip-tests-several <<-\\EOF + check_sub_test_lib_test git-skip-tests-several <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS) > ok 3 - passing test #3 @@ -364,20 +360,20 @@ test_expect_success 'GIT_SKIP_TESTS several tests' " > 1..6 EOF ) -" +' -test_expect_success 'GIT_SKIP_TESTS sh pattern' " +test_expect_success 'GIT_SKIP_TESTS sh pattern' ' ( - GIT_SKIP_TESTS='git.[2-5]' && export GIT_SKIP_TESTS && + GIT_SKIP_TESTS="git.[2-5]" && export GIT_SKIP_TESTS && run_sub_test_lib_test git-skip-tests-sh-pattern \ - 'GIT_SKIP_TESTS sh pattern' <<-\\EOF && + "GIT_SKIP_TESTS sh pattern" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test git-skip-tests-sh-pattern <<-\\EOF + check_sub_test_lib_test git-skip-tests-sh-pattern <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (GIT_SKIP_TESTS) > ok 3 # skip passing test #3 (GIT_SKIP_TESTS) @@ -388,37 +384,37 @@ test_expect_success 'GIT_SKIP_TESTS sh pattern' " > 1..6 EOF ) -" +' -test_expect_success 'GIT_SKIP_TESTS entire suite' " +test_expect_success 'GIT_SKIP_TESTS entire suite' ' ( - GIT_SKIP_TESTS='git' && export GIT_SKIP_TESTS && + GIT_SKIP_TESTS="git" && export GIT_SKIP_TESTS && run_sub_test_lib_test git-skip-tests-entire-suite \ - 'GIT_SKIP_TESTS entire suite' <<-\\EOF && + "GIT_SKIP_TESTS entire suite" <<-\EOF && for i in 1 2 3 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test git-skip-tests-entire-suite <<-\\EOF + check_sub_test_lib_test git-skip-tests-entire-suite <<-\EOF > 1..0 # SKIP skip all tests in git EOF ) -" +' -test_expect_success 'GIT_SKIP_TESTS does not skip unmatched suite' " +test_expect_success 'GIT_SKIP_TESTS does not skip unmatched suite' ' ( - GIT_SKIP_TESTS='notgit' && export GIT_SKIP_TESTS && + GIT_SKIP_TESTS="notgit" && export GIT_SKIP_TESTS && run_sub_test_lib_test git-skip-tests-unmatched-suite \ - 'GIT_SKIP_TESTS does not skip unmatched suite' <<-\\EOF && + "GIT_SKIP_TESTS does not skip unmatched suite" <<-\EOF && for i in 1 2 3 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test git-skip-tests-unmatched-suite <<-\\EOF + check_sub_test_lib_test git-skip-tests-unmatched-suite <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 - passing test #3 @@ -426,18 +422,18 @@ test_expect_success 'GIT_SKIP_TESTS does not skip unmatched suite' " > 1..3 EOF ) -" +' -test_expect_success '--run basic' " +test_expect_success '--run basic' ' run_sub_test_lib_test run-basic \ - '--run basic' --run='1 3 5' <<-\\EOF && + "--run basic" --run="1,3,5" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-basic <<-\\EOF + check_sub_test_lib_test run-basic <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (--run) > ok 3 - passing test #3 @@ -447,18 +443,18 @@ test_expect_success '--run basic' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with a range' " +test_expect_success '--run with a range' ' run_sub_test_lib_test run-range \ - '--run with a range' --run='1-3' <<-\\EOF && + "--run with a range" --run="1-3" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-range <<-\\EOF + check_sub_test_lib_test run-range <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 - passing test #3 @@ -468,18 +464,18 @@ test_expect_success '--run with a range' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with two ranges' " +test_expect_success '--run with two ranges' ' run_sub_test_lib_test run-two-ranges \ - '--run with two ranges' --run='1-2 5-6' <<-\\EOF && + "--run with two ranges" --run="1-2,5-6" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-two-ranges <<-\\EOF + check_sub_test_lib_test run-two-ranges <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -489,18 +485,18 @@ test_expect_success '--run with two ranges' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with a left open range' " +test_expect_success '--run with a left open range' ' run_sub_test_lib_test run-left-open-range \ - '--run with a left open range' --run='-3' <<-\\EOF && + "--run with a left open range" --run="-3" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-left-open-range <<-\\EOF + check_sub_test_lib_test run-left-open-range <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 - passing test #3 @@ -510,18 +506,18 @@ test_expect_success '--run with a left open range' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with a right open range' " +test_expect_success '--run with a right open range' ' run_sub_test_lib_test run-right-open-range \ - '--run with a right open range' --run='4-' <<-\\EOF && + "--run with a right open range" --run="4-" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-right-open-range <<-\\EOF + check_sub_test_lib_test run-right-open-range <<-\EOF > ok 1 # skip passing test #1 (--run) > ok 2 # skip passing test #2 (--run) > ok 3 # skip passing test #3 (--run) @@ -531,18 +527,18 @@ test_expect_success '--run with a right open range' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with basic negation' " +test_expect_success '--run with basic negation' ' run_sub_test_lib_test run-basic-neg \ - '--run with basic negation' --run='"'!3'"' <<-\\EOF && + "--run with basic negation" --run="!3" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-basic-neg <<-\\EOF + check_sub_test_lib_test run-basic-neg <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -552,18 +548,18 @@ test_expect_success '--run with basic negation' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run with two negations' " +test_expect_success '--run with two negations' ' run_sub_test_lib_test run-two-neg \ - '--run with two negations' --run='"'!3 !6'"' <<-\\EOF && + "--run with two negations" --run="!3,!6" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-two-neg <<-\\EOF + check_sub_test_lib_test run-two-neg <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -573,18 +569,18 @@ test_expect_success '--run with two negations' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run a range and negation' " +test_expect_success '--run a range and negation' ' run_sub_test_lib_test run-range-and-neg \ - '--run a range and negation' --run='"'-4 !2'"' <<-\\EOF && + "--run a range and negation" --run="-4,!2" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-range-and-neg <<-\\EOF + check_sub_test_lib_test run-range-and-neg <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (--run) > ok 3 - passing test #3 @@ -594,18 +590,18 @@ test_expect_success '--run a range and negation' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run range negation' " +test_expect_success '--run range negation' ' run_sub_test_lib_test run-range-neg \ - '--run range negation' --run='"'!1-3'"' <<-\\EOF && + "--run range negation" --run="!1-3" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-range-neg <<-\\EOF + check_sub_test_lib_test run-range-neg <<-\EOF > ok 1 # skip passing test #1 (--run) > ok 2 # skip passing test #2 (--run) > ok 3 # skip passing test #3 (--run) @@ -615,19 +611,19 @@ test_expect_success '--run range negation' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run include, exclude and include' " +test_expect_success '--run include, exclude and include' ' run_sub_test_lib_test run-inc-neg-inc \ - '--run include, exclude and include' \ - --run='"'1-5 !1-3 2'"' <<-\\EOF && + "--run include, exclude and include" \ + --run="1-5,!1-3,2" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-inc-neg-inc <<-\\EOF + check_sub_test_lib_test run-inc-neg-inc <<-\EOF > ok 1 # skip passing test #1 (--run) > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -637,19 +633,19 @@ test_expect_success '--run include, exclude and include' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run include, exclude and include, comma separated' " +test_expect_success '--run include, exclude and include, comma separated' ' run_sub_test_lib_test run-inc-neg-inc-comma \ - '--run include, exclude and include, comma separated' \ - --run=1-5,\!1-3,2 <<-\\EOF && + "--run include, exclude and include, comma separated" \ + --run=1-5,!1-3,2 <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-inc-neg-inc-comma <<-\\EOF + check_sub_test_lib_test run-inc-neg-inc-comma <<-\EOF > ok 1 # skip passing test #1 (--run) > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -659,19 +655,19 @@ test_expect_success '--run include, exclude and include, comma separated' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run exclude and include' " +test_expect_success '--run exclude and include' ' run_sub_test_lib_test run-neg-inc \ - '--run exclude and include' \ - --run='"'!3- 5'"' <<-\\EOF && + "--run exclude and include" \ + --run="!3-,5" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-neg-inc <<-\\EOF + check_sub_test_lib_test run-neg-inc <<-\EOF > ok 1 - passing test #1 > ok 2 - passing test #2 > ok 3 # skip passing test #3 (--run) @@ -681,19 +677,19 @@ test_expect_success '--run exclude and include' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run empty selectors' " +test_expect_success '--run empty selectors' ' run_sub_test_lib_test run-empty-sel \ - '--run empty selectors' \ - --run='1,,3,,,5' <<-\\EOF && + "--run empty selectors" \ + --run="1,,3,,,5" <<-\EOF && for i in 1 2 3 4 5 6 do - test_expect_success \"passing test #\$i\" 'true' + test_expect_success "passing test #$i" "true" done test_done EOF - check_sub_test_lib_test run-empty-sel <<-\\EOF + check_sub_test_lib_test run-empty-sel <<-\EOF > ok 1 - passing test #1 > ok 2 # skip passing test #2 (--run) > ok 3 - passing test #3 @@ -703,161 +699,189 @@ test_expect_success '--run empty selectors' " > # passed all 6 test(s) > 1..6 EOF -" +' -test_expect_success '--run invalid range start' " +test_expect_success '--run substring selector' ' + run_sub_test_lib_test run-substring-selector \ + "--run empty selectors" \ + --run="relevant" <<-\EOF && + test_expect_success "relevant test" "true" + for i in 1 2 3 4 5 6 + do + test_expect_success "other test #$i" "true" + done + test_done + EOF + check_sub_test_lib_test run-substring-selector <<-\EOF + > ok 1 - relevant test + > ok 2 # skip other test #1 (--run) + > ok 3 # skip other test #2 (--run) + > ok 4 # skip other test #3 (--run) + > ok 5 # skip other test #4 (--run) + > ok 6 # skip other test #5 (--run) + > ok 7 # skip other test #6 (--run) + > # passed all 7 test(s) + > 1..7 + EOF +' + +test_expect_success '--run keyword selection' ' run_sub_test_lib_test_err run-inv-range-start \ - '--run invalid range start' \ - --run='a-5' <<-\\EOF && - test_expect_success \"passing test #1\" 'true' + "--run invalid range start" \ + --run="a-5" <<-\EOF && + test_expect_success "passing test #1" "true" test_done EOF check_sub_test_lib_test_err run-inv-range-start \ - <<-\\EOF_OUT 3<<-\\EOF_ERR + <<-\EOF_OUT 3<<-EOF_ERR > FATAL: Unexpected exit with code 1 EOF_OUT - > error: --run: invalid non-numeric in range start: 'a-5' + > error: --run: invalid non-numeric in range start: ${SQ}a-5${SQ} EOF_ERR -" +' -test_expect_success '--run invalid range end' " +test_expect_success '--run invalid range end' ' run_sub_test_lib_test_err run-inv-range-end \ - '--run invalid range end' \ - --run='1-z' <<-\\EOF && - test_expect_success \"passing test #1\" 'true' + "--run invalid range end" \ + --run="1-z" <<-\EOF && + test_expect_success "passing test #1" "true" test_done EOF check_sub_test_lib_test_err run-inv-range-end \ - <<-\\EOF_OUT 3<<-\\EOF_ERR + <<-\EOF_OUT 3<<-EOF_ERR > FATAL: Unexpected exit with code 1 EOF_OUT - > error: --run: invalid non-numeric in range end: '1-z' + > error: --run: invalid non-numeric in range end: ${SQ}1-z${SQ} EOF_ERR -" +' + +test_expect_success 'tests respect prerequisites' ' + run_sub_test_lib_test prereqs "tests respect prereqs" <<-\EOF && + + test_set_prereq HAVEIT + test_expect_success HAVEIT "prereq is satisfied" "true" + test_expect_success "have_prereq works" " + test_have_prereq HAVEIT + " + test_expect_success DONTHAVEIT "prereq not satisfied" "false" + + test_set_prereq HAVETHIS + test_expect_success HAVETHIS,HAVEIT "multiple prereqs" "true" + test_expect_success HAVEIT,DONTHAVEIT "mixed prereqs (yes,no)" "false" + test_expect_success DONTHAVEIT,HAVEIT "mixed prereqs (no,yes)" "false" -test_expect_success '--run invalid selector' " - run_sub_test_lib_test_err run-inv-selector \ - '--run invalid selector' \ - --run='1?' <<-\\EOF && - test_expect_success \"passing test #1\" 'true' test_done EOF - check_sub_test_lib_test_err run-inv-selector \ - <<-\\EOF_OUT 3<<-\\EOF_ERR - > FATAL: Unexpected exit with code 1 - EOF_OUT - > error: --run: invalid non-numeric in test selector: '1?' - EOF_ERR -" - - -test_set_prereq HAVEIT -haveit=no -test_expect_success HAVEIT 'test runs if prerequisite is satisfied' ' - test_have_prereq HAVEIT && - haveit=yes -' -donthaveit=yes -test_expect_success DONTHAVEIT 'unmet prerequisite causes test to be skipped' ' - donthaveit=no -' -if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit != yesyes -then - say "bug in test framework: prerequisite tags do not work reliably" - exit 1 -fi - -test_set_prereq HAVETHIS -haveit=no -test_expect_success HAVETHIS,HAVEIT 'test runs if prerequisites are satisfied' ' - test_have_prereq HAVEIT && - test_have_prereq HAVETHIS && - haveit=yes -' -donthaveit=yes -test_expect_success HAVEIT,DONTHAVEIT 'unmet prerequisites causes test to be skipped' ' - donthaveit=no -' -donthaveiteither=yes -test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' ' - donthaveiteither=no -' -if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit$donthaveiteither != yesyesyes -then - say "bug in test framework: multiple prerequisite tags do not work reliably" - exit 1 -fi - -test_lazy_prereq LAZY_TRUE true -havetrue=no -test_expect_success LAZY_TRUE 'test runs if lazy prereq is satisfied' ' - havetrue=yes -' -donthavetrue=yes -test_expect_success !LAZY_TRUE 'missing lazy prereqs skip tests' ' - donthavetrue=no -' - -if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$havetrue$donthavetrue" != yesyes -then - say 'bug in test framework: lazy prerequisites do not work' - exit 1 -fi - -test_lazy_prereq LAZY_FALSE false -nothavefalse=no -test_expect_success !LAZY_FALSE 'negative lazy prereqs checked' ' - nothavefalse=yes -' -havefalse=yes -test_expect_success LAZY_FALSE 'missing negative lazy prereqs will skip' ' - havefalse=no -' - -if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$nothavefalse$havefalse" != yesyes -then - say 'bug in test framework: negative lazy prerequisites do not work' - exit 1 -fi - -clean=no -test_expect_success 'tests clean up after themselves' ' - test_when_finished clean=yes + + check_sub_test_lib_test prereqs <<-\EOF + ok 1 - prereq is satisfied + ok 2 - have_prereq works + ok 3 # skip prereq not satisfied (missing DONTHAVEIT) + ok 4 - multiple prereqs + ok 5 # skip mixed prereqs (yes,no) (missing DONTHAVEIT of HAVEIT,DONTHAVEIT) + ok 6 # skip mixed prereqs (no,yes) (missing DONTHAVEIT of DONTHAVEIT,HAVEIT) + # passed all 6 test(s) + 1..6 + EOF ' -if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $clean != yes -then - say "bug in test framework: basic cleanup command does not work reliably" - exit 1 -fi +test_expect_success 'tests respect lazy prerequisites' ' + run_sub_test_lib_test lazy-prereqs "respect lazy prereqs" <<-\EOF && + + test_lazy_prereq LAZY_TRUE true + test_expect_success LAZY_TRUE "lazy prereq is satisifed" "true" + test_expect_success !LAZY_TRUE "negative lazy prereq" "false" + + test_lazy_prereq LAZY_FALSE false + test_expect_success LAZY_FALSE "lazy prereq not satisfied" "false" + test_expect_success !LAZY_FALSE "negative false prereq" "true" + + test_done + EOF + + check_sub_test_lib_test lazy-prereqs <<-\EOF + ok 1 - lazy prereq is satisifed + ok 2 # skip negative lazy prereq (missing !LAZY_TRUE) + ok 3 # skip lazy prereq not satisfied (missing LAZY_FALSE) + ok 4 - negative false prereq + # passed all 4 test(s) + 1..4 + EOF +' -test_expect_success 'lazy prereqs do not turn off tracing' " +test_expect_success 'nested lazy prerequisites' ' + run_sub_test_lib_test nested-lazy "nested lazy prereqs" <<-\EOF && + + test_lazy_prereq NESTED_INNER " + >inner && + rm -f outer + " + test_lazy_prereq NESTED_PREREQ " + >outer && + test_have_prereq NESTED_INNER && + echo can create new file in cwd >file && + test_path_is_file outer && + test_path_is_missing inner + " + test_expect_success NESTED_PREREQ "evaluate nested prereq" "true" + + test_done + EOF + + check_sub_test_lib_test nested-lazy <<-\EOF + ok 1 - evaluate nested prereq + # passed all 1 test(s) + 1..1 + EOF +' + +test_expect_success 'lazy prereqs do not turn off tracing' ' run_sub_test_lib_test lazy-prereq-and-tracing \ - 'lazy prereqs and -x' -v -x <<-\\EOF && + "lazy prereqs and -x" -v -x <<-\EOF && test_lazy_prereq LAZY true - test_expect_success lazy 'test_have_prereq LAZY && echo trace' + test_expect_success lazy "test_have_prereq LAZY && echo trace" test_done EOF - grep 'echo trace' lazy-prereq-and-tracing/err -" + grep "echo trace" lazy-prereq-and-tracing/err +' -test_expect_success 'tests clean up even on failures' " +test_expect_success 'tests clean up after themselves' ' + run_sub_test_lib_test cleanup "test with cleanup" <<-\EOF && + clean=no + test_expect_success "do cleanup" " + test_when_finished clean=yes + " + test_expect_success "cleanup happened" " + test $clean = yes + " + test_done + EOF + + check_sub_test_lib_test cleanup <<-\EOF + ok 1 - do cleanup + ok 2 - cleanup happened + # passed all 2 test(s) + 1..2 + EOF +' + +test_expect_success 'tests clean up even on failures' ' run_sub_test_lib_test_err \ - failing-cleanup 'Failing tests with cleanup commands' <<-\\EOF && - test_expect_success 'tests clean up even after a failure' ' + failing-cleanup "Failing tests with cleanup commands" <<-\EOF && + test_expect_success "tests clean up even after a failure" " touch clean-after-failure && test_when_finished rm clean-after-failure && (exit 1) - ' - test_expect_success 'failure to clean up causes the test to fail' ' + " + test_expect_success "failure to clean up causes the test to fail" " test_when_finished \"(exit 2)\" - ' + " test_done EOF - check_sub_test_lib_test failing-cleanup <<-\\EOF + check_sub_test_lib_test failing-cleanup <<-\EOF > not ok 1 - tests clean up even after a failure > # Z > # touch clean-after-failure && @@ -866,30 +890,30 @@ test_expect_success 'tests clean up even on failures' " > # Z > not ok 2 - failure to clean up causes the test to fail > # Z - > # test_when_finished \"(exit 2)\" + > # test_when_finished "(exit 2)" > # Z > # failed 2 among 2 test(s) > 1..2 EOF -" +' -test_expect_success 'test_atexit is run' " +test_expect_success 'test_atexit is run' ' run_sub_test_lib_test_err \ - atexit-cleanup 'Run atexit commands' -i <<-\\EOF && - test_expect_success 'tests clean up even after a failure' ' + atexit-cleanup "Run atexit commands" -i <<-\EOF && + test_expect_success "tests clean up even after a failure" " > ../../clean-atexit && test_atexit rm ../../clean-atexit && > ../../also-clean-atexit && test_atexit rm ../../also-clean-atexit && > ../../dont-clean-atexit && (exit 1) - ' + " test_done EOF test_path_is_file dont-clean-atexit && test_path_is_missing clean-atexit && test_path_is_missing also-clean-atexit -" +' test_expect_success 'test_oid provides sane info by default' ' test_oid zero >actual && @@ -1191,7 +1215,7 @@ test_expect_success 'writing this tree with --missing-ok' ' test_expect_success 'git read-tree followed by write-tree should be idempotent' ' rm -f .git/index && git read-tree $tree && - test -f .git/index && + test_path_is_file .git/index && newtree=$(git write-tree) && test "$newtree" = "$tree" ' diff --git a/t/t0001-init.sh b/t/t0001-init.sh index 2f7c3dcd0f..acd662e403 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -163,7 +163,7 @@ test_expect_success 'reinit' ' ( mkdir again && cd again && - git init >out1 2>err1 && + git -c init.defaultBranch=initial init >out1 2>err1 && git init >out2 2>err2 ) && test_i18ngrep "Initialized empty" again/out1 && @@ -186,21 +186,33 @@ test_expect_success 'init with --template (blank)' ' test_path_is_missing template-blank/.git/info/exclude ' -test_expect_success 'init with init.templatedir set' ' - mkdir templatedir-source && - echo Content >templatedir-source/file && - test_config_global init.templatedir "${HOME}/templatedir-source" && +init_no_templatedir_env () { ( - mkdir templatedir-set && - cd templatedir-set && sane_unset GIT_TEMPLATE_DIR && NO_SET_GIT_TEMPLATE_DIR=t && export NO_SET_GIT_TEMPLATE_DIR && - git init - ) && + git init "$1" + ) +} + +test_expect_success 'init with init.templatedir set' ' + mkdir templatedir-source && + echo Content >templatedir-source/file && + test_config_global init.templatedir "${HOME}/templatedir-source" && + + init_no_templatedir_env templatedir-set && test_cmp templatedir-source/file templatedir-set/.git/file ' +test_expect_success 'init with init.templatedir using ~ expansion' ' + mkdir -p templatedir-source && + echo Content >templatedir-source/file && + test_config_global init.templatedir "~/templatedir-source" && + + init_no_templatedir_env templatedir-expansion && + test_cmp templatedir-source/file templatedir-expansion/.git/file +' + test_expect_success 'init --bare/--shared overrides system/global config' ' test_config_global core.bare false && test_config_global core.sharedRepository 0640 && @@ -553,15 +565,37 @@ test_expect_success '--initial-branch' ' test_expect_success 'overridden default initial branch name (config)' ' test_config_global init.defaultBranch nmb && - git init initial-branch-config && + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= git init initial-branch-config && git -C initial-branch-config symbolic-ref HEAD >actual && grep nmb actual ' +test_expect_success 'advice on unconfigured init.defaultBranch' ' + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= git -c color.advice=always \ + init unconfigured-default-branch-name 2>err && + test_decode_color <err >decoded && + test_i18ngrep "<YELLOW>hint: " decoded +' + +test_expect_success 'overridden default main branch name (env)' ' + test_config_global init.defaultBranch nmb && + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=env git init main-branch-env && + git -C main-branch-env symbolic-ref HEAD >actual && + grep env actual +' + test_expect_success 'invalid default branch name' ' - test_config_global init.defaultBranch "with space" && - test_must_fail git init initial-branch-invalid 2>err && + test_must_fail env GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME="with space" \ + git init initial-branch-invalid 2>err && test_i18ngrep "invalid branch name" err ' +test_expect_success 'branch -m with the initial branch' ' + git init rename-initial && + git -C rename-initial branch -m renamed && + test renamed = $(git -C rename-initial symbolic-ref --short HEAD) && + git -C rename-initial branch -m renamed again && + test again = $(git -C rename-initial symbolic-ref --short HEAD) +' + test_done diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh index 960ed150cb..8440e6add1 100755 --- a/t/t0002-gitfile.sh +++ b/t/t0002-gitfile.sh @@ -4,6 +4,9 @@ test_description='.git file Verify that plumbing commands work when .git is a file ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh objpath() { @@ -96,7 +99,7 @@ test_expect_success 'enter_repo non-strict mode' ' git ls-remote enter_repo >actual && cat >expected <<-EOF && $head HEAD - $head refs/heads/master + $head refs/heads/main $head refs/tags/foo EOF test_cmp expected actual @@ -111,7 +114,7 @@ test_expect_success 'enter_repo linked checkout' ' git ls-remote foo >actual && cat >expected <<-EOF && $head HEAD - $head refs/heads/master + $head refs/heads/main $head refs/tags/foo EOF test_cmp expected actual @@ -122,7 +125,7 @@ test_expect_success 'enter_repo strict mode' ' git ls-remote --upload-pack="git upload-pack --strict" foo/.git >actual && cat >expected <<-EOF && $head HEAD - $head refs/heads/master + $head refs/heads/main $head refs/tags/foo EOF test_cmp expected actual diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index b660593c20..1e4c672b84 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -4,12 +4,16 @@ test_description=gitattributes . ./test-lib.sh -attr_check () { +attr_check_basic () { path="$1" expect="$2" git_opts="$3" && git $git_opts check-attr test -- "$path" >actual 2>err && echo "$path: test: $expect" >expect && - test_cmp expect actual && + test_cmp expect actual +} + +attr_check () { + attr_check_basic "$@" && test_must_be_empty err } @@ -331,7 +335,6 @@ test_expect_success 'binary macro expanded by -a' ' test_cmp expect actual ' - test_expect_success 'query binary macro directly' ' echo "file binary" >.gitattributes && echo file: binary: set >expect && @@ -339,4 +342,31 @@ test_expect_success 'query binary macro directly' ' test_cmp expect actual ' +test_expect_success SYMLINKS 'set up symlink tests' ' + echo "* test" >attr && + rm -f .gitattributes +' + +test_expect_success SYMLINKS 'symlinks respected in core.attributesFile' ' + test_when_finished "rm symlink" && + ln -s attr symlink && + test_config core.attributesFile "$(pwd)/symlink" && + attr_check file set +' + +test_expect_success SYMLINKS 'symlinks respected in info/attributes' ' + test_when_finished "rm .git/info/attributes" && + ln -s ../../attr .git/info/attributes && + attr_check file set +' + +test_expect_success SYMLINKS 'symlinks not respected in-tree' ' + test_when_finished "rm -rf .gitattributes subdir" && + ln -s attr .gitattributes && + mkdir subdir && + ln -s ../attr subdir/.gitattributes && + attr_check_basic subdir/file unspecified && + test_i18ngrep "unable to access.*gitattributes" err +' + test_done diff --git a/t/t0006-date.sh b/t/t0006-date.sh index 75ee9a96b8..6b757d7169 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -11,7 +11,7 @@ check_relative() { echo "$t -> $2" >expect test_expect_${3:-success} "relative date ($2)" " test-tool date relative $t >actual && - test_i18ncmp expect actual + test_cmp expect actual " } @@ -139,7 +139,7 @@ check_date_format_human() { echo "$t -> $2" >expect test_expect_success "human date $t" ' test-tool date human $t >actual && - test_i18ncmp expect actual + test_cmp expect actual ' } diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index 370a389e5c..a594b4aa7d 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -34,7 +34,7 @@ expect_from_stdin () { test_stderr () { expected="$1" expect_in stderr "$1" && - test_i18ncmp "$HOME/expected-stderr" "$HOME/stderr" + test_cmp "$HOME/expected-stderr" "$HOME/stderr" } broken_c_unquote () { @@ -865,4 +865,38 @@ test_expect_success 'info/exclude trumps core.excludesfile' ' test_cmp expect actual ' +test_expect_success SYMLINKS 'set up ignore file for symlink tests' ' + echo "*" >ignore && + rm -f .gitignore .git/info/exclude +' + +test_expect_success SYMLINKS 'symlinks respected in core.excludesFile' ' + test_when_finished "rm symlink" && + ln -s ignore symlink && + test_config core.excludesFile "$(pwd)/symlink" && + echo file >expect && + git check-ignore file >actual 2>err && + test_cmp expect actual && + test_must_be_empty err +' + +test_expect_success SYMLINKS 'symlinks respected in info/exclude' ' + test_when_finished "rm .git/info/exclude" && + ln -s ../../ignore .git/info/exclude && + echo file >expect && + git check-ignore file >actual 2>err && + test_cmp expect actual && + test_must_be_empty err +' + +test_expect_success SYMLINKS 'symlinks not respected in-tree' ' + test_when_finished "rm .gitignore" && + ln -s ignore .gitignore && + mkdir subdir && + ln -s ignore subdir/.gitignore && + test_must_fail git check-ignore subdir/file >actual 2>err && + test_must_be_empty actual && + test_i18ngrep "unable to access.*gitignore" err +' + test_done diff --git a/t/t0012-help.sh b/t/t0012-help.sh index e8ef7300ec..5679e29c62 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -55,7 +55,7 @@ test_expect_success "--help does not work for guides" " git: 'revisions' is not a git command. See 'git --help'. EOF test_must_fail git revisions --help 2>actual && - test_i18ncmp expect actual + test_cmp expect actual " test_expect_success 'git help' ' diff --git a/t/t0017-env-helper.sh b/t/t0017-env-helper.sh index c1ecf6aeac..4a159f99e4 100755 --- a/t/t0017-env-helper.sh +++ b/t/t0017-env-helper.sh @@ -86,14 +86,14 @@ test_expect_success 'env--helper reads config thanks to trace2' ' git config -f home/cycle include.path .gitconfig && test_must_fail \ - env HOME="$(pwd)/home" GIT_TEST_GETTEXT_POISON=false \ + env HOME="$(pwd)/home" \ git config -l 2>err && grep "exceeded maximum include depth" err && test_must_fail \ - env HOME="$(pwd)/home" GIT_TEST_GETTEXT_POISON=true \ - git -C cycle env--helper --type=bool --default=0 --exit-code GIT_TEST_GETTEXT_POISON 2>err && - grep "# GETTEXT POISON #" err + env HOME="$(pwd)/home" GIT_TEST_ENV_HELPER=true \ + git -C cycle env--helper --type=bool --default=0 --exit-code GIT_TEST_ENV_HELPER 2>err && + grep "exceeded maximum include depth" err ' test_done diff --git a/t/t0018-advice.sh b/t/t0018-advice.sh index e03554d2f3..39e5e4b34f 100755 --- a/t/t0018-advice.sh +++ b/t/t0018-advice.sh @@ -10,7 +10,7 @@ test_expect_success 'advice should be printed when config variable is unset' ' hint: Disable this message with "git config advice.nestedTag false" EOF test-tool advise "This is a piece of advice" 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'advice should be printed when config variable is set to true' ' @@ -20,7 +20,7 @@ test_expect_success 'advice should be printed when config variable is set to tru EOF test_config advice.nestedTag true && test-tool advise "This is a piece of advice" 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'advice should not be printed when config variable is set to false' ' diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh index b63ba62e5d..f25ae8b5e1 100755 --- a/t/t0020-crlf.sh +++ b/t/t0020-crlf.sh @@ -2,6 +2,9 @@ test_description='CRLF conversion' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh has_cr() { @@ -84,10 +87,8 @@ test_expect_success 'safecrlf: print warning only once' ' git commit -m "nowarn" && for w in Oh here is CRLFQ in text; do echo $w; done | q_to_cr >doublewarn && git add doublewarn 2>err && - if test_have_prereq C_LOCALE_OUTPUT - then - test $(grep "CRLF will be replaced by LF" err | wc -l) = 1 - fi + grep "CRLF will be replaced by LF" err >err.warnings && + test_line_count = 1 err.warnings ' @@ -318,8 +319,8 @@ test_expect_success 'checkout with existing .gitattributes' ' git add .gitattributes .file && git commit -m second && - git checkout master~1 && - git checkout master && + git checkout main~1 && + git checkout main && test "$(git diff-files --raw)" = "" ' @@ -331,8 +332,8 @@ test_expect_success 'checkout when deleting .gitattributes' ' git add .file2 && git commit -m third && - git checkout master~1 && - git checkout master && + git checkout main~1 && + git checkout main && has_cr .file2 ' diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index 4bfffa9c31..b5749f327d 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -2,6 +2,9 @@ test_description='blob conversion via gitattributes' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh TEST_ROOT="$PWD" @@ -23,10 +26,6 @@ generate_random_characters () { perl -pe "s/./chr((ord($&) % 26) + ord('a'))/sge" >"$TEST_ROOT/$NAME" } -file_size () { - test-tool path-utils file-size "$1" -} - filter_git () { rm -f *.log && git "$@" @@ -35,7 +34,7 @@ filter_git () { # Compare two files and ensure that `clean` and `smudge` respectively are # called at least once if specified in the `expect` file. The actual # invocation count is not relevant because their number can vary. -# c.f. http://lore.kernel.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ +# c.f. https://lore.kernel.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ test_cmp_count () { expect=$1 actual=$2 @@ -50,7 +49,7 @@ test_cmp_count () { # Compare two files but exclude all `clean` invocations because Git can # call `clean` zero or more times. -# c.f. http://lore.kernel.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ +# c.f. https://lore.kernel.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ test_cmp_exclude_clean () { expect=$1 actual=$2 @@ -258,6 +257,30 @@ test_expect_success 'required filter clean failure' ' test_must_fail git add test.fc ' +test_expect_success 'required filter with absent clean field' ' + test_config filter.absentclean.smudge cat && + test_config filter.absentclean.required true && + + echo "*.ac filter=absentclean" >.gitattributes && + + echo test >test.ac && + test_must_fail git add test.ac 2>stderr && + test_i18ngrep "fatal: test.ac: clean filter .absentclean. failed" stderr +' + +test_expect_success 'required filter with absent smudge field' ' + test_config filter.absentsmudge.clean cat && + test_config filter.absentsmudge.required true && + + echo "*.as filter=absentsmudge" >.gitattributes && + + echo test >test.as && + git add test.as && + rm -f test.as && + test_must_fail git checkout -- test.as 2>stderr && + test_i18ngrep "fatal: test.as: smudge filter absentsmudge failed" stderr +' + test_expect_success 'filtering large input to small output should use little memory' ' test_config filter.devnull.clean "cat >/dev/null" && test_config filter.devnull.required true && @@ -361,9 +384,9 @@ test_expect_success PERL 'required process filter should filter data' ' cp "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r" && >test4-empty.r && - S=$(file_size test.r) && - S2=$(file_size test2.r) && - S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") && + S=$(test_file_size test.r) && + S2=$(test_file_size test2.r) && + S3=$(test_file_size "testsubdir/test3 '\''sq'\'',\$x=.r") && M=$(git hash-object test.r) && M2=$(git hash-object test2.r) && M3=$(git hash-object "testsubdir/test3 '\''sq'\'',\$x=.r") && @@ -382,8 +405,8 @@ test_expect_success PERL 'required process filter should filter data' ' test_cmp_count expected.log debug.log && git commit -m "test commit 2" && - MASTER=$(git rev-parse --verify master) && - META="ref=refs/heads/master treeish=$MASTER" && + MAIN=$(git rev-parse --verify main) && + META="ref=refs/heads/main treeish=$MAIN" && rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x=.r" && filter_git checkout --quiet --no-progress . && @@ -408,7 +431,7 @@ test_expect_success PERL 'required process filter should filter data' ' EOF test_cmp_exclude_clean expected.log debug.log && - filter_git checkout --quiet --no-progress master && + filter_git checkout --quiet --no-progress main && cat >expected.log <<-EOF && START init handshake complete @@ -432,23 +455,23 @@ test_expect_success PERL 'required process filter should filter data for various ( cd repo && - S=$(file_size test.r) && - S2=$(file_size test2.r) && - S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") && + S=$(test_file_size test.r) && + S2=$(test_file_size test2.r) && + S3=$(test_file_size "testsubdir/test3 '\''sq'\'',\$x=.r") && M=$(git hash-object test.r) && M2=$(git hash-object test2.r) && M3=$(git hash-object "testsubdir/test3 '\''sq'\'',\$x=.r") && EMPTY=$(git hash-object /dev/null) && - MASTER=$(git rev-parse --verify master) && + MAIN=$(git rev-parse --verify main) && cp "$TEST_ROOT/test.o" test5.r && git add test5.r && git commit -m "test commit 3" && git checkout empty-branch && - filter_git rebase --onto empty-branch master^^ master && - MASTER2=$(git rev-parse --verify master) && - META="ref=refs/heads/master treeish=$MASTER2" && + filter_git rebase --onto empty-branch main^^ main && + MAIN2=$(git rev-parse --verify main) && + META="ref=refs/heads/main treeish=$MAIN2" && cat >expected.log <<-EOF && START init handshake complete @@ -462,8 +485,8 @@ test_expect_success PERL 'required process filter should filter data for various test_cmp_exclude_clean expected.log debug.log && git reset --hard empty-branch && - filter_git reset --hard $MASTER && - META="treeish=$MASTER" && + filter_git reset --hard $MAIN && + META="treeish=$MAIN" && cat >expected.log <<-EOF && START init handshake complete @@ -475,10 +498,10 @@ test_expect_success PERL 'required process filter should filter data for various EOF test_cmp_exclude_clean expected.log debug.log && - git branch old-master $MASTER && + git branch old-main $MAIN && git reset --hard empty-branch && - filter_git reset --hard old-master && - META="ref=refs/heads/old-master treeish=$MASTER" && + filter_git reset --hard old-main && + META="ref=refs/heads/old-main treeish=$MAIN" && cat >expected.log <<-EOF && START init handshake complete @@ -491,9 +514,9 @@ test_expect_success PERL 'required process filter should filter data for various test_cmp_exclude_clean expected.log debug.log && git checkout -b merge empty-branch && - git branch -f master $MASTER2 && - filter_git merge master && - META="treeish=$MASTER2" && + git branch -f main $MAIN2 && + filter_git merge main && + META="treeish=$MAIN2" && cat >expected.log <<-EOF && START init handshake complete @@ -506,8 +529,8 @@ test_expect_success PERL 'required process filter should filter data for various EOF test_cmp_exclude_clean expected.log debug.log && - filter_git archive master >/dev/null && - META="ref=refs/heads/master treeish=$MASTER2" && + filter_git archive main >/dev/null && + META="ref=refs/heads/main treeish=$MAIN2" && cat >expected.log <<-EOF && START init handshake complete @@ -520,7 +543,7 @@ test_expect_success PERL 'required process filter should filter data for various EOF test_cmp_exclude_clean expected.log debug.log && - TREE="$(git rev-parse $MASTER2^{tree})" && + TREE="$(git rev-parse $MAIN2^{tree})" && filter_git archive $TREE >/dev/null && META="treeish=$TREE" && cat >expected.log <<-EOF && @@ -549,7 +572,7 @@ test_expect_success PERL 'required process filter takes precedence' ' echo "*.r filter=protocol" >.gitattributes && cp "$TEST_ROOT/test.o" test.r && - S=$(file_size test.r) && + S=$(test_file_size test.r) && # Check that the process filter is invoked here filter_git add . && @@ -573,7 +596,7 @@ test_expect_success PERL 'required process filter should be used only for "clean echo "*.r filter=protocol" >.gitattributes && cp "$TEST_ROOT/test.o" test.r && - S=$(file_size test.r) && + S=$(test_file_size test.r) && filter_git add . && cat >expected.log <<-EOF && @@ -697,9 +720,9 @@ test_expect_success PERL 'process filter should restart after unexpected write f echo "this is going to fail" >smudge-write-fail.o && cp smudge-write-fail.o smudge-write-fail.r && - S=$(file_size test.r) && - S2=$(file_size test2.r) && - SF=$(file_size smudge-write-fail.r) && + S=$(test_file_size test.r) && + S2=$(test_file_size test2.r) && + SF=$(test_file_size smudge-write-fail.r) && M=$(git hash-object test.r) && M2=$(git hash-object test2.r) && MF=$(git hash-object smudge-write-fail.r) && @@ -752,9 +775,9 @@ test_expect_success PERL 'process filter should not be restarted if it signals a echo "this will cause an error" >error.o && cp error.o error.r && - S=$(file_size test.r) && - S2=$(file_size test2.r) && - SE=$(file_size error.r) && + S=$(test_file_size test.r) && + S2=$(test_file_size test2.r) && + SE=$(test_file_size error.r) && M=$(git hash-object test.r) && M2=$(git hash-object test2.r) && ME=$(git hash-object error.r) && @@ -797,7 +820,7 @@ test_expect_success PERL 'process filter abort stops processing of all further f M="blob=$(git hash-object abort.r)" && rm -f debug.log && - SA=$(file_size abort.r) && + SA=$(test_file_size abort.r) && git add . && rm -f *.r && @@ -859,9 +882,9 @@ test_expect_success PERL 'delayed checkout in process filter' ' git commit -m "test commit" ) && - S=$(file_size "$TEST_ROOT/test.o") && - PM="ref=refs/heads/master treeish=$(git -C repo rev-parse --verify master) " && - M="${PM}blob=$(git -C repo rev-parse --verify master:test.a)" && + S=$(test_file_size "$TEST_ROOT/test.o") && + PM="ref=refs/heads/main treeish=$(git -C repo rev-parse --verify main) " && + M="${PM}blob=$(git -C repo rev-parse --verify main:test.a)" && cat >a.exp <<-EOF && START init handshake complete @@ -957,4 +980,85 @@ test_expect_success PERL 'invalid file in delayed checkout' ' grep "error: external filter .* signaled that .unfiltered. is now available although it has not been delayed earlier" git-stderr.log ' +for mode in 'case' 'utf-8' +do + case "$mode" in + case) dir='A' symlink='a' mode_prereq='CASE_INSENSITIVE_FS' ;; + utf-8) + dir=$(printf "\141\314\210") symlink=$(printf "\303\244") + mode_prereq='UTF8_NFD_TO_NFC' ;; + esac + + test_expect_success PERL,SYMLINKS,$mode_prereq \ + "delayed checkout with $mode-collision don't write to the wrong place" ' + test_config_global filter.delay.process \ + "\"$TEST_ROOT/rot13-filter.pl\" --always-delay delayed.log clean smudge delay" && + test_config_global filter.delay.required true && + + git init $mode-collision && + ( + cd $mode-collision && + mkdir target-dir && + + empty_oid=$(printf "" | git hash-object -w --stdin) && + symlink_oid=$(printf "%s" "$PWD/target-dir" | git hash-object -w --stdin) && + attr_oid=$(echo "$dir/z filter=delay" | git hash-object -w --stdin) && + + cat >objs <<-EOF && + 100644 blob $empty_oid $dir/x + 100644 blob $empty_oid $dir/y + 100644 blob $empty_oid $dir/z + 120000 blob $symlink_oid $symlink + 100644 blob $attr_oid .gitattributes + EOF + + git update-index --index-info <objs && + git commit -m "test commit" + ) && + + git clone $mode-collision $mode-collision-cloned && + # Make sure z was really delayed + grep "IN: smudge $dir/z .* \\[DELAYED\\]" $mode-collision-cloned/delayed.log && + + # Should not create $dir/z at $symlink/z + test_path_is_missing $mode-collision/target-dir/z + ' +done + +test_expect_success PERL,SYMLINKS,CASE_INSENSITIVE_FS \ +"delayed checkout with submodule collision don't write to the wrong place" ' + git init collision-with-submodule && + ( + cd collision-with-submodule && + git config filter.delay.process "\"$TEST_ROOT/rot13-filter.pl\" --always-delay delayed.log clean smudge delay" && + git config filter.delay.required true && + + # We need Git to treat the submodule "a" and the + # leading dir "A" as different paths in the index. + git config --local core.ignoreCase false && + + empty_oid=$(printf "" | git hash-object -w --stdin) && + attr_oid=$(echo "A/B/y filter=delay" | git hash-object -w --stdin) && + cat >objs <<-EOF && + 100644 blob $empty_oid A/B/x + 100644 blob $empty_oid A/B/y + 100644 blob $attr_oid .gitattributes + EOF + git update-index --index-info <objs && + + git init a && + mkdir target-dir && + symlink_oid=$(printf "%s" "$PWD/target-dir" | git -C a hash-object -w --stdin) && + echo "120000 blob $symlink_oid b" >objs && + git -C a update-index --index-info <objs && + git -C a commit -m sub && + git submodule add ./a && + git commit -m super && + + git checkout --recurse-submodules . && + grep "IN: smudge A/B/y .* \\[DELAYED\\]" delayed.log && + test_path_is_missing target-dir/y + ) +' + test_done diff --git a/t/t0021/rot13-filter.pl b/t/t0021/rot13-filter.pl index cd32a82da5..7bb93768f3 100644 --- a/t/t0021/rot13-filter.pl +++ b/t/t0021/rot13-filter.pl @@ -2,9 +2,15 @@ # Example implementation for the Git filter protocol version 2 # See Documentation/gitattributes.txt, section "Filter Protocol" # -# The first argument defines a debug log file that the script write to. -# All remaining arguments define a list of supported protocol -# capabilities ("clean", "smudge", etc). +# Usage: rot13-filter.pl [--always-delay] <log path> <capabilities> +# +# Log path defines a debug log file that the script writes to. The +# subsequent arguments define a list of supported protocol capabilities +# ("clean", "smudge", etc). +# +# When --always-delay is given all pathnames with the "can-delay" flag +# that don't appear on the list bellow are delayed with a count of 1 +# (see more below). # # This implementation supports special test cases: # (1) If data with the pathname "clean-write-fail.r" is processed with @@ -53,6 +59,13 @@ use IO::File; use Git::Packet; my $MAX_PACKET_CONTENT_SIZE = 65516; + +my $always_delay = 0; +if ( $ARGV[0] eq '--always-delay' ) { + $always_delay = 1; + shift @ARGV; +} + my $log_file = shift @ARGV; my @capabilities = @ARGV; @@ -134,6 +147,8 @@ while (1) { if ( $buffer eq "can-delay=1" ) { if ( exists $DELAY{$pathname} and $DELAY{$pathname}{"requested"} == 0 ) { $DELAY{$pathname}{"requested"} = 1; + } elsif ( !exists $DELAY{$pathname} and $always_delay ) { + $DELAY{$pathname} = { "requested" => 1, "count" => 1 }; } } elsif ($buffer =~ /^(ref|treeish|blob)=/) { print $debug " $buffer"; diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh index 9fcd56fab3..4a5c5c602c 100755 --- a/t/t0027-auto-crlf.sh +++ b/t/t0027-auto-crlf.sh @@ -83,7 +83,7 @@ check_warning () { *) echo >&2 "Illegal 1": "$1" ; return false ;; esac grep "will be replaced by" "$2" | sed -e "s/\(.*\) in [^ ]*$/\1/" | uniq >"$2".actual - test_i18ncmp "$2".expect "$2".actual + test_cmp "$2".expect "$2".actual } commit_check_warn () { @@ -368,9 +368,9 @@ test_expect_success 'ls-files --eol -o Text/Binary' ' test_cmp expect actual ' -test_expect_success 'setup master' ' +test_expect_success 'setup main' ' echo >.gitattributes && - git checkout -b master && + git checkout -b main && git add .gitattributes && git commit -m "add .gitattributes" . && printf "\$Id: 0000000000000000000000000000000000000000 \$\nLINEONE\nLINETWO\nLINETHREE" >LF && @@ -386,7 +386,9 @@ test_expect_success 'setup master' ' test_tick ' - +# Disable extra chain-linting for the next set of tests. There are many +# auto-generated ones that are not worth checking over and over. +GIT_TEST_CHAIN_LINT_HARDER_DEFAULT=0 warn_LF_CRLF="LF will be replaced by CRLF" warn_CRLF_LF="CRLF will be replaced by LF" @@ -597,6 +599,9 @@ do checkout_files auto "$id" "" false native $NL CRLF CRLF_mix_LF LF_mix_CR LF_nul done +# The rest of the tests are unique; do the usual linting. +unset GIT_TEST_CHAIN_LINT_HARDER_DEFAULT + # Should be the last test case: remove some files from the worktree test_expect_success 'ls-files --eol -d -z' ' rm crlf_false_attr__CRLF.txt crlf_false_attr__CRLF_mix_LF.txt crlf_false_attr__LF.txt .gitattributes && diff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh index bfc4fb9af5..82905a2156 100755 --- a/t/t0028-working-tree-encoding.sh +++ b/t/t0028-working-tree-encoding.sh @@ -2,34 +2,14 @@ test_description='working-tree-encoding conversion via gitattributes' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY/lib-encoding.sh" GIT_TRACE_WORKING_TREE_ENCODING=1 && export GIT_TRACE_WORKING_TREE_ENCODING -test_lazy_prereq NO_UTF16_BOM ' - test $(printf abc | iconv -f UTF-8 -t UTF-16 | wc -c) = 6 -' - -test_lazy_prereq NO_UTF32_BOM ' - test $(printf abc | iconv -f UTF-8 -t UTF-32 | wc -c) = 12 -' - -write_utf16 () { - if test_have_prereq NO_UTF16_BOM - then - printf '\376\377' - fi && - iconv -f UTF-8 -t UTF-16 -} - -write_utf32 () { - if test_have_prereq NO_UTF32_BOM - then - printf '\0\0\376\377' - fi && - iconv -f UTF-8 -t UTF-32 -} - test_expect_success 'setup test files' ' git config core.eol lf && @@ -215,7 +195,7 @@ test_expect_success 'error if encoding round trip is not the same during refresh TEST_HASH=$(git hash-object --no-filters -w nonsense.utf16le) && git update-index --add --cacheinfo 100644 $TEST_HASH nonsense.utf16le && COMMIT=$(git commit-tree -p $(git rev-parse HEAD) -m "plain commit" $(git write-tree)) && - git update-ref refs/heads/master $COMMIT && + git update-ref refs/heads/main $COMMIT && test_must_fail git checkout HEAD^ 2>err.out && test_i18ngrep "error: .* overwritten by checkout:" err.out @@ -231,7 +211,7 @@ test_expect_success 'error if encoding garbage is already in Git' ' TEST_HASH=$(git hash-object --no-filters -w nonsense.utf16) && git update-index --add --cacheinfo 100644 $TEST_HASH nonsense.utf16 && COMMIT=$(git commit-tree -p $(git rev-parse HEAD) -m "plain commit" $(git write-tree)) && - git update-ref refs/heads/master $COMMIT && + git update-ref refs/heads/main $COMMIT && git diff 2>err.out && test_i18ngrep "error: BOM is required" err.out diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index 14cafc138b..ad4746d899 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -61,7 +61,7 @@ EOF test_expect_success 'test help' ' test_must_fail test-tool parse-options -h >output 2>output.err && test_must_be_empty output.err && - test_i18ncmp expect output + test_cmp expect output ' mv expect expect.err @@ -84,7 +84,7 @@ check_unknown_i18n() { cat expect.err >>expect && test_must_fail test-tool parse-options $* >output 2>output.err && test_must_be_empty output && - test_i18ncmp expect output.err + test_cmp expect output.err } test_expect_success 'OPT_BOOL() #1' 'check boolean: 1 --yes' @@ -250,7 +250,7 @@ EOF test_expect_success 'detect possible typos' ' test_must_fail test-tool parse-options -boolean >output 2>output.err && test_must_be_empty output && - test_i18ncmp typo.err output.err + test_cmp typo.err output.err ' cat >typo.err <<\EOF @@ -260,7 +260,7 @@ EOF test_expect_success 'detect possible typos' ' test_must_fail test-tool parse-options -ambiguous >output 2>output.err && test_must_be_empty output && - test_i18ncmp typo.err output.err + test_cmp typo.err output.err ' test_expect_success 'keep some options as arguments' ' diff --git a/t/t0041-usage.sh b/t/t0041-usage.sh index 5b927b76fe..c4fc34eb18 100755 --- a/t/t0041-usage.sh +++ b/t/t0041-usage.sh @@ -2,6 +2,9 @@ test_description='Test commands behavior when given invalid argument value' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup ' ' @@ -41,8 +44,8 @@ test_expect_success 'tag usage error' ' ' test_expect_success 'branch --contains <existent_commit>' ' - git branch --contains "master" >actual 2>actual.err && - test_i18ngrep "master" actual && + git branch --contains "main" >actual 2>actual.err && + test_i18ngrep "main" actual && test_line_count = 0 actual.err ' @@ -54,7 +57,7 @@ test_expect_success 'branch --contains <inexistent_commit>' ' ' test_expect_success 'branch --no-contains <existent_commit>' ' - git branch --no-contains "master" >actual 2>actual.err && + git branch --no-contains "main" >actual 2>actual.err && test_line_count = 0 actual && test_line_count = 0 actual.err ' @@ -73,7 +76,7 @@ test_expect_success 'branch usage error' ' ' test_expect_success 'for-each-ref --contains <existent_object>' ' - git for-each-ref --contains "master" >actual 2>actual.err && + git for-each-ref --contains "main" >actual 2>actual.err && test_line_count = 2 actual && test_line_count = 0 actual.err ' @@ -86,7 +89,7 @@ test_expect_success 'for-each-ref --contains <inexistent_object>' ' ' test_expect_success 'for-each-ref --no-contains <existent_object>' ' - git for-each-ref --no-contains "master" >actual 2>actual.err && + git for-each-ref --no-contains "main" >actual 2>actual.err && test_line_count = 0 actual && test_line_count = 0 actual.err ' diff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh index 608673fb77..afc343cf9b 100755 --- a/t/t0050-filesystem.sh +++ b/t/t0050-filesystem.sh @@ -2,6 +2,9 @@ test_description='Various filesystem issues' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh auml=$(printf '\303\244') @@ -65,7 +68,7 @@ test_expect_success "setup case tests" ' git mv camelcase tmp && git mv tmp CamelCase && git commit -m "rename" && - git checkout -f master + git checkout -f main ' test_expect_success 'rename (case change)' ' @@ -118,7 +121,7 @@ test_expect_success "setup unicode normalization tests" ' git mv $aumlcdiar tmp && git mv tmp "$auml" && git commit -m rename && - git checkout -f master + git checkout -f main ' $test_unicode 'rename (silent unicode normalization)' ' @@ -147,7 +150,7 @@ test_expect_success CASE_INSENSITIVE_FS 'checkout with no pathspec and a case in git add gitweb && git commit -m "add gitweb/subdir/file" && - git checkout master + git checkout main ) ' diff --git a/t/t0052-simple-ipc.sh b/t/t0052-simple-ipc.sh new file mode 100755 index 0000000000..ff98be31a5 --- /dev/null +++ b/t/t0052-simple-ipc.sh @@ -0,0 +1,122 @@ +#!/bin/sh + +test_description='simple command server' + +. ./test-lib.sh + +test-tool simple-ipc SUPPORTS_SIMPLE_IPC || { + skip_all='simple IPC not supported on this platform' + test_done +} + +stop_simple_IPC_server () { + test-tool simple-ipc stop-daemon +} + +test_expect_success 'start simple command server' ' + test_atexit stop_simple_IPC_server && + test-tool simple-ipc start-daemon --threads=8 && + test-tool simple-ipc is-active +' + +test_expect_success 'simple command server' ' + test-tool simple-ipc send --token=ping >actual && + echo pong >expect && + test_cmp expect actual +' + +test_expect_success 'servers cannot share the same path' ' + test_must_fail test-tool simple-ipc run-daemon && + test-tool simple-ipc is-active +' + +test_expect_success 'big response' ' + test-tool simple-ipc send --token=big >actual && + test_line_count -ge 10000 actual && + grep -q "big: [0]*9999\$" actual +' + +test_expect_success 'chunk response' ' + test-tool simple-ipc send --token=chunk >actual && + test_line_count -ge 10000 actual && + grep -q "big: [0]*9999\$" actual +' + +test_expect_success 'slow response' ' + test-tool simple-ipc send --token=slow >actual && + test_line_count -ge 100 actual && + grep -q "big: [0]*99\$" actual +' + +# Send an IPC with n=100,000 bytes of ballast. This should be large enough +# to force both the kernel and the pkt-line layer to chunk the message to the +# daemon and for the daemon to receive it in chunks. +# +test_expect_success 'sendbytes' ' + test-tool simple-ipc sendbytes --bytecount=100000 --byte=A >actual && + grep "sent:A00100000 rcvd:A00100000" actual +' + +# Start a series of <threads> client threads that each make <batchsize> +# IPC requests to the server. Each (<threads> * <batchsize>) request +# will open a new connection to the server and randomly bind to a server +# thread. Each client thread exits after completing its batch. So the +# total number of live client threads will be smaller than the total. +# Each request will send a message containing at least <bytecount> bytes +# of ballast. (Responses are small.) +# +# The purpose here is to test threading in the server and responding to +# many concurrent client requests (regardless of whether they come from +# 1 client process or many). And to test that the server side of the +# named pipe/socket is stable. (On Windows this means that the server +# pipe is properly recycled.) +# +# On Windows it also lets us adjust the connection timeout in the +# `ipc_client_send_command()`. +# +# Note it is easy to drive the system into failure by requesting an +# insane number of threads on client or server and/or increasing the +# per-thread batchsize or the per-request bytecount (ballast). +# On Windows these failures look like "pipe is busy" errors. +# So I've chosen fairly conservative values for now. +# +# We expect output of the form "sent:<letter><length> ..." +# With terms (7, 19, 13) we expect: +# <letter> in [A-G] +# <length> in [19+0 .. 19+(13-1)] +# and (7 * 13) successful responses. +# +test_expect_success 'stress test threads' ' + test-tool simple-ipc multiple \ + --threads=7 \ + --bytecount=19 \ + --batchsize=13 \ + >actual && + test_line_count = 92 actual && + grep "good 91" actual && + grep "sent:A" <actual >actual_a && + cat >expect_a <<-EOF && + sent:A00000019 rcvd:A00000019 + sent:A00000020 rcvd:A00000020 + sent:A00000021 rcvd:A00000021 + sent:A00000022 rcvd:A00000022 + sent:A00000023 rcvd:A00000023 + sent:A00000024 rcvd:A00000024 + sent:A00000025 rcvd:A00000025 + sent:A00000026 rcvd:A00000026 + sent:A00000027 rcvd:A00000027 + sent:A00000028 rcvd:A00000028 + sent:A00000029 rcvd:A00000029 + sent:A00000030 rcvd:A00000030 + sent:A00000031 rcvd:A00000031 + EOF + test_cmp expect_a actual_a +' + +test_expect_success 'stop-daemon works' ' + test-tool simple-ipc stop-daemon && + test_must_fail test-tool simple-ipc is-active && + test_must_fail test-tool simple-ipc send --token=ping +' + +test_done diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index 56db5c8aba..de4960783f 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -312,8 +312,8 @@ test_git_path GIT_COMMON_DIR=bar info/sparse-checkout .git/info/sparse-check test_git_path GIT_COMMON_DIR=bar info//sparse-checkout .git/info//sparse-checkout test_git_path GIT_COMMON_DIR=bar remotes/bar bar/remotes/bar test_git_path GIT_COMMON_DIR=bar branches/bar bar/branches/bar -test_git_path GIT_COMMON_DIR=bar logs/refs/heads/master bar/logs/refs/heads/master -test_git_path GIT_COMMON_DIR=bar refs/heads/master bar/refs/heads/master +test_git_path GIT_COMMON_DIR=bar logs/refs/heads/main bar/logs/refs/heads/main +test_git_path GIT_COMMON_DIR=bar refs/heads/main bar/refs/heads/main test_git_path GIT_COMMON_DIR=bar refs/bisect/foo .git/refs/bisect/foo test_git_path GIT_COMMON_DIR=bar hooks/me bar/hooks/me test_git_path GIT_COMMON_DIR=bar config bar/config @@ -468,6 +468,36 @@ test_expect_success 'match .gitmodules' ' .gitmodules,:\$DATA ' +test_expect_success 'match .gitattributes' ' + test-tool path-utils is_dotgitattributes \ + .gitattributes \ + .git${u200c}attributes \ + .Gitattributes \ + .gitattributeS \ + GITATT~1 \ + GI7D29~1 +' + +test_expect_success 'match .gitignore' ' + test-tool path-utils is_dotgitignore \ + .gitignore \ + .git${u200c}ignore \ + .Gitignore \ + .gitignorE \ + GITIGN~1 \ + GI250A~1 +' + +test_expect_success 'match .mailmap' ' + test-tool path-utils is_dotmailmap \ + .mailmap \ + .mail${u200c}map \ + .Mailmap \ + .mailmaP \ + MAILMA~1 \ + MABA30~1 +' + test_expect_success MINGW 'is_valid_path() on Windows' ' test-tool path-utils is_valid_path \ win32 \ diff --git a/t/t0064-sha1-array.sh b/t/t0064-oid-array.sh index 45685af2fd..2e5438ccda 100755 --- a/t/t0064-sha1-array.sh +++ b/t/t0064-oid-array.sh @@ -1,6 +1,6 @@ #!/bin/sh -test_description='basic tests for the SHA1 array implementation' +test_description='basic tests for the oid array implementation' . ./test-lib.sh echoid () { @@ -27,6 +27,7 @@ test_expect_success 'ordered enumeration with duplicate suppression' ' { echoid append 88 44 aa 55 && echoid append 88 44 aa 55 && + echoid append 88 44 aa 55 && echo for_each_unique } | test-tool oid-array >actual && test_cmp expect actual @@ -54,17 +55,19 @@ test_expect_success 'lookup with duplicates' ' { echoid append 88 44 aa 55 && echoid append 88 44 aa 55 && + echoid append 88 44 aa 55 && echoid lookup 55 } | test-tool oid-array >actual && n=$(cat actual) && - test "$n" -ge 2 && - test "$n" -le 3 + test "$n" -ge 3 && + test "$n" -le 5 ' test_expect_success 'lookup non-existing entry with duplicates' ' { echoid append 88 44 aa 55 && echoid append 88 44 aa 55 && + echoid append 88 44 aa 55 && echoid lookup 66 } | test-tool oid-array >actual && n=$(cat actual) && diff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh new file mode 100755 index 0000000000..4675e85251 --- /dev/null +++ b/t/t0068-for-each-repo.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +test_description='git for-each-repo builtin' + +. ./test-lib.sh + +test_expect_success 'run based on configured value' ' + git init one && + git init two && + git init three && + git -C two commit --allow-empty -m "DID NOT RUN" && + git config run.key "$TRASH_DIRECTORY/one" && + git config --add run.key "$TRASH_DIRECTORY/three" && + git for-each-repo --config=run.key commit --allow-empty -m "ran" && + git -C one log -1 --pretty=format:%s >message && + grep ran message && + git -C two log -1 --pretty=format:%s >message && + ! grep ran message && + git -C three log -1 --pretty=format:%s >message && + grep ran message && + git for-each-repo --config=run.key -- commit --allow-empty -m "ran again" && + git -C one log -1 --pretty=format:%s >message && + grep again message && + git -C two log -1 --pretty=format:%s >message && + ! grep again message && + git -C three log -1 --pretty=format:%s >message && + grep again message +' + +test_expect_success 'do nothing on empty config' ' + # the whole thing would fail if for-each-ref iterated even + # once, because "git help --no-such-option" would fail + git for-each-repo --config=bogus.config -- help --no-such-option +' + +test_done diff --git a/t/t0069-oidtree.sh b/t/t0069-oidtree.sh new file mode 100755 index 0000000000..bfb1397d7b --- /dev/null +++ b/t/t0069-oidtree.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +test_description='basic tests for the oidtree implementation' +. ./test-lib.sh + +maxhexsz=$(test_oid hexsz) +echoid () { + prefix="${1:+$1 }" + shift + while test $# -gt 0 + do + shortoid="$1" + shift + difference=$(($maxhexsz - ${#shortoid})) + printf "%s%s%0${difference}d\\n" "$prefix" "$shortoid" "0" + done +} + +test_expect_success 'oidtree insert and contains' ' + cat >expect <<-\EOF && + 0 + 0 + 0 + 1 + 1 + 0 + EOF + { + echoid insert 444 1 2 3 4 5 a b c d e && + echoid contains 44 441 440 444 4440 4444 + echo clear + } | test-tool oidtree >actual && + test_cmp expect actual +' + +test_expect_success 'oidtree each' ' + echoid "" 123 321 321 >expect && + { + echoid insert f 9 8 123 321 a b c d e + echo each 12300 + echo each 3211 + echo each 3210 + echo each 32100 + echo clear + } | test-tool oidtree >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh index 7b111a56fd..8d59905ef0 100755 --- a/t/t0070-fundamental.sh +++ b/t/t0070-fundamental.sh @@ -34,4 +34,22 @@ test_expect_success 'check for a bug in the regex routines' ' test-tool regex --bug ' +test_expect_success 'incomplete sideband messages are reassembled' ' + test-tool pkt-line send-split-sideband >split-sideband && + test-tool pkt-line receive-sideband <split-sideband 2>err && + grep "Hello, world" err +' + +test_expect_success 'eof on sideband message is reported' ' + printf 1234 >input && + test-tool pkt-line receive-sideband <input 2>err && + test_i18ngrep "unexpected disconnect" err +' + +test_expect_success 'missing sideband designator is reported' ' + printf 0004 >input && + test-tool pkt-line receive-sideband <input 2>err && + test_i18ngrep "missing sideband" err +' + test_done diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh index 5a633690bf..9bf66c9e68 100755 --- a/t/t0090-cache-tree.sh +++ b/t/t0090-cache-tree.sh @@ -10,40 +10,36 @@ cache-tree extension. cmp_cache_tree () { test-tool dump-cache-tree | sed -e '/#(ref)/d' >actual && sed "s/$OID_REGEX/SHA/" <actual >filtered && - test_cmp "$1" filtered + test_cmp "$1" filtered && + rm filtered } # We don't bother with actually checking the SHA1: # test-tool dump-cache-tree already verifies that all existing data is # correct. -generate_expected_cache_tree_rec () { - dir="$1${1:+/}" && - parent="$2" && - # ls-files might have foo/bar, foo/bar/baz, and foo/bar/quux - # We want to count only foo because it's the only direct child - git ls-files >files && - subtrees=$(grep / files|cut -d / -f 1|uniq) && - subtree_count=$(echo "$subtrees"|awk -v c=0 '$1 != "" {++c} END {print c}') && - entries=$(wc -l <files) && - printf "SHA $dir (%d entries, %d subtrees)\n" "$entries" "$subtree_count" && - for subtree in $subtrees - do - cd "$subtree" - generate_expected_cache_tree_rec "$dir$subtree" "$dir" || return 1 - cd .. - done && - dir=$parent -} - generate_expected_cache_tree () { - ( - generate_expected_cache_tree_rec - ) + pathspec="$1" && + dir="$2${2:+/}" && + git ls-tree --name-only HEAD -- "$pathspec" >files && + git ls-tree --name-only -d HEAD -- "$pathspec" >subtrees && + printf "SHA %s (%d entries, %d subtrees)\n" "$dir" $(wc -l <files) $(wc -l <subtrees) && + while read subtree + do + generate_expected_cache_tree "$pathspec/$subtree/" "$subtree" || return 1 + done <subtrees } test_cache_tree () { - generate_expected_cache_tree >expect && - cmp_cache_tree expect + generate_expected_cache_tree "." >expect && + cmp_cache_tree expect && + rm expect actual files subtrees && + git status --porcelain -- ':!status' ':!expected.status' >status && + if test -n "$1" + then + test_cmp "$1" status + else + test_must_be_empty status + fi } test_invalid_cache_tree () { @@ -54,7 +50,7 @@ test_invalid_cache_tree () { } test_no_cache_tree () { - : >expect && + >expect && cmp_cache_tree expect } @@ -83,18 +79,6 @@ test_expect_success 'git-add in subdir invalidates cache-tree' ' test_invalid_cache_tree ' -cat >before <<\EOF -SHA (3 entries, 2 subtrees) -SHA dir1/ (1 entries, 0 subtrees) -SHA dir2/ (1 entries, 0 subtrees) -EOF - -cat >expect <<\EOF -invalid (2 subtrees) -invalid dir1/ (0 subtrees) -SHA dir2/ (1 entries, 0 subtrees) -EOF - test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' ' git tag no-children && test_when_finished "git reset --hard no-children; git read-tree HEAD" && @@ -102,9 +86,20 @@ test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' ' test_commit dir1/a && test_commit dir2/b && echo "I changed this file" >dir1/a && + test_when_finished "rm before" && + cat >before <<-\EOF && + SHA (3 entries, 2 subtrees) + SHA dir1/ (1 entries, 0 subtrees) + SHA dir2/ (1 entries, 0 subtrees) + EOF cmp_cache_tree before && echo "I changed this file" >dir1/a && git add dir1/a && + cat >expect <<-\EOF && + invalid (2 subtrees) + invalid dir1/ (0 subtrees) + SHA dir2/ (1 entries, 0 subtrees) + EOF cmp_cache_tree expect ' @@ -133,6 +128,7 @@ test_expect_success 'second commit has cache-tree' ' ' test_expect_success PERL 'commit --interactive gives cache-tree on partial commit' ' + test_when_finished "git reset --hard" && cat <<-\EOT >foo.c && int foo() { @@ -159,7 +155,10 @@ test_expect_success PERL 'commit --interactive gives cache-tree on partial commi EOT test_write_lines p 1 "" s n y q | git commit --interactive -m foo && - test_cache_tree + cat <<-\EOF >expected.status && + M foo.c + EOF + test_cache_tree expected.status ' test_expect_success PERL 'commit -p with shrinking cache-tree' ' @@ -250,7 +249,10 @@ test_expect_success 'partial commit gives cache-tree' ' git add one.t && echo "some other change" >two.t && git commit two.t -m partial && - test_cache_tree + cat <<-\EOF >expected.status && + M one.t + EOF + test_cache_tree expected.status ' test_expect_success 'no phantom error when switching trees' ' diff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh index 232ba2c485..7e4ab1795f 100755 --- a/t/t0095-bloom.sh +++ b/t/t0095-bloom.sh @@ -71,8 +71,8 @@ test_expect_success 'get bloom filters for commit with no changes' ' git init && git commit --allow-empty -m "c0" && cat >expect <<-\EOF && - Filter_Length:0 - Filter_Data: + Filter_Length:1 + Filter_Data:00| EOF test-tool bloom get_filter_for_commit "$(git rev-parse HEAD)" >actual && test_cmp expect actual @@ -107,8 +107,8 @@ test_expect_success EXPENSIVE 'get bloom filter for commit with 513 changes' ' git add bigDir && git commit -m "commit with 513 changes" && cat >expect <<-\EOF && - Filter_Length:0 - Filter_Data: + Filter_Length:1 + Filter_Data:ff| EOF test-tool bloom get_filter_for_commit "$(git rev-parse HEAD)" >actual && test_cmp expect actual diff --git a/t/t0100-previous.sh b/t/t0100-previous.sh index 58c0b7e9b6..69beb59f62 100755 --- a/t/t0100-previous.sh +++ b/t/t0100-previous.sh @@ -2,13 +2,16 @@ test_description='previous branch syntax @{-n}' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'branch -d @{-1}' ' test_commit A && git checkout -b junk && git checkout - && - test "$(git symbolic-ref HEAD)" = refs/heads/master && + test "$(git symbolic-ref HEAD)" = refs/heads/main && git branch -d @{-1} && test_must_fail git rev-parse --verify refs/heads/junk ' @@ -17,9 +20,9 @@ test_expect_success 'branch -d @{-12} when there is not enough switches yet' ' git reflog expire --expire=now && git checkout -b junk2 && git checkout - && - test "$(git symbolic-ref HEAD)" = refs/heads/master && + test "$(git symbolic-ref HEAD)" = refs/heads/main && test_must_fail git branch -d @{-12} && - git rev-parse --verify refs/heads/master + git rev-parse --verify refs/heads/main ' test_expect_success 'merge @{-1}' ' @@ -28,19 +31,19 @@ test_expect_success 'merge @{-1}' ' git checkout A && test_commit C && test_commit D && - git branch -f master B && + git branch -f main B && git branch -f other && git checkout other && - git checkout master && + git checkout main && git merge @{-1} && git cat-file commit HEAD | grep "Merge branch '\''other'\''" ' test_expect_success 'merge @{-1}~1' ' - git checkout master && + git checkout main && git reset --hard B && git checkout other && - git checkout master && + git checkout main && git merge @{-1}~1 && git cat-file commit HEAD >actual && grep "Merge branch '\''other'\''" actual @@ -48,11 +51,11 @@ test_expect_success 'merge @{-1}~1' ' test_expect_success 'merge @{-100} before checking out that many branches yet' ' git reflog expire --expire=now && - git checkout -f master && + git checkout -f main && git reset --hard B && git branch -f other C && git checkout other && - git checkout master && + git checkout main && test_must_fail git merge @{-100} ' diff --git a/t/t0201-gettext-fallbacks.sh b/t/t0201-gettext-fallbacks.sh index 90da1c7ddc..6c74df0dc6 100755 --- a/t/t0201-gettext-fallbacks.sh +++ b/t/t0201-gettext-fallbacks.sh @@ -18,7 +18,7 @@ test_expect_success 'sanity: $GIT_INTERNAL_GETTEXT_TEST_FALLBACKS is set' ' test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS" ' -test_expect_success C_LOCALE_OUTPUT 'sanity: $GIT_INTERNAL_GETTEXT_SH_SCHEME" is fallthrough' ' +test_expect_success 'sanity: $GIT_INTERNAL_GETTEXT_SH_SCHEME" is fallthrough' ' echo fallthrough >expect && echo $GIT_INTERNAL_GETTEXT_SH_SCHEME >actual && test_cmp expect actual @@ -27,25 +27,25 @@ test_expect_success C_LOCALE_OUTPUT 'sanity: $GIT_INTERNAL_GETTEXT_SH_SCHEME" is test_expect_success 'gettext: our gettext() fallback has pass-through semantics' ' printf "test" >expect && gettext "test" >actual && - test_i18ncmp expect actual && + test_cmp expect actual && printf "test more words" >expect && gettext "test more words" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'eval_gettext: our eval_gettext() fallback has pass-through semantics' ' printf "test" >expect && eval_gettext "test" >actual && - test_i18ncmp expect actual && + test_cmp expect actual && printf "test more words" >expect && eval_gettext "test more words" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'eval_gettext: our eval_gettext() fallback can interpolate variables' ' printf "test YesPlease" >expect && GIT_INTERNAL_GETTEXT_TEST_FALLBACKS=YesPlease eval_gettext "test \$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'eval_gettext: our eval_gettext() fallback can interpolate variables with spaces' ' @@ -53,7 +53,7 @@ test_expect_success 'eval_gettext: our eval_gettext() fallback can interpolate v export cmdline && printf "When you have resolved this problem, run git am --resolved." >expect && eval_gettext "When you have resolved this problem, run \$cmdline --resolved." >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'eval_gettext: our eval_gettext() fallback can interpolate variables with spaces and quotes' ' @@ -61,7 +61,7 @@ test_expect_success 'eval_gettext: our eval_gettext() fallback can interpolate v export cmdline && printf "When you have resolved this problem, run \"git am --resolved\"." >expect && eval_gettext "When you have resolved this problem, run \"\$cmdline --resolved\"." >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_done diff --git a/t/t0205-gettext-poison.sh b/t/t0205-gettext-poison.sh deleted file mode 100755 index f9fa16ad83..0000000000 --- a/t/t0205-gettext-poison.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2010 Ævar Arnfjörð Bjarmason -# - -test_description='Gettext Shell poison' - -GIT_TEST_GETTEXT_POISON=true -export GIT_TEST_GETTEXT_POISON -. ./lib-gettext.sh - -test_expect_success 'sanity: $GIT_INTERNAL_GETTEXT_SH_SCHEME" is poison' ' - test "$GIT_INTERNAL_GETTEXT_SH_SCHEME" = "poison" -' - -test_expect_success 'gettext: our gettext() fallback has poison semantics' ' - printf "# GETTEXT POISON #" >expect && - gettext "test" >actual && - test_cmp expect actual && - printf "# GETTEXT POISON #" >expect && - gettext "test more words" >actual && - test_cmp expect actual -' - -test_expect_success 'eval_gettext: our eval_gettext() fallback has poison semantics' ' - printf "# GETTEXT POISON #" >expect && - eval_gettext "test" >actual && - test_cmp expect actual && - printf "# GETTEXT POISON #" >expect && - eval_gettext "test more words" >actual && - test_cmp expect actual -' - -test_expect_success "gettext: invalid GIT_TEST_GETTEXT_POISON value doesn't infinitely loop" " - test_must_fail env GIT_TEST_GETTEXT_POISON=xyz git version 2>error && - grep \"fatal: bad numeric config value 'xyz' for 'GIT_TEST_GETTEXT_POISON': invalid unit\" error -" - -test_done diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh index ce7574edb1..0cf3a63b75 100755 --- a/t/t0210-trace2-normal.sh +++ b/t/t0210-trace2-normal.sh @@ -147,6 +147,25 @@ test_expect_success 'normal stream, error event' ' test_cmp expect actual ' +# Verb 007bug +# +# Check that BUG writes to trace2 + +test_expect_success 'BUG messages are written to trace2' ' + test_when_finished "rm trace.normal actual expect" && + test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 007bug && + perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + cat >expect <<-EOF && + version $V + start _EXE_ trace2 007bug + cmd_name trace2 (trace2) + error the bug message + exit elapsed:_TIME_ code:99 + atexit elapsed:_TIME_ code:99 + EOF + test_cmp expect actual +' + sane_unset GIT_TRACE2_BRIEF # Now test without environment variables and get all Trace2 settings diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh index bc2d74098f..3485c0534e 100755 --- a/t/t0300-credentials.sh +++ b/t/t0300-credentials.sh @@ -265,6 +265,32 @@ test_expect_success 'internal getpass does not ask for known username' ' EOF ' +test_expect_success 'git-credential respects core.askPass' ' + write_script alternate-askpass <<-\EOF && + echo >&2 "alternate askpass invoked" + echo alternate-value + EOF + test_config core.askpass "$PWD/alternate-askpass" && + ( + # unset GIT_ASKPASS set by lib-credential.sh which would + # override our config, but do so in a subshell so that we do + # not interfere with other tests + sane_unset GIT_ASKPASS && + check fill <<-\EOF + protocol=http + host=example.com + -- + protocol=http + host=example.com + username=alternate-value + password=alternate-value + -- + alternate askpass invoked + alternate askpass invoked + EOF + ) +' + HELPER="!f() { cat >/dev/null echo username=foo @@ -552,7 +578,7 @@ test_expect_success 'helpers can abort the process' ' quit: host=example.com fatal: credential helper '\''quit'\'' told us to quit EOF - test_i18ncmp expect stderr + test_cmp expect stderr ' test_expect_success 'empty helper spec resets helper list' ' @@ -580,7 +606,7 @@ test_expect_success 'url parser rejects embedded newlines' ' warning: url contains a newline in its path component: https://one.example.com?%0ahost=two.example.com/ fatal: credential url cannot be parsed: https://one.example.com?%0ahost=two.example.com/ EOF - test_i18ncmp expect stderr + test_cmp expect stderr ' test_expect_success 'host-less URLs are parsed as empty host' ' @@ -607,7 +633,7 @@ test_expect_success 'credential system refuses to work with missing host' ' cat >expect <<-\EOF && fatal: refusing to work with credential missing host field EOF - test_i18ncmp expect stderr + test_cmp expect stderr ' test_expect_success 'credential system refuses to work with missing protocol' ' @@ -617,7 +643,7 @@ test_expect_success 'credential system refuses to work with missing protocol' ' cat >expect <<-\EOF && fatal: refusing to work with credential missing protocol field EOF - test_i18ncmp expect stderr + test_cmp expect stderr ' # usage: check_host_and_path <url> <expected-host> <expected-path> diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh index 584a039b85..a211a66c67 100755 --- a/t/t0410-partial-clone.sh +++ b/t/t0410-partial-clone.sh @@ -604,6 +604,29 @@ test_expect_success 'do not fetch when checking existence of tree we construct o git -C repo cherry-pick side1 ' +test_expect_success 'lazy-fetch when accessing object not in the_repository' ' + rm -rf full partial.git && + test_create_repo full && + test_commit -C full create-a-file file.txt && + + test_config -C full uploadpack.allowfilter 1 && + test_config -C full uploadpack.allowanysha1inwant 1 && + git clone --filter=blob:none --bare "file://$(pwd)/full" partial.git && + FILE_HASH=$(git -C full rev-parse HEAD:file.txt) && + + # Sanity check that the file is missing + git -C partial.git rev-list --objects --missing=print HEAD >out && + grep "[?]$FILE_HASH" out && + + git -C full cat-file -s "$FILE_HASH" >expect && + test-tool partial-clone object-info partial.git "$FILE_HASH" >actual && + test_cmp expect actual && + + # Sanity check that the file is now present + git -C partial.git rev-list --objects --missing=print HEAD >out && + ! grep "[?]$FILE_HASH" out +' + . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd diff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh index 1ed1df351c..22058b503a 100755 --- a/t/t0500-progress-display.sh +++ b/t/t0500-progress-display.sh @@ -29,7 +29,7 @@ test_expect_success 'simple progress display' ' test-tool progress "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display with total' ' @@ -48,7 +48,7 @@ test_expect_success 'progress display with total' ' test-tool progress --total=3 "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display breaks long lines #1' ' @@ -72,7 +72,7 @@ EOF <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display breaks long lines #2' ' @@ -100,7 +100,7 @@ EOF <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display breaks long lines #3 - even the first is too long' ' @@ -126,7 +126,7 @@ EOF <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display breaks long lines #4 - title line matches terminal width' ' @@ -150,7 +150,7 @@ EOF <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' # Progress counter goes backwards, this should not happen in practice. @@ -172,7 +172,7 @@ test_expect_success 'progress shortens - crazy caller' ' test-tool progress --total=1000 "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display with throughput' ' @@ -201,7 +201,7 @@ test_expect_success 'progress display with throughput' ' test-tool progress "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress display with throughput and total' ' @@ -226,7 +226,7 @@ test_expect_success 'progress display with throughput and total' ' test-tool progress --total=40 "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'cover up after throughput shortens' ' @@ -255,7 +255,7 @@ test_expect_success 'cover up after throughput shortens' ' test-tool progress "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'cover up after throughput shortens a lot' ' @@ -280,7 +280,7 @@ test_expect_success 'cover up after throughput shortens a lot' ' test-tool progress "Working hard" <in 2>stderr && show_cr <stderr >out && - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'progress generates traces' ' @@ -303,8 +303,7 @@ test_expect_success 'progress generates traces' ' "Working hard" <in 2>stderr && # t0212/parse_events.perl intentionally omits regions and data. - grep -e "region_enter" -e "\"category\":\"progress\"" trace.event && - grep -e "region_leave" -e "\"category\":\"progress\"" trace.event && + test_region progress "Working hard" trace.event && grep "\"key\":\"total_objects\",\"value\":\"40\"" trace.event && grep "\"key\":\"total_bytes\",\"value\":\"409600\"" trace.event ' diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh index c13578a635..11bf10424f 100755 --- a/t/t1004-read-tree-m-u-wf.sh +++ b/t/t1004-read-tree-m-u-wf.sh @@ -2,6 +2,9 @@ test_description='read-tree -m -u checks working tree files' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-read-tree.sh @@ -20,17 +23,17 @@ test_expect_success 'two-way setup' ' git branch side && git tag -f branch-point && - echo file2 is not tracked on the master anymore && + echo file2 is not tracked on the main branch anymore && rm -f file2 subdir/file2 && git update-index --remove file2 subdir/file2 && - git commit -a -m "master removes file2 and subdir/file2" + git commit -a -m "main removes file2 and subdir/file2" ' test_expect_success 'two-way not clobbering' ' - echo >file2 master creates untracked file2 && - echo >subdir/file2 master creates untracked subdir/file2 && - if err=$(read_tree_u_must_succeed -m -u master side 2>&1) + echo >file2 main creates untracked file2 && + echo >subdir/file2 main creates untracked subdir/file2 && + if err=$(read_tree_u_must_succeed -m -u main side 2>&1) then echo should have complained false @@ -43,7 +46,7 @@ echo file2 >.gitignore test_expect_success 'two-way with incorrect --exclude-per-directory (1)' ' - if err=$(read_tree_u_must_succeed -m --exclude-per-directory=.gitignore master side 2>&1) + if err=$(read_tree_u_must_succeed -m --exclude-per-directory=.gitignore main side 2>&1) then echo should have complained false @@ -54,7 +57,7 @@ test_expect_success 'two-way with incorrect --exclude-per-directory (1)' ' test_expect_success 'two-way with incorrect --exclude-per-directory (2)' ' - if err=$(read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore master side 2>&1) + if err=$(read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore main side 2>&1) then echo should have complained false @@ -65,7 +68,7 @@ test_expect_success 'two-way with incorrect --exclude-per-directory (2)' ' test_expect_success 'two-way clobbering a ignored file' ' - read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore master side + read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore main side ' rm -f .gitignore @@ -81,21 +84,21 @@ test_expect_success 'three-way not complaining on an untracked path in both' ' git update-index --add file3 subdir/file3 && git commit -a -m "side adds file3 and removes file2" && - git checkout master && - echo >file2 file two is untracked on the master side && - echo >subdir/file2 file two is untracked on the master side && + git checkout main && + echo >file2 file two is untracked on the main side && + echo >subdir/file2 file two is untracked on the main side && - read_tree_u_must_succeed -m -u branch-point master side + read_tree_u_must_succeed -m -u branch-point main side ' test_expect_success 'three-way not clobbering a working tree file' ' git reset --hard && rm -f file2 subdir/file2 file3 subdir/file3 && - git checkout master && - echo >file3 file three created in master, untracked && - echo >subdir/file3 file three created in master, untracked && - if err=$(read_tree_u_must_succeed -m -u branch-point master side 2>&1) + git checkout main && + echo >file3 file three created in main, untracked && + echo >subdir/file3 file three created in main, untracked && + if err=$(read_tree_u_must_succeed -m -u branch-point main side 2>&1) then echo should have complained false @@ -110,11 +113,11 @@ test_expect_success 'three-way not complaining on an untracked file' ' git reset --hard && rm -f file2 subdir/file2 file3 subdir/file3 && - git checkout master && - echo >file3 file three created in master, untracked && - echo >subdir/file3 file three created in master, untracked && + git checkout main && + echo >file3 file three created in main, untracked && + echo >subdir/file3 file three created in main, untracked && - read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore branch-point master side + read_tree_u_must_succeed -m -u --exclude-per-directory=.gitignore branch-point main side ' test_expect_success '3-way not overwriting local changes (setup)' ' diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh index 2f501d2dc9..18b3779ccb 100755 --- a/t/t1006-cat-file.sh +++ b/t/t1006-cat-file.sh @@ -166,7 +166,7 @@ tag_content="$tag_header_without_timestamp 0000000000 +0000 $tag_description" -tag_sha1=$(echo_without_newline "$tag_content" | git mktag) +tag_sha1=$(echo_without_newline "$tag_content" | git hash-object -t tag --stdin -w) tag_size=$(strlen "$tag_content") run_tests 'tag' $tag_sha1 $tag_size "$tag_content" "$tag_content" 1 @@ -586,4 +586,26 @@ test_expect_success 'cat-file --unordered works' ' test_cmp expect actual ' +test_expect_success 'set up object list for --batch-all-objects tests' ' + git -C all-two cat-file --batch-all-objects --batch-check="%(objectname)" >objects +' + +test_expect_success 'cat-file --batch="%(objectname)" with --batch-all-objects will work' ' + git -C all-two cat-file --batch="%(objectname)" <objects >expect && + git -C all-two cat-file --batch-all-objects --batch="%(objectname)" >actual && + cmp expect actual +' + +test_expect_success 'cat-file --batch="%(rest)" with --batch-all-objects will work' ' + git -C all-two cat-file --batch="%(rest)" <objects >expect && + git -C all-two cat-file --batch-all-objects --batch="%(rest)" >actual && + cmp expect actual +' + +test_expect_success 'cat-file --batch="batman" with --batch-all-objects will work' ' + git -C all-two cat-file --batch="batman" <objects >expect && + git -C all-two cat-file --batch-all-objects --batch="batman" >actual && + cmp expect actual +' + test_done diff --git a/t/t1008-read-tree-overlay.sh b/t/t1008-read-tree-overlay.sh index cf96016844..4512fb0b6e 100755 --- a/t/t1008-read-tree-overlay.sh +++ b/t/t1008-read-tree-overlay.sh @@ -2,6 +2,9 @@ test_description='test multi-tree read-tree without merging' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-read-tree.sh @@ -22,7 +25,7 @@ test_expect_success setup ' ' test_expect_success 'multi-read' ' - read_tree_must_succeed initial master side && + read_tree_must_succeed initial main side && test_write_lines a b/c >expect && git ls-files >actual && test_cmp expect actual diff --git a/t/t1009-read-tree-new-index.sh b/t/t1009-read-tree-new-index.sh index 59b3aa4bc4..2935f68f8d 100755 --- a/t/t1009-read-tree-new-index.sh +++ b/t/t1009-read-tree-new-index.sh @@ -2,6 +2,9 @@ test_description='test read-tree into a fresh index file' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -12,13 +15,13 @@ test_expect_success setup ' test_expect_success 'non-existent index file' ' rm -f new-index && - GIT_INDEX_FILE=new-index git read-tree master + GIT_INDEX_FILE=new-index git read-tree main ' test_expect_success 'empty index file' ' rm -f new-index && > new-index && - GIT_INDEX_FILE=new-index git read-tree master + GIT_INDEX_FILE=new-index git read-tree main ' test_done diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 140f459977..24092c09a9 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -2,7 +2,7 @@ test_description='sparse checkout tests -* (tag: removed, master) removed +* (tag: removed, main) removed | D sub/added * (HEAD, tag: top) modified and added | M init.t @@ -253,7 +253,7 @@ warning: The following paths were already present and thus not updated despite s After fixing the above paths, you may want to run `git sparse-checkout reapply`. EOF - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'checkout without --ignore-skip-worktree-bits' ' diff --git a/t/t1021-rerere-in-workdir.sh b/t/t1021-rerere-in-workdir.sh index 301e071ff7..0b892894eb 100755 --- a/t/t1021-rerere-in-workdir.sh +++ b/t/t1021-rerere-in-workdir.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='rerere run in a workdir' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success SYMLINKS setup ' @@ -19,7 +22,7 @@ test_expect_success SYMLINKS setup ' test_tick && git commit -a -m goodbye && - git checkout master + git checkout main ' test_expect_success SYMLINKS 'rerere in workdir' ' diff --git a/t/t1050-large.sh b/t/t1050-large.sh index 61e89a8071..4bab6a513c 100755 --- a/t/t1050-large.sh +++ b/t/t1050-large.sh @@ -5,12 +5,6 @@ test_description='adding and checking out large blobs' . ./test-lib.sh -# This should be moved to test-lib.sh together with the -# copy in t0021 after both topics have graduated to 'master'. -file_size () { - test-tool path-utils file-size "$1" -} - test_expect_success setup ' # clone does not allow us to pass core.bigfilethreshold to # new repos, so set core.bigfilethreshold globally @@ -29,7 +23,7 @@ do test_expect_success "add with $config" ' test_when_finished "rm -f .git/objects/pack/pack-*.* .git/index" && git $config add large1 && - sz=$(file_size .git/objects/pack/pack-*.pack) && + sz=$(test_file_size .git/objects/pack/pack-*.pack) && case "$expect" in small) test "$sz" -le 100000 ;; large) test "$sz" -ge 100000 ;; diff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh index f35a73dd20..3deb490187 100755 --- a/t/t1090-sparse-checkout-scope.sh +++ b/t/t1090-sparse-checkout-scope.sh @@ -2,6 +2,9 @@ test_description='sparse checkout scope tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -20,18 +23,18 @@ test_expect_success 'create feature branch' ' git commit -m "modification" ' -test_expect_success 'perform sparse checkout of master' ' +test_expect_success 'perform sparse checkout of main' ' git config --local --bool core.sparsecheckout true && echo "!/*" >.git/info/sparse-checkout && echo "/a" >>.git/info/sparse-checkout && echo "/c" >>.git/info/sparse-checkout && - git checkout master && + git checkout main && test_path_is_file a && test_path_is_missing b && test_path_is_file c ' -test_expect_success 'merge feature branch into sparse checkout of master' ' +test_expect_success 'merge feature branch into sparse checkout of main' ' git merge feature && test_path_is_file a && test_path_is_missing b && @@ -39,10 +42,10 @@ test_expect_success 'merge feature branch into sparse checkout of master' ' test "$(cat c)" = "modified" ' -test_expect_success 'return to full checkout of master' ' +test_expect_success 'return to full checkout of main' ' git checkout feature && echo "/*" >.git/info/sparse-checkout && - git checkout master && + git checkout main && test_path_is_file a && test_path_is_file b && test_path_is_file c && diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index 84acfc48b6..38fc8340f5 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -2,6 +2,9 @@ test_description='sparse checkout builtin tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh list_files() { @@ -117,7 +120,7 @@ test_expect_success 'interaction with clone --no-checkout (unborn index)' ' test_path_is_missing clone_no_checkout/.git/index && # No branch is checked out until we manually switch to one - git -C clone_no_checkout switch master && + git -C clone_no_checkout switch main && test_path_is_file clone_no_checkout/.git/index && check_files clone_no_checkout a folder1 ' @@ -202,6 +205,19 @@ test_expect_success 'sparse-checkout disable' ' check_files repo a deep folder1 folder2 ' +test_expect_success 'sparse-index enabled and disabled' ' + git -C repo sparse-checkout init --cone --sparse-index && + test_cmp_config -C repo true index.sparse && + test-tool -C repo read-cache --table >cache && + grep " tree " cache && + + git -C repo sparse-checkout disable && + test-tool -C repo read-cache --table >cache && + ! grep " tree " cache && + git -C repo config --list >config && + ! grep index.sparse config +' + test_expect_success 'cone mode: init and set' ' git -C repo sparse-checkout init --cone && git -C repo config --list >config && diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh new file mode 100755 index 0000000000..d028b73eba --- /dev/null +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -0,0 +1,416 @@ +#!/bin/sh + +test_description='compare full workdir to sparse workdir' + +GIT_TEST_SPLIT_INDEX=0 +GIT_TEST_SPARSE_INDEX= + +. ./test-lib.sh + +test_expect_success 'setup' ' + git init initial-repo && + ( + GIT_TEST_SPARSE_INDEX=0 && + cd initial-repo && + echo a >a && + echo "after deep" >e && + echo "after folder1" >g && + echo "after x" >z && + mkdir folder1 folder2 deep x && + mkdir deep/deeper1 deep/deeper2 && + mkdir deep/deeper1/deepest && + echo "after deeper1" >deep/e && + echo "after deepest" >deep/deeper1/e && + cp a folder1 && + cp a folder2 && + cp a x && + cp a deep && + cp a deep/deeper1 && + cp a deep/deeper2 && + cp a deep/deeper1/deepest && + cp -r deep/deeper1/deepest deep/deeper2 && + git add . && + git commit -m "initial commit" && + git checkout -b base && + for dir in folder1 folder2 deep + do + git checkout -b update-$dir && + echo "updated $dir" >$dir/a && + git commit -a -m "update $dir" || return 1 + done && + + git checkout -b rename-base base && + echo >folder1/larger-content <<-\EOF && + matching + lines + help + inexact + renames + EOF + cp folder1/larger-content folder2/ && + cp folder1/larger-content deep/deeper1/ && + git add . && + git commit -m "add interesting rename content" && + + git checkout -b rename-out-to-out rename-base && + mv folder1/a folder2/b && + mv folder1/larger-content folder2/edited-content && + echo >>folder2/edited-content && + git add . && + git commit -m "rename folder1/... to folder2/..." && + + git checkout -b rename-out-to-in rename-base && + mv folder1/a deep/deeper1/b && + mv folder1/larger-content deep/deeper1/edited-content && + echo >>deep/deeper1/edited-content && + git add . && + git commit -m "rename folder1/... to deep/deeper1/..." && + + git checkout -b rename-in-to-out rename-base && + mv deep/deeper1/a folder1/b && + mv deep/deeper1/larger-content folder1/edited-content && + echo >>folder1/edited-content && + git add . && + git commit -m "rename deep/deeper1/... to folder1/..." && + + git checkout -b deepest base && + echo "updated deepest" >deep/deeper1/deepest/a && + git commit -a -m "update deepest" && + + git checkout -f base && + git reset --hard + ) +' + +init_repos () { + rm -rf full-checkout sparse-checkout sparse-index && + + # create repos in initial state + cp -r initial-repo full-checkout && + git -C full-checkout reset --hard && + + cp -r initial-repo sparse-checkout && + git -C sparse-checkout reset --hard && + + cp -r initial-repo sparse-index && + git -C sparse-index reset --hard && + + # initialize sparse-checkout definitions + git -C sparse-checkout sparse-checkout init --cone && + git -C sparse-checkout sparse-checkout set deep && + git -C sparse-index sparse-checkout init --cone --sparse-index && + test_cmp_config -C sparse-index true index.sparse && + git -C sparse-index sparse-checkout set deep +} + +run_on_sparse () { + ( + cd sparse-checkout && + GIT_PROGRESS_DELAY=100000 "$@" >../sparse-checkout-out 2>../sparse-checkout-err + ) && + ( + cd sparse-index && + GIT_PROGRESS_DELAY=100000 "$@" >../sparse-index-out 2>../sparse-index-err + ) +} + +run_on_all () { + ( + cd full-checkout && + GIT_PROGRESS_DELAY=100000 "$@" >../full-checkout-out 2>../full-checkout-err + ) && + run_on_sparse "$@" +} + +test_all_match () { + run_on_all "$@" && + test_cmp full-checkout-out sparse-checkout-out && + test_cmp full-checkout-out sparse-index-out && + test_cmp full-checkout-err sparse-checkout-err && + test_cmp full-checkout-err sparse-index-err +} + +test_sparse_match () { + run_on_sparse "$@" && + test_cmp sparse-checkout-out sparse-index-out && + test_cmp sparse-checkout-err sparse-index-err +} + +test_expect_success 'sparse-index contents' ' + init_repos && + + test-tool -C sparse-index read-cache --table >cache && + for dir in folder1 folder2 x + do + TREE=$(git -C sparse-index rev-parse HEAD:$dir) && + grep "040000 tree $TREE $dir/" cache \ + || return 1 + done && + + git -C sparse-index sparse-checkout set folder1 && + + test-tool -C sparse-index read-cache --table >cache && + for dir in deep folder2 x + do + TREE=$(git -C sparse-index rev-parse HEAD:$dir) && + grep "040000 tree $TREE $dir/" cache \ + || return 1 + done && + + git -C sparse-index sparse-checkout set deep/deeper1 && + + test-tool -C sparse-index read-cache --table >cache && + for dir in deep/deeper2 folder1 folder2 x + do + TREE=$(git -C sparse-index rev-parse HEAD:$dir) && + grep "040000 tree $TREE $dir/" cache \ + || return 1 + done && + + # Disabling the sparse-index removes tree entries with full ones + git -C sparse-index sparse-checkout init --no-sparse-index && + + test-tool -C sparse-index read-cache --table >cache && + ! grep "040000 tree" cache && + test_sparse_match test-tool read-cache --table +' + +test_expect_success 'expanded in-memory index matches full index' ' + init_repos && + test_sparse_match test-tool read-cache --expand --table +' + +test_expect_success 'status with options' ' + init_repos && + test_sparse_match ls && + test_all_match git status --porcelain=v2 && + test_all_match git status --porcelain=v2 -z -u && + test_all_match git status --porcelain=v2 -uno && + run_on_all touch README.md && + test_all_match git status --porcelain=v2 && + test_all_match git status --porcelain=v2 -z -u && + test_all_match git status --porcelain=v2 -uno && + test_all_match git add README.md && + test_all_match git status --porcelain=v2 && + test_all_match git status --porcelain=v2 -z -u && + test_all_match git status --porcelain=v2 -uno +' + +test_expect_success 'add, commit, checkout' ' + init_repos && + + write_script edit-contents <<-\EOF && + echo text >>$1 + EOF + run_on_all ../edit-contents README.md && + + test_all_match git add README.md && + test_all_match git status --porcelain=v2 && + test_all_match git commit -m "Add README.md" && + + test_all_match git checkout HEAD~1 && + test_all_match git checkout - && + + run_on_all ../edit-contents README.md && + + test_all_match git add -A && + test_all_match git status --porcelain=v2 && + test_all_match git commit -m "Extend README.md" && + + test_all_match git checkout HEAD~1 && + test_all_match git checkout - && + + run_on_all ../edit-contents deep/newfile && + + test_all_match git status --porcelain=v2 -uno && + test_all_match git status --porcelain=v2 && + test_all_match git add . && + test_all_match git status --porcelain=v2 && + test_all_match git commit -m "add deep/newfile" && + + test_all_match git checkout HEAD~1 && + test_all_match git checkout - +' + +test_expect_success 'checkout and reset --hard' ' + init_repos && + + test_all_match git checkout update-folder1 && + test_all_match git status --porcelain=v2 && + + test_all_match git checkout update-deep && + test_all_match git status --porcelain=v2 && + + test_all_match git checkout -b reset-test && + test_all_match git reset --hard deepest && + test_all_match git reset --hard update-folder1 && + test_all_match git reset --hard update-folder2 +' + +test_expect_success 'diff --staged' ' + init_repos && + + write_script edit-contents <<-\EOF && + echo text >>README.md + EOF + run_on_all ../edit-contents && + + test_all_match git diff && + test_all_match git diff --staged && + test_all_match git add README.md && + test_all_match git diff && + test_all_match git diff --staged +' + +test_expect_success 'diff with renames' ' + init_repos && + + for branch in rename-out-to-out rename-out-to-in rename-in-to-out + do + test_all_match git checkout rename-base && + test_all_match git checkout $branch -- . && + test_all_match git diff --staged --no-renames && + test_all_match git diff --staged --find-renames || return 1 + done +' + +test_expect_success 'log with pathspec outside sparse definition' ' + init_repos && + + test_all_match git log -- a && + test_all_match git log -- folder1/a && + test_all_match git log -- folder2/a && + test_all_match git log -- deep/a && + test_all_match git log -- deep/deeper1/a && + test_all_match git log -- deep/deeper1/deepest/a && + + test_all_match git checkout update-folder1 && + test_all_match git log -- folder1/a +' + +test_expect_success 'blame with pathspec inside sparse definition' ' + init_repos && + + test_all_match git blame a && + test_all_match git blame deep/a && + test_all_match git blame deep/deeper1/a && + test_all_match git blame deep/deeper1/deepest/a +' + +# TODO: blame currently does not support blaming files outside of the +# sparse definition. It complains that the file doesn't exist locally. +test_expect_failure 'blame with pathspec outside sparse definition' ' + init_repos && + + test_all_match git blame folder1/a && + test_all_match git blame folder2/a && + test_all_match git blame deep/deeper2/a && + test_all_match git blame deep/deeper2/deepest/a +' + +# TODO: reset currently does not behave as expected when in a +# sparse-checkout. +test_expect_failure 'checkout and reset (mixed)' ' + init_repos && + + test_all_match git checkout -b reset-test update-deep && + test_all_match git reset deepest && + test_all_match git reset update-folder1 && + test_all_match git reset update-folder2 +' + +# Ensure that sparse-index behaves identically to +# sparse-checkout with a full index. +test_expect_success 'checkout and reset (mixed) [sparse]' ' + init_repos && + + test_sparse_match git checkout -b reset-test update-deep && + test_sparse_match git reset deepest && + test_sparse_match git reset update-folder1 && + test_sparse_match git reset update-folder2 +' + +test_expect_success 'merge' ' + init_repos && + + test_all_match git checkout -b merge update-deep && + test_all_match git merge -m "folder1" update-folder1 && + test_all_match git rev-parse HEAD^{tree} && + test_all_match git merge -m "folder2" update-folder2 && + test_all_match git rev-parse HEAD^{tree} +' + +test_expect_success 'merge with outside renames' ' + init_repos && + + for type in out-to-out out-to-in in-to-out + do + test_all_match git reset --hard && + test_all_match git checkout -f -b merge-$type update-deep && + test_all_match git merge -m "$type" rename-$type && + test_all_match git rev-parse HEAD^{tree} || return 1 + done +' + +test_expect_success 'clean' ' + init_repos && + + echo bogus >>.gitignore && + run_on_all cp ../.gitignore . && + test_all_match git add .gitignore && + test_all_match git commit -m "ignore bogus files" && + + run_on_sparse mkdir folder1 && + run_on_all touch folder1/bogus && + + test_all_match git status --porcelain=v2 && + test_all_match git clean -f && + test_all_match git status --porcelain=v2 && + test_sparse_match ls && + test_sparse_match ls folder1 && + + test_all_match git clean -xf && + test_all_match git status --porcelain=v2 && + test_sparse_match ls && + test_sparse_match ls folder1 && + + test_all_match git clean -xdf && + test_all_match git status --porcelain=v2 && + test_sparse_match ls && + test_sparse_match ls folder1 && + + test_sparse_match test_path_is_dir folder1 +' + +test_expect_success 'submodule handling' ' + init_repos && + + test_all_match mkdir modules && + test_all_match touch modules/a && + test_all_match git add modules && + test_all_match git commit -m "add modules directory" && + + run_on_all git submodule add "$(pwd)/initial-repo" modules/sub && + test_all_match git commit -m "add submodule" && + + # having a submodule prevents "modules" from collapse + test-tool -C sparse-index read-cache --table >cache && + grep "100644 blob .* modules/a" cache && + grep "160000 commit $(git -C initial-repo rev-parse HEAD) modules/sub" cache +' + +test_expect_success 'sparse-index is expanded and converted back' ' + init_repos && + + GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \ + git -C sparse-index -c core.fsmonitor="" reset --hard && + test_region index convert_to_sparse trace2.txt && + test_region index ensure_full_index trace2.txt && + + rm trace2.txt && + GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \ + git -C sparse-index -c core.fsmonitor="" status -uno && + test_region index ensure_full_index trace2.txt +' + +test_done diff --git a/t/t1300-config.sh b/t/t1300-config.sh index 97ebfe1f9d..9ff46f3b04 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -5,6 +5,9 @@ test_description='Test git config in different settings' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'clear default config' ' @@ -12,75 +15,75 @@ test_expect_success 'clear default config' ' ' cat > expect << EOF -[core] +[section] penguin = little blue EOF test_expect_success 'initial' ' - git config core.penguin "little blue" && + git config section.penguin "little blue" && test_cmp expect .git/config ' cat > expect << EOF -[core] +[section] penguin = little blue Movie = BadPhysics EOF test_expect_success 'mixed case' ' - git config Core.Movie BadPhysics && + git config Section.Movie BadPhysics && test_cmp expect .git/config ' cat > expect << EOF -[core] +[section] penguin = little blue Movie = BadPhysics -[Cores] +[Sections] WhatEver = Second EOF test_expect_success 'similar section' ' - git config Cores.WhatEver Second && + git config Sections.WhatEver Second && test_cmp expect .git/config ' cat > expect << EOF -[core] +[section] penguin = little blue Movie = BadPhysics UPPERCASE = true -[Cores] +[Sections] WhatEver = Second EOF test_expect_success 'uppercase section' ' - git config CORE.UPPERCASE true && + git config SECTION.UPPERCASE true && test_cmp expect .git/config ' test_expect_success 'replace with non-match' ' - git config core.penguin kingpin !blue + git config section.penguin kingpin !blue ' test_expect_success 'replace with non-match (actually matching)' ' - git config core.penguin "very blue" !kingpin + git config section.penguin "very blue" !kingpin ' cat > expect << EOF -[core] +[section] penguin = very blue Movie = BadPhysics UPPERCASE = true penguin = kingpin -[Cores] +[Sections] WhatEver = Second EOF test_expect_success 'non-match result' 'test_cmp expect .git/config' test_expect_success 'find mixed-case key by canonical name' ' - test_cmp_config Second cores.whatever + test_cmp_config Second sections.whatever ' test_expect_success 'find mixed-case key by non-canonical name' ' - test_cmp_config Second CoReS.WhAtEvEr + test_cmp_config Second SeCtIoNs.WhAtEvEr ' test_expect_success 'subsections are not canonicalized by git-config' ' @@ -469,7 +472,8 @@ test_expect_success 'new variable inserts into proper section' ' ' test_expect_success 'alternative --file (non-existing file should fail)' ' - test_must_fail git config --file non-existing-config -l + test_must_fail git config --file non-existing-config -l && + test_must_fail git config --file non-existing-config test.xyzzy ' cat > other-config << EOF @@ -506,10 +510,6 @@ test_expect_success 'editing stdin is an error' ' test_expect_success 'refer config from subdirectory' ' mkdir x && - test_cmp_config -C x strasse --get --file ../other-config ein.bahn -' - -test_expect_success 'refer config from subdirectory via --file' ' test_cmp_config -C x strasse --file=../other-config --get ein.bahn ' @@ -675,6 +675,13 @@ test_expect_success 'invalid unit' ' test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual ' +test_expect_success 'invalid unit boolean' ' + git config commit.gpgsign "1true" && + test_cmp_config 1true commit.gpgsign && + test_must_fail git config --bool --get commit.gpgsign 2>actual && + test_i18ngrep "bad boolean config value .1true. for .commit.gpgsign." actual +' + test_expect_success 'line number is reported correctly' ' printf "[bool]\n\tvar\n" >invalid && test_must_fail git config -f invalid --path bool.var 2>actual && @@ -1036,11 +1043,6 @@ test_expect_success SYMLINKS 'symlinked configuration' ' test_cmp expect actual ' -test_expect_success 'nonexistent configuration' ' - test_must_fail git config --file=doesnotexist --list && - test_must_fail git config --file=doesnotexist test.xyzzy -' - test_expect_success SYMLINKS 'symlink to nonexistent configuration' ' ln -s doesnotexist linktonada && ln -s linktonada linktolinktonada && @@ -1054,8 +1056,8 @@ test_expect_success 'check split_cmdline return' " echo foo > foo && git add foo && git commit -m 'initial commit' && - git config branch.master.mergeoptions 'echo \"' && - test_must_fail git merge master + git config branch.main.mergeoptions 'echo \"' && + test_must_fail git merge main " test_expect_success 'git -c "key=value" support' ' @@ -1065,12 +1067,12 @@ test_expect_success 'git -c "key=value" support' ' true EOF { - git -c core.name=value config core.name && + git -c section.name=value config section.name && git -c foo.CamelCase=value config foo.camelcase && git -c foo.flag config --bool foo.flag } >actual && test_cmp expect actual && - test_must_fail git -c name=value config core.name + test_must_fail git -c name=value config section.name ' # We just need a type-specifier here that cares about the @@ -1115,7 +1117,7 @@ test_expect_success 'aliases can be CamelCased' ' test_expect_success 'git -c does not split values on equals' ' echo "value with = in it" >expect && - git -c core.foo="value with = in it" config core.foo >actual && + git -c section.foo="value with = in it" config section.foo >actual && test_cmp expect actual ' @@ -1294,6 +1296,58 @@ test_expect_success 'git -c is not confused by empty environment' ' GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list ' +test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' ' + v="${SQ}key.one=foo${SQ}" && + v="$v ${SQ}key.two=bar${SQ}" && + v="$v ${SQ}key.ambiguous=section.whatever=value${SQ}" && + GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual && + cat >expect <<-EOF && + key.one foo + key.two bar + key.ambiguous section.whatever=value + EOF + test_cmp expect actual +' + +test_expect_success 'GIT_CONFIG_PARAMETERS handles new-style entries' ' + v="${SQ}key.one${SQ}=${SQ}foo${SQ}" && + v="$v ${SQ}key.two${SQ}=${SQ}bar${SQ}" && + v="$v ${SQ}key.ambiguous=section.whatever${SQ}=${SQ}value${SQ}" && + GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual && + cat >expect <<-EOF && + key.one foo + key.two bar + key.ambiguous=section.whatever value + EOF + test_cmp expect actual +' + +test_expect_success 'old and new-style entries can mix' ' + v="${SQ}key.oldone=oldfoo${SQ}" && + v="$v ${SQ}key.newone${SQ}=${SQ}newfoo${SQ}" && + v="$v ${SQ}key.oldtwo=oldbar${SQ}" && + v="$v ${SQ}key.newtwo${SQ}=${SQ}newbar${SQ}" && + GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual && + cat >expect <<-EOF && + key.oldone oldfoo + key.newone newfoo + key.oldtwo oldbar + key.newtwo newbar + EOF + test_cmp expect actual +' + +test_expect_success 'old and new bools with ambiguous subsection' ' + v="${SQ}key.with=equals.oldbool${SQ}" && + v="$v ${SQ}key.with=equals.newbool${SQ}=" && + GIT_CONFIG_PARAMETERS=$v git config --get-regexp "key.*" >actual && + cat >expect <<-EOF && + key.with equals.oldbool + key.with=equals.newbool + EOF + test_cmp expect actual +' + test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' ' cat >expect <<-\EOF && env.one one @@ -1316,6 +1370,186 @@ test_expect_success 'detect bogus GIT_CONFIG_PARAMETERS' ' git config --get-regexp "env.*" ' +test_expect_success 'git --config-env=key=envvar support' ' + cat >expect <<-\EOF && + value + value + value + value + false + false + EOF + { + ENVVAR=value git --config-env=core.name=ENVVAR config core.name && + ENVVAR=value git --config-env core.name=ENVVAR config core.name && + ENVVAR=value git --config-env=foo.CamelCase=ENVVAR config foo.camelcase && + ENVVAR=value git --config-env foo.CamelCase=ENVVAR config foo.camelcase && + ENVVAR= git --config-env=foo.flag=ENVVAR config --bool foo.flag && + ENVVAR= git --config-env foo.flag=ENVVAR config --bool foo.flag + } >actual && + test_cmp expect actual +' + +test_expect_success 'git --config-env with missing value' ' + test_must_fail env ENVVAR=value git --config-env 2>error && + grep "no config key given for --config-env" error && + test_must_fail env ENVVAR=value git --config-env config core.name 2>error && + grep "invalid config format: config" error +' + +test_expect_success 'git --config-env fails with invalid parameters' ' + test_must_fail git --config-env=foo.flag config --bool foo.flag 2>error && + test_i18ngrep "invalid config format: foo.flag" error && + test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error && + test_i18ngrep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error && + sane_unset NONEXISTENT && + test_must_fail git --config-env=foo.flag=NONEXISTENT config --bool foo.flag 2>error && + test_i18ngrep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error +' + +test_expect_success 'git -c and --config-env work together' ' + cat >expect <<-\EOF && + bar.cmd cmd-value + bar.env env-value + EOF + ENVVAR=env-value git \ + -c bar.cmd=cmd-value \ + --config-env=bar.env=ENVVAR \ + config --get-regexp "^bar.*" >actual && + test_cmp expect actual +' + +test_expect_success 'git -c and --config-env override each other' ' + cat >expect <<-\EOF && + env + cmd + EOF + { + ENVVAR=env git -c bar.bar=cmd --config-env=bar.bar=ENVVAR config bar.bar && + ENVVAR=env git --config-env=bar.bar=ENVVAR -c bar.bar=cmd config bar.bar + } >actual && + test_cmp expect actual +' + +test_expect_success '--config-env handles keys with equals' ' + echo value=with=equals >expect && + ENVVAR=value=with=equals git \ + --config-env=section.subsection=with=equals.key=ENVVAR \ + config section.subsection=with=equals.key >actual && + test_cmp expect actual +' + +test_expect_success 'git config handles environment config pairs' ' + GIT_CONFIG_COUNT=2 \ + GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="foo" \ + GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="bar" \ + git config --get-regexp "pair.*" >actual && + cat >expect <<-EOF && + pair.one foo + pair.two bar + EOF + test_cmp expect actual +' + +test_expect_success 'git config ignores pairs without count' ' + test_must_fail env GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \ + git config pair.one 2>error && + test_must_be_empty error +' + +test_expect_success 'git config ignores pairs with zero count' ' + test_must_fail env \ + GIT_CONFIG_COUNT=0 \ + GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \ + git config pair.one +' + +test_expect_success 'git config ignores pairs exceeding count' ' + GIT_CONFIG_COUNT=1 \ + GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \ + GIT_CONFIG_KEY_1="pair.two" GIT_CONFIG_VALUE_1="value" \ + git config --get-regexp "pair.*" >actual && + cat >expect <<-EOF && + pair.one value + EOF + test_cmp expect actual +' + +test_expect_success 'git config ignores pairs with zero count' ' + test_must_fail env \ + GIT_CONFIG_COUNT=0 GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \ + git config pair.one >error && + test_must_be_empty error +' + +test_expect_success 'git config ignores pairs with empty count' ' + test_must_fail env \ + GIT_CONFIG_COUNT= GIT_CONFIG_KEY_0="pair.one" GIT_CONFIG_VALUE_0="value" \ + git config pair.one >error && + test_must_be_empty error +' + +test_expect_success 'git config fails with invalid count' ' + test_must_fail env GIT_CONFIG_COUNT=10a git config --list 2>error && + test_i18ngrep "bogus count" error && + test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config --list 2>error && + test_i18ngrep "too many entries" error +' + +test_expect_success 'git config fails with missing config key' ' + test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_VALUE_0="value" \ + git config --list 2>error && + test_i18ngrep "missing config key" error +' + +test_expect_success 'git config fails with missing config value' ' + test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0="pair.one" \ + git config --list 2>error && + test_i18ngrep "missing config value" error +' + +test_expect_success 'git config fails with invalid config pair key' ' + test_must_fail env GIT_CONFIG_COUNT=1 \ + GIT_CONFIG_KEY_0= GIT_CONFIG_VALUE_0=value \ + git config --list && + test_must_fail env GIT_CONFIG_COUNT=1 \ + GIT_CONFIG_KEY_0=missing-section GIT_CONFIG_VALUE_0=value \ + git config --list +' + +test_expect_success 'environment overrides config file' ' + test_when_finished "rm -f .git/config" && + cat >.git/config <<-EOF && + [pair] + one = value + EOF + GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=override \ + git config pair.one >actual && + cat >expect <<-EOF && + override + EOF + test_cmp expect actual +' + +test_expect_success 'GIT_CONFIG_PARAMETERS overrides environment config' ' + GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \ + GIT_CONFIG_PARAMETERS="${SQ}pair.one=override${SQ}" \ + git config pair.one >actual && + cat >expect <<-EOF && + override + EOF + test_cmp expect actual +' + +test_expect_success 'command line overrides environment config' ' + GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=pair.one GIT_CONFIG_VALUE_0=value \ + git -c pair.one=override config pair.one >actual && + cat >expect <<-EOF && + override + EOF + test_cmp expect actual +' + test_expect_success 'git config --edit works' ' git config -f tmp test.value no && echo test.value=yes >expect && @@ -1661,9 +1895,11 @@ test_expect_success '--show-origin with --list' ' file:.git/config user.override=local file:.git/config include.path=../include/relative.include file:.git/../include/relative.include user.relative=include + command line: user.environ=true command line: user.cmdline=true EOF - git -c user.cmdline=true config --list --show-origin >output && + GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=user.environ GIT_CONFIG_VALUE_0=true\ + git -c user.cmdline=true config --list --show-origin >output && test_cmp expect output ' @@ -1769,11 +2005,11 @@ test_expect_success '--show-origin blob' ' test_expect_success '--show-origin blob ref' ' cat >expect <<-\EOF && - blob:master:custom.conf user.custom=true + blob:main:custom.conf user.custom=true EOF git add "$CUSTOM_CONFIG_FILE" && git commit -m "new config file" && - git config --blob=master:"$CUSTOM_CONFIG_FILE" --show-origin --list >output && + git config --blob=main:"$CUSTOM_CONFIG_FILE" --show-origin --list >output && test_cmp expect output ' @@ -1836,60 +2072,148 @@ test_expect_success '--show-scope with --show-origin' ' test_cmp expect output ' -test_expect_success '--local requires a repo' ' - # we expect 128 to ensure that we do not simply - # fail to find anything and return code "1" - test_expect_code 128 nongit git config --local foo.bar +test_expect_success 'override global and system config' ' + test_when_finished rm -f "$HOME"/.config/git && + + cat >"$HOME"/.gitconfig <<-EOF && + [home] + config = true + EOF + mkdir -p "$HOME"/.config/git && + cat >"$HOME"/.config/git/config <<-EOF && + [xdg] + config = true + EOF + cat >.git/config <<-EOF && + [local] + config = true + EOF + cat >custom-global-config <<-EOF && + [global] + config = true + EOF + cat >custom-system-config <<-EOF && + [system] + config = true + EOF + + cat >expect <<-EOF && + global xdg.config=true + global home.config=true + local local.config=true + EOF + git config --show-scope --list >output && + test_cmp expect output && + + cat >expect <<-EOF && + system system.config=true + global global.config=true + local local.config=true + EOF + GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=custom-system-config GIT_CONFIG_GLOBAL=custom-global-config \ + git config --show-scope --list >output && + test_cmp expect output && + + cat >expect <<-EOF && + local local.config=true + EOF + GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=/dev/null GIT_CONFIG_GLOBAL=/dev/null \ + git config --show-scope --list >output && + test_cmp expect output +' + +test_expect_success 'override global and system config with missing file' ' + test_must_fail env GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=/dev/null git config --global --list && + test_must_fail env GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=does-not-exist git config --system --list && + GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=does-not-exist git version ' +test_expect_success 'system override has no effect with GIT_CONFIG_NOSYSTEM' ' + # `git config --system` has different semantics compared to other + # commands as it ignores GIT_CONFIG_NOSYSTEM. We thus test whether the + # variable has an effect via a different proxy. + cat >alias-config <<-EOF && + [alias] + hello-world = !echo "hello world" + EOF + test_must_fail env GIT_CONFIG_NOSYSTEM=true GIT_CONFIG_SYSTEM=alias-config \ + git hello-world && + GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=alias-config \ + git hello-world >actual && + echo "hello world" >expect && + test_cmp expect actual +' + +test_expect_success 'write to overridden global and system config' ' + cat >expect <<EOF && +[config] + key = value +EOF + + GIT_CONFIG_GLOBAL=write-to-global git config --global config.key value && + test_cmp expect write-to-global && + + GIT_CONFIG_SYSTEM=write-to-system git config --system config.key value && + test_cmp expect write-to-system +' + +for opt in --local --worktree +do + test_expect_success "$opt requires a repo" ' + # we expect 128 to ensure that we do not simply + # fail to find anything and return code "1" + test_expect_code 128 nongit git config $opt foo.bar + ' +done + cat >.git/config <<-\EOF && -[core] +[section] foo = true number = 10 big = 1M EOF test_expect_success 'identical modern --type specifiers are allowed' ' - test_cmp_config 1048576 --type=int --type=int core.big + test_cmp_config 1048576 --type=int --type=int section.big ' test_expect_success 'identical legacy --type specifiers are allowed' ' - test_cmp_config 1048576 --int --int core.big + test_cmp_config 1048576 --int --int section.big ' test_expect_success 'identical mixed --type specifiers are allowed' ' - test_cmp_config 1048576 --int --type=int core.big + test_cmp_config 1048576 --int --type=int section.big ' test_expect_success 'non-identical modern --type specifiers are not allowed' ' - test_must_fail git config --type=int --type=bool core.big 2>error && + test_must_fail git config --type=int --type=bool section.big 2>error && test_i18ngrep "only one type at a time" error ' test_expect_success 'non-identical legacy --type specifiers are not allowed' ' - test_must_fail git config --int --bool core.big 2>error && + test_must_fail git config --int --bool section.big 2>error && test_i18ngrep "only one type at a time" error ' test_expect_success 'non-identical mixed --type specifiers are not allowed' ' - test_must_fail git config --type=int --bool core.big 2>error && + test_must_fail git config --type=int --bool section.big 2>error && test_i18ngrep "only one type at a time" error ' test_expect_success '--type allows valid type specifiers' ' - test_cmp_config true --type=bool core.foo + test_cmp_config true --type=bool section.foo ' test_expect_success '--no-type unsets type specifiers' ' - test_cmp_config 10 --type=bool --no-type core.number + test_cmp_config 10 --type=bool --no-type section.number ' test_expect_success 'unset type specifiers may be reset to conflicting ones' ' - test_cmp_config 1048576 --type=bool --no-type --type=int core.big + test_cmp_config 1048576 --type=bool --no-type --type=int section.big ' test_expect_success '--type rejects unknown specifiers' ' - test_must_fail git config --type=nonsense core.foo 2>error && + test_must_fail git config --type=nonsense section.foo 2>error && test_i18ngrep "unrecognized --type argument" error ' @@ -1914,4 +2238,153 @@ test_expect_success '--replace-all does not invent newlines' ' test_cmp expect .git/config ' +test_expect_success 'set all config with value-pattern' ' + test_when_finished rm -f config initial && + git config --file=initial abc.key one && + + # no match => add new entry + cp initial config && + git config --file=config abc.key two a+ && + git config --file=config --list >actual && + cat >expect <<-\EOF && + abc.key=one + abc.key=two + EOF + test_cmp expect actual && + + # multiple matches => failure + test_must_fail git config --file=config abc.key three o+ 2>err && + test_i18ngrep "has multiple values" err && + + # multiple values, no match => add + git config --file=config abc.key three a+ && + git config --file=config --list >actual && + cat >expect <<-\EOF && + abc.key=one + abc.key=two + abc.key=three + EOF + test_cmp expect actual && + + # single match => replace + git config --file=config abc.key four h+ && + git config --file=config --list >actual && + cat >expect <<-\EOF && + abc.key=one + abc.key=two + abc.key=four + EOF + test_cmp expect actual +' + +test_expect_success '--replace-all and value-pattern' ' + test_when_finished rm -f config && + git config --file=config --add abc.key one && + git config --file=config --add abc.key two && + git config --file=config --add abc.key three && + git config --file=config --replace-all abc.key four "o+" && + git config --file=config --list >actual && + cat >expect <<-\EOF && + abc.key=four + abc.key=three + EOF + test_cmp expect actual +' + +test_expect_success 'refuse --fixed-value for incompatible actions' ' + test_when_finished rm -f config && + git config --file=config dev.null bogus && + + # These modes do not allow --fixed-value at all + test_must_fail git config --file=config --fixed-value --add dev.null bogus && + test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus && + test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null bogus && + test_must_fail git config --file=config --fixed-value --rename-section dev null && + test_must_fail git config --file=config --fixed-value --remove-section dev && + test_must_fail git config --file=config --fixed-value --list && + test_must_fail git config --file=config --fixed-value --get-color dev.null && + test_must_fail git config --file=config --fixed-value --get-colorbool dev.null && + + # These modes complain when --fixed-value has no value-pattern + test_must_fail git config --file=config --fixed-value dev.null bogus && + test_must_fail git config --file=config --fixed-value --replace-all dev.null bogus && + test_must_fail git config --file=config --fixed-value --get dev.null && + test_must_fail git config --file=config --fixed-value --get-all dev.null && + test_must_fail git config --file=config --fixed-value --get-regexp "dev.*" && + test_must_fail git config --file=config --fixed-value --unset dev.null && + test_must_fail git config --file=config --fixed-value --unset-all dev.null +' + +test_expect_success '--fixed-value uses exact string matching' ' + test_when_finished rm -f config initial && + META="a+b*c?d[e]f.g" && + git config --file=initial fixed.test "$META" && + + cp initial config && + git config --file=config fixed.test bogus "$META" && + git config --file=config --list >actual && + cat >expect <<-EOF && + fixed.test=$META + fixed.test=bogus + EOF + test_cmp expect actual && + + cp initial config && + git config --file=config --fixed-value fixed.test bogus "$META" && + git config --file=config --list >actual && + cat >expect <<-\EOF && + fixed.test=bogus + EOF + test_cmp expect actual && + + cp initial config && + test_must_fail git config --file=config --unset fixed.test "$META" && + git config --file=config --fixed-value --unset fixed.test "$META" && + test_must_fail git config --file=config fixed.test && + + cp initial config && + test_must_fail git config --file=config --unset-all fixed.test "$META" && + git config --file=config --fixed-value --unset-all fixed.test "$META" && + test_must_fail git config --file=config fixed.test && + + cp initial config && + git config --file=config --replace-all fixed.test bogus "$META" && + git config --file=config --list >actual && + cat >expect <<-EOF && + fixed.test=$META + fixed.test=bogus + EOF + test_cmp expect actual && + + git config --file=config --fixed-value --replace-all fixed.test bogus "$META" && + git config --file=config --list >actual && + cat >expect <<-EOF && + fixed.test=bogus + fixed.test=bogus + EOF + test_cmp expect actual +' + +test_expect_success '--get and --get-all with --fixed-value' ' + test_when_finished rm -f config && + META="a+b*c?d[e]f.g" && + git config --file=config fixed.test bogus && + git config --file=config --add fixed.test "$META" && + + git config --file=config --get fixed.test bogus && + test_must_fail git config --file=config --get fixed.test "$META" && + git config --file=config --get --fixed-value fixed.test "$META" && + test_must_fail git config --file=config --get --fixed-value fixed.test non-existent && + + git config --file=config --get-all fixed.test bogus && + test_must_fail git config --file=config --get-all fixed.test "$META" && + git config --file=config --get-all --fixed-value fixed.test "$META" && + test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent && + + git config --file=config --get-regexp fixed+ bogus && + test_must_fail git config --file=config --get-regexp fixed+ "$META" && + git config --file=config --get-regexp --fixed-value fixed+ "$META" && + test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent +' + test_done diff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh index 2dc853d1be..84bf1970d8 100755 --- a/t/t1301-shared-repo.sh +++ b/t/t1301-shared-repo.sh @@ -5,6 +5,9 @@ test_description='Test shared repository initialization' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Remove a default ACL from the test dir if possible. @@ -115,13 +118,13 @@ test_expect_success POSIXPERM 'git reflog expire honors core.sharedRepository' ' umask 077 && git config core.sharedRepository group && git reflog expire --all && - actual="$(ls -l .git/logs/refs/heads/master)" && + actual="$(ls -l .git/logs/refs/heads/main)" && case "$actual" in -rw-rw-*) : happy ;; *) - echo Ooops, .git/logs/refs/heads/master is not 0662 [$actual] + echo Ooops, .git/logs/refs/heads/main is not 066x [$actual] false ;; esac diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh index f1e1b289f9..ccbb116c01 100755 --- a/t/t1305-config-include.sh +++ b/t/t1305-config-include.sh @@ -312,7 +312,7 @@ test_expect_success SYMLINKS 'conditional include, gitdir matching symlink, icas test_expect_success 'conditional include, onbranch' ' echo "[includeIf \"onbranch:foo-branch\"]path=bar9" >>.git/config && echo "[test]nine=9" >.git/bar9 && - git checkout -b master && + git checkout -b main && test_must_fail git config test.nine && git checkout -b foo-branch && echo 9 >expect && @@ -352,9 +352,7 @@ test_expect_success 'include cycles are detected' ' git init --bare cycle && git -C cycle config include.path cycle && git config -f cycle/cycle include.path config && - test_must_fail \ - env GIT_TEST_GETTEXT_POISON=false \ - git -C cycle config --get-all test.value 2>stderr && + test_must_fail git -C cycle config --get-all test.value 2>stderr && grep "exceeded maximum include depth" stderr ' diff --git a/t/t1306-xdg-files.sh b/t/t1306-xdg-files.sh index dd87b43be1..40d3c42618 100755 --- a/t/t1306-xdg-files.sh +++ b/t/t1306-xdg-files.sh @@ -116,7 +116,7 @@ test_expect_success 'Exclusion in a non-XDG global ignore file' ' test_expect_success 'Checking XDG ignore file when HOME is unset' ' (sane_unset HOME && git config --unset core.excludesfile && - git ls-files --exclude-standard --ignored >actual) && + git ls-files --exclude-standard --ignored --others >actual) && test_must_be_empty actual ' diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh index 002e6d3388..930dce06f0 100755 --- a/t/t1307-config-blob.sh +++ b/t/t1307-config-blob.sh @@ -65,9 +65,7 @@ test_expect_success 'parse errors in blobs are properly attributed' ' ' test_expect_success 'can parse blob ending with CR' ' - printf "[some]key = value\\r" >config && - git add config && - git commit -m CR && + test_commit --printf CR config "[some]key = value\\r" && echo value >expect && git config --blob=HEAD:config some.key >actual && test_cmp expect actual diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh index 3a527e3a84..88b119a0a3 100755 --- a/t/t1308-config-set.sh +++ b/t/t1308-config-set.sh @@ -208,14 +208,14 @@ test_expect_success 'proper error on error in default config files' ' echo "[" >>.git/config && echo "fatal: bad config line 34 in file .git/config" >expect && test_expect_code 128 test-tool config get_value foo.bar 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'proper error on error in custom config files' ' echo "[" >>syntax-error && echo "fatal: bad config line 1 in file syntax-error" >expect && test_expect_code 128 test-tool config configset_get_value foo.bar syntax-error 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'check line errors for malformed values' ' diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh index ebb8e1aecb..b4a9158307 100755 --- a/t/t1309-early-config.sh +++ b/t/t1309-early-config.sh @@ -91,11 +91,11 @@ test_expect_failure 'ignore .git/ with invalid config' ' test_expect_success 'early config and onbranch' ' echo "[broken" >broken && - test_with_config "[includeif \"onbranch:master\"]path=../broken" + test_with_config "[includeif \"onbranch:topic\"]path=../broken" ' test_expect_success 'onbranch config outside of git repo' ' - test_config_global includeIf.onbranch:master.path non-existent && + test_config_global includeIf.onbranch:topic.path non-existent && nongit git help ' diff --git a/t/t1350-config-hooks-path.sh b/t/t1350-config-hooks-path.sh index f1f9aee9f5..fa9647a7c0 100755 --- a/t/t1350-config-hooks-path.sh +++ b/t/t1350-config-hooks-path.sh @@ -5,6 +5,7 @@ test_description='Test the core.hooksPath configuration variable' . ./test-lib.sh test_expect_success 'set up a pre-commit hook in core.hooksPath' ' + >actual && mkdir -p .git/custom-hooks .git/hooks && write_script .git/custom-hooks/pre-commit <<-\EOF && echo CUSTOM >>actual diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 770e7be363..4506cd435b 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -4,11 +4,14 @@ # test_description='Test git update-ref and basic ref logging' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh Z=$ZERO_OID -m=refs/heads/master +m=refs/heads/main n_dir=refs/heads/gu n=$n_dir/fixes outside=refs/foo @@ -27,10 +30,11 @@ create_test_commits () } test_expect_success setup ' + git checkout --orphan main && create_test_commits "" && mkdir $bare && cd $bare && - git init --bare && + git init --bare -b main && create_test_commits "bare" && cd - ' @@ -48,17 +52,17 @@ test_expect_success "fail to delete $m with stale ref" ' test $B = "$(git show-ref -s --verify $m)" ' test_expect_success "delete $m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d $m $B && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "delete $m without oldvalue verification" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && test $A = $(git show-ref -s --verify $m) && git update-ref -d $m && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "fail to create $n" ' @@ -80,26 +84,26 @@ test_expect_success "fail to delete $m (by HEAD) with stale ref" ' test $B = $(git show-ref -s --verify $m) ' test_expect_success "delete $m (by HEAD)" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d HEAD $B && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' test_expect_success "deleting current branch adds message to HEAD's log" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && git symbolic-ref HEAD $m && git update-ref -m delete-$m -d $m && - test_path_is_missing .git/$m && + test_must_fail git show-ref --verify -q $m && grep "delete-$m$" .git/logs/HEAD ' test_expect_success "deleting by HEAD adds message to HEAD's log" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref $m $A && git symbolic-ref HEAD $m && git update-ref -m delete-by-head -d HEAD && - test_path_is_missing .git/$m && + test_must_fail git show-ref --verify -q $m && grep "delete-by-head$" .git/logs/HEAD ' @@ -188,31 +192,37 @@ test_expect_success "move $m (by HEAD)" ' test $B = $(git show-ref -s --verify $m) ' test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && git update-ref -d HEAD $B && ! grep "$m" .git/packed-refs && - test_path_is_missing .git/$m + test_must_fail git show-ref --verify -q $m ' -cp -f .git/HEAD .git/HEAD.orig test_expect_success 'delete symref without dereference' ' - test_when_finished "cp -f .git/HEAD.orig .git/HEAD" && - git update-ref --no-deref -d HEAD && - test_path_is_missing .git/HEAD + test_when_finished "git update-ref -d $m" && + echo foo >foo.c && + git add foo.c && + git commit -m foo && + git symbolic-ref SYMREF $m && + git update-ref --no-deref -d SYMREF && + git show-ref --verify -q $m && + test_must_fail git show-ref --verify -q SYMREF && + test_must_fail git symbolic-ref SYMREF ' test_expect_success 'delete symref without dereference when the referred ref is packed' ' - test_when_finished "cp -f .git/HEAD.orig .git/HEAD" && + test_when_finished "git update-ref -d $m" && echo foo >foo.c && git add foo.c && git commit -m foo && + git symbolic-ref SYMREF $m && git pack-refs --all && - git update-ref --no-deref -d HEAD && - test_path_is_missing .git/HEAD + git update-ref --no-deref -d SYMREF && + git show-ref --verify -q $m && + test_must_fail git show-ref --verify -q SYMREF && + test_must_fail git symbolic-ref SYMREF ' -git update-ref -d $m - test_expect_success 'update-ref -d is not confused by self-reference' ' git symbolic-ref refs/heads/self refs/heads/self && test_when_finished "rm -f .git/refs/heads/self" && @@ -226,25 +236,25 @@ test_expect_success 'update-ref --no-deref -d can delete self-reference' ' test_when_finished "rm -f .git/refs/heads/self" && test_path_is_file .git/refs/heads/self && git update-ref --no-deref -d refs/heads/self && - test_path_is_missing .git/refs/heads/self + test_must_fail git show-ref --verify -q refs/heads/self ' test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' ' >.git/refs/heads/bad && test_when_finished "rm -f .git/refs/heads/bad" && git symbolic-ref refs/heads/ref-to-bad refs/heads/bad && - test_when_finished "rm -f .git/refs/heads/ref-to-bad" && + test_when_finished "git update-ref -d refs/heads/ref-to-bad" && test_path_is_file .git/refs/heads/ref-to-bad && git update-ref --no-deref -d refs/heads/ref-to-bad && - test_path_is_missing .git/refs/heads/ref-to-bad + test_must_fail git show-ref --verify -q refs/heads/ref-to-bad ' test_expect_success '(not) create HEAD with old sha1' ' test_must_fail git update-ref HEAD $A $B ' test_expect_success "(not) prior created .git/$m" ' - test_when_finished "rm -f .git/$m" && - test_path_is_missing .git/$m + test_when_finished "git update-ref -d $m" && + test_must_fail git show-ref --verify -q $m ' test_expect_success 'create HEAD' ' @@ -254,11 +264,11 @@ test_expect_success '(not) change HEAD with wrong SHA1' ' test_must_fail git update-ref HEAD $B $Z ' test_expect_success "(not) changed .git/$m" ' - test_when_finished "rm -f .git/$m" && + test_when_finished "git update-ref -d $m" && ! test $B = $(git show-ref -s --verify $m) ' -rm -f .git/logs/refs/heads/master +rm -f .git/logs/refs/heads/main test_expect_success "create $m (logged by touch)" ' test_config core.logAllRefUpdates false && GIT_COMMITTER_DATE="2005-05-26 23:30" \ @@ -284,8 +294,8 @@ test_expect_success 'empty directory removal' ' test_path_is_file .git/refs/heads/d1/d2/r1 && test_path_is_file .git/logs/refs/heads/d1/d2/r1 && git branch -d d1/d2/r1 && - test_path_is_missing .git/refs/heads/d1/d2 && - test_path_is_missing .git/logs/refs/heads/d1/d2 && + test_must_fail git show-ref --verify -q refs/heads/d1/d2 && + test_must_fail git show-ref --verify -q logs/refs/heads/d1/d2 && test_path_is_file .git/refs/heads/d1/r2 && test_path_is_file .git/logs/refs/heads/d1/r2 ' @@ -294,12 +304,12 @@ test_expect_success 'symref empty directory removal' ' git branch e1/e2/r1 HEAD && git branch e1/r2 HEAD && git checkout e1/e2/r1 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && test_path_is_file .git/refs/heads/e1/e2/r1 && test_path_is_file .git/logs/refs/heads/e1/e2/r1 && git update-ref -d HEAD && - test_path_is_missing .git/refs/heads/e1/e2 && - test_path_is_missing .git/logs/refs/heads/e1/e2 && + test_must_fail git show-ref --verify -q refs/heads/e1/e2 && + test_must_fail git show-ref --verify -q logs/refs/heads/e1/e2 && test_path_is_file .git/refs/heads/e1/r2 && test_path_is_file .git/logs/refs/heads/e1/r2 && test_path_is_file .git/logs/HEAD @@ -358,68 +368,68 @@ test_expect_success 'set up for querying the reflog' ' ed="Thu, 26 May 2005 18:32:00 -0500" gd="Thu, 26 May 2005 18:33:00 -0500" ld="Thu, 26 May 2005 18:43:00 -0500" -test_expect_success 'Query "master@{May 25 2005}" (before history)' ' +test_expect_success 'Query "main@{May 25 2005}" (before history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{May 25 2005}" >o 2>e && + git rev-parse --verify "main@{May 25 2005}" >o 2>e && echo "$C" >expect && test_cmp expect o && - echo "warning: log for '\''master'\'' only goes back to $ed" >expect && - test_i18ncmp expect e + echo "warning: log for '\''main'\'' only goes back to $ed" >expect && + test_cmp expect e ' -test_expect_success 'Query master@{2005-05-25} (before history)' ' +test_expect_success 'Query main@{2005-05-25} (before history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify master@{2005-05-25} >o 2>e && + git rev-parse --verify main@{2005-05-25} >o 2>e && echo "$C" >expect && test_cmp expect o && - echo "warning: log for '\''master'\'' only goes back to $ed" >expect && - test_i18ncmp expect e + echo "warning: log for '\''main'\'' only goes back to $ed" >expect && + test_cmp expect e ' -test_expect_success 'Query "master@{May 26 2005 23:31:59}" (1 second before history)' ' +test_expect_success 'Query "main@{May 26 2005 23:31:59}" (1 second before history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e && + git rev-parse --verify "main@{May 26 2005 23:31:59}" >o 2>e && echo "$C" >expect && test_cmp expect o && - echo "warning: log for '\''master'\'' only goes back to $ed" >expect && - test_i18ncmp expect e + echo "warning: log for '\''main'\'' only goes back to $ed" >expect && + test_cmp expect e ' -test_expect_success 'Query "master@{May 26 2005 23:32:00}" (exactly history start)' ' +test_expect_success 'Query "main@{May 26 2005 23:32:00}" (exactly history start)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e && + git rev-parse --verify "main@{May 26 2005 23:32:00}" >o 2>e && echo "$C" >expect && test_cmp expect o && test_must_be_empty e ' -test_expect_success 'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' ' +test_expect_success 'Query "main@{May 26 2005 23:32:30}" (first non-creation change)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e && + git rev-parse --verify "main@{May 26 2005 23:32:30}" >o 2>e && echo "$A" >expect && test_cmp expect o && test_must_be_empty e ' -test_expect_success 'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' ' +test_expect_success 'Query "main@{2005-05-26 23:33:01}" (middle of history with gap)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e && + git rev-parse --verify "main@{2005-05-26 23:33:01}" >o 2>e && echo "$B" >expect && test_cmp expect o && test_i18ngrep -F "warning: log for ref $m has gap after $gd" e ' -test_expect_success 'Query "master@{2005-05-26 23:38:00}" (middle of history)' ' +test_expect_success 'Query "main@{2005-05-26 23:38:00}" (middle of history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e && + git rev-parse --verify "main@{2005-05-26 23:38:00}" >o 2>e && echo "$Z" >expect && test_cmp expect o && test_must_be_empty e ' -test_expect_success 'Query "master@{2005-05-26 23:43:00}" (exact end of history)' ' +test_expect_success 'Query "main@{2005-05-26 23:43:00}" (exact end of history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e && + git rev-parse --verify "main@{2005-05-26 23:43:00}" >o 2>e && echo "$E" >expect && test_cmp expect o && test_must_be_empty e ' -test_expect_success 'Query "master@{2005-05-28}" (past end of history)' ' +test_expect_success 'Query "main@{2005-05-28}" (past end of history)' ' test_when_finished "rm -f o e" && - git rev-parse --verify "master@{2005-05-28}" >o 2>e && + git rev-parse --verify "main@{2005-05-28}" >o 2>e && echo "$D" >expect && test_cmp expect o && test_i18ngrep -F "warning: log for ref $m unexpectedly ended on $ld" e @@ -461,14 +471,14 @@ test_expect_success 'git commit logged updates' ' ' unset h_TEST h_OTHER h_FIXED h_MERGED -test_expect_success 'git cat-file blob master:F (expect OTHER)' ' - test OTHER = $(git cat-file blob master:F) +test_expect_success 'git cat-file blob main:F (expect OTHER)' ' + test OTHER = $(git cat-file blob main:F) ' -test_expect_success 'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' ' - test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F") +test_expect_success 'git cat-file blob main@{2005-05-26 23:30}:F (expect TEST)' ' + test TEST = $(git cat-file blob "main@{2005-05-26 23:30}:F") ' -test_expect_success 'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' ' - test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F") +test_expect_success 'git cat-file blob main@{2005-05-26 23:42}:F (expect OTHER)' ' + test OTHER = $(git cat-file blob "main@{2005-05-26 23:42}:F") ' # Test adding and deleting pseudorefs @@ -580,21 +590,21 @@ test_expect_success 'stdin fails on unknown command' ' ' test_expect_success 'stdin fails on unbalanced quotes' ' - echo "create $a \"master" >stdin && + echo "create $a \"main" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && - grep "fatal: badly quoted argument: \\\"master" err + grep "fatal: badly quoted argument: \\\"main" err ' test_expect_success 'stdin fails on invalid escape' ' - echo "create $a \"ma\zter\"" >stdin && + echo "create $a \"ma\zn\"" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && - grep "fatal: badly quoted argument: \\\"ma\\\\zter\\\"" err + grep "fatal: badly quoted argument: \\\"ma\\\\zn\\\"" err ' test_expect_success 'stdin fails on junk after quoted argument' ' - echo "create \"$a\"master" >stdin && + echo "create \"$a\"main" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && - grep "fatal: unexpected character after quoted argument: \\\"$a\\\"master" err + grep "fatal: unexpected character after quoted argument: \\\"$a\\\"main" err ' test_expect_success 'stdin fails create with no ref' ' @@ -706,7 +716,7 @@ test_expect_success 'stdin succeeds with quoted argument' ' test_expect_success 'stdin succeeds with escaped character' ' git update-ref -d $a && - echo "create $a \"ma\\163ter\"" >stdin && + echo "create $a \"ma\\151n\"" >stdin && git update-ref --stdin <stdin && git rev-parse $m >expect && git rev-parse $a >actual && @@ -1388,7 +1398,8 @@ test_expect_success 'handle per-worktree refs in refs/bisect' ' git rev-parse refs/bisect/something >../worktree-head && git for-each-ref | grep refs/bisect/something ) && - test_path_is_missing .git/refs/bisect && + git show-ref >actual && + ! grep 'refs/bisect' actual && test_must_fail git rev-parse refs/bisect/something && git update-ref refs/bisect/something HEAD && git rev-parse refs/bisect/something >main-head && @@ -1500,7 +1511,7 @@ test_expect_success 'transaction can handle abort' ' git update-ref --stdin <stdin >actual && printf "%s: ok\n" start abort >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b ' test_expect_success 'transaction aborts by default' ' @@ -1511,7 +1522,7 @@ test_expect_success 'transaction aborts by default' ' git update-ref --stdin <stdin >actual && printf "%s: ok\n" start >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b ' test_expect_success 'transaction with prepare aborts by default' ' @@ -1523,7 +1534,77 @@ test_expect_success 'transaction with prepare aborts by default' ' git update-ref --stdin <stdin >actual && printf "%s: ok\n" start prepare >expect && test_cmp expect actual && - test_path_is_missing .git/$b + test_must_fail git show-ref --verify -q $b +' + +test_expect_success 'transaction can commit multiple times' ' + cat >stdin <<-EOF && + start + create refs/heads/branch-1 $A + commit + start + create refs/heads/branch-2 $B + commit + EOF + git update-ref --stdin <stdin >actual && + printf "%s: ok\n" start commit start commit >expect && + test_cmp expect actual && + echo "$A" >expect && + git rev-parse refs/heads/branch-1 >actual && + test_cmp expect actual && + echo "$B" >expect && + git rev-parse refs/heads/branch-2 >actual && + test_cmp expect actual +' + +test_expect_success 'transaction can create and delete' ' + cat >stdin <<-EOF && + start + create refs/heads/create-and-delete $A + commit + start + delete refs/heads/create-and-delete $A + commit + EOF + git update-ref --stdin <stdin >actual && + printf "%s: ok\n" start commit start commit >expect && + test_must_fail git show-ref --verify refs/heads/create-and-delete +' + +test_expect_success 'transaction can commit after abort' ' + cat >stdin <<-EOF && + start + create refs/heads/abort $A + abort + start + create refs/heads/abort $A + commit + EOF + git update-ref --stdin <stdin >actual && + printf "%s: ok\n" start abort start commit >expect && + echo "$A" >expect && + git rev-parse refs/heads/abort >actual && + test_cmp expect actual +' + +test_expect_success 'transaction cannot restart ongoing transaction' ' + cat >stdin <<-EOF && + start + create refs/heads/restart $A + start + commit + EOF + test_must_fail git update-ref --stdin <stdin >actual && + test_must_fail git show-ref --verify refs/heads/restart +' + +test_expect_success 'directory not created deleting packed ref' ' + git branch d1/d2/r1 HEAD && + git pack-refs --all && + test_path_is_missing .git/refs/heads/d1/d2 && + git update-ref -d refs/heads/d1/d2/r1 && + test_path_is_missing .git/refs/heads/d1/d2 && + test_path_is_missing .git/refs/heads/d1 ' test_done diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh index a4ebb0b65f..132a1b885a 100755 --- a/t/t1401-symbolic-ref.sh +++ b/t/t1401-symbolic-ref.sh @@ -7,17 +7,19 @@ test_description='basic symbolic-ref tests' # the git repo, meaning that further tests will operate on # the surrounding git repo instead of the trash directory. reset_to_sane() { - echo ref: refs/heads/foo >.git/HEAD + rm -rf .git && + "$TAR" xf .git.tar } -test_expect_success 'symbolic-ref writes HEAD' ' +test_expect_success 'setup' ' git symbolic-ref HEAD refs/heads/foo && - echo ref: refs/heads/foo >expect && - test_cmp expect .git/HEAD + test_commit file && + "$TAR" cf .git.tar .git/ ' -test_expect_success 'symbolic-ref reads HEAD' ' - echo refs/heads/foo >expect && +test_expect_success 'symbolic-ref read/write roundtrip' ' + git symbolic-ref HEAD refs/heads/read-write-roundtrip && + echo refs/heads/read-write-roundtrip >expect && git symbolic-ref HEAD >actual && test_cmp expect actual ' @@ -25,12 +27,13 @@ test_expect_success 'symbolic-ref reads HEAD' ' test_expect_success 'symbolic-ref refuses non-ref for HEAD' ' test_must_fail git symbolic-ref HEAD foo ' + reset_to_sane test_expect_success 'symbolic-ref refuses bare sha1' ' - echo content >file && git add file && git commit -m one && test_must_fail git symbolic-ref HEAD $(git rev-parse HEAD) ' + reset_to_sane test_expect_success 'HEAD cannot be removed' ' @@ -42,16 +45,16 @@ reset_to_sane test_expect_success 'symbolic-ref can be deleted' ' git symbolic-ref NOTHEAD refs/heads/foo && git symbolic-ref -d NOTHEAD && - test_path_is_file .git/refs/heads/foo && - test_path_is_missing .git/NOTHEAD + git rev-parse refs/heads/foo && + test_must_fail git symbolic-ref NOTHEAD ' reset_to_sane test_expect_success 'symbolic-ref can delete dangling symref' ' git symbolic-ref NOTHEAD refs/heads/missing && git symbolic-ref -d NOTHEAD && - test_path_is_missing .git/refs/heads/missing && - test_path_is_missing .git/NOTHEAD + test_must_fail git rev-parse refs/heads/missing && + test_must_fail git symbolic-ref NOTHEAD ' reset_to_sane diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh index 98e4a8613b..cabc516ae9 100755 --- a/t/t1402-check-ref-format.sh +++ b/t/t1402-check-ref-format.sh @@ -134,18 +134,18 @@ valid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize' test_expect_success "check-ref-format --branch @{-1}" ' T=$(git write-tree) && sha1=$(echo A | git commit-tree $T) && - git update-ref refs/heads/master $sha1 && - git update-ref refs/remotes/origin/master $sha1 && - git checkout master && - git checkout origin/master && - git checkout master && + git update-ref refs/heads/main $sha1 && + git update-ref refs/remotes/origin/main $sha1 && + git checkout main && + git checkout origin/main && + git checkout main && refname=$(git check-ref-format --branch @{-1}) && test "$refname" = "$sha1" && refname2=$(git check-ref-format --branch @{-2}) && - test "$refname2" = master' + test "$refname2" = main' -test_expect_success 'check-ref-format --branch -naster' ' - test_must_fail git check-ref-format --branch -naster >actual && +test_expect_success 'check-ref-format --branch -nain' ' + test_must_fail git check-ref-format --branch -nain >actual && test_must_be_empty actual ' @@ -154,11 +154,11 @@ test_expect_success 'check-ref-format --branch from subdir' ' T=$(git write-tree) && sha1=$(echo A | git commit-tree $T) && - git update-ref refs/heads/master $sha1 && - git update-ref refs/remotes/origin/master $sha1 && - git checkout master && - git checkout origin/master && - git checkout master && + git update-ref refs/heads/main $sha1 && + git update-ref refs/remotes/origin/main $sha1 && + git checkout main && + git checkout origin/main && + git checkout main && refname=$( cd subdir && git check-ref-format --branch @{-1} @@ -171,9 +171,9 @@ test_expect_success 'check-ref-format --branch @{-1} from non-repo' ' test_must_be_empty actual ' -test_expect_success 'check-ref-format --branch master from non-repo' ' - echo master >expect && - nongit git check-ref-format --branch master >actual && +test_expect_success 'check-ref-format --branch main from non-repo' ' + echo main >expect && + nongit git check-ref-format --branch main >actual && test_cmp expect actual ' diff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh index 5d955c3bff..17d3cc1405 100755 --- a/t/t1403-show-ref.sh +++ b/t/t1403-show-ref.sh @@ -1,15 +1,16 @@ #!/bin/sh test_description='show-ref' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' - test_commit A && - git tag -f -a -m "annotated A" A && + test_commit --annotate A && git checkout -b side && - test_commit B && - git tag -f -a -m "annotated B" B && - git checkout master && + test_commit --annotate B && + git checkout main && test_commit C && git branch B A^0 ' @@ -92,23 +93,23 @@ test_expect_success 'show-ref -d' ' git show-ref --verify -d refs/tags/A refs/tags/C >actual && test_cmp expect actual && - echo $(git rev-parse refs/heads/master) refs/heads/master >expect && - git show-ref -d master >actual && + echo $(git rev-parse refs/heads/main) refs/heads/main >expect && + git show-ref -d main >actual && test_cmp expect actual && - git show-ref -d heads/master >actual && + git show-ref -d heads/main >actual && test_cmp expect actual && - git show-ref -d refs/heads/master >actual && + git show-ref -d refs/heads/main >actual && test_cmp expect actual && - git show-ref -d --verify refs/heads/master >actual && + git show-ref -d --verify refs/heads/main >actual && test_cmp expect actual && - test_must_fail git show-ref -d --verify master >actual && + test_must_fail git show-ref -d --verify main >actual && test_must_be_empty actual && - test_must_fail git show-ref -d --verify heads/master >actual && + test_must_fail git show-ref -d --verify heads/main >actual && test_must_be_empty actual && test_must_fail git show-ref --verify -d A C >actual && @@ -120,7 +121,7 @@ test_expect_success 'show-ref -d' ' ' test_expect_success 'show-ref --heads, --tags, --head, pattern' ' - for branch in B master side + for branch in B main side do echo $(git rev-parse refs/heads/$branch) refs/heads/$branch done >expect.heads && diff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh index 2d142e5535..b729c1f480 100755 --- a/t/t1404-update-ref-errors.sh +++ b/t/t1404-update-ref-errors.sh @@ -101,7 +101,7 @@ df_test() { printf "%s\n" "delete $delname" "create $addname $D" fi >commands && test_must_fail git update-ref --stdin <commands 2>output.err && - test_i18ncmp expected-err output.err && + test_cmp expected-err output.err && printf "%s\n" "$C $delref" >expected-refs && git for-each-ref --format="%(objectname) %(refname)" $prefix/r >actual-refs && test_cmp expected-refs actual-refs @@ -189,7 +189,7 @@ test_expect_success 'one new ref is a simple prefix of another' ' ' -test_expect_success 'empty directory should not fool rev-parse' ' +test_expect_success REFFILES 'empty directory should not fool rev-parse' ' prefix=refs/e-rev-parse && git update-ref $prefix/foo $C && git pack-refs --all && @@ -199,7 +199,7 @@ test_expect_success 'empty directory should not fool rev-parse' ' test_cmp expected actual ' -test_expect_success 'empty directory should not fool for-each-ref' ' +test_expect_success REFFILES 'empty directory should not fool for-each-ref' ' prefix=refs/e-for-each-ref && git update-ref $prefix/foo $C && git for-each-ref $prefix >expected && @@ -209,14 +209,14 @@ test_expect_success 'empty directory should not fool for-each-ref' ' test_cmp expected actual ' -test_expect_success 'empty directory should not fool create' ' +test_expect_success REFFILES 'empty directory should not fool create' ' prefix=refs/e-create && mkdir -p .git/$prefix/foo/bar/baz && printf "create %s $C\n" $prefix/foo | git update-ref --stdin ' -test_expect_success 'empty directory should not fool verify' ' +test_expect_success REFFILES 'empty directory should not fool verify' ' prefix=refs/e-verify && git update-ref $prefix/foo $C && git pack-refs --all && @@ -225,7 +225,7 @@ test_expect_success 'empty directory should not fool verify' ' git update-ref --stdin ' -test_expect_success 'empty directory should not fool 1-arg update' ' +test_expect_success REFFILES 'empty directory should not fool 1-arg update' ' prefix=refs/e-update-1 && git update-ref $prefix/foo $C && git pack-refs --all && @@ -234,7 +234,7 @@ test_expect_success 'empty directory should not fool 1-arg update' ' git update-ref --stdin ' -test_expect_success 'empty directory should not fool 2-arg update' ' +test_expect_success REFFILES 'empty directory should not fool 2-arg update' ' prefix=refs/e-update-2 && git update-ref $prefix/foo $C && git pack-refs --all && @@ -243,7 +243,7 @@ test_expect_success 'empty directory should not fool 2-arg update' ' git update-ref --stdin ' -test_expect_success 'empty directory should not fool 0-arg delete' ' +test_expect_success REFFILES 'empty directory should not fool 0-arg delete' ' prefix=refs/e-delete-0 && git update-ref $prefix/foo $C && git pack-refs --all && @@ -252,7 +252,7 @@ test_expect_success 'empty directory should not fool 0-arg delete' ' git update-ref --stdin ' -test_expect_success 'empty directory should not fool 1-arg delete' ' +test_expect_success REFFILES 'empty directory should not fool 1-arg delete' ' prefix=refs/e-delete-1 && git update-ref $prefix/foo $C && git pack-refs --all && @@ -466,7 +466,7 @@ test_expect_success 'incorrect old value blocks indirect no-deref delete' ' test_cmp expected output.err ' -test_expect_success 'non-empty directory blocks create' ' +test_expect_success REFFILES 'non-empty directory blocks create' ' prefix=refs/ne-create && mkdir -p .git/$prefix/foo/bar && : >.git/$prefix/foo/bar/baz.lock && @@ -485,7 +485,7 @@ test_expect_success 'non-empty directory blocks create' ' test_cmp expected output.err ' -test_expect_success 'broken reference blocks create' ' +test_expect_success REFFILES 'broken reference blocks create' ' prefix=refs/broken-create && mkdir -p .git/$prefix && echo "gobbledigook" >.git/$prefix/foo && @@ -504,7 +504,7 @@ test_expect_success 'broken reference blocks create' ' test_cmp expected output.err ' -test_expect_success 'non-empty directory blocks indirect create' ' +test_expect_success REFFILES 'non-empty directory blocks indirect create' ' prefix=refs/ne-indirect-create && git symbolic-ref $prefix/symref $prefix/foo && mkdir -p .git/$prefix/foo/bar && @@ -524,7 +524,7 @@ test_expect_success 'non-empty directory blocks indirect create' ' test_cmp expected output.err ' -test_expect_success 'broken reference blocks indirect create' ' +test_expect_success REFFILES 'broken reference blocks indirect create' ' prefix=refs/broken-indirect-create && git symbolic-ref $prefix/symref $prefix/foo && echo "gobbledigook" >.git/$prefix/foo && @@ -543,7 +543,7 @@ test_expect_success 'broken reference blocks indirect create' ' test_cmp expected output.err ' -test_expect_success 'no bogus intermediate values during delete' ' +test_expect_success REFFILES 'no bogus intermediate values during delete' ' prefix=refs/slow-transaction && # Set up a reference with differing loose and packed versions: git update-ref $prefix/foo $C && @@ -600,7 +600,7 @@ test_expect_success 'no bogus intermediate values during delete' ' test_must_fail git rev-parse --verify --quiet $prefix/foo ' -test_expect_success 'delete fails cleanly if packed-refs file is locked' ' +test_expect_success REFFILES 'delete fails cleanly if packed-refs file is locked' ' prefix=refs/locked-packed-refs && # Set up a reference with differing loose and packed versions: git update-ref $prefix/foo $C && @@ -616,7 +616,7 @@ test_expect_success 'delete fails cleanly if packed-refs file is locked' ' test_cmp unchanged actual ' -test_expect_success 'delete fails cleanly if packed-refs.new write fails' ' +test_expect_success REFFILES 'delete fails cleanly if packed-refs.new write fails' ' # Setup and expectations are similar to the test above. prefix=refs/failed-packed-refs && git update-ref $prefix/foo $C && diff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh index 74af927fba..a237d9880e 100755 --- a/t/t1405-main-ref-store.sh +++ b/t/t1405-main-ref-store.sh @@ -2,6 +2,9 @@ test_description='test main ref store api' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh RUN="test-tool ref-store main" @@ -14,24 +17,18 @@ test_expect_success 'pack_refs(PACK_REFS_ALL | PACK_REFS_PRUNE)' ' N=`find .git/refs -type f | wc -l` ' -test_expect_success 'peel_ref(new-tag)' ' - git rev-parse HEAD >expected && - git tag -a -m new-tag new-tag HEAD && - $RUN peel-ref refs/tags/new-tag >actual && - test_cmp expected actual -' - -test_expect_success 'create_symref(FOO, refs/heads/master)' ' - $RUN create-symref FOO refs/heads/master nothing && - echo refs/heads/master >expected && +test_expect_success 'create_symref(FOO, refs/heads/main)' ' + $RUN create-symref FOO refs/heads/main nothing && + echo refs/heads/main >expected && git symbolic-ref FOO >actual && test_cmp expected actual ' test_expect_success 'delete_refs(FOO, refs/tags/new-tag)' ' + git tag -a -m new-tag new-tag HEAD && git rev-parse FOO -- && git rev-parse refs/tags/new-tag -- && - m=$(git rev-parse master) && + m=$(git rev-parse main) && REF_NO_DEREF=1 && $RUN delete-refs $REF_NO_DEREF nothing FOO refs/tags/new-tag && test_must_fail git rev-parse --symbolic-full-name FOO && @@ -39,19 +36,19 @@ test_expect_success 'delete_refs(FOO, refs/tags/new-tag)' ' test_must_fail git rev-parse refs/tags/new-tag -- ' -test_expect_success 'rename_refs(master, new-master)' ' - git rev-parse master >expected && - $RUN rename-ref refs/heads/master refs/heads/new-master && - git rev-parse new-master >actual && +test_expect_success 'rename_refs(main, new-main)' ' + git rev-parse main >expected && + $RUN rename-ref refs/heads/main refs/heads/new-main && + git rev-parse new-main >actual && test_cmp expected actual && - test_commit recreate-master + test_commit recreate-main ' test_expect_success 'for_each_ref(refs/heads/)' ' $RUN for-each-ref refs/heads/ | cut -d" " -f 2- >actual && cat >expected <<-\EOF && - master 0x0 - new-master 0x0 + main 0x0 + new-main 0x0 EOF test_cmp expected actual ' @@ -62,23 +59,23 @@ test_expect_success 'for_each_ref() is sorted' ' test_cmp expected actual ' -test_expect_success 'resolve_ref(new-master)' ' - SHA1=`git rev-parse new-master` && - echo "$SHA1 refs/heads/new-master 0x0" >expected && - $RUN resolve-ref refs/heads/new-master 0 >actual && +test_expect_success 'resolve_ref(new-main)' ' + SHA1=`git rev-parse new-main` && + echo "$SHA1 refs/heads/new-main 0x0" >expected && + $RUN resolve-ref refs/heads/new-main 0 >actual && test_cmp expected actual ' -test_expect_success 'verify_ref(new-master)' ' - $RUN verify-ref refs/heads/new-master +test_expect_success 'verify_ref(new-main)' ' + $RUN verify-ref refs/heads/new-main ' test_expect_success 'for_each_reflog()' ' $RUN for-each-reflog | sort -k2 | cut -d" " -f 2- >actual && cat >expected <<-\EOF && HEAD 0x1 - refs/heads/master 0x0 - refs/heads/new-master 0x0 + refs/heads/main 0x0 + refs/heads/new-main 0x0 EOF test_cmp expected actual ' @@ -86,12 +83,12 @@ test_expect_success 'for_each_reflog()' ' test_expect_success 'for_each_reflog_ent()' ' $RUN for-each-reflog-ent HEAD >actual && head -n1 actual | grep one && - tail -n2 actual | head -n1 | grep recreate-master + tail -n2 actual | head -n1 | grep recreate-main ' test_expect_success 'for_each_reflog_ent_reverse()' ' $RUN for-each-reflog-ent-reverse HEAD >actual && - head -n1 actual | grep recreate-master && + head -n1 actual | grep recreate-main && tail -n2 actual | head -n1 | grep one ' diff --git a/t/t1406-submodule-ref-store.sh b/t/t1406-submodule-ref-store.sh index 36b7ef5046..0a87058971 100755 --- a/t/t1406-submodule-ref-store.sh +++ b/t/t1406-submodule-ref-store.sh @@ -2,6 +2,9 @@ test_description='test submodule ref store api' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh RUN="test-tool ref-store submodule:sub" @@ -11,7 +14,8 @@ test_expect_success 'setup' ' ( cd sub && test_commit first && - git checkout -b new-master + git checkout -b new-main && + git tag -a -m new-tag new-tag HEAD ) ' @@ -19,15 +23,8 @@ test_expect_success 'pack_refs() not allowed' ' test_must_fail $RUN pack-refs 3 ' -test_expect_success 'peel_ref(new-tag)' ' - git -C sub rev-parse HEAD >expected && - git -C sub tag -a -m new-tag new-tag HEAD && - $RUN peel-ref refs/tags/new-tag >actual && - test_cmp expected actual -' - test_expect_success 'create_symref() not allowed' ' - test_must_fail $RUN create-symref FOO refs/heads/master nothing + test_must_fail $RUN create-symref FOO refs/heads/main nothing ' test_expect_success 'delete_refs() not allowed' ' @@ -35,14 +32,14 @@ test_expect_success 'delete_refs() not allowed' ' ' test_expect_success 'rename_refs() not allowed' ' - test_must_fail $RUN rename-ref refs/heads/master refs/heads/new-master + test_must_fail $RUN rename-ref refs/heads/main refs/heads/new-main ' test_expect_success 'for_each_ref(refs/heads/)' ' $RUN for-each-ref refs/heads/ | cut -d" " -f 2- >actual && cat >expected <<-\EOF && - master 0x0 - new-master 0x0 + main 0x0 + new-main 0x0 EOF test_cmp expected actual ' @@ -53,23 +50,23 @@ test_expect_success 'for_each_ref() is sorted' ' test_cmp expected actual ' -test_expect_success 'resolve_ref(master)' ' - SHA1=`git -C sub rev-parse master` && - echo "$SHA1 refs/heads/master 0x0" >expected && - $RUN resolve-ref refs/heads/master 0 >actual && +test_expect_success 'resolve_ref(main)' ' + SHA1=`git -C sub rev-parse main` && + echo "$SHA1 refs/heads/main 0x0" >expected && + $RUN resolve-ref refs/heads/main 0 >actual && test_cmp expected actual ' -test_expect_success 'verify_ref(new-master)' ' - $RUN verify-ref refs/heads/new-master +test_expect_success 'verify_ref(new-main)' ' + $RUN verify-ref refs/heads/new-main ' test_expect_success 'for_each_reflog()' ' $RUN for-each-reflog | sort | cut -d" " -f 2- >actual && cat >expected <<-\EOF && HEAD 0x1 - refs/heads/master 0x0 - refs/heads/new-master 0x0 + refs/heads/main 0x0 + refs/heads/new-main 0x0 EOF test_cmp expected actual ' @@ -77,12 +74,12 @@ test_expect_success 'for_each_reflog()' ' test_expect_success 'for_each_reflog_ent()' ' $RUN for-each-reflog-ent HEAD >actual && head -n1 actual | grep first && - tail -n2 actual | head -n1 | grep master.to.new + tail -n2 actual | head -n1 | grep main.to.new ' test_expect_success 'for_each_reflog_ent_reverse()' ' $RUN for-each-reflog-ent-reverse HEAD >actual && - head -n1 actual | grep master.to.new && + head -n1 actual | grep main.to.new && tail -n2 actual | head -n1 | grep first ' diff --git a/t/t1407-worktree-ref-store.sh b/t/t1407-worktree-ref-store.sh index 9a84858118..ad8006c813 100755 --- a/t/t1407-worktree-ref-store.sh +++ b/t/t1407-worktree-ref-store.sh @@ -2,6 +2,9 @@ test_description='test worktree ref store api' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh RWT="test-tool ref-store worktree:wt" @@ -9,7 +12,7 @@ RMAIN="test-tool ref-store worktree:main" test_expect_success 'setup' ' test_commit first && - git worktree add -b wt-master wt && + git worktree add -b wt-main wt && ( cd wt && test_commit second @@ -17,39 +20,46 @@ test_expect_success 'setup' ' ' test_expect_success 'resolve_ref(<shared-ref>)' ' - SHA1=`git rev-parse master` && - echo "$SHA1 refs/heads/master 0x0" >expected && - $RWT resolve-ref refs/heads/master 0 >actual && + SHA1=`git rev-parse main` && + echo "$SHA1 refs/heads/main 0x0" >expected && + $RWT resolve-ref refs/heads/main 0 >actual && test_cmp expected actual && - $RMAIN resolve-ref refs/heads/master 0 >actual && + $RMAIN resolve-ref refs/heads/main 0 >actual && test_cmp expected actual ' test_expect_success 'resolve_ref(<per-worktree-ref>)' ' SHA1=`git -C wt rev-parse HEAD` && - echo "$SHA1 refs/heads/wt-master 0x1" >expected && + echo "$SHA1 refs/heads/wt-main 0x1" >expected && $RWT resolve-ref HEAD 0 >actual && test_cmp expected actual && SHA1=`git rev-parse HEAD` && - echo "$SHA1 refs/heads/master 0x1" >expected && + echo "$SHA1 refs/heads/main 0x1" >expected && $RMAIN resolve-ref HEAD 0 >actual && test_cmp expected actual ' -test_expect_success 'create_symref(FOO, refs/heads/master)' ' - $RWT create-symref FOO refs/heads/master nothing && - echo refs/heads/master >expected && +test_expect_success 'create_symref(FOO, refs/heads/main)' ' + $RWT create-symref FOO refs/heads/main nothing && + echo refs/heads/main >expected && git -C wt symbolic-ref FOO >actual && test_cmp expected actual && - $RMAIN create-symref FOO refs/heads/wt-master nothing && - echo refs/heads/wt-master >expected && + $RMAIN create-symref FOO refs/heads/wt-main nothing && + echo refs/heads/wt-main >expected && git symbolic-ref FOO >actual && test_cmp expected actual ' -test_expect_success 'for_each_reflog()' ' +# Some refs (refs/bisect/*, pseudorefs) are kept per worktree, so they should +# only appear in the for-each-reflog output if it is called from the correct +# worktree, which is exercised in this test. This test is poorly written (and +# therefore marked REFFILES) for mulitple reasons: 1) it creates invalidly +# formatted log entres. 2) it uses direct FS access for creating the reflogs. 3) +# PSEUDO-WT and refs/bisect/random do not create reflogs by default, so it is +# not testing a realistic scenario. +test_expect_success REFFILES 'for_each_reflog()' ' echo $ZERO_OID > .git/logs/PSEUDO-MAIN && mkdir -p .git/logs/refs/bisect && echo $ZERO_OID > .git/logs/refs/bisect/random && @@ -63,8 +73,8 @@ test_expect_success 'for_each_reflog()' ' HEAD 0x1 PSEUDO-WT 0x0 refs/bisect/wt-random 0x0 - refs/heads/master 0x0 - refs/heads/wt-master 0x0 + refs/heads/main 0x0 + refs/heads/wt-main 0x0 EOF test_cmp expected actual && @@ -73,8 +83,8 @@ test_expect_success 'for_each_reflog()' ' HEAD 0x1 PSEUDO-MAIN 0x0 refs/bisect/random 0x0 - refs/heads/master 0x0 - refs/heads/wt-master 0x0 + refs/heads/main 0x0 + refs/heads/wt-main 0x0 EOF test_cmp expected actual ' diff --git a/t/t1408-packed-refs.sh b/t/t1408-packed-refs.sh index 1e44a17eea..41ba1f1d7f 100755 --- a/t/t1408-packed-refs.sh +++ b/t/t1408-packed-refs.sh @@ -2,6 +2,9 @@ test_description='packed-refs entries are covered by loose refs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -9,32 +12,32 @@ test_expect_success setup ' git commit --allow-empty -m one && one=$(git rev-parse HEAD) && git for-each-ref >actual && - echo "$one commit refs/heads/master" >expect && + echo "$one commit refs/heads/main" >expect && test_cmp expect actual && git pack-refs --all && git for-each-ref >actual && - echo "$one commit refs/heads/master" >expect && + echo "$one commit refs/heads/main" >expect && test_cmp expect actual && git checkout --orphan another && test_tick && git commit --allow-empty -m two && two=$(git rev-parse HEAD) && - git checkout -B master && + git checkout -B main && git branch -D another && git for-each-ref >actual && - echo "$two commit refs/heads/master" >expect && + echo "$two commit refs/heads/main" >expect && test_cmp expect actual && git reflog expire --expire=now --all && git prune && - git tag -m v1.0 v1.0 master + git tag -m v1.0 v1.0 main ' test_expect_success 'no error from stale entry in packed-refs' ' - git describe master >actual 2>&1 && + git describe main >actual 2>&1 && echo "v1.0" >expect && test_cmp expect actual ' diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index 730a43d9dd..27b9080251 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -4,6 +4,9 @@ # test_description='Test prune and reflog expiration' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_have () { @@ -99,7 +102,7 @@ test_expect_success setup ' check_fsck && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 4 output ' @@ -116,7 +119,7 @@ test_expect_success rewind ' check_have A B C D E F G H I J K L && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 5 output ' @@ -135,7 +138,7 @@ test_expect_success 'reflog expire --dry-run should not touch reflog' ' --stale-fix \ --all && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 5 output && check_fsck "missing blob $F" @@ -149,12 +152,38 @@ test_expect_success 'reflog expire' ' --stale-fix \ --all && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 2 output && check_fsck "dangling commit $K" ' +test_expect_success '--stale-fix handles missing objects generously' ' + git -c core.logAllRefUpdates=false fast-import --date-format=now <<-EOS && + commit refs/heads/stale-fix + mark :1 + committer Author <a@uth.or> now + data <<EOF + start stale fix + EOF + M 100644 inline file + data <<EOF + contents + EOF + commit refs/heads/stale-fix + committer Author <a@uth.or> now + data <<EOF + stale fix branch tip + EOF + from :1 + EOS + + parent_oid=$(git rev-parse stale-fix^) && + test_when_finished "recover $parent_oid" && + corrupt $parent_oid && + git reflog expire --stale-fix +' + test_expect_success 'prune and fsck' ' git prune && @@ -186,29 +215,29 @@ test_expect_success 'delete' ' git commit -m tiger C && HEAD_entry_count=$(git reflog | wc -l) && - master_entry_count=$(git reflog show master | wc -l) && + main_entry_count=$(git reflog show main | wc -l) && test $HEAD_entry_count = 5 && - test $master_entry_count = 5 && + test $main_entry_count = 5 && - git reflog delete master@{1} && - git reflog show master > output && - test_line_count = $(($master_entry_count - 1)) output && + git reflog delete main@{1} && + git reflog show main > output && + test_line_count = $(($main_entry_count - 1)) output && test $HEAD_entry_count = $(git reflog | wc -l) && ! grep ox < output && - master_entry_count=$(wc -l < output) && + main_entry_count=$(wc -l < output) && git reflog delete HEAD@{1} && test $(($HEAD_entry_count -1)) = $(git reflog | wc -l) && - test $master_entry_count = $(git reflog show master | wc -l) && + test $main_entry_count = $(git reflog show main | wc -l) && HEAD_entry_count=$(git reflog | wc -l) && - git reflog delete master@{07.04.2005.15:15:00.-0700} && - git reflog show master > output && - test_line_count = $(($master_entry_count - 1)) output && + git reflog delete main@{07.04.2005.15:15:00.-0700} && + git reflog show main > output && + test_line_count = $(($main_entry_count - 1)) output && ! grep dragon < output ' @@ -216,7 +245,7 @@ test_expect_success 'delete' ' test_expect_success 'rewind2' ' test_tick && git reset --hard HEAD~2 && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 4 output ' @@ -226,7 +255,7 @@ test_expect_success '--expire=never' ' --expire=never \ --expire-unreachable=never \ --all && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 4 output ' @@ -237,7 +266,7 @@ test_expect_success 'gc.reflogexpire=never' ' git reflog expire --verbose --all >output && test_line_count = 9 output && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 4 output ' @@ -246,7 +275,7 @@ test_expect_success 'gc.reflogexpire=false' ' test_config gc.reflogexpireunreachable false && git reflog expire --verbose --all && - git reflog refs/heads/master >output && + git reflog refs/heads/main >output && test_line_count = 4 output ' @@ -255,33 +284,33 @@ test_expect_success 'git reflog expire unknown reference' ' test_config gc.reflogexpire never && test_config gc.reflogexpireunreachable never && - test_must_fail git reflog expire master@{123} 2>stderr && + test_must_fail git reflog expire main@{123} 2>stderr && test_i18ngrep "points nowhere" stderr && test_must_fail git reflog expire does-not-exist 2>stderr && test_i18ngrep "points nowhere" stderr ' test_expect_success 'checkout should not delete log for packed ref' ' - test $(git reflog master | wc -l) = 4 && + test $(git reflog main | wc -l) = 4 && git branch foo && git pack-refs --all && git checkout foo && - test $(git reflog master | wc -l) = 4 + test $(git reflog main | wc -l) = 4 ' test_expect_success 'stale dirs do not cause d/f conflicts (reflogs on)' ' test_when_finished "git branch -d one || git branch -d one/two" && - git branch one/two master && - echo "one/two@{0} branch: Created from master" >expect && + git branch one/two main && + echo "one/two@{0} branch: Created from main" >expect && git log -g --format="%gd %gs" one/two >actual && test_cmp expect actual && git branch -d one/two && # now logs/refs/heads/one is a stale directory, but # we should move it out of the way to create "one" reflog - git branch one master && - echo "one@{0} branch: Created from master" >expect && + git branch one main && + echo "one@{0} branch: Created from main" >expect && git log -g --format="%gd %gs" one >actual && test_cmp expect actual ' @@ -289,15 +318,15 @@ test_expect_success 'stale dirs do not cause d/f conflicts (reflogs on)' ' test_expect_success 'stale dirs do not cause d/f conflicts (reflogs off)' ' test_when_finished "git branch -d one || git branch -d one/two" && - git branch one/two master && - echo "one/two@{0} branch: Created from master" >expect && + git branch one/two main && + echo "one/two@{0} branch: Created from main" >expect && git log -g --format="%gd %gs" one/two >actual && test_cmp expect actual && git branch -d one/two && # same as before, but we only create a reflog for "one" if # it already exists, which it does not - git -c core.logallrefupdates=false branch one master && + git -c core.logallrefupdates=false branch one main && git log -g --format="%gd %gs" one >actual && test_must_be_empty actual ' diff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh index 985daf1def..0bb319b944 100755 --- a/t/t1411-reflog-show.sh +++ b/t/t1411-reflog-show.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Test reflog display routines' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -167,7 +170,7 @@ test_expect_success 'git log -g -p shows diffs vs. parents' ' ' test_expect_success 'reflog exists works' ' - git reflog exists refs/heads/master && + git reflog exists refs/heads/main && ! git reflog exists refs/heads/nonexistent ' diff --git a/t/t1412-reflog-loop.sh b/t/t1412-reflog-loop.sh index 3acd895afb..977603f7f1 100755 --- a/t/t1412-reflog-loop.sh +++ b/t/t1412-reflog-loop.sh @@ -4,11 +4,8 @@ test_description='reflog walk shows repeated commits again' . ./test-lib.sh test_expect_success 'setup commits' ' - test_tick && - echo content >file && git add file && git commit -m one && - git tag one && - echo content >>file && git add file && git commit -m two && - git tag two + test_commit one file content && + test_commit --append two file content ' test_expect_success 'setup reflog with alternating commits' ' diff --git a/t/t1413-reflog-detach.sh b/t/t1413-reflog-detach.sh index c730600d8a..934688a1ee 100755 --- a/t/t1413-reflog-detach.sh +++ b/t/t1413-reflog-detach.sh @@ -1,11 +1,13 @@ #!/bin/sh test_description='Test reflog interaction with detached HEAD' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh reset_state () { - git checkout master && - cp saved_reflog .git/logs/HEAD + rm -rf .git && "$TAR" xf .git-saved.tar } test_expect_success setup ' @@ -14,19 +16,19 @@ test_expect_success setup ' git branch side && test_tick && git commit --allow-empty -m second && - cat .git/logs/HEAD >saved_reflog + "$TAR" cf .git-saved.tar .git ' test_expect_success baseline ' reset_state && - git rev-parse master master^ >expect && + git rev-parse main main^ >expect && git log -g --format=%H >actual && test_cmp expect actual ' test_expect_success 'switch to branch' ' reset_state && - git rev-parse side master master^ >expect && + git rev-parse side main main^ >expect && git checkout side && git log -g --format=%H >actual && test_cmp expect actual @@ -34,34 +36,34 @@ test_expect_success 'switch to branch' ' test_expect_success 'detach to other' ' reset_state && - git rev-parse master side master master^ >expect && + git rev-parse main side main main^ >expect && git checkout side && - git checkout master^0 && + git checkout main^0 && git log -g --format=%H >actual && test_cmp expect actual ' test_expect_success 'detach to self' ' reset_state && - git rev-parse master master master^ >expect && - git checkout master^0 && + git rev-parse main main main^ >expect && + git checkout main^0 && git log -g --format=%H >actual && test_cmp expect actual ' test_expect_success 'attach to self' ' reset_state && - git rev-parse master master master master^ >expect && - git checkout master^0 && - git checkout master && + git rev-parse main main main main^ >expect && + git checkout main^0 && + git checkout main && git log -g --format=%H >actual && test_cmp expect actual ' test_expect_success 'attach to other' ' reset_state && - git rev-parse side master master master^ >expect && - git checkout master^0 && + git rev-parse side main main main^ >expect && + git checkout main^0 && git checkout side && git log -g --format=%H >actual && test_cmp expect actual diff --git a/t/t1414-reflog-walk.sh b/t/t1414-reflog-walk.sh index 1181a9fb28..ea64cecf47 100755 --- a/t/t1414-reflog-walk.sh +++ b/t/t1414-reflog-walk.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='various tests of reflog walk (log -g) behavior' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'set up some reflog entries' ' @@ -8,7 +11,7 @@ test_expect_success 'set up some reflog entries' ' test_commit two && git checkout -b side HEAD^ && test_commit three && - git merge --no-commit master && + git merge --no-commit main && echo evil-merge-content >>one.t && test_tick && git commit --no-edit -a @@ -20,9 +23,9 @@ do_walk () { test_expect_success 'set up expected reflog' ' cat >expect.all <<-EOF - HEAD@{0} commit (merge): Merge branch ${SQ}master${SQ} into side + HEAD@{0} commit (merge): Merge branch ${SQ}main${SQ} into side HEAD@{1} commit: three - HEAD@{2} checkout: moving from master to side + HEAD@{2} checkout: moving from main to side HEAD@{3} commit: two HEAD@{4} commit (initial): one EOF @@ -73,15 +76,15 @@ test_expect_success 'walking multiple reflogs shows all' ' # sort ignores the bits after the timestamp. # # 2. POSIX leaves undefined whether this is a stable sort or not. So - # we use "-k 1" to ensure that we see HEAD before master before + # we use "-k 1" to ensure that we see HEAD before main before # side when breaking ties. { do_walk --date=unix HEAD && do_walk --date=unix side && - do_walk --date=unix master + do_walk --date=unix main } >expect.raw && sort -t "{" -k 2nr -k 1 <expect.raw >expect && - do_walk --date=unix HEAD master side >actual && + do_walk --date=unix HEAD main side >actual && test_cmp expect actual ' @@ -116,7 +119,9 @@ test_expect_success 'min/max age uses entry date to limit' ' test_cmp expect actual ' -test_expect_success 'walk prefers reflog to ref tip' ' +# Create a situation where the reflog and ref database disagree about the latest +# state of HEAD. +test_expect_success REFFILES 'walk prefers reflog to ref tip' ' head=$(git rev-parse HEAD) && one=$(git rev-parse one) && ident="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE" && diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh index bb2c7572a3..a3e6ea0808 100755 --- a/t/t1415-worktree-refs.sh +++ b/t/t1415-worktree-refs.sh @@ -16,7 +16,10 @@ test_expect_success 'setup' ' git -C wt2 update-ref refs/worktree/foo HEAD ' -test_expect_success 'refs/worktree must not be packed' ' +# The 'packed-refs' file is stored directly in .git/. This means it is global +# to the repository, and can only contain refs that are shared across all +# worktrees. +test_expect_success REFFILES 'refs/worktree must not be packed' ' git pack-refs --all && test_path_is_missing .git/refs/tags/wt1 && test_path_is_file .git/refs/worktree/foo && @@ -37,9 +40,8 @@ test_expect_success 'resolve main-worktree/HEAD' ' ' test_expect_success 'ambiguous main-worktree/HEAD' ' - mkdir -p .git/refs/heads/main-worktree && - test_when_finished rm -f .git/refs/heads/main-worktree/HEAD && - cp .git/HEAD .git/refs/heads/main-worktree/HEAD && + test_when_finished git update-ref -d refs/heads/main-worktree/HEAD && + git update-ref refs/heads/main-worktree/HEAD $(git rev-parse HEAD) && git rev-parse main-worktree/HEAD 2>warn && grep "main-worktree/HEAD.*ambiguous" warn ' @@ -51,9 +53,8 @@ test_expect_success 'resolve worktrees/xx/HEAD' ' ' test_expect_success 'ambiguous worktrees/xx/HEAD' ' - mkdir -p .git/refs/heads/worktrees/wt1 && - test_when_finished rm -f .git/refs/heads/worktrees/wt1/HEAD && - cp .git/HEAD .git/refs/heads/worktrees/wt1/HEAD && + git update-ref refs/heads/worktrees/wt1/HEAD $(git rev-parse HEAD) && + test_when_finished git update-ref -d refs/heads/worktrees/wt1/HEAD && git rev-parse worktrees/wt1/HEAD 2>warn && grep "worktrees/wt1/HEAD.*ambiguous" warn ' @@ -76,24 +77,24 @@ test_expect_success 'reflog of worktrees/xx/HEAD' ' test_cmp expected actual.wt2 ' -test_expect_success 'for-each-ref from main repo' ' +test_expect_success 'for-each-ref from main worktree' ' mkdir fer1 && git -C fer1 init repo && test_commit -C fer1/repo initial && git -C fer1/repo worktree add ../second && - git -C fer1/repo update-ref refs/bisect/main HEAD && - git -C fer1/repo update-ref refs/rewritten/main HEAD && - git -C fer1/repo update-ref refs/worktree/main HEAD && - git -C fer1/repo for-each-ref --format="%(refname)" | grep main >actual && + git -C fer1/repo update-ref refs/bisect/first HEAD && + git -C fer1/repo update-ref refs/rewritten/first HEAD && + git -C fer1/repo update-ref refs/worktree/first HEAD && + git -C fer1/repo for-each-ref --format="%(refname)" | grep first >actual && cat >expected <<-\EOF && - refs/bisect/main - refs/rewritten/main - refs/worktree/main + refs/bisect/first + refs/rewritten/first + refs/worktree/first EOF test_cmp expected actual ' -test_expect_success 'for-each-ref from linked repo' ' +test_expect_success 'for-each-ref from linked worktree' ' mkdir fer2 && git -C fer2 init repo && test_commit -C fer2/repo initial && diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh index f6e741c6c0..6c941027a8 100755 --- a/t/t1416-ref-transaction-hooks.sh +++ b/t/t1416-ref-transaction-hooks.sh @@ -2,6 +2,9 @@ test_description='reference transaction hooks' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -53,11 +56,11 @@ test_expect_success 'hook gets all queued updates in prepared state' ' EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD - $ZERO_OID $POST_OID refs/heads/master + $ZERO_OID $POST_OID refs/heads/main EOF git update-ref HEAD POST <<-EOF && update HEAD $ZERO_OID $POST_OID - update refs/heads/master $ZERO_OID $POST_OID + update refs/heads/main $ZERO_OID $POST_OID EOF test_cmp expect actual ' @@ -76,7 +79,7 @@ test_expect_success 'hook gets all queued updates in committed state' ' EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD - $ZERO_OID $POST_OID refs/heads/master + $ZERO_OID $POST_OID refs/heads/main EOF git update-ref HEAD POST && test_cmp expect actual @@ -96,12 +99,12 @@ test_expect_success 'hook gets all queued updates in aborted state' ' EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD - $ZERO_OID $POST_OID refs/heads/master + $ZERO_OID $POST_OID refs/heads/main EOF git update-ref --stdin <<-EOF && start update HEAD POST $ZERO_OID - update refs/heads/master POST $ZERO_OID + update refs/heads/main POST $ZERO_OID abort EOF test_cmp expect actual diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh index c7878a60ed..b1839e0877 100755 --- a/t/t1430-bad-ref-name.sh +++ b/t/t1430-bad-ref-name.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Test handling of ref names that check-ref-format rejects' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -17,7 +20,7 @@ test_expect_success 'fast-import: fail on invalid branch name ".badbranchname"' corrupt COMMIT - from refs/heads/master + from refs/heads/main INPUT_END test_must_fail git fast-import <input @@ -32,14 +35,14 @@ test_expect_success 'fast-import: fail on invalid branch name "bad[branch]name"' corrupt COMMIT - from refs/heads/master + from refs/heads/main INPUT_END test_must_fail git fast-import <input ' test_expect_success 'git branch shows badly named ref as warning' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch >output 2>error && test_i18ngrep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && @@ -47,7 +50,7 @@ test_expect_success 'git branch shows badly named ref as warning' ' ' test_expect_success 'branch -d can delete badly named ref' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch -d broken...ref && git branch >output 2>error && @@ -56,7 +59,7 @@ test_expect_success 'branch -d can delete badly named ref' ' ' test_expect_success 'branch -D can delete badly named ref' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch -D broken...ref && git branch >output 2>error && @@ -98,17 +101,17 @@ test_expect_success 'branch -m cannot rename to a bad ref name' ' test_might_fail git branch -D goodref && git branch goodref && test_must_fail git branch -m goodref broken...ref && - test_cmp_rev master goodref && + test_cmp_rev main goodref && git branch >output 2>error && ! grep -e "broken\.\.\.ref" error && ! grep -e "broken\.\.\.ref" output ' test_expect_failure 'branch -m can rename from a bad ref name' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch -m broken...ref renamed && - test_cmp_rev master renamed && + test_cmp_rev main renamed && git branch >output 2>error && ! grep -e "broken\.\.\.ref" error && ! grep -e "broken\.\.\.ref" output @@ -122,7 +125,7 @@ test_expect_success 'push cannot create a badly named ref' ' ! grep -e "broken\.\.\.ref" output ' -test_expect_failure C_LOCALE_OUTPUT 'push --mirror can delete badly named ref' ' +test_expect_failure 'push --mirror can delete badly named ref' ' top=$(pwd) && git init src && git init dest && @@ -135,7 +138,7 @@ test_expect_failure C_LOCALE_OUTPUT 'push --mirror can delete badly named ref' ' cd dest && test_commit two && git checkout --detach && - cp .git/refs/heads/master .git/refs/heads/broken...ref + cp .git/refs/heads/main .git/refs/heads/broken...ref ) && git -C src push --mirror "file://$top/dest" && git -C dest branch >output 2>error && @@ -146,7 +149,7 @@ test_expect_failure C_LOCALE_OUTPUT 'push --mirror can delete badly named ref' ' test_expect_success 'rev-parse skips symref pointing to broken name' ' test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch shadow one && - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && printf "ref: refs/heads/broken...ref\n" >.git/refs/tags/shadow && test_when_finished "rm -f .git/refs/tags/shadow" && git rev-parse --verify one >expect && @@ -156,11 +159,11 @@ test_expect_success 'rev-parse skips symref pointing to broken name' ' ' test_expect_success 'for-each-ref emits warnings for broken names' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname && test_when_finished "rm -f .git/refs/heads/badname" && - printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref && + printf "ref: refs/heads/main\n" >.git/refs/heads/broken...symref && test_when_finished "rm -f .git/refs/heads/broken...symref" && git for-each-ref >output 2>error && ! grep -e "broken\.\.\.ref" output && @@ -172,7 +175,7 @@ test_expect_success 'for-each-ref emits warnings for broken names' ' ' test_expect_success 'update-ref -d can delete broken name' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git update-ref -d refs/heads/broken...ref >output 2>error && test_must_be_empty output && @@ -183,7 +186,7 @@ test_expect_success 'update-ref -d can delete broken name' ' ' test_expect_success 'branch -d can delete broken name' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && git branch -d broken...ref >output 2>error && test_i18ngrep "Deleted branch broken...ref (was broken)" output && @@ -194,7 +197,7 @@ test_expect_success 'branch -d can delete broken name' ' ' test_expect_success 'update-ref --no-deref -d can delete symref to broken name' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname && test_when_finished "rm -f .git/refs/heads/badname" && @@ -205,7 +208,7 @@ test_expect_success 'update-ref --no-deref -d can delete symref to broken name' ' test_expect_success 'branch -d can delete symref to broken name' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname && test_when_finished "rm -f .git/refs/heads/badname" && @@ -234,7 +237,7 @@ test_expect_success 'branch -d can delete dangling symref to broken name' ' ' test_expect_success 'update-ref -d can delete broken name through symref' ' - cp .git/refs/heads/master .git/refs/heads/broken...ref && + cp .git/refs/heads/main .git/refs/heads/broken...ref && test_when_finished "rm -f .git/refs/heads/broken...ref" && printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname && test_when_finished "rm -f .git/refs/heads/badname" && @@ -245,7 +248,7 @@ test_expect_success 'update-ref -d can delete broken name through symref' ' ' test_expect_success 'update-ref --no-deref -d can delete symref with broken name' ' - printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref && + printf "ref: refs/heads/main\n" >.git/refs/heads/broken...symref && test_when_finished "rm -f .git/refs/heads/broken...symref" && git update-ref --no-deref -d refs/heads/broken...symref >output 2>error && test_path_is_missing .git/refs/heads/broken...symref && @@ -254,11 +257,11 @@ test_expect_success 'update-ref --no-deref -d can delete symref with broken name ' test_expect_success 'branch -d can delete symref with broken name' ' - printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref && + printf "ref: refs/heads/main\n" >.git/refs/heads/broken...symref && test_when_finished "rm -f .git/refs/heads/broken...symref" && git branch -d broken...symref >output 2>error && test_path_is_missing .git/refs/heads/broken...symref && - test_i18ngrep "Deleted branch broken...symref (was refs/heads/master)" output && + test_i18ngrep "Deleted branch broken...symref (was refs/heads/main)" output && test_must_be_empty error ' @@ -296,37 +299,37 @@ test_expect_success 'update-ref -d cannot delete absolute path' ' ' test_expect_success 'update-ref --stdin fails create with bad ref name' ' - echo "create ~a refs/heads/master" >stdin && + echo "create ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin fails update with bad ref name' ' - echo "update ~a refs/heads/master" >stdin && + echo "update ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin fails delete with bad ref name' ' - echo "delete ~a refs/heads/master" >stdin && + echo "delete ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin -z fails create with bad ref name' ' - printf "%s\0" "create ~a " refs/heads/master >stdin && + printf "%s\0" "create ~a " refs/heads/main >stdin && test_must_fail git update-ref -z --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a " err ' test_expect_success 'update-ref --stdin -z fails update with bad ref name' ' - printf "%s\0" "update ~a" refs/heads/master "" >stdin && + printf "%s\0" "update ~a" refs/heads/main "" >stdin && test_must_fail git update-ref -z --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin -z fails delete with bad ref name' ' - printf "%s\0" "delete ~a" refs/heads/master >stdin && + printf "%s\0" "delete ~a" refs/heads/main >stdin && test_must_fail git update-ref -z --stdin <stdin 2>err && grep "fatal: invalid ref format: ~a" err ' diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index b17f5c21fb..5071ac63a5 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -3,7 +3,7 @@ test_description='git fsck random collection of tests * (HEAD) B -* (master) A +* (main) A ' . ./test-lib.sh @@ -40,17 +40,13 @@ test_expect_success 'HEAD is part of refs, valid objects appear valid' ' # specific corruption you test afterwards, lest a later test trip over # it. -test_expect_success 'setup: helpers for corruption tests' ' - sha1_file() { - remainder=${1#??} && - firsttwo=${1%$remainder} && - echo ".git/objects/$firsttwo/$remainder" - } && +sha1_file () { + git rev-parse --git-path objects/$(test_oid_to_path "$1") +} - remove_object() { - rm "$(sha1_file "$1")" - } -' +remove_object () { + rm "$(sha1_file "$1")" +} test_expect_success 'object with bad sha1' ' sha=$(echo blob | git hash-object -w --stdin) && @@ -380,7 +376,7 @@ test_expect_success 'tag with incorrect tag name & missing tagger' ' warning in tag $tag: badTagName: invalid '\''tag'\'' name: wrong name format warning in tag $tag: missingTaggerEntry: invalid format - expected '\''tagger'\'' line EOF - test_i18ncmp expect out + test_cmp expect out ' test_expect_success 'tag with bad tagger' ' @@ -662,13 +658,15 @@ test_expect_success 'fsck --name-objects' ' git init name-objects && ( cd name-objects && + git config core.logAllRefUpdates false && test_commit julius caesar.t && - test_commit augustus && - test_commit caesar && + test_commit augustus44 && + test_commit caesar && remove_object $(git rev-parse julius:caesar.t) && - test_must_fail git fsck --name-objects >out && tree=$(git rev-parse --verify julius:) && - test_i18ngrep "$tree (refs/tags/julius:" out + git tag -d julius && + test_must_fail git fsck --name-objects >out && + test_i18ngrep "$tree (refs/tags/augustus44\\^:" out ) ' @@ -806,7 +804,7 @@ test_expect_success 'fsck notices dangling objects' ' git fsck >actual && # the output order is non-deterministic, as it comes from a hash sort <actual >actual.sorted && - test_i18ncmp expect actual.sorted + test_cmp expect actual.sorted ) ' @@ -816,7 +814,7 @@ test_expect_success 'fsck --connectivity-only notices dangling objects' ' git fsck --connectivity-only >actual && # the output order is non-deterministic, as it comes from a hash sort <actual >actual.sorted && - test_i18ncmp expect actual.sorted + test_cmp expect actual.sorted ) ' diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh index 408b97d5af..1c2df08333 100755 --- a/t/t1500-rev-parse.sh +++ b/t/t1500-rev-parse.sh @@ -1,8 +1,21 @@ #!/bin/sh test_description='test git rev-parse' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +test_one () { + dir="$1" && + expect="$2" && + shift && + shift && + echo "$expect" >expect && + git -C "$dir" rev-parse "$@" >actual && + test_cmp expect actual +} + # usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir absolute-git-dir test_rev_parse () { d= @@ -60,7 +73,13 @@ ROOT=$(pwd) test_expect_success 'setup' ' mkdir -p sub/dir work && - cp -R .git repo.git + cp -R .git repo.git && + git checkout -B main && + test_commit abc && + git checkout -b side && + test_commit def && + git checkout main && + git worktree add worktree side ' test_rev_parse toplevel false false true '' .git "$ROOT/.git" @@ -88,6 +107,49 @@ test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = tru test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true '' +test_expect_success 'rev-parse --path-format=absolute' ' + test_one "." "$ROOT/.git" --path-format=absolute --git-dir && + test_one "." "$ROOT/.git" --path-format=absolute --git-common-dir && + test_one "sub/dir" "$ROOT/.git" --path-format=absolute --git-dir && + test_one "sub/dir" "$ROOT/.git" --path-format=absolute --git-common-dir && + test_one "worktree" "$ROOT/.git/worktrees/worktree" --path-format=absolute --git-dir && + test_one "worktree" "$ROOT/.git" --path-format=absolute --git-common-dir && + test_one "." "$ROOT" --path-format=absolute --show-toplevel && + test_one "." "$ROOT/.git/objects" --path-format=absolute --git-path objects && + test_one "." "$ROOT/.git/objects/foo/bar/baz" --path-format=absolute --git-path objects/foo/bar/baz +' + +test_expect_success 'rev-parse --path-format=relative' ' + test_one "." ".git" --path-format=relative --git-dir && + test_one "." ".git" --path-format=relative --git-common-dir && + test_one "sub/dir" "../../.git" --path-format=relative --git-dir && + test_one "sub/dir" "../../.git" --path-format=relative --git-common-dir && + test_one "worktree" "../.git/worktrees/worktree" --path-format=relative --git-dir && + test_one "worktree" "../.git" --path-format=relative --git-common-dir && + test_one "." "./" --path-format=relative --show-toplevel && + test_one "." ".git/objects" --path-format=relative --git-path objects && + test_one "." ".git/objects/foo/bar/baz" --path-format=relative --git-path objects/foo/bar/baz +' + +test_expect_success '--path-format=relative does not affect --absolute-git-dir' ' + git rev-parse --path-format=relative --absolute-git-dir >actual && + echo "$ROOT/.git" >expect && + test_cmp expect actual +' + +test_expect_success '--path-format can change in the middle of the command line' ' + git rev-parse --path-format=absolute --git-dir --path-format=relative --git-path objects/foo/bar >actual && + cat >expect <<-EOF && + $ROOT/.git + .git/objects/foo/bar + EOF + test_cmp expect actual +' + +test_expect_success '--path-format does not segfault without an argument' ' + test_must_fail git rev-parse --path-format +' + test_expect_success 'git-common-dir from worktree root' ' echo .git >expect && git rev-parse --git-common-dir >actual && @@ -174,8 +236,8 @@ test_expect_success 'showing the superproject correctly' ' test_commit -C super/dir/sub branch1_commit && git -C super add dir/sub && test_commit -C super branch1_commit && - git -C super checkout -b branch2 master && - git -C super/dir/sub checkout -b branch2 master && + git -C super checkout -b branch2 main && + git -C super/dir/sub checkout -b branch2 main && test_commit -C super/dir/sub branch2_commit && git -C super add dir/sub && test_commit -C super branch2_commit && @@ -185,4 +247,19 @@ test_expect_success 'showing the superproject correctly' ' test_cmp expect out ' +# at least one external project depends on this behavior: +test_expect_success 'rev-parse --since= unsqueezed ordering' ' + x1=--since=1970-01-01T00:00:01Z && + x2=--since=1970-01-01T00:00:02Z && + x3=--since=1970-01-01T00:00:03Z && + git rev-parse $x1 $x1 $x3 $x2 >actual && + cat >expect <<-EOF && + --max-age=1 + --max-age=1 + --max-age=3 + --max-age=2 + EOF + test_cmp expect actual +' + test_done diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index a859abedf5..b29563fc99 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -95,7 +95,7 @@ test_expect_success 'test --parseopt help output' ' |EOF END_EXPECT test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'test --parseopt help output no switches' ' @@ -108,7 +108,7 @@ test_expect_success 'test --parseopt help output no switches' ' |EOF END_EXPECT test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_no_switches && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'test --parseopt help output hidden switches' ' @@ -121,7 +121,7 @@ test_expect_success 'test --parseopt help output hidden switches' ' |EOF END_EXPECT test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_only_hidden_switches && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'test --parseopt help-all output hidden switches' ' @@ -136,7 +136,7 @@ test_expect_success 'test --parseopt help-all output hidden switches' ' |EOF END_EXPECT test_expect_code 129 git rev-parse --parseopt -- --help-all > output < optionspec_only_hidden_switches && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'test --parseopt invalid switch help output' ' @@ -176,7 +176,7 @@ test_expect_success 'test --parseopt invalid switch help output' ' | END_EXPECT test_expect_code 129 git rev-parse --parseopt -- --does-not-exist 1>/dev/null 2>output < optionspec && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'setup expect.1' " diff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh index 492edffa9c..bf08102391 100755 --- a/t/t1503-rev-parse-verify.sh +++ b/t/t1503-rev-parse-verify.sh @@ -6,6 +6,9 @@ test_description='test git rev-parse --verify' exec </dev/null +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh add_line_into_file() @@ -51,8 +54,8 @@ test_expect_success 'works with one good rev' ' test "$rev_hash3" = "$HASH3" && rev_hash4=$(git rev-parse --verify $HASH4) && test "$rev_hash4" = "$HASH4" && - rev_master=$(git rev-parse --verify master) && - test "$rev_master" = "$HASH4" && + rev_main=$(git rev-parse --verify main) && + test "$rev_main" = "$HASH4" && rev_head=$(git rev-parse --verify HEAD) && test "$rev_head" = "$HASH4" ' @@ -86,8 +89,8 @@ test_expect_success 'fails silently when using -q' ' test_expect_success 'fails silently when using -q with deleted reflogs' ' ref=$(git rev-parse HEAD) && git update-ref --create-reflog -m "message for refs/test" refs/test "$ref" && - git reflog delete --updateref --rewrite refs/test@{0} && - test_must_fail git rev-parse -q --verify refs/test@{0} >error 2>&1 && + git reflog delete --updateref --rewrite refs/test@{1} && + test_must_fail git rev-parse -q --verify refs/test@{1} >error 2>&1 && test_must_be_empty error ' @@ -116,27 +119,27 @@ test_expect_success 'no stdout output on error' ' ' test_expect_success 'use --default' ' - git rev-parse --verify --default master && - git rev-parse --verify --default master HEAD && - git rev-parse --default master --verify && - git rev-parse --default master --verify HEAD && - git rev-parse --verify HEAD --default master && - test_must_fail git rev-parse --verify foo --default master && + git rev-parse --verify --default main && + git rev-parse --verify --default main HEAD && + git rev-parse --default main --verify && + git rev-parse --default main --verify HEAD && + git rev-parse --verify HEAD --default main && + test_must_fail git rev-parse --verify foo --default main && test_must_fail git rev-parse --default HEAD --verify bar && test_must_fail git rev-parse --verify --default HEAD baz && test_must_fail git rev-parse --default foo --verify && test_must_fail git rev-parse --verify --default bar ' -test_expect_success 'master@{n} for various n' ' +test_expect_success 'main@{n} for various n' ' N=$(git reflog | wc -l) && Nm1=$(($N-1)) && Np1=$(($N+1)) && - git rev-parse --verify master@{0} && - git rev-parse --verify master@{1} && - git rev-parse --verify master@{$Nm1} && - test_must_fail git rev-parse --verify master@{$N} && - test_must_fail git rev-parse --verify master@{$Np1} + git rev-parse --verify main@{0} && + git rev-parse --verify main@{1} && + git rev-parse --verify main@{$Nm1} && + test_must_fail git rev-parse --verify main@{$N} && + test_must_fail git rev-parse --verify main@{$Np1} ' test_expect_success SYMLINKS 'ref resolution not confused by broken symlinks' ' @@ -144,4 +147,17 @@ test_expect_success SYMLINKS 'ref resolution not confused by broken symlinks' ' test_must_fail git rev-parse --verify broken ' +test_expect_success 'options can appear after --verify' ' + git rev-parse --verify HEAD >expect && + git rev-parse --verify -q HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'verify respects --end-of-options' ' + git update-ref refs/heads/-tricky HEAD && + git rev-parse --verify HEAD >expect && + git rev-parse --verify --end-of-options -tricky >actual && + test_cmp expect actual +' + test_done diff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh index 4969edb314..2803ca9489 100755 --- a/t/t1505-rev-parse-last.sh +++ b/t/t1505-rev-parse-last.sh @@ -2,6 +2,9 @@ test_description='test @{-N} syntax' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh @@ -20,12 +23,12 @@ test_expect_success 'setup' ' make_commit 3 && git checkout side && make_commit 4 && - git merge master && - git checkout master + git merge main && + git checkout main ' -# 1 -- 2 -- 3 master +# 1 -- 2 -- 3 main # \ \ # \ \ # --- 4 --- 5 side @@ -49,7 +52,7 @@ test_expect_success '@{-1}@{1} works' ' ' test_expect_success '@{-2} works' ' - test_cmp_rev master @{-2} + test_cmp_rev main @{-2} ' test_expect_success '@{-3} fails' ' diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh index dbf690b9c1..65a154a8a2 100755 --- a/t/t1506-rev-parse-diagnosis.sh +++ b/t/t1506-rev-parse-diagnosis.sh @@ -4,6 +4,9 @@ test_description='test git rev-parse diagnosis for invalid argument' exec </dev/null +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_did_you_mean () @@ -12,7 +15,7 @@ test_did_you_mean () fatal: path '$2$3' $4, but not ${5:-$SQ$3$SQ} hint: Did you mean '$1:$2$3'${2:+ aka $SQ$1:./$3$SQ}? EOF - test_i18ncmp expected error + test_cmp expected error } HASH_file= @@ -137,10 +140,10 @@ test_expect_success 'incorrect file in :path and :N:path' ' ' test_expect_success 'invalid @{n} reference' ' - test_must_fail git rev-parse master@{99999} >output 2>error && + test_must_fail git rev-parse main@{99999} >output 2>error && test_must_be_empty output && test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error && - test_must_fail git rev-parse --verify master@{99999} >output 2>error && + test_must_fail git rev-parse --verify main@{99999} >output 2>error && test_must_be_empty output && test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error ' @@ -190,6 +193,24 @@ test_expect_success 'dotdot is not an empty set' ' test_cmp expect actual ' +test_expect_success 'dotdot does not peel endpoints' ' + git tag -a -m "annote" annotated HEAD && + A=$(git rev-parse annotated) && + H=$(git rev-parse annotated^0) && + { + echo $A && echo ^$A + } >expect-with-two-dots && + { + echo $A && echo $A && echo ^$H + } >expect-with-merge-base && + + git rev-parse annotated..annotated >actual-with-two-dots && + test_cmp expect-with-two-dots actual-with-two-dots && + + git rev-parse annotated...annotated >actual-with-merge-base && + test_cmp expect-with-merge-base actual-with-merge-base +' + test_expect_success 'arg before dashdash must be a revision (missing)' ' test_must_fail git rev-parse foobar -- 2>stderr && test_i18ngrep "bad revision" stderr @@ -236,4 +257,29 @@ test_expect_success 'escaped char does not trigger wildcard rule' ' test_must_fail git rev-parse "foo\\*bar" ' +test_expect_success 'arg after dashdash not interpreted as option' ' + cat >expect <<-\EOF && + -- + --local-env-vars + EOF + git rev-parse -- --local-env-vars >actual && + test_cmp expect actual +' + +test_expect_success 'arg after end-of-options not interpreted as option' ' + test_must_fail git rev-parse --end-of-options --not-real -- 2>err && + test_i18ngrep bad.revision.*--not-real err +' + +test_expect_success 'end-of-options still allows --' ' + cat >expect <<-EOF && + --end-of-options + $(git rev-parse --verify HEAD) + -- + path + EOF + git rev-parse --end-of-options HEAD -- path >actual && + test_cmp expect actual +' + test_done diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh index dfc0d96d8a..c34714ffe3 100755 --- a/t/t1507-rev-parse-upstream.sh +++ b/t/t1507-rev-parse-upstream.sh @@ -2,6 +2,9 @@ test_description='test <branch>@{upstream} syntax' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh @@ -10,20 +13,20 @@ test_expect_success 'setup' ' test_commit 1 && git checkout -b side && test_commit 2 && - git checkout master && + git checkout main && git clone . clone && test_commit 3 && (cd clone && test_commit 4 && git branch --track my-side origin/side && - git branch --track local-master master && + git branch --track local-main main && git branch --track fun@ny origin/side && git branch --track @funny origin/side && git branch --track funny@ origin/side && - git remote add -t master master-only .. && - git fetch master-only && + git remote add -t main main-only .. && + git fetch main-only && git branch bad-upstream && - git config branch.bad-upstream.remote master-only && + git config branch.bad-upstream.remote main-only && git config branch.bad-upstream.merge refs/heads/side ) ' @@ -39,7 +42,7 @@ error_message () { } test_expect_success '@{upstream} resolves to correct full name' ' - echo refs/remotes/origin/master >expect && + echo refs/remotes/origin/main >expect && git -C clone rev-parse --symbolic-full-name @{upstream} >actual && test_cmp expect actual && git -C clone rev-parse --symbolic-full-name @{UPSTREAM} >actual && @@ -49,7 +52,7 @@ test_expect_success '@{upstream} resolves to correct full name' ' ' test_expect_success '@{u} resolves to correct full name' ' - echo refs/remotes/origin/master >expect && + echo refs/remotes/origin/main >expect && git -C clone rev-parse --symbolic-full-name @{u} >actual && test_cmp expect actual && git -C clone rev-parse --symbolic-full-name @{U} >actual && @@ -132,7 +135,7 @@ test_expect_success 'checkout -b new my-side@{u} forks from the same' ' test_expect_success 'merge my-side@{u} records the correct name' ' ( cd clone && - git checkout master && + git checkout main && test_might_fail git branch -D new && git branch -t new my-side@{u} && git merge -s ours new@{u} && @@ -143,24 +146,24 @@ test_expect_success 'merge my-side@{u} records the correct name' ' ' test_expect_success 'branch -d other@{u}' ' - git checkout -t -b other master && + git checkout -t -b other main && git branch -d @{u} && - git for-each-ref refs/heads/master >actual && + git for-each-ref refs/heads/main >actual && test_must_be_empty actual ' test_expect_success 'checkout other@{u}' ' - git branch -f master HEAD && - git checkout -t -b another master && + git branch -f main HEAD && + git checkout -t -b another main && git checkout @{u} && git symbolic-ref HEAD >actual && - echo refs/heads/master >expect && + echo refs/heads/main >expect && test_cmp expect actual ' test_expect_success 'branch@{u} works when tracking a local branch' ' - echo refs/heads/master >expect && - git -C clone rev-parse --symbolic-full-name local-master@{u} >actual && + echo refs/heads/main >expect && + git -C clone rev-parse --symbolic-full-name local-main@{u} >actual && test_cmp expect actual ' @@ -169,15 +172,15 @@ test_expect_success 'branch@{u} error message when no upstream' ' fatal: no upstream configured for branch ${SQ}non-tracking${SQ} EOF error_message non-tracking@{u} && - test_i18ncmp expect error + test_cmp expect error ' test_expect_success '@{u} error message when no upstream' ' cat >expect <<-EOF && - fatal: no upstream configured for branch ${SQ}master${SQ} + fatal: no upstream configured for branch ${SQ}main${SQ} EOF test_must_fail git rev-parse --verify @{u} 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'branch@{u} error message with misspelt branch' ' @@ -185,7 +188,7 @@ test_expect_success 'branch@{u} error message with misspelt branch' ' fatal: no such branch: ${SQ}no-such-branch${SQ} EOF error_message no-such-branch@{u} && - test_i18ncmp expect error + test_cmp expect error ' test_expect_success '@{u} error message when not on a branch' ' @@ -194,7 +197,7 @@ test_expect_success '@{u} error message when not on a branch' ' EOF git checkout HEAD^0 && test_must_fail git rev-parse --verify @{u} 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'branch@{u} error message if upstream branch not fetched' ' @@ -202,20 +205,20 @@ test_expect_success 'branch@{u} error message if upstream branch not fetched' ' fatal: upstream branch ${SQ}refs/heads/side${SQ} not stored as a remote-tracking branch EOF error_message bad-upstream@{u} && - test_i18ncmp expect error + test_cmp expect error ' test_expect_success 'pull works when tracking a local branch' ' ( cd clone && - git checkout local-master && + git checkout local-main && git pull ) ' # makes sense if the previous one succeeded test_expect_success '@{u} works when tracking a local branch' ' - echo refs/heads/master >expect && + echo refs/heads/main >expect && git -C clone rev-parse --symbolic-full-name @{u} >actual && test_cmp expect actual ' @@ -224,7 +227,7 @@ test_expect_success 'log -g other@{u}' ' commit=$(git rev-parse HEAD) && cat >expect <<-EOF && commit $commit - Reflog: master@{0} (C O Mitter <committer@example.com>) + Reflog: main@{0} (C O Mitter <committer@example.com>) Reflog message: branch: Created from HEAD Author: A U Thor <author@example.com> Date: Thu Apr 7 15:15:13 2005 -0700 @@ -239,7 +242,7 @@ test_expect_success 'log -g other@{u}@{now}' ' commit=$(git rev-parse HEAD) && cat >expect <<-EOF && commit $commit - Reflog: master@{Thu Apr 7 15:17:13 2005 -0700} (C O Mitter <committer@example.com>) + Reflog: main@{Thu Apr 7 15:17:13 2005 -0700} (C O Mitter <committer@example.com>) Reflog message: branch: Created from HEAD Author: A U Thor <author@example.com> Date: Thu Apr 7 15:15:13 2005 -0700 diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh index 4a9964e9dc..87a4286414 100755 --- a/t/t1508-at-combinations.sh +++ b/t/t1508-at-combinations.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test various @{X} syntax combinations together' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check() { @@ -30,8 +33,8 @@ fail() { } test_expect_success 'setup' ' - test_commit master-one && - test_commit master-two && + test_commit main-one && + test_commit main-two && git checkout -b upstream-branch && test_commit upstream-one && test_commit upstream-two && @@ -47,7 +50,7 @@ test_expect_success 'setup' ' git checkout -b new-branch && test_commit new-one && test_commit new-two && - git branch -u master old-branch && + git branch -u main old-branch && git branch -u upstream-branch new-branch ' @@ -62,8 +65,8 @@ check "@{-1}@{1}" commit old-one check "@{u}" ref refs/heads/upstream-branch check "HEAD@{u}" ref refs/heads/upstream-branch check "@{u}@{1}" commit upstream-one -check "@{-1}@{u}" ref refs/heads/master -check "@{-1}@{u}@{1}" commit master-one +check "@{-1}@{u}" ref refs/heads/main +check "@{-1}@{u}@{1}" commit main-one check "@" commit new-two check "@@{u}" ref refs/heads/upstream-branch check "@@/at-test" ref refs/heads/@@/at-test @@ -99,4 +102,17 @@ test_expect_success 'create path with @' ' check "@:normal" blob content check "@:fun@ny" blob content +test_expect_success '@{1} works with only one reflog entry' ' + git checkout -B newbranch main && + git reflog expire --expire=now refs/heads/newbranch && + git commit --allow-empty -m "first after expiration" && + test_cmp_rev newbranch~ newbranch@{1} +' + +test_expect_success '@{0} works with empty reflog' ' + git checkout -B newbranch main && + git reflog expire --expire=now refs/heads/newbranch && + test_cmp_rev newbranch newbranch@{0} +' + test_done diff --git a/t/t1509-root-work-tree.sh b/t/t1509-root-work-tree.sh index fd2f7abf1c..553a3f601b 100755 --- a/t/t1509-root-work-tree.sh +++ b/t/t1509-root-work-tree.sh @@ -221,7 +221,7 @@ test_expect_success 'setup' ' rm -rf /.git && echo "Initialized empty Git repository in /.git/" > expected && git init > result && - test_i18ncmp expected result + test_cmp expected result ' test_vars 'auto gitdir, root' ".git" "/" "" @@ -246,7 +246,7 @@ test_expect_success 'setup' ' cd / && echo "Initialized empty Git repository in /" > expected && git init --bare > result && - test_i18ncmp expected result + test_cmp expected result ' test_vars 'auto gitdir, root' "." "" "" diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh index 9974457f56..bbfe05b8e4 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -79,7 +79,7 @@ setup_repo () { name=$1 worktreecfg=$2 gitfile=$3 barecfg=$4 && sane_unset GIT_DIR GIT_WORK_TREE && - git init "$name" && + git -c init.defaultBranch=initial init "$name" && maybe_config "$name/.git/config" core.worktree "$worktreecfg" && maybe_config "$name/.git/config" core.bare "$barecfg" && mkdir -p "$name/sub/sub" && diff --git a/t/t1511-rev-parse-caret.sh b/t/t1511-rev-parse-caret.sh index e0a49a651f..6ecfed86bc 100755 --- a/t/t1511-rev-parse-caret.sh +++ b/t/t1511-rev-parse-caret.sh @@ -2,6 +2,9 @@ test_description='tests for ref^{stuff}' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -15,7 +18,7 @@ test_expect_success 'setup' ' git commit -m Initial && git tag -a -m commit commit-tag && git branch ref && - git checkout master && + git checkout main && echo modified >>a-blob && git add -u && git commit -m Modified && @@ -73,52 +76,52 @@ test_expect_success 'ref^{tag}' ' ' test_expect_success 'ref^{/.}' ' - git rev-parse master >expected && - git rev-parse master^{/.} >actual && + git rev-parse main >expected && + git rev-parse main^{/.} >actual && test_cmp expected actual ' test_expect_success 'ref^{/non-existent}' ' - test_must_fail git rev-parse master^{/non-existent} + test_must_fail git rev-parse main^{/non-existent} ' test_expect_success 'ref^{/Initial}' ' git rev-parse ref >expected && - git rev-parse master^{/Initial} >actual && + git rev-parse main^{/Initial} >actual && test_cmp expected actual ' test_expect_success 'ref^{/!Exp}' ' - test_must_fail git rev-parse master^{/!Exp} + test_must_fail git rev-parse main^{/!Exp} ' test_expect_success 'ref^{/!}' ' - test_must_fail git rev-parse master^{/!} + test_must_fail git rev-parse main^{/!} ' test_expect_success 'ref^{/!!Exp}' ' git rev-parse expref >expected && - git rev-parse master^{/!!Exp} >actual && + git rev-parse main^{/!!Exp} >actual && test_cmp expected actual ' test_expect_success 'ref^{/!-}' ' - test_must_fail git rev-parse master^{/!-} + test_must_fail git rev-parse main^{/!-} ' test_expect_success 'ref^{/!-.}' ' - test_must_fail git rev-parse master^{/!-.} + test_must_fail git rev-parse main^{/!-.} ' test_expect_success 'ref^{/!-non-existent}' ' - git rev-parse master >expected && - git rev-parse master^{/!-non-existent} >actual && + git rev-parse main >expected && + git rev-parse main^{/!-non-existent} >actual && test_cmp expected actual ' test_expect_success 'ref^{/!-Changed}' ' git rev-parse expref >expected && - git rev-parse master^{/!-Changed} >actual && + git rev-parse main^{/!-Changed} >actual && test_cmp expected actual ' diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 18fa6cf40d..7891a6becf 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -20,6 +20,9 @@ one tagged as v1.0.0. They all have one regular file each. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq SHA1 @@ -48,7 +51,7 @@ test_expect_success 'blob and tree' ' test_expect_success 'warn ambiguity when no candidate matches type hint' ' test_must_fail git rev-parse --verify 000000000^{commit} 2>actual && - test_i18ngrep "short SHA1 000000000 is ambiguous" actual + test_i18ngrep "short object ID 000000000 is ambiguous" actual ' test_expect_success 'disambiguate tree-ish' ' @@ -212,7 +215,7 @@ test_expect_success 'more history' ' side=$(git rev-parse HEAD) && # commit 000000000066 - git checkout master && + git checkout main && # If you use recursive, merge will fail and you will need to # clean up a0blgqsjc as well. If you use resolve, merge will @@ -311,39 +314,39 @@ test_expect_success 'ambiguous short sha1 ref' ' grep "refname.*${REF}.*ambiguous" err ' -test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (raw)' ' +test_expect_success 'ambiguity errors are not repeated (raw)' ' test_must_fail git rev-parse 00000 2>stderr && grep "is ambiguous" stderr >errors && test_line_count = 1 errors ' -test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (treeish)' ' +test_expect_success 'ambiguity errors are not repeated (treeish)' ' test_must_fail git rev-parse 00000:foo 2>stderr && grep "is ambiguous" stderr >errors && test_line_count = 1 errors ' -test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (peel)' ' +test_expect_success 'ambiguity errors are not repeated (peel)' ' test_must_fail git rev-parse 00000^{commit} 2>stderr && grep "is ambiguous" stderr >errors && test_line_count = 1 errors ' -test_expect_success C_LOCALE_OUTPUT 'ambiguity hints' ' +test_expect_success 'ambiguity hints' ' test_must_fail git rev-parse 000000000 2>stderr && grep ^hint: stderr >hints && # 16 candidates, plus one intro line test_line_count = 17 hints ' -test_expect_success C_LOCALE_OUTPUT 'ambiguity hints respect type' ' +test_expect_success 'ambiguity hints respect type' ' test_must_fail git rev-parse 000000000^{commit} 2>stderr && grep ^hint: stderr >hints && # 5 commits, 1 tag (which is a committish), plus intro line test_line_count = 7 hints ' -test_expect_success C_LOCALE_OUTPUT 'failed type-selector still shows hint' ' +test_expect_success 'failed type-selector still shows hint' ' # these two blobs share the same prefix "ee3d", but neither # will pass for a commit echo 851 | git hash-object --stdin -w && @@ -367,7 +370,7 @@ test_expect_success 'core.disambiguate does not override context' ' git -c core.disambiguate=committish rev-parse $sha1^{tree} ' -test_expect_success C_LOCALE_OUTPUT 'ambiguous commits are printed by type first, then hash order' ' +test_expect_success 'ambiguous commits are printed by type first, then hash order' ' test_must_fail git rev-parse 0000 2>stderr && grep ^hint: stderr >hints && grep 0000 hints >objects && diff --git a/t/t1513-rev-parse-prefix.sh b/t/t1513-rev-parse-prefix.sh index 87ec3ae714..5f437be8c9 100755 --- a/t/t1513-rev-parse-prefix.sh +++ b/t/t1513-rev-parse-prefix.sh @@ -2,6 +2,9 @@ test_description='Tests for rev-parse --prefix' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -76,9 +79,9 @@ test_expect_success 'disambiguate path with valid prefix' ' ' test_expect_success 'file and refs with prefix' ' - git rev-parse --prefix sub1/ master file1 >actual && + git rev-parse --prefix sub1/ main file1 >actual && cat <<-EOF >expected && - $(git rev-parse master) + $(git rev-parse main) sub1/file1 EOF test_cmp expected actual diff --git a/t/t1514-rev-parse-push.sh b/t/t1514-rev-parse-push.sh index 788cc91e45..d868a08110 100755 --- a/t/t1514-rev-parse-push.sh +++ b/t/t1514-rev-parse-push.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test <branch>@{push} syntax' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh resolve () { @@ -16,24 +19,24 @@ test_expect_success 'setup' ' git remote add other other.git && test_commit base && git push origin HEAD && - git branch --set-upstream-to=origin/master master && - git branch --track topic origin/master && + git branch --set-upstream-to=origin/main main && + git branch --track topic origin/main && git push origin topic && git push other topic ' test_expect_success '@{push} with default=nothing' ' test_config push.default nothing && - test_must_fail git rev-parse master@{push} && - test_must_fail git rev-parse master@{PUSH} && - test_must_fail git rev-parse master@{PuSH} + test_must_fail git rev-parse main@{push} && + test_must_fail git rev-parse main@{PUSH} && + test_must_fail git rev-parse main@{PuSH} ' test_expect_success '@{push} with default=simple' ' test_config push.default simple && - resolve master@{push} refs/remotes/origin/master && - resolve master@{PUSH} refs/remotes/origin/master && - resolve master@{pUSh} refs/remotes/origin/master + resolve main@{push} refs/remotes/origin/main && + resolve main@{PUSH} refs/remotes/origin/main && + resolve main@{pUSh} refs/remotes/origin/main ' test_expect_success 'triangular @{push} fails with default=simple' ' diff --git a/t/t1600-index.sh b/t/t1600-index.sh index b7c31aa86a..c9b9e718b8 100755 --- a/t/t1600-index.sh +++ b/t/t1600-index.sh @@ -18,7 +18,7 @@ test_expect_success 'bogus GIT_INDEX_VERSION issues warning' ' warning: GIT_INDEX_VERSION set, but the value is invalid. Using version Z EOF - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ) ' @@ -32,7 +32,7 @@ test_expect_success 'out of bounds GIT_INDEX_VERSION issues warning' ' warning: GIT_INDEX_VERSION set, but the value is invalid. Using version Z EOF - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ) ' @@ -55,7 +55,7 @@ test_expect_success 'out of bounds index.version issues warning' ' warning: index.version set, but the value is invalid. Using version Z EOF - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ) ' diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh index 12a5568844..986baa612e 100755 --- a/t/t1700-split-index.sh +++ b/t/t1700-split-index.sh @@ -2,6 +2,9 @@ test_description='split index mode tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # We need total control of index splitting here @@ -496,7 +499,7 @@ test_expect_success 'do not refresh null base index' ' test_commit initial && git checkout -b side-branch && test_commit extra && - git checkout master && + git checkout main && git update-index --split-index && test_commit more && # must not write a new shareindex, or we wont catch the problem diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh index a12afe93f3..a9352b08a8 100755 --- a/t/t2004-checkout-cache-temp.sh +++ b/t/t2004-checkout-cache-temp.sh @@ -88,9 +88,17 @@ test_expect_success 'checkout all stage 2 to temporary files' ' done ' +test_expect_success 'checkout all stages of unknown path' ' + rm -f path* .merge_* actual && + test_must_fail git checkout-index --stage=all --temp \ + -- does-not-exist 2>stderr && + test_i18ngrep not.in.the.cache stderr +' + test_expect_success 'checkout all stages/one file to nothing' ' rm -f path* .merge_* actual && - git checkout-index --stage=all --temp -- path0 >actual && + git checkout-index --stage=all --temp -- path0 >actual 2>stderr && + test_must_be_empty stderr && test_line_count = 0 actual ' diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh index 57cbdfe9bc..7705e3a317 100755 --- a/t/t2006-checkout-index-basic.sh +++ b/t/t2006-checkout-index-basic.sh @@ -21,4 +21,83 @@ test_expect_success 'checkout-index -h in broken repository' ' test_i18ngrep "[Uu]sage" broken/usage ' +test_expect_success 'checkout-index reports errors (cmdline)' ' + test_must_fail git checkout-index -- does-not-exist 2>stderr && + test_i18ngrep not.in.the.cache stderr +' + +test_expect_success 'checkout-index reports errors (stdin)' ' + echo does-not-exist | + test_must_fail git checkout-index --stdin 2>stderr && + test_i18ngrep not.in.the.cache stderr +' +for mode in 'case' 'utf-8' +do + case "$mode" in + case) dir='A' symlink='a' mode_prereq='CASE_INSENSITIVE_FS' ;; + utf-8) + dir=$(printf "\141\314\210") symlink=$(printf "\303\244") + mode_prereq='UTF8_NFD_TO_NFC' ;; + esac + + test_expect_success SYMLINKS,$mode_prereq \ + "checkout-index with $mode-collision don't write to the wrong place" ' + git init $mode-collision && + ( + cd $mode-collision && + mkdir target-dir && + + empty_obj_hex=$(git hash-object -w --stdin </dev/null) && + symlink_hex=$(printf "%s" "$PWD/target-dir" | git hash-object -w --stdin) && + + cat >objs <<-EOF && + 100644 blob ${empty_obj_hex} ${dir}/x + 100644 blob ${empty_obj_hex} ${dir}/y + 100644 blob ${empty_obj_hex} ${dir}/z + 120000 blob ${symlink_hex} ${symlink} + EOF + + git update-index --index-info <objs && + + # Note: the order is important here to exercise the + # case where the file at ${dir} has its type changed by + # the time Git tries to check out ${dir}/z. + # + # Also, we use core.precomposeUnicode=false because we + # want Git to treat the UTF-8 paths transparently on + # Mac OS, matching what is in the index. + # + git -c core.precomposeUnicode=false checkout-index -f \ + ${dir}/x ${dir}/y ${symlink} ${dir}/z && + + # Should not create ${dir}/z at ${symlink}/z + test_path_is_missing target-dir/z + + ) + ' +done + +test_expect_success 'checkout-index --temp correctly reports error on missing blobs' ' + test_when_finished git reset --hard && + missing_blob=$(echo "no such blob here" | git hash-object --stdin) && + cat >objs <<-EOF && + 100644 $missing_blob file + 120000 $missing_blob symlink + EOF + git update-index --index-info <objs && + + test_must_fail git checkout-index --temp symlink file 2>stderr && + test_i18ngrep "unable to read sha1 file of file ($missing_blob)" stderr && + test_i18ngrep "unable to read sha1 file of symlink ($missing_blob)" stderr +' + +test_expect_success 'checkout-index --temp correctly reports error for submodules' ' + git init sub && + test_commit -C sub file && + git submodule add ./sub && + git commit -m sub && + test_must_fail git checkout-index --temp sub 2>stderr && + test_i18ngrep "cannot create temporary submodule sub" stderr +' + test_done diff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh index fc9aad530e..6f0b90ce12 100755 --- a/t/t2007-checkout-symlink.sh +++ b/t/t2007-checkout-symlink.sh @@ -4,6 +4,9 @@ test_description='git checkout to switch between branches with symlink<->dir' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -12,14 +15,14 @@ test_expect_success setup ' echo hello >frotz/filfre && git add frotz/filfre && test_tick && - git commit -m "master has file frotz/filfre" && + git commit -m "main has file frotz/filfre" && git branch side && echo goodbye >nitfol && git add nitfol && test_tick && - git commit -m "master adds file nitfol" && + git commit -m "main adds file nitfol" && git checkout side && @@ -34,13 +37,13 @@ test_expect_success setup ' test_expect_success 'switch from symlink to dir' ' - git checkout master + git checkout main ' -test_expect_success 'Remove temporary directories & switch to master' ' +test_expect_success 'Remove temporary directories & switch to main' ' rm -fr frotz xyzzy nitfol && - git checkout -f master + git checkout -f main ' test_expect_success 'switch from dir to symlink' ' diff --git a/t/t2009-checkout-statinfo.sh b/t/t2009-checkout-statinfo.sh index f3c2152087..b0540636ae 100755 --- a/t/t2009-checkout-statinfo.sh +++ b/t/t2009-checkout-statinfo.sh @@ -2,6 +2,9 @@ test_description='checkout should leave clean stat info' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -21,13 +24,13 @@ test_expect_success 'branch switching' ' git reset --hard && test "$(git diff-files --raw)" = "" && - git checkout master && + git checkout main && test "$(git diff-files --raw)" = "" && git checkout side && test "$(git diff-files --raw)" = "" && - git checkout master && + git checkout main && test "$(git diff-files --raw)" = "" ' @@ -37,13 +40,13 @@ test_expect_success 'path checkout' ' git reset --hard && test "$(git diff-files --raw)" = "" && - git checkout master world && + git checkout main world && test "$(git diff-files --raw)" = "" && git checkout side world && test "$(git diff-files --raw)" = "" && - git checkout master world && + git checkout main world && test "$(git diff-files --raw)" = "" ' diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh index 2e47fe01cf..6e8757387d 100755 --- a/t/t2010-checkout-ambiguous.sh +++ b/t/t2010-checkout-ambiguous.sh @@ -2,6 +2,9 @@ test_description='checkout and pathspecs/refspecs ambiguities' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -17,7 +20,7 @@ test_expect_success 'reference must be a tree' ' ' test_expect_success 'branch switching' ' - test "refs/heads/master" = "$(git symbolic-ref HEAD)" && + test "refs/heads/main" = "$(git symbolic-ref HEAD)" && git checkout world -- && test "refs/heads/world" = "$(git symbolic-ref HEAD)" ' @@ -57,7 +60,7 @@ test_expect_success 'disambiguate checking out from a tree-ish' ' ' test_expect_success 'accurate error message with more than one ref' ' - test_must_fail git checkout HEAD master -- 2>actual && + test_must_fail git checkout HEAD main -- 2>actual && test_i18ngrep 2 actual && test_i18ngrep "one reference expected, 2 given" actual ' diff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh index 0e8d56aa76..e52022e152 100755 --- a/t/t2011-checkout-invalid-head.sh +++ b/t/t2011-checkout-invalid-head.sh @@ -2,6 +2,9 @@ test_description='checkout switching away from an invalid branch' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -11,12 +14,12 @@ test_expect_success 'setup' ' ' test_expect_success 'checkout should not start branch from a tree' ' - test_must_fail git checkout -b newbranch master^{tree} + test_must_fail git checkout -b newbranch main^{tree} ' -test_expect_success 'checkout master from invalid HEAD' ' +test_expect_success 'checkout main from invalid HEAD' ' echo $ZERO_OID >.git/HEAD && - git checkout master -- + git checkout main -- ' test_expect_success 'checkout notices failure to lock HEAD' ' @@ -26,7 +29,7 @@ test_expect_success 'checkout notices failure to lock HEAD' ' ' test_expect_success 'create ref directory/file conflict scenario' ' - git update-ref refs/heads/outer/inner master && + git update-ref refs/heads/outer/inner main && # do not rely on symbolic-ref to get a known state, # as it may use the same code we are testing @@ -37,12 +40,12 @@ test_expect_success 'create ref directory/file conflict scenario' ' test_expect_success 'checkout away from d/f HEAD (unpacked, to branch)' ' reset_to_df && - git checkout master + git checkout main ' test_expect_success 'checkout away from d/f HEAD (unpacked, to detached)' ' reset_to_df && - git checkout --detach master + git checkout --detach main ' test_expect_success 'pack refs' ' @@ -51,11 +54,11 @@ test_expect_success 'pack refs' ' test_expect_success 'checkout away from d/f HEAD (packed, to branch)' ' reset_to_df && - git checkout master + git checkout main ' test_expect_success 'checkout away from d/f HEAD (packed, to detached)' ' reset_to_df && - git checkout --detach master + git checkout --detach main ' test_done diff --git a/t/t2012-checkout-last.sh b/t/t2012-checkout-last.sh index e7ba8c505f..0e7d47ab31 100755 --- a/t/t2012-checkout-last.sh +++ b/t/t2012-checkout-last.sh @@ -2,16 +2,15 @@ test_description='checkout can switch to last branch and merge base' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' - echo hello >world && - git add world && - git commit -m initial && + test_commit initial world hello && git branch other && - echo "hello again" >>world && - git add world && - git commit -m second + test_commit --append second world "hello again" ' test_expect_success '"checkout -" does not work initially' ' @@ -24,7 +23,7 @@ test_expect_success 'first branch switch' ' test_expect_success '"checkout -" switches back' ' git checkout - && - test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" + test "z$(git symbolic-ref HEAD)" = "zrefs/heads/main" ' test_expect_success '"checkout -" switches forth' ' @@ -93,61 +92,59 @@ test_expect_success 'switch to twelfth from the last' ' test_expect_success 'merge base test setup' ' git checkout -b another other && - echo "hello again" >>world && - git add world && - git commit -m third + test_commit --append third world "hello again" ' -test_expect_success 'another...master' ' +test_expect_success 'another...main' ' git checkout another && - git checkout another...master && - test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" + git checkout another...main && + test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify main^)" ' -test_expect_success '...master' ' +test_expect_success '...main' ' git checkout another && - git checkout ...master && - test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" + git checkout ...main && + test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify main^)" ' -test_expect_success 'master...' ' +test_expect_success 'main...' ' git checkout another && - git checkout master... && - test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify master^)" + git checkout main... && + test "z$(git rev-parse --verify HEAD)" = "z$(git rev-parse --verify main^)" ' test_expect_success '"checkout -" works after a rebase A' ' - git checkout master && + git checkout main && git checkout other && - git rebase master && + git rebase main && git checkout - && - test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" + test "z$(git symbolic-ref HEAD)" = "zrefs/heads/main" ' test_expect_success '"checkout -" works after a rebase A B' ' - git branch moodle master~1 && - git checkout master && + git branch moodle main~1 && + git checkout main && git checkout other && - git rebase master moodle && + git rebase main moodle && git checkout - && - test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" + test "z$(git symbolic-ref HEAD)" = "zrefs/heads/main" ' test_expect_success '"checkout -" works after a rebase -i A' ' - git checkout master && + git checkout main && git checkout other && - git rebase -i master && + git rebase -i main && git checkout - && - test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" + test "z$(git symbolic-ref HEAD)" = "zrefs/heads/main" ' test_expect_success '"checkout -" works after a rebase -i A B' ' - git branch foodle master~1 && - git checkout master && + git branch foodle main~1 && + git checkout main && git checkout other && - git rebase master foodle && + git rebase main foodle && git checkout - && - test "z$(git symbolic-ref HEAD)" = "zrefs/heads/master" + test "z$(git symbolic-ref HEAD)" = "zrefs/heads/main" ' test_done diff --git a/t/t2015-checkout-unborn.sh b/t/t2015-checkout-unborn.sh index 37bdcedcc9..a9721215fa 100755 --- a/t/t2015-checkout-unborn.sh +++ b/t/t2015-checkout-unborn.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='checkout from unborn branch' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -11,7 +14,7 @@ test_expect_success 'setup' ' git add file && git commit -m base ) && - git fetch parent master:origin + git fetch parent main:origin ' test_expect_success 'checkout from unborn preserves untracked files' ' diff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh index 47aeb0b167..abfd586c32 100755 --- a/t/t2016-checkout-patch.sh +++ b/t/t2016-checkout-patch.sh @@ -18,6 +18,10 @@ test_expect_success PERL 'setup' ' # note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar' +# NEEDSWORK: Since the builtin add-p is used when $GIT_TEST_ADD_I_USE_BUILTIN +# is given, we should replace the PERL prerequisite with an ADD_I prerequisite +# which first checks if $GIT_TEST_ADD_I_USE_BUILTIN is defined before checking +# PERL. test_expect_success PERL 'saying "n" does nothing' ' set_and_save_state dir/foo work head && test_write_lines n n | git checkout -p && @@ -59,6 +63,13 @@ test_expect_success PERL 'git checkout -p HEAD with change already staged' ' verify_state dir/foo head head ' +test_expect_success PERL 'git checkout -p HEAD^...' ' + # the third n is to get out in case it mistakenly does not apply + test_write_lines n y n | git checkout -p HEAD^... && + verify_saved_state bar && + verify_state dir/foo parent parent +' + test_expect_success PERL 'git checkout -p HEAD^' ' # the third n is to get out in case it mistakenly does not apply test_write_lines n y n | git checkout -p HEAD^ && @@ -112,4 +123,9 @@ test_expect_success PERL 'none of this moved HEAD' ' verify_saved_head ' +test_expect_success PERL 'empty tree can be handled' ' + test_when_finished "git reset --hard" && + git checkout -p $(test_oid empty_tree) -- +' + test_done diff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh index 655f278c5f..88d6992a5e 100755 --- a/t/t2017-checkout-orphan.sh +++ b/t/t2017-checkout-orphan.sh @@ -7,6 +7,9 @@ test_description='git checkout --orphan Main Tests for --orphan functionality.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh TEST_FILE=foo @@ -29,34 +32,34 @@ test_expect_success '--orphan creates a new orphan branch from HEAD' ' test_tick && git commit -m "Third Commit" && test_must_fail git rev-parse --verify HEAD^ && - git diff-tree --quiet master alpha + git diff-tree --quiet main alpha ' test_expect_success '--orphan creates a new orphan branch from <start_point>' ' - git checkout master && - git checkout --orphan beta master^ && + git checkout main && + git checkout --orphan beta main^ && test_must_fail git rev-parse --verify HEAD && test "refs/heads/beta" = "$(git symbolic-ref HEAD)" && test_tick && git commit -m "Fourth Commit" && test_must_fail git rev-parse --verify HEAD^ && - git diff-tree --quiet master^ beta + git diff-tree --quiet main^ beta ' test_expect_success '--orphan must be rejected with -b' ' - git checkout master && + git checkout main && test_must_fail git checkout --orphan new -b newer && - test refs/heads/master = "$(git symbolic-ref HEAD)" + test refs/heads/main = "$(git symbolic-ref HEAD)" ' test_expect_success '--orphan must be rejected with -t' ' - git checkout master && - test_must_fail git checkout --orphan new -t master && - test refs/heads/master = "$(git symbolic-ref HEAD)" + git checkout main && + test_must_fail git checkout --orphan new -t main && + test refs/heads/main = "$(git symbolic-ref HEAD)" ' test_expect_success '--orphan ignores branch.autosetupmerge' ' - git checkout master && + git checkout main && git config branch.autosetupmerge always && git checkout --orphan gamma && test -z "$(git config branch.gamma.merge)" && @@ -65,7 +68,7 @@ test_expect_success '--orphan ignores branch.autosetupmerge' ' ' test_expect_success '--orphan makes reflog by default' ' - git checkout master && + git checkout main && git config --unset core.logAllRefUpdates && git checkout --orphan delta && test_must_fail git rev-parse --verify delta@{0} && @@ -73,8 +76,8 @@ test_expect_success '--orphan makes reflog by default' ' git rev-parse --verify delta@{0} ' -test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' ' - git checkout master && +test_expect_success REFFILES '--orphan does not make reflog when core.logAllRefUpdates = false' ' + git checkout main && git config core.logAllRefUpdates false && git checkout --orphan epsilon && test_must_fail git rev-parse --verify epsilon@{0} && @@ -83,7 +86,7 @@ test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = ' test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' ' - git checkout master && + git checkout main && git checkout -l --orphan zeta && test_must_fail git rev-parse --verify zeta@{0} && git commit -m Zeta && @@ -91,33 +94,33 @@ test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = ' test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' ' - git checkout master && + git checkout main && git checkout -l --orphan eta && test_must_fail git rev-parse --verify eta@{0} && - git checkout master && + git checkout main && test_must_fail git rev-parse --verify eta@{0} ' test_expect_success '--orphan is rejected with an existing name' ' - git checkout master && - test_must_fail git checkout --orphan master && - test refs/heads/master = "$(git symbolic-ref HEAD)" + git checkout main && + test_must_fail git checkout --orphan main && + test refs/heads/main = "$(git symbolic-ref HEAD)" ' test_expect_success '--orphan refuses to switch if a merge is needed' ' - git checkout master && + git checkout main && git reset --hard && echo local >>"$TEST_FILE" && cat "$TEST_FILE" >"$TEST_FILE.saved" && - test_must_fail git checkout --orphan new master^ && - test refs/heads/master = "$(git symbolic-ref HEAD)" && + test_must_fail git checkout --orphan new main^ && + test refs/heads/main = "$(git symbolic-ref HEAD)" && test_cmp "$TEST_FILE" "$TEST_FILE.saved" && git diff-index --quiet --cached HEAD && git reset --hard ' test_expect_success 'cannot --detach on an unborn branch' ' - git checkout master && + git checkout main && git checkout --orphan new && test_must_fail git checkout --detach ' diff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh index 5f761bc616..93be1c0eae 100755 --- a/t/t2018-checkout-branch.sh +++ b/t/t2018-checkout-branch.sh @@ -150,7 +150,7 @@ test_expect_success 'checkout -b to @{-1} fails with the right branch name' ' git checkout branch2 && echo >expect "fatal: A branch named '\''branch1'\'' already exists." && test_must_fail git checkout -b @{-1} 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'checkout -B to an existing branch resets branch to HEAD' ' diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh index b748db9946..bc46713a43 100755 --- a/t/t2020-checkout-detach.sh +++ b/t/t2020-checkout-detach.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='checkout into detached HEAD state' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_detached () { @@ -22,7 +25,7 @@ check_no_orphan_warning() { } reset () { - git checkout master && + git checkout main && check_not_detached } @@ -85,7 +88,7 @@ test_expect_success 'checkout --detach errors out for non-commit' ' test_expect_success 'checkout --detach errors out for extra argument' ' reset && - git checkout master && + git checkout main && test_must_fail git checkout --detach tag one.t && check_not_detached ' @@ -113,7 +116,7 @@ test_expect_success 'checkout warns on orphan commits' ' echo new content >orphan && git commit -a -m orphan2 && orphan2=$(git rev-parse HEAD) && - git checkout master 2>stderr + git checkout main 2>stderr ' test_expect_success 'checkout warns on orphan commits: output' ' @@ -132,7 +135,7 @@ test_expect_success 'checkout warns orphaning 1 of 2 commits: output' ' test_expect_success 'checkout does not warn leaving ref tip' ' reset && git checkout --detach two && - git checkout master 2>stderr + git checkout main 2>stderr ' test_expect_success 'checkout does not warn leaving ref tip' ' @@ -142,7 +145,7 @@ test_expect_success 'checkout does not warn leaving ref tip' ' test_expect_success 'checkout does not warn leaving reachable commit' ' reset && git checkout --detach HEAD^ && - git checkout master 2>stderr + git checkout main 2>stderr ' test_expect_success 'checkout does not warn leaving reachable commit' ' @@ -150,17 +153,17 @@ test_expect_success 'checkout does not warn leaving reachable commit' ' ' cat >expect <<'EOF' -Your branch is behind 'master' by 1 commit, and can be fast-forwarded. +Your branch is behind 'main' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch) EOF test_expect_success 'tracking count is accurate after orphan check' ' reset && - git branch child master^ && + git branch child main^ && git config branch.child.remote . && - git config branch.child.merge refs/heads/master && + git config branch.child.merge refs/heads/main && git checkout child^ && git checkout child >stdout && - test_i18ncmp expect stdout + test_cmp expect stdout ' test_expect_success 'no advice given for explicit detached head state' ' @@ -189,9 +192,9 @@ test_expect_success 'no advice given for explicit detached head state' ' # Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (new format) test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not asked to' " - commit=$(git rev-parse --short=12 master^) && - commit2=$(git rev-parse --short=12 master~2) && - commit3=$(git rev-parse --short=12 master~3) && + commit=$(git rev-parse --short=12 main^) && + commit2=$(git rev-parse --short=12 main~2) && + commit3=$(git rev-parse --short=12 main~3) && # The first detach operation is more chatty than the following ones. cat >1st_detach <<-EOF && @@ -234,15 +237,15 @@ test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not as sane_unset GIT_PRINT_SHA1_ELLIPSIS && git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 1st_detach actual && + test_cmp 1st_detach actual && GIT_PRINT_SHA1_ELLIPSIS="no" git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 2nd_detach actual && + test_cmp 2nd_detach actual && GIT_PRINT_SHA1_ELLIPSIS= git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 3rd_detach actual && + test_cmp 3rd_detach actual && sane_unset GIT_PRINT_SHA1_ELLIPSIS && @@ -253,17 +256,17 @@ test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not as # Make no mention of the env var at all git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 1st_detach actual && + test_cmp 1st_detach actual && GIT_PRINT_SHA1_ELLIPSIS='nope' && git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 2nd_detach actual && + test_cmp 2nd_detach actual && GIT_PRINT_SHA1_ELLIPSIS=nein && git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 3rd_detach actual && + test_cmp 3rd_detach actual && true " @@ -271,9 +274,9 @@ test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not as # Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (old format) test_expect_success 'describe_detached_head does print SHA-1 ellipsis when asked to' " - commit=$(git rev-parse --short=12 master^) && - commit2=$(git rev-parse --short=12 master~2) && - commit3=$(git rev-parse --short=12 master~3) && + commit=$(git rev-parse --short=12 main^) && + commit2=$(git rev-parse --short=12 main~2) && + commit3=$(git rev-parse --short=12 main~3) && # The first detach operation is more chatty than the following ones. cat >1st_detach <<-EOF && @@ -316,15 +319,15 @@ test_expect_success 'describe_detached_head does print SHA-1 ellipsis when asked GIT_PRINT_SHA1_ELLIPSIS=yes git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 1st_detach actual && + test_cmp 1st_detach actual && GIT_PRINT_SHA1_ELLIPSIS=Yes git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 2nd_detach actual && + test_cmp 2nd_detach actual && GIT_PRINT_SHA1_ELLIPSIS=YES git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 && check_detached && - test_i18ncmp 3rd_detach actual && + test_cmp 3rd_detach actual && true " diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh index c2ada7de37..70d69263e6 100755 --- a/t/t2021-checkout-overwrite.sh +++ b/t/t2021-checkout-overwrite.sh @@ -51,4 +51,16 @@ test_expect_success SYMLINKS 'the symlink remained' ' test -h a/b ' +test_expect_success SYMLINKS 'checkout -f must not follow symlinks when removing entries' ' + git checkout -f start && + mkdir dir && + >dir/f && + git add dir/f && + git commit -m "add dir/f" && + mv dir untracked && + ln -s untracked dir && + git checkout -f HEAD~ && + test_path_is_file untracked/f +' + test_done diff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh index 6844afafc0..c49ba7f9bd 100755 --- a/t/t2022-checkout-paths.sh +++ b/t/t2022-checkout-paths.sh @@ -1,19 +1,22 @@ #!/bin/sh test_description='checkout $tree -- $paths' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' mkdir dir && - >dir/master && + >dir/main && echo common >dir/common && - git add dir/master dir/common && - test_tick && git commit -m "master has dir/master" && + git add dir/main dir/common && + test_tick && git commit -m "main has dir/main" && git checkout -b next && - git mv dir/master dir/next0 && + git mv dir/main dir/next0 && echo next >dir/next1 && git add dir && - test_tick && git commit -m "next has dir/next but not dir/master" + test_tick && git commit -m "next has dir/next but not dir/main" ' test_expect_success 'checking out paths out of a tree does not clobber unrelated paths' ' @@ -26,11 +29,11 @@ test_expect_success 'checking out paths out of a tree does not clobber unrelated echo untracked >expect.next2 && cat expect.next2 >dir/next2 && - git checkout master dir && + git checkout main dir && test_cmp expect.common dir/common && - test_path_is_file dir/master && - git diff --exit-code master dir/master && + test_path_is_file dir/main && + git diff --exit-code main dir/main && test_path_is_missing dir/next0 && test_cmp expect.next1 dir/next1 && @@ -52,11 +55,11 @@ test_expect_success 'do not touch unmerged entries matching $path but not in $tr EOF git update-index --index-info <expect.next0 && - git checkout master dir && + git checkout main dir && test_cmp expect.common dir/common && - test_path_is_file dir/master && - git diff --exit-code master dir/master && + test_path_is_file dir/main && + git diff --exit-code main dir/main && git ls-files -s dir/next0 >actual.next0 && test_cmp expect.next0 actual.next0 ' diff --git a/t/t2023-checkout-m.sh b/t/t2023-checkout-m.sh index fca3f85824..7b327b7544 100755 --- a/t/t2023-checkout-m.sh +++ b/t/t2023-checkout-m.sh @@ -4,21 +4,24 @@ test_description='checkout -m -- <conflicted path> Ensures that checkout -m on a resolved file restores the conflicted file' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' test_tick && test_commit both.txt both.txt initial && git branch topic && - test_commit modified_in_master both.txt in_master && - test_commit added_in_master each.txt in_master && + test_commit modified_in_main both.txt in_main && + test_commit added_in_main each.txt in_main && git checkout topic && test_commit modified_in_topic both.txt in_topic && test_commit added_in_topic each.txt in_topic ' -test_expect_success 'git merge master' ' - test_must_fail git merge master +test_expect_success 'git merge main' ' + test_must_fail git merge main ' clean_branchnames () { @@ -61,7 +64,7 @@ test_expect_success 'force checkout a conflict file creates stage zero entry' ' git checkout topic && echo c >a && C_OBJ=$(git hash-object a) && - git checkout -m master && + git checkout -m main && test_cmp_rev :1:a $A_OBJ && test_cmp_rev :2:a $B_OBJ && test_cmp_rev :3:a $C_OBJ && diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index accfa9aa4b..4a1c901456 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -29,11 +29,11 @@ status_uno_is_clean () { } test_expect_success 'setup' ' - test_commit my_master && + test_commit my_main && git init repo_a && ( cd repo_a && - test_commit a_master && + test_commit a_main && git checkout -b foo && test_commit a_foo && git checkout -b bar && @@ -44,7 +44,7 @@ test_expect_success 'setup' ' git init repo_b && ( cd repo_b && - test_commit b_master && + test_commit b_main && git checkout -b foo && test_commit b_foo && git checkout -b baz && @@ -60,23 +60,23 @@ test_expect_success 'setup' ' ' test_expect_success 'checkout of non-existing branch fails' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D xyzzy && test_must_fail git checkout xyzzy && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/xyzzy && - test_branch master + test_branch main ' test_expect_success 'checkout of branch from multiple remotes fails #1' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D foo && test_must_fail git checkout foo && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/foo && - test_branch master + test_branch main ' test_expect_success 'when arg matches multiple remotes, do not fallback to interpreting as pathspec' ' @@ -100,21 +100,21 @@ test_expect_success 'when arg matches multiple remotes, do not fallback to inter ' test_expect_success 'checkout of branch from multiple remotes fails with advice' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D foo && test_must_fail git checkout foo 2>stderr && - test_branch master && + test_branch main && status_uno_is_clean && test_i18ngrep "^hint: " stderr && test_must_fail git -c advice.checkoutAmbiguousRemoteBranchName=false \ checkout foo 2>stderr && - test_branch master && + test_branch main && status_uno_is_clean && test_i18ngrep ! "^hint: " stderr ' test_expect_success PERL 'checkout -p with multiple remotes does not print advice' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D foo && git checkout -p foo 2>stderr && @@ -123,7 +123,7 @@ test_expect_success PERL 'checkout -p with multiple remotes does not print advic ' test_expect_success 'checkout of branch from multiple remotes succeeds with checkout.defaultRemote #1' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D foo && @@ -135,7 +135,7 @@ test_expect_success 'checkout of branch from multiple remotes succeeds with chec ' test_expect_success 'checkout of branch from a single remote succeeds #1' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D bar && git checkout bar && @@ -146,7 +146,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #1' ' ' test_expect_success 'checkout of branch from a single remote succeeds #2' ' - git checkout -B master && + git checkout -B main && test_might_fail git branch -D baz && git checkout baz && @@ -157,22 +157,33 @@ test_expect_success 'checkout of branch from a single remote succeeds #2' ' ' test_expect_success '--no-guess suppresses branch auto-vivification' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D bar && test_must_fail git checkout --no-guess bar && test_must_fail git rev-parse --verify refs/heads/bar && - test_branch master + test_branch main +' + +test_expect_success 'checkout.guess = false suppresses branch auto-vivification' ' + git checkout -B main && + status_uno_is_clean && + test_might_fail git branch -D bar && + + test_config checkout.guess false && + test_must_fail git checkout bar && + test_must_fail git rev-parse --verify refs/heads/bar && + test_branch main ' test_expect_success 'setup more remotes with unconventional refspecs' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && git init repo_c && ( cd repo_c && - test_commit c_master && + test_commit c_main && git checkout -b bar && test_commit c_bar && git checkout -b spam && @@ -181,7 +192,7 @@ test_expect_success 'setup more remotes with unconventional refspecs' ' git init repo_d && ( cd repo_d && - test_commit d_master && + test_commit d_main && git checkout -b baz && test_commit d_baz && git checkout -b eggs && @@ -197,29 +208,29 @@ test_expect_success 'setup more remotes with unconventional refspecs' ' ' test_expect_success 'checkout of branch from multiple remotes fails #2' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D bar && test_must_fail git checkout bar && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/bar && - test_branch master + test_branch main ' test_expect_success 'checkout of branch from multiple remotes fails #3' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D baz && test_must_fail git checkout baz && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/baz && - test_branch master + test_branch main ' test_expect_success 'checkout of branch from a single remote succeeds #3' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D spam && @@ -231,7 +242,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #3' ' ' test_expect_success 'checkout of branch from a single remote succeeds #4' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D eggs && @@ -243,7 +254,7 @@ test_expect_success 'checkout of branch from a single remote succeeds #4' ' ' test_expect_success 'checkout of branch with a file having the same name fails' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D spam && @@ -251,11 +262,11 @@ test_expect_success 'checkout of branch with a file having the same name fails' test_must_fail git checkout spam && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/spam && - test_branch master + test_branch main ' test_expect_success 'checkout of branch with a file in subdir having the same name fails' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D spam && @@ -265,11 +276,11 @@ test_expect_success 'checkout of branch with a file in subdir having the same na test_must_fail git -C sub checkout spam && status_uno_is_clean && test_must_fail git rev-parse --verify refs/heads/spam && - test_branch master + test_branch main ' test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' ' - git checkout -B master && + git checkout -B main && status_uno_is_clean && test_might_fail git branch -D spam && @@ -283,7 +294,7 @@ test_expect_success 'checkout <branch> -- succeeds, even if a file with the same test_expect_success 'loosely defined local base branch is reported correctly' ' - git checkout master && + git checkout main && status_uno_is_clean && git branch strict && git branch loose && @@ -291,8 +302,8 @@ test_expect_success 'loosely defined local base branch is reported correctly' ' test_config branch.strict.remote . && test_config branch.loose.remote . && - test_config branch.strict.merge refs/heads/master && - test_config branch.loose.merge master && + test_config branch.strict.merge refs/heads/main && + test_config branch.loose.merge main && git checkout strict | sed -e "s/strict/BRANCHNAME/g" >expect && status_uno_is_clean && diff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh index bcba1bf90c..4453741b96 100755 --- a/t/t2027-checkout-track.sh +++ b/t/t2027-checkout-track.sh @@ -2,6 +2,9 @@ test_description='tests for git branch --track' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -10,14 +13,14 @@ test_expect_success 'setup' ' ' test_expect_success 'checkout --track -b creates a new tracking branch' ' - git checkout --track -b branch1 master && + git checkout --track -b branch1 main && test $(git rev-parse --abbrev-ref HEAD) = branch1 && test $(git config --get branch.branch1.remote) = . && - test $(git config --get branch.branch1.merge) = refs/heads/master + test $(git config --get branch.branch1.merge) = refs/heads/main ' test_expect_success 'checkout --track -b rejects an extra path argument' ' - test_must_fail git checkout --track -b branch2 master one.t 2>err && + test_must_fail git checkout --track -b branch2 main one.t 2>err && test_i18ngrep "cannot be used with updating paths" err ' diff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh index 309199bca2..f691e6d903 100755 --- a/t/t2030-unresolve-info.sh +++ b/t/t2030-unresolve-info.sh @@ -2,6 +2,9 @@ test_description='undoing resolution' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_resolve_undo () { @@ -59,7 +62,7 @@ test_expect_success setup ' test_commit fourth fi/le fourth && git checkout add-add && test_commit fifth add-differently && - git checkout master + git checkout main ' test_expect_success 'add records switch clears' ' @@ -176,15 +179,14 @@ test_expect_success 'rerere and rerere forget (subdirectory)' ' test_expect_success 'rerere forget (binary)' ' git checkout -f side && - printf "a\0c" >binary && - git commit -a -m binary && + test_commit --printf binary binary "a\0c" && test_must_fail git merge second && git rerere forget binary ' test_expect_success 'rerere forget (add-add conflict)' ' - git checkout -f master && - echo master >add-differently && + git checkout -f main && + echo main >add-differently && git add add-differently && git commit -m "add differently" && test_must_fail git merge fifth && diff --git a/t/t2060-switch.sh b/t/t2060-switch.sh index 2c1b8c0d6d..9bc6a3aa5c 100755 --- a/t/t2060-switch.sh +++ b/t/t2060-switch.sh @@ -2,6 +2,9 @@ test_description='switch basic functionality' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -23,41 +26,41 @@ test_expect_success 'switch branch' ' ' test_expect_success 'switch and detach' ' - test_when_finished git switch master && - test_must_fail git switch master^{commit} && - git switch --detach master^{commit} && + test_when_finished git switch main && + test_must_fail git switch main^{commit} && + git switch --detach main^{commit} && test_must_fail git symbolic-ref HEAD ' test_expect_success 'switch and detach current branch' ' - test_when_finished git switch master && - git switch master && + test_when_finished git switch main && + git switch main && git switch --detach && test_must_fail git symbolic-ref HEAD ' test_expect_success 'switch and create branch' ' - test_when_finished git switch master && - git switch -c temp master^ && - test_cmp_rev master^ refs/heads/temp && + test_when_finished git switch main && + git switch -c temp main^ && + test_cmp_rev main^ refs/heads/temp && echo refs/heads/temp >expected-branch && git symbolic-ref HEAD >actual-branch && test_cmp expected-branch actual-branch ' test_expect_success 'force create branch from HEAD' ' - test_when_finished git switch master && - git switch --detach master && + test_when_finished git switch main && + git switch --detach main && test_must_fail git switch -c temp && git switch -C temp && - test_cmp_rev master refs/heads/temp && + test_cmp_rev main refs/heads/temp && echo refs/heads/temp >expected-branch && git symbolic-ref HEAD >actual-branch && test_cmp expected-branch actual-branch ' test_expect_success 'new orphan branch from empty' ' - test_when_finished git switch master && + test_when_finished git switch main && test_must_fail git switch --orphan new-orphan HEAD && git switch --orphan new-orphan && test_commit orphan && @@ -69,7 +72,7 @@ test_expect_success 'new orphan branch from empty' ' ' test_expect_success 'orphan branch works with --discard-changes' ' - test_when_finished git switch master && + test_when_finished git switch main && echo foo >foo.txt && git switch --discard-changes --orphan new-orphan2 && git ls-files >tracked-files && @@ -77,7 +80,7 @@ test_expect_success 'orphan branch works with --discard-changes' ' ' test_expect_success 'switching ignores file of same branch name' ' - test_when_finished git switch master && + test_when_finished git switch main && : >first-branch && git switch first-branch && echo refs/heads/first-branch >expected && @@ -85,9 +88,12 @@ test_expect_success 'switching ignores file of same branch name' ' test_cmp expected actual ' -test_expect_success 'guess and create branch ' ' - test_when_finished git switch master && +test_expect_success 'guess and create branch' ' + test_when_finished git switch main && test_must_fail git switch --no-guess foo && + test_config checkout.guess false && + test_must_fail git switch foo && + test_config checkout.guess true && git switch foo && echo refs/heads/foo >expected && git symbolic-ref HEAD >actual && diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh index 89e5a142c9..7c43ddf1d9 100755 --- a/t/t2070-restore.sh +++ b/t/t2070-restore.sh @@ -2,6 +2,9 @@ test_description='restore basic functionality' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -15,7 +18,7 @@ test_expect_success 'setup' ' echo ignored >ignored && echo /ignored >.gitignore && git add one two .gitignore && - git update-ref refs/heads/one master + git update-ref refs/heads/one main ' test_expect_success 'restore without pathspec is not ok' ' @@ -91,7 +94,7 @@ test_expect_success 'restore --ignore-unmerged ignores unmerged entries' ' git switch -c first && echo first >unmerged && git commit -am first && - git switch -c second master && + git switch -c second main && echo second >unmerged && git commit -am second && test_must_fail git merge first && diff --git a/t/t2071-restore-patch.sh b/t/t2071-restore-patch.sh index 98b2476e7c..b5c5c0ff7e 100755 --- a/t/t2071-restore-patch.sh +++ b/t/t2071-restore-patch.sh @@ -60,6 +60,14 @@ test_expect_success PERL 'git restore -p --source=HEAD^' ' verify_state dir/foo parent index ' +test_expect_success PERL 'git restore -p --source=HEAD^...' ' + set_state dir/foo work index && + # the third n is to get out in case it mistakenly does not apply + test_write_lines n y n | git restore -p --source=HEAD^... && + verify_saved_state bar && + verify_state dir/foo parent index +' + test_expect_success PERL 'git restore -p handles deletion' ' set_state dir/foo work index && rm dir/foo && diff --git a/t/t2080-parallel-checkout-basics.sh b/t/t2080-parallel-checkout-basics.sh new file mode 100755 index 0000000000..3e0f8c675f --- /dev/null +++ b/t/t2080-parallel-checkout-basics.sh @@ -0,0 +1,229 @@ +#!/bin/sh + +test_description='parallel-checkout basics + +Ensure that parallel-checkout basically works on clone and checkout, spawning +the required number of workers and correctly populating both the index and the +working tree. +' + +TEST_NO_CREATE_REPO=1 +. ./test-lib.sh +. "$TEST_DIRECTORY/lib-parallel-checkout.sh" + +# Test parallel-checkout with a branch switch containing a variety of file +# creations, deletions, and modifications, involving different entry types. +# The branches B1 and B2 have the following paths: +# +# B1 B2 +# a/a (file) a (file) +# b (file) b/b (file) +# +# c/c (file) c (symlink) +# d (symlink) d/d (file) +# +# e/e (file) e (submodule) +# f (submodule) f/f (file) +# +# g (submodule) g (symlink) +# h (symlink) h (submodule) +# +# Additionally, the following paths are present on both branches, but with +# different contents: +# +# i (file) i (file) +# j (symlink) j (symlink) +# k (submodule) k (submodule) +# +# And the following paths are only present in one of the branches: +# +# l/l (file) - +# - m/m (file) +# +test_expect_success 'setup repo for checkout with various types of changes' ' + git init sub && + ( + cd sub && + git checkout -b B2 && + echo B2 >file && + git add file && + git commit -m file && + + git checkout -b B1 && + echo B1 >file && + git add file && + git commit -m file + ) && + + git init various && + ( + cd various && + + git checkout -b B1 && + mkdir a c e && + echo a/a >a/a && + echo b >b && + echo c/c >c/c && + test_ln_s_add c d && + echo e/e >e/e && + git submodule add ../sub f && + git submodule add ../sub g && + test_ln_s_add c h && + + echo "B1 i" >i && + test_ln_s_add c j && + git submodule add -b B1 ../sub k && + mkdir l && + echo l/l >l/l && + + git add . && + git commit -m B1 && + + git checkout -b B2 && + git rm -rf :^.gitmodules :^k && + mkdir b d f && + echo a >a && + echo b/b >b/b && + test_ln_s_add b c && + echo d/d >d/d && + git submodule add ../sub e && + echo f/f >f/f && + test_ln_s_add b g && + git submodule add ../sub h && + + echo "B2 i" >i && + test_ln_s_add b j && + git -C k checkout B2 && + mkdir m && + echo m/m >m/m && + + git add . && + git commit -m B2 && + + git checkout --recurse-submodules B1 + ) +' + +for mode in sequential parallel sequential-fallback +do + case $mode in + sequential) workers=1 threshold=0 expected_workers=0 ;; + parallel) workers=2 threshold=0 expected_workers=2 ;; + sequential-fallback) workers=2 threshold=100 expected_workers=0 ;; + esac + + test_expect_success "$mode checkout" ' + repo=various_$mode && + cp -R -P various $repo && + + # The just copied files have more recent timestamps than their + # associated index entries. So refresh the cached timestamps + # to avoid an "entry not up-to-date" error from `git checkout`. + # We only have to do this for the submodules as `git checkout` + # will already refresh the superproject index before performing + # the up-to-date check. + # + git -C $repo submodule foreach "git update-index --refresh" && + + set_checkout_config $workers $threshold && + test_checkout_workers $expected_workers \ + git -C $repo checkout --recurse-submodules B2 && + verify_checkout $repo + ' +done + +for mode in parallel sequential-fallback +do + case $mode in + parallel) workers=2 threshold=0 expected_workers=2 ;; + sequential-fallback) workers=2 threshold=100 expected_workers=0 ;; + esac + + test_expect_success "$mode checkout on clone" ' + repo=various_${mode}_clone && + set_checkout_config $workers $threshold && + test_checkout_workers $expected_workers \ + git clone --recurse-submodules --branch B2 various $repo && + verify_checkout $repo + ' +done + +# Just to be paranoid, actually compare the working trees' contents directly. +test_expect_success 'compare the working trees' ' + rm -rf various_*/.git && + rm -rf various_*/*/.git && + + # We use `git diff` instead of `diff -r` because the latter would + # follow symlinks, and not all `diff` implementations support the + # `--no-dereference` option. + # + git diff --no-index various_sequential various_parallel && + git diff --no-index various_sequential various_parallel_clone && + git diff --no-index various_sequential various_sequential-fallback && + git diff --no-index various_sequential various_sequential-fallback_clone +' + +# Currently, each submodule is checked out in a separated child process, but +# these subprocesses must also be able to use parallel checkout workers to +# write the submodules' entries. +test_expect_success 'submodules can use parallel checkout' ' + set_checkout_config 2 0 && + git init super && + ( + cd super && + git init sub && + test_commit -C sub A && + test_commit -C sub B && + git submodule add ./sub && + git commit -m sub && + rm sub/* && + test_checkout_workers 2 git checkout --recurse-submodules . + ) +' + +test_expect_success 'parallel checkout respects --[no]-force' ' + set_checkout_config 2 0 && + git init dirty && + ( + cd dirty && + mkdir D && + test_commit D/F && + test_commit F && + + rm -rf D && + echo changed >D && + echo changed >F.t && + + # We expect 0 workers because there is nothing to be done + test_checkout_workers 0 git checkout HEAD && + test_path_is_file D && + grep changed D && + grep changed F.t && + + test_checkout_workers 2 git checkout --force HEAD && + test_path_is_dir D && + grep D/F D/F.t && + grep F F.t + ) +' + +test_expect_success SYMLINKS 'parallel checkout checks for symlinks in leading dirs' ' + set_checkout_config 2 0 && + git init symlinks && + ( + cd symlinks && + mkdir D untracked && + # Commit 2 files to have enough work for 2 parallel workers + test_commit D/A && + test_commit D/B && + rm -rf D && + ln -s untracked D && + + test_checkout_workers 2 git checkout --force HEAD && + ! test -h D && + grep D/A D/A.t && + grep D/B D/B.t + ) +' + +test_done diff --git a/t/t2081-parallel-checkout-collisions.sh b/t/t2081-parallel-checkout-collisions.sh new file mode 100755 index 0000000000..f6fcfc0c1e --- /dev/null +++ b/t/t2081-parallel-checkout-collisions.sh @@ -0,0 +1,162 @@ +#!/bin/sh + +test_description="path collisions during parallel checkout + +Parallel checkout must detect path collisions to: + +1) Avoid racily writing to different paths that represent the same file on disk. +2) Report the colliding entries on clone. + +The tests in this file exercise parallel checkout's collision detection code in +both these mechanics. +" + +. ./test-lib.sh +. "$TEST_DIRECTORY/lib-parallel-checkout.sh" + +TEST_ROOT="$PWD" + +test_expect_success CASE_INSENSITIVE_FS 'setup' ' + empty_oid=$(git hash-object -w --stdin </dev/null) && + cat >objs <<-EOF && + 100644 $empty_oid FILE_X + 100644 $empty_oid FILE_x + 100644 $empty_oid file_X + 100644 $empty_oid file_x + EOF + git update-index --index-info <objs && + git commit -m "colliding files" && + git tag basename_collision && + + write_script "$TEST_ROOT"/logger_script <<-\EOF + echo "$@" >>filter.log + EOF +' + +test_workers_in_event_trace () +{ + test $1 -eq $(grep ".event.:.child_start..*checkout--worker" $2 | wc -l) +} + +test_expect_success CASE_INSENSITIVE_FS 'worker detects basename collision' ' + GIT_TRACE2_EVENT="$(pwd)/trace" git \ + -c checkout.workers=2 -c checkout.thresholdForParallelism=0 \ + checkout . && + + test_workers_in_event_trace 2 trace && + collisions=$(grep -i "category.:.pcheckout.,.key.:.collision/basename.,.value.:.file_x.}" trace | wc -l) && + test $collisions -eq 3 +' + +test_expect_success CASE_INSENSITIVE_FS 'worker detects dirname collision' ' + test_config filter.logger.smudge "\"$TEST_ROOT/logger_script\" %f" && + empty_oid=$(git hash-object -w --stdin </dev/null) && + + # By setting a filter command to "a", we make it ineligible for parallel + # checkout, and thus it is checked out *first*. This way we can ensure + # that "A/B" and "A/C" will both collide with the regular file "a". + # + attr_oid=$(echo "a filter=logger" | git hash-object -w --stdin) && + + cat >objs <<-EOF && + 100644 $empty_oid A/B + 100644 $empty_oid A/C + 100644 $empty_oid a + 100644 $attr_oid .gitattributes + EOF + git rm -rf . && + git update-index --index-info <objs && + + rm -f trace filter.log && + GIT_TRACE2_EVENT="$(pwd)/trace" git \ + -c checkout.workers=2 -c checkout.thresholdForParallelism=0 \ + checkout . && + + # Check that "a" (and only "a") was filtered + echo a >expected.log && + test_cmp filter.log expected.log && + + # Check that it used the right number of workers and detected the collisions + test_workers_in_event_trace 2 trace && + grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/B.}" trace && + grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/C.}" trace +' + +test_expect_success SYMLINKS,CASE_INSENSITIVE_FS 'do not follow symlinks colliding with leading dir' ' + empty_oid=$(git hash-object -w --stdin </dev/null) && + symlink_oid=$(echo "./e" | git hash-object -w --stdin) && + mkdir e && + + cat >objs <<-EOF && + 120000 $symlink_oid D + 100644 $empty_oid d/x + 100644 $empty_oid e/y + EOF + git rm -rf . && + git update-index --index-info <objs && + + set_checkout_config 2 0 && + test_checkout_workers 2 git checkout . && + test_path_is_dir e && + test_path_is_missing e/x +' + +# The two following tests check that parallel checkout correctly reports +# colliding entries on clone. The sequential code detects a collision by +# calling lstat() before trying to open(O_CREAT) a file. (Note that this only +# works for clone.) Then, to find the pair of a colliding item k, it searches +# cache_entry[0, k-1]. This is not sufficient in parallel checkout because: +# +# - A colliding file may be created between the lstat() and open() calls; +# - A colliding entry might appear in the second half of the cache_entry array. +# +test_expect_success CASE_INSENSITIVE_FS 'collision report on clone (w/ racy file creation)' ' + git reset --hard basename_collision && + set_checkout_config 2 0 && + test_checkout_workers 2 git clone . clone-repo 2>stderr && + + grep FILE_X stderr && + grep FILE_x stderr && + grep file_X stderr && + grep file_x stderr && + grep "the following paths have collided" stderr +' + +# This test ensures that the collision report code is correctly looking for +# colliding peers in the second half of the cache_entry array. This is done by +# defining a smudge command for the *last* array entry, which makes it +# non-eligible for parallel-checkout. Thus, it is checked out *first*, before +# spawning the workers. +# +# Note: this test doesn't work on Windows because, on this system, the +# collision report code uses strcmp() to find the colliding pairs when +# core.ignoreCase is false. And we need this setting for this test so that only +# 'file_x' matches the pattern of the filter attribute. But the test works on +# OSX, where the colliding pairs are found using inode. +# +test_expect_success CASE_INSENSITIVE_FS,!MINGW,!CYGWIN \ + 'collision report on clone (w/ colliding peer after the detected entry)' ' + + test_config_global filter.logger.smudge "\"$TEST_ROOT/logger_script\" %f" && + git reset --hard basename_collision && + echo "file_x filter=logger" >.gitattributes && + git add .gitattributes && + git commit -m "filter for file_x" && + + rm -rf clone-repo && + set_checkout_config 2 0 && + test_checkout_workers 2 \ + git -c core.ignoreCase=false clone . clone-repo 2>stderr && + + grep FILE_X stderr && + grep FILE_x stderr && + grep file_X stderr && + grep file_x stderr && + grep "the following paths have collided" stderr && + + # Check that only "file_x" was filtered + echo file_x >expected.log && + test_cmp clone-repo/filter.log expected.log +' + +test_done diff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh new file mode 100755 index 0000000000..2525457961 --- /dev/null +++ b/t/t2082-parallel-checkout-attributes.sh @@ -0,0 +1,194 @@ +#!/bin/sh + +test_description='parallel-checkout: attributes + +Verify that parallel-checkout correctly creates files that require +conversions, as specified in .gitattributes. The main point here is +to check that the conv_attr data is correctly sent to the workers +and that it contains sufficient information to smudge files +properly (without access to the index or attribute stack). +' + +TEST_NO_CREATE_REPO=1 +. ./test-lib.sh +. "$TEST_DIRECTORY/lib-parallel-checkout.sh" +. "$TEST_DIRECTORY/lib-encoding.sh" + +test_expect_success 'parallel-checkout with ident' ' + set_checkout_config 2 0 && + git init ident && + ( + cd ident && + echo "A ident" >.gitattributes && + echo "\$Id\$" >A && + echo "\$Id\$" >B && + git add -A && + git commit -m id && + + rm A B && + test_checkout_workers 2 git reset --hard && + hexsz=$(test_oid hexsz) && + grep -E "\\\$Id: [0-9a-f]{$hexsz} \\\$" A && + grep "\\\$Id\\\$" B + ) +' + +test_expect_success 'parallel-checkout with re-encoding' ' + set_checkout_config 2 0 && + git init encoding && + ( + cd encoding && + echo text >utf8-text && + write_utf16 <utf8-text >utf16-text && + + echo "A working-tree-encoding=UTF-16" >.gitattributes && + cp utf16-text A && + cp utf8-text B && + git add A B .gitattributes && + git commit -m encoding && + + # Check that A is stored in UTF-8 + git cat-file -p :A >A.internal && + test_cmp_bin utf8-text A.internal && + + rm A B && + test_checkout_workers 2 git checkout A B && + + # Check that A (and only A) is re-encoded during checkout + test_cmp_bin utf16-text A && + test_cmp_bin utf8-text B + ) +' + +test_expect_success 'parallel-checkout with eol conversions' ' + set_checkout_config 2 0 && + git init eol && + ( + cd eol && + printf "multi\r\nline\r\ntext" >crlf-text && + printf "multi\nline\ntext" >lf-text && + + git config core.autocrlf false && + echo "A eol=crlf" >.gitattributes && + cp crlf-text A && + cp lf-text B && + git add A B .gitattributes && + git commit -m eol && + + # Check that A is stored with LF format + git cat-file -p :A >A.internal && + test_cmp_bin lf-text A.internal && + + rm A B && + test_checkout_workers 2 git checkout A B && + + # Check that A (and only A) is converted to CRLF during checkout + test_cmp_bin crlf-text A && + test_cmp_bin lf-text B + ) +' + +# Entries that require an external filter are not eligible for parallel +# checkout. Check that both the parallel-eligible and non-eligible entries are +# properly writen in a single checkout operation. +# +test_expect_success 'parallel-checkout and external filter' ' + set_checkout_config 2 0 && + git init filter && + ( + cd filter && + write_script <<-\EOF rot13.sh && + tr \ + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \ + "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" + EOF + + git config filter.rot13.clean "\"$(pwd)/rot13.sh\"" && + git config filter.rot13.smudge "\"$(pwd)/rot13.sh\"" && + git config filter.rot13.required true && + + echo abcd >original && + echo nopq >rot13 && + + echo "A filter=rot13" >.gitattributes && + cp original A && + cp original B && + cp original C && + git add A B C .gitattributes && + git commit -m filter && + + # Check that A (and only A) was cleaned + git cat-file -p :A >A.internal && + test_cmp rot13 A.internal && + git cat-file -p :B >B.internal && + test_cmp original B.internal && + git cat-file -p :C >C.internal && + test_cmp original C.internal && + + rm A B C *.internal && + test_checkout_workers 2 git checkout A B C && + + # Check that A (and only A) was smudged during checkout + test_cmp original A && + test_cmp original B && + test_cmp original C + ) +' + +# The delayed queue is independent from the parallel queue, and they should be +# able to work together in the same checkout process. +# +test_expect_success PERL 'parallel-checkout and delayed checkout' ' + write_script rot13-filter.pl "$PERL_PATH" \ + <"$TEST_DIRECTORY"/t0021/rot13-filter.pl && + + test_config_global filter.delay.process \ + "\"$(pwd)/rot13-filter.pl\" --always-delay \"$(pwd)/delayed.log\" clean smudge delay" && + test_config_global filter.delay.required true && + + echo "abcd" >original && + echo "nopq" >rot13 && + + git init delayed && + ( + cd delayed && + echo "*.d filter=delay" >.gitattributes && + cp ../original W.d && + cp ../original X.d && + cp ../original Y && + cp ../original Z && + git add -A && + git commit -m delayed && + + # Check that *.d files were cleaned + git cat-file -p :W.d >W.d.internal && + test_cmp W.d.internal ../rot13 && + git cat-file -p :X.d >X.d.internal && + test_cmp X.d.internal ../rot13 && + git cat-file -p :Y >Y.internal && + test_cmp Y.internal ../original && + git cat-file -p :Z >Z.internal && + test_cmp Z.internal ../original && + + rm * + ) && + + set_checkout_config 2 0 && + test_checkout_workers 2 git -C delayed checkout -f && + verify_checkout delayed && + + # Check that the *.d files got to the delay queue and were filtered + grep "smudge W.d .* \[DELAYED\]" delayed.log && + grep "smudge X.d .* \[DELAYED\]" delayed.log && + test_cmp delayed/W.d original && + test_cmp delayed/X.d original && + + # Check that the parallel-eligible entries went to the right queue and + # were not filtered + ! grep "smudge Y .* \[DELAYED\]" delayed.log && + ! grep "smudge Z .* \[DELAYED\]" delayed.log && + test_cmp delayed/Y original && + test_cmp delayed/Z original +' + +test_done diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh index 7e2e7dd4ae..30666fc70d 100755 --- a/t/t2104-update-index-skip-worktree.sh +++ b/t/t2104-update-index-skip-worktree.sh @@ -9,6 +9,11 @@ test_description='skip-worktree bit test' sane_unset GIT_TEST_SPLIT_INDEX +test_set_index_version () { + GIT_INDEX_VERSION="$1" + export GIT_INDEX_VERSION +} + test_set_index_version 3 cat >expect.full <<EOF diff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh index 99d858c6b7..2d450daf5c 100755 --- a/t/t2106-update-index-assume-unchanged.sh +++ b/t/t2106-update-index-assume-unchanged.sh @@ -5,20 +5,23 @@ test_description='git update-index --assume-unchanged test. . ./test-lib.sh -test_expect_success 'setup' \ - ': >file && - git add file && - git commit -m initial && - git branch other && - echo upstream >file && - git add file && - git commit -m upstream' +test_expect_success 'setup' ' + : >file && + git add file && + git commit -m initial && + git branch other && + echo upstream >file && + git add file && + git commit -m upstream +' -test_expect_success 'do not switch branches with dirty file' \ - 'git reset --hard && - git checkout other && - echo dirt >file && - git update-index --assume-unchanged file && - test_must_fail git checkout master' +test_expect_success 'do not switch branches with dirty file' ' + git reset --hard && + git checkout other && + echo dirt >file && + git update-index --assume-unchanged file && + test_must_fail git checkout - 2>err && + test_i18ngrep overwritten err +' test_done diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh index f764b7e3f5..45ca35d60a 100755 --- a/t/t2200-add-update.sh +++ b/t/t2200-add-update.sh @@ -135,7 +135,7 @@ test_expect_success 'add -n -u should not add but just report' ' after=$(git ls-files -s check top) && test "$before" = "$after" && - test_i18ncmp expect actual + test_cmp expect actual ' @@ -179,7 +179,8 @@ test_expect_success 'add -u resolves unmerged paths' ' test_expect_success '"add -u non-existent" should fail' ' test_must_fail git add -u non-existent && - ! (git ls-files | grep "non-existent") + git ls-files >actual && + ! grep "non-existent" actual ' test_done diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 5a7495474a..37ad79470f 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -2,6 +2,9 @@ test_description='test git worktree add' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -12,12 +15,12 @@ test_expect_success 'setup' ' test_expect_success '"add" an existing worktree' ' mkdir -p existing/subtree && - test_must_fail git worktree add --detach existing master + test_must_fail git worktree add --detach existing main ' test_expect_success '"add" an existing empty worktree' ' mkdir existing_empty && - git worktree add --detach existing_empty master + git worktree add --detach existing_empty main ' test_expect_success '"add" using shorthand - fails when no previous branch' ' @@ -29,7 +32,7 @@ test_expect_success '"add" using - shorthand' ' echo hello >myworld && git add myworld && git commit -m myworld && - git checkout master && + git checkout main && git worktree add short-hand - && echo refs/heads/newbranch >expect && git -C short-hand rev-parse --symbolic-full-name HEAD >actual && @@ -37,7 +40,7 @@ test_expect_success '"add" using - shorthand' ' ' test_expect_success '"add" refuses to checkout locked branch' ' - test_must_fail git worktree add zere master && + test_must_fail git worktree add zere main && ! test -d zere && ! test -d .git/worktrees/zere ' @@ -46,13 +49,13 @@ test_expect_success 'checking out paths not complaining about linked checkouts' ( cd existing_empty && echo dirty >>init.t && - git checkout master -- init.t + git checkout main -- init.t ) ' test_expect_success '"add" worktree' ' git rev-parse HEAD >expect && - git worktree add --detach here master && + git worktree add --detach here main && ( cd here && test_cmp ../init.t init.t && @@ -64,16 +67,30 @@ test_expect_success '"add" worktree' ' ' test_expect_success '"add" worktree with lock' ' - git rev-parse HEAD >expect && - git worktree add --detach --lock here-with-lock master && + git worktree add --detach --lock here-with-lock main && + test_when_finished "git worktree unlock here-with-lock || :" && test -f .git/worktrees/here-with-lock/locked ' +test_expect_success '"add" worktree with lock and reason' ' + lock_reason="why not" && + git worktree add --detach --lock --reason "$lock_reason" here-with-lock-reason main && + test_when_finished "git worktree unlock here-with-lock-reason || :" && + test -f .git/worktrees/here-with-lock-reason/locked && + echo "$lock_reason" >expect && + test_cmp expect .git/worktrees/here-with-lock-reason/locked +' + +test_expect_success '"add" worktree with reason but no lock' ' + test_must_fail git worktree add --detach --reason "why not" here-with-reason-only main && + test_path_is_missing .git/worktrees/here-with-reason-only/locked +' + test_expect_success '"add" worktree from a subdir' ' ( mkdir sub && cd sub && - git worktree add --detach here master && + git worktree add --detach here main && cd here && test_cmp ../../init.t init.t ) @@ -82,19 +99,19 @@ test_expect_success '"add" worktree from a subdir' ' test_expect_success '"add" from a linked checkout' ' ( cd here && - git worktree add --detach nested-here master && + git worktree add --detach nested-here main && cd nested-here && git fsck ) ' test_expect_success '"add" worktree creating new branch' ' - git worktree add -b newmaster there master && + git worktree add -b newmain there main && ( cd there && test_cmp ../init.t init.t && git symbolic-ref HEAD >actual && - echo refs/heads/newmaster >expect && + echo refs/heads/newmain >expect && test_cmp expect actual && git fsck ) @@ -103,7 +120,7 @@ test_expect_success '"add" worktree creating new branch' ' test_expect_success 'die the same branch is already checked out' ' ( cd here && - test_must_fail git checkout newmaster + test_must_fail git checkout newmain ) ' @@ -112,20 +129,20 @@ test_expect_success SYMLINKS 'die the same branch is already checked out (symlin ref=$(git -C there symbolic-ref HEAD) && rm "$head" && ln -s "$ref" "$head" && - test_must_fail git -C here checkout newmaster + test_must_fail git -C here checkout newmain ' test_expect_success 'not die the same branch is already checked out' ' ( cd here && - git worktree add --force anothernewmaster newmaster + git worktree add --force anothernewmain newmain ) ' test_expect_success 'not die on re-checking out current branch' ' ( cd there && - git checkout newmaster + git checkout newmain ) ' @@ -133,14 +150,14 @@ test_expect_success '"add" from a bare repo' ' ( git clone --bare . bare && cd bare && - git worktree add -b bare-master ../there2 master + git worktree add -b bare-main ../there2 main ) ' test_expect_success 'checkout from a bare repo without "add"' ' ( cd bare && - test_must_fail git checkout master + test_must_fail git checkout main ) ' @@ -148,7 +165,7 @@ test_expect_success '"add" default branch of a bare repo' ' ( git clone --bare . bare2 && cd bare2 && - git worktree add ../there3 master + git worktree add ../there3 main ) ' @@ -165,7 +182,7 @@ test_expect_success 'checkout with grafts' ' EOF git log --format=%s -2 >actual && test_cmp expected actual && - git worktree add --detach grafted master && + git worktree add --detach grafted main && git --git-dir=grafted/.git log --format=%s -2 >actual && test_cmp expected actual ' @@ -226,34 +243,34 @@ test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' ' ' test_expect_success '"add" -b/-B mutually exclusive' ' - test_must_fail git worktree add -b poodle -B poodle bamboo master + test_must_fail git worktree add -b poodle -B poodle bamboo main ' test_expect_success '"add" -b/--detach mutually exclusive' ' - test_must_fail git worktree add -b poodle --detach bamboo master + test_must_fail git worktree add -b poodle --detach bamboo main ' test_expect_success '"add" -B/--detach mutually exclusive' ' - test_must_fail git worktree add -B poodle --detach bamboo master + test_must_fail git worktree add -B poodle --detach bamboo main ' test_expect_success '"add -B" fails if the branch is checked out' ' - git rev-parse newmaster >before && - test_must_fail git worktree add -B newmaster bamboo master && - git rev-parse newmaster >after && + git rev-parse newmain >before && + test_must_fail git worktree add -B newmain bamboo main && + git rev-parse newmain >after && test_cmp before after ' test_expect_success 'add -B' ' - git worktree add -B poodle bamboo2 master^ && + git worktree add -B poodle bamboo2 main^ && git -C bamboo2 symbolic-ref HEAD >actual && echo refs/heads/poodle >expected && test_cmp expected actual && - test_cmp_rev master^ poodle + test_cmp_rev main^ poodle ' test_expect_success 'add --quiet' ' - git worktree add --quiet another-worktree master 2>actual && + git worktree add --quiet another-worktree main 2>actual && test_must_be_empty actual ' @@ -348,24 +365,24 @@ test_branch_upstream () { test_expect_success '--track sets up tracking' ' test_when_finished rm -rf track && - git worktree add --track -b track track master && - test_branch_upstream track . master + git worktree add --track -b track track main && + test_branch_upstream track . main ' # setup remote repository $1 and repository $2 with $1 set up as -# remote. The remote has two branches, master and foo. +# remote. The remote has two branches, main and foo. setup_remote_repo () { git init $1 && ( cd $1 && - test_commit $1_master && + test_commit $1_main && git checkout -b foo && test_commit upstream_foo ) && git init $2 && ( cd $2 && - test_commit $2_master && + test_commit $2_main && git remote add $1 ../$1 && git config remote.$1.fetch \ "refs/heads/*:refs/remotes/$1/*" && diff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh index a6ce7f590b..a615d3b483 100755 --- a/t/t2401-worktree-prune.sh +++ b/t/t2401-worktree-prune.sh @@ -2,6 +2,9 @@ test_description='prune $GIT_DIR/worktrees' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success initialize ' @@ -20,7 +23,7 @@ test_expect_success 'prune files inside $GIT_DIR/worktrees' ' cat >expect <<EOF && Removing worktrees/abc: not a valid directory EOF - test_i18ncmp expect actual && + test_cmp expect actual && ! test -f .git/worktrees/abc && ! test -d .git/worktrees ' @@ -32,7 +35,7 @@ test_expect_success 'prune directories without gitdir' ' Removing worktrees/def: gitdir file does not exist EOF git worktree prune --verbose >actual && - test_i18ncmp expect actual && + test_cmp expect actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' @@ -87,7 +90,7 @@ test_expect_success 'not prune recent checkouts' ' test_expect_success 'not prune proper checkouts' ' test_when_finished rm -r .git/worktrees && - git worktree add --detach "$PWD/nop" master && + git worktree add --detach "$PWD/nop" main && git worktree prune && test -d .git/worktrees/nop ' diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh index 52585ec2aa..fedcefe8de 100755 --- a/t/t2402-worktree-list.sh +++ b/t/t2402-worktree-list.sh @@ -2,6 +2,9 @@ test_description='test git worktree list' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -21,7 +24,7 @@ test_expect_success 'rev-parse --git-common-dir on main worktree' ' test_expect_success 'rev-parse --git-path objects linked worktree' ' echo "$(git rev-parse --show-toplevel)/.git/objects" >expect && test_when_finished "rm -rf linked-tree actual expect && git worktree prune" && - git worktree add --detach linked-tree master && + git worktree add --detach linked-tree main && git -C linked-tree rev-parse --git-path objects >actual && test_cmp expect actual ' @@ -29,7 +32,7 @@ test_expect_success 'rev-parse --git-path objects linked worktree' ' test_expect_success '"list" all worktrees from main' ' echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect && test_when_finished "rm -rf here out actual expect && git worktree prune" && - git worktree add --detach here master && + git worktree add --detach here main && echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect && git worktree list >out && sed "s/ */ /g" <out >actual && @@ -39,7 +42,7 @@ test_expect_success '"list" all worktrees from main' ' test_expect_success '"list" all worktrees from linked' ' echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect && test_when_finished "rm -rf here out actual expect && git worktree prune" && - git worktree add --detach here master && + git worktree add --detach here main && echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect && git -C here worktree list >out && sed "s/ */ /g" <out >actual && @@ -52,7 +55,7 @@ test_expect_success '"list" all worktrees --porcelain' ' echo "branch $(git symbolic-ref HEAD)" >>expect && echo >>expect && test_when_finished "rm -rf here actual expect && git worktree prune" && - git worktree add --detach here master && + git worktree add --detach here main && echo "worktree $(git -C here rev-parse --show-toplevel)" >>expect && echo "HEAD $(git rev-parse HEAD)" >>expect && echo "detached" >>expect && @@ -61,18 +64,124 @@ test_expect_success '"list" all worktrees --porcelain' ' test_cmp expect actual ' +test_expect_success '"list" all worktrees with locked annotation' ' + test_when_finished "rm -rf locked unlocked out && git worktree prune" && + git worktree add --detach locked main && + git worktree add --detach unlocked main && + git worktree lock locked && + test_when_finished "git worktree unlock locked" && + git worktree list >out && + grep "/locked *[0-9a-f].* locked$" out && + ! grep "/unlocked *[0-9a-f].* locked$" out +' + +test_expect_success '"list" all worktrees --porcelain with locked' ' + test_when_finished "rm -rf locked1 locked2 unlocked out actual expect && git worktree prune" && + echo "locked" >expect && + echo "locked with reason" >>expect && + git worktree add --detach locked1 && + git worktree add --detach locked2 && + # unlocked worktree should not be annotated with "locked" + git worktree add --detach unlocked && + git worktree lock locked1 && + test_when_finished "git worktree unlock locked1" && + git worktree lock locked2 --reason "with reason" && + test_when_finished "git worktree unlock locked2" && + git worktree list --porcelain >out && + grep "^locked" out >actual && + test_cmp expect actual +' + +test_expect_success '"list" all worktrees --porcelain with locked reason newline escaped' ' + test_when_finished "rm -rf locked_lf locked_crlf out actual expect && git worktree prune" && + printf "locked \"locked\\\\r\\\\nreason\"\n" >expect && + printf "locked \"locked\\\\nreason\"\n" >>expect && + git worktree add --detach locked_lf && + git worktree add --detach locked_crlf && + git worktree lock locked_lf --reason "$(printf "locked\nreason")" && + test_when_finished "git worktree unlock locked_lf" && + git worktree lock locked_crlf --reason "$(printf "locked\r\nreason")" && + test_when_finished "git worktree unlock locked_crlf" && + git worktree list --porcelain >out && + grep "^locked" out >actual && + test_cmp expect actual +' + +test_expect_success '"list" all worktrees with prunable annotation' ' + test_when_finished "rm -rf prunable unprunable out && git worktree prune" && + git worktree add --detach prunable && + git worktree add --detach unprunable && + rm -rf prunable && + git worktree list >out && + grep "/prunable *[0-9a-f].* prunable$" out && + ! grep "/unprunable *[0-9a-f].* prunable$" +' + +test_expect_success '"list" all worktrees --porcelain with prunable' ' + test_when_finished "rm -rf prunable out && git worktree prune" && + git worktree add --detach prunable && + rm -rf prunable && + git worktree list --porcelain >out && + sed -n "/^worktree .*\/prunable$/,/^$/p" <out >only_prunable && + test_i18ngrep "^prunable gitdir file points to non-existent location$" only_prunable +' + +test_expect_success '"list" all worktrees with prunable consistent with "prune"' ' + test_when_finished "rm -rf prunable unprunable out && git worktree prune" && + git worktree add --detach prunable && + git worktree add --detach unprunable && + rm -rf prunable && + git worktree list >out && + grep "/prunable *[0-9a-f].* prunable$" out && + ! grep "/unprunable *[0-9a-f].* unprunable$" out && + git worktree prune --verbose >out && + test_i18ngrep "^Removing worktrees/prunable" out && + test_i18ngrep ! "^Removing worktrees/unprunable" out +' + +test_expect_success '"list" --verbose and --porcelain mutually exclusive' ' + test_must_fail git worktree list --verbose --porcelain +' + +test_expect_success '"list" all worktrees --verbose with locked' ' + test_when_finished "rm -rf locked1 locked2 out actual expect && git worktree prune" && + git worktree add locked1 --detach && + git worktree add locked2 --detach && + git worktree lock locked1 && + test_when_finished "git worktree unlock locked1" && + git worktree lock locked2 --reason "with reason" && + test_when_finished "git worktree unlock locked2" && + echo "$(git -C locked2 rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >expect && + printf "\tlocked: with reason\n" >>expect && + git worktree list --verbose >out && + grep "/locked1 *[0-9a-f].* locked$" out && + sed -n "s/ */ /g;/\/locked2 *[0-9a-f].*$/,/locked: .*$/p" <out >actual && + test_cmp actual expect +' + +test_expect_success '"list" all worktrees --verbose with prunable' ' + test_when_finished "rm -rf prunable out actual expect && git worktree prune" && + git worktree add prunable --detach && + echo "$(git -C prunable rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >expect && + printf "\tprunable: gitdir file points to non-existent location\n" >>expect && + rm -rf prunable && + git worktree list --verbose >out && + sed -n "s/ */ /g;/\/prunable *[0-9a-f].*$/,/prunable: .*$/p" <out >actual && + test_cmp actual expect +' + test_expect_success 'bare repo setup' ' git init --bare bare1 && echo "data" >file1 && git add file1 && git commit -m"File1: add data" && - git push bare1 master && + git push bare1 main && git reset --hard HEAD^ ' test_expect_success '"list" all worktrees from bare main' ' test_when_finished "rm -rf there out actual expect && git -C bare1 worktree prune" && - git -C bare1 worktree add --detach ../there master && + git -C bare1 worktree add --detach ../there main && echo "$(pwd)/bare1 (bare)" >expect && echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect && git -C bare1 worktree list >out && @@ -82,7 +191,7 @@ test_expect_success '"list" all worktrees from bare main' ' test_expect_success '"list" all worktrees --porcelain from bare main' ' test_when_finished "rm -rf there actual expect && git -C bare1 worktree prune" && - git -C bare1 worktree add --detach ../there master && + git -C bare1 worktree add --detach ../there main && echo "worktree $(pwd)/bare1" >expect && echo "bare" >>expect && echo >>expect && @@ -96,7 +205,7 @@ test_expect_success '"list" all worktrees --porcelain from bare main' ' test_expect_success '"list" all worktrees from linked with a bare main' ' test_when_finished "rm -rf there out actual expect && git -C bare1 worktree prune" && - git -C bare1 worktree add --detach ../there master && + git -C bare1 worktree add --detach ../there main && echo "$(pwd)/bare1 (bare)" >expect && echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect && git -C there worktree list >out && diff --git a/t/t2405-worktree-submodule.sh b/t/t2405-worktree-submodule.sh index e1b2bfd87e..b172c26ca4 100755 --- a/t/t2405-worktree-submodule.sh +++ b/t/t2405-worktree-submodule.sh @@ -2,6 +2,9 @@ test_description='Combination of submodules and multiple worktrees' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh base_path=$(pwd -P) @@ -31,7 +34,7 @@ test_expect_success 'add superproject worktree' ' ' test_expect_failure 'submodule is checked out just after worktree add' ' - git -C worktree diff --submodule master"^!" >out && + git -C worktree diff --submodule main"^!" >out && grep "file1 updated" out ' @@ -41,7 +44,7 @@ test_expect_success 'add superproject worktree and initialize submodules' ' ' test_expect_success 'submodule is checked out just after submodule update in linked worktree' ' - git -C worktree-submodule-update diff --submodule master"^!" >out && + git -C worktree-submodule-update diff --submodule main"^!" >out && grep "file1 updated" out ' @@ -51,7 +54,7 @@ test_expect_success 'add superproject worktree and manually add submodule worktr ' test_expect_success 'submodule is checked out after manually adding submodule worktree' ' - git -C linked_submodule diff --submodule master"^!" >out && + git -C linked_submodule diff --submodule main"^!" >out && grep "file1 updated" out ' diff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh index 1fe468bfe8..f73741886b 100755 --- a/t/t2406-worktree-repair.sh +++ b/t/t2406-worktree-repair.sh @@ -104,6 +104,16 @@ test_expect_success 'repo not found; .git not file' ' test_i18ngrep ".git is not a file" err ' +test_expect_success 'repo not found; .git not referencing repo' ' + test_when_finished "rm -rf side not-a-repo && git worktree prune" && + git worktree add --detach side && + sed s,\.git/worktrees/side$,not-a-repo, side/.git >side/.newgit && + mv side/.newgit side/.git && + mkdir not-a-repo && + test_must_fail git worktree repair side 2>err && + test_i18ngrep ".git file does not reference a repository" err +' + test_expect_success 'repo not found; .git file broken' ' test_when_finished "rm -rf orig moved && git worktree prune" && git worktree add --detach orig && @@ -176,4 +186,20 @@ test_expect_success 'repair multiple gitdir files' ' test_must_be_empty err ' +test_expect_success 'repair moved main and linked worktrees' ' + test_when_finished "rm -rf main side mainmoved sidemoved" && + test_create_repo main && + test_commit -C main init && + git -C main worktree add --detach ../side && + sed "s,side/\.git$,sidemoved/.git," \ + main/.git/worktrees/side/gitdir >expect-gitdir && + sed "s,main/.git/worktrees/side$,mainmoved/.git/worktrees/side," \ + side/.git >expect-gitfile && + mv main mainmoved && + mv side sidemoved && + git -C mainmoved worktree repair ../sidemoved && + test_cmp expect-gitdir mainmoved/.git/worktrees/side/gitdir && + test_cmp expect-gitfile sidemoved/.git +' + test_done diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index 1ec7cb57c7..516c95ea0e 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -292,6 +292,11 @@ EOF test_cmp expect actual ' +test_expect_success 'ls-files with "**" patterns and --directory' ' + # Expectation same as previous test + git ls-files --directory -o -i --exclude "**/a.1" >actual && + test_cmp expect actual +' test_expect_success 'ls-files with "**" patterns and no slashes' ' git ls-files -o -i --exclude "one**a.1" >actual && diff --git a/t/t3003-ls-files-exclude.sh b/t/t3003-ls-files-exclude.sh index d5ec333131..c41c4f046a 100755 --- a/t/t3003-ls-files-exclude.sh +++ b/t/t3003-ls-files-exclude.sh @@ -29,11 +29,11 @@ test_expect_success 'add file to gitignore' ' ' check_all_output -test_expect_success 'ls-files -i lists only tracked-but-ignored files' ' +test_expect_success 'ls-files -i -c lists only tracked-but-ignored files' ' echo content >other-file && git add other-file && echo file >expect && - git ls-files -i --exclude-standard >output && + git ls-files -i -c --exclude-standard >output && test_cmp expect output ' diff --git a/t/t3005-ls-files-relative.sh b/t/t3005-ls-files-relative.sh index 2ec69a8a26..727e9ae1a4 100755 --- a/t/t3005-ls-files-relative.sh +++ b/t/t3005-ls-files-relative.sh @@ -46,7 +46,7 @@ test_expect_success 'ls-files -c' ' ls ../x* >expect.out && test_must_fail git ls-files -c --error-unmatch ../[xy]* >actual.out 2>actual.err && test_cmp expect.out actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ) ' @@ -61,7 +61,7 @@ test_expect_success 'ls-files -o' ' ls ../y* >expect.out && test_must_fail git ls-files -o --error-unmatch ../[xy]* >actual.out 2>actual.err && test_cmp expect.out actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ) ' diff --git a/t/t3012-ls-files-dedup.sh b/t/t3012-ls-files-dedup.sh new file mode 100755 index 0000000000..2682b1f43a --- /dev/null +++ b/t/t3012-ls-files-dedup.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +test_description='git ls-files --deduplicate test' + +. ./test-lib.sh + +test_expect_success 'setup' ' + >a.txt && + >b.txt && + >delete.txt && + git add a.txt b.txt delete.txt && + git commit -m base && + echo a >a.txt && + echo b >b.txt && + echo delete >delete.txt && + git add a.txt b.txt delete.txt && + git commit -m tip && + git tag tip && + git reset --hard HEAD^ && + echo change >a.txt && + git commit -a -m side && + git tag side +' + +test_expect_success 'git ls-files --deduplicate to show unique unmerged path' ' + test_must_fail git merge tip && + git ls-files --deduplicate >actual && + cat >expect <<-\EOF && + a.txt + b.txt + delete.txt + EOF + test_cmp expect actual && + git merge --abort +' + +test_expect_success 'git ls-files -d -m --deduplicate with different display options' ' + git reset --hard side && + test_must_fail git merge tip && + rm delete.txt && + git ls-files -d -m --deduplicate >actual && + cat >expect <<-\EOF && + a.txt + delete.txt + EOF + test_cmp expect actual && + git ls-files -d -m -t --deduplicate >actual && + cat >expect <<-\EOF && + C a.txt + C a.txt + C a.txt + R delete.txt + C delete.txt + EOF + test_cmp expect actual && + git ls-files -d -m -c --deduplicate >actual && + cat >expect <<-\EOF && + a.txt + b.txt + delete.txt + EOF + test_cmp expect actual && + git merge --abort +' + +test_done diff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh index b81eb5fd6f..6abdcbbc94 100755 --- a/t/t3040-subprojects-basic.sh +++ b/t/t3040-subprojects-basic.sh @@ -79,7 +79,4 @@ test_expect_success 'checkout in superproject' ' git diff-index --exit-code --raw --cached save -- sub1 ' -# just interesting what happened... -# git diff --name-status -M save master - test_done diff --git a/t/t3060-ls-files-with-tree.sh b/t/t3060-ls-files-with-tree.sh index 52ed665fcd..b257c792a4 100755 --- a/t/t3060-ls-files-with-tree.sh +++ b/t/t3060-ls-files-with-tree.sh @@ -47,6 +47,12 @@ test_expect_success setup ' git add . ' +test_expect_success 'usage' ' + test_expect_code 128 git ls-files --with-tree=HEAD -u && + test_expect_code 128 git ls-files --with-tree=HEAD -s && + test_expect_code 128 git ls-files --recurse-submodules --with-tree=HEAD +' + test_expect_success 'git ls-files --with-tree should succeed from subdir' ' # We have to run from a sub-directory to trigger prune_path # Then we finally get to run our --with-tree test @@ -60,4 +66,39 @@ test_expect_success \ 'git ls-files --with-tree should add entries from named tree.' \ 'test_cmp expected output' +test_expect_success 'no duplicates in --with-tree output' ' + git ls-files --with-tree=HEAD >actual && + sort -u actual >expected && + test_cmp expected actual +' + +test_expect_success 'setup: output in a conflict' ' + test_create_repo conflict && + test_commit -C conflict BASE file && + test_commit -C conflict A file foo && + git -C conflict reset --hard BASE && + test_commit -C conflict B file bar +' + +test_expect_success 'output in a conflict' ' + test_must_fail git -C conflict merge A B && + cat >expected <<-\EOF && + file + file + file + file + EOF + git -C conflict ls-files --with-tree=HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'output with removed .git/index' ' + cat >expected <<-\EOF && + file + EOF + rm conflict/.git/index && + git -C conflict ls-files --with-tree=HEAD >actual && + test_cmp expected actual +' + test_done diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 891d4d7cb9..56ea4bda13 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -4,6 +4,11 @@ test_description='wildmatch tests' . ./test-lib.sh +# Disable expensive chain-lint tests; all of the tests in this script +# are variants of a few trivial test-tool invocations, and there are a lot of +# them. +GIT_TEST_CHAIN_LINT_HARDER_DEFAULT=0 + should_create_test_file() { file=$1 diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 4c0734157b..cc4b10236e 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -5,6 +5,9 @@ test_description='git branch assorted tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -12,6 +15,7 @@ test_expect_success 'prepare a trivial repository' ' echo Hello >A && git update-index --add A && git commit -m "Initial commit." && + git branch -M main && echo World >>A && git update-index --add A && git commit -m "Second commit." && @@ -27,8 +31,8 @@ test_expect_success 'branch -h in broken repository' ' mkdir broken && ( cd broken && - git init && - >.git/refs/heads/master && + git init -b main && + >.git/refs/heads/main && test_expect_code 129 git branch -h >usage 2>&1 ) && test_i18ngrep "[Uu]sage" broken/usage @@ -42,8 +46,8 @@ test_expect_success 'git branch a/b/c should create a branch' ' git branch a/b/c && test_path_is_file .git/refs/heads/a/b/c ' -test_expect_success 'git branch mb master... should create a branch' ' - git branch mb master... && test_path_is_file .git/refs/heads/mb +test_expect_success 'git branch mb main... should create a branch' ' + git branch mb main... && test_path_is_file .git/refs/heads/mb ' test_expect_success 'git branch HEAD should fail' ' @@ -51,7 +55,7 @@ test_expect_success 'git branch HEAD should fail' ' ' cat >expect <<EOF -$ZERO_OID $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master +$ZERO_OID $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from main EOF test_expect_success 'git branch --create-reflog d/e/f should create a branch and a log' ' GIT_COMMITTER_DATE="2005-05-26 23:30" \ @@ -110,7 +114,7 @@ test_expect_success 'git branch -m n/n n should work' ' test_expect_success 'git branch -m bbb should rename checked out branch' ' test_when_finished git branch -D bbb && - test_when_finished git checkout master && + test_when_finished git checkout main && git checkout -b aaa && git commit --allow-empty -m "a new commit" && git rev-parse aaa@{0} >expect && @@ -124,7 +128,7 @@ test_expect_success 'git branch -m bbb should rename checked out branch' ' test_expect_success 'renaming checked out branch works with d/f conflict' ' test_when_finished "git branch -D foo/bar || git branch -D foo" && - test_when_finished git checkout master && + test_when_finished git checkout main && git checkout -b foo && git branch -m foo/bar && git symbolic-ref HEAD >actual && @@ -178,14 +182,14 @@ test_expect_success 'git branch -M baz bam should add entries to .git/logs/HEAD' ' test_expect_success 'git branch -M should leave orphaned HEAD alone' ' - git init orphan && + git init -b main orphan && ( cd orphan && test_commit initial && git checkout --orphan lonely && grep lonely .git/HEAD && test_path_is_missing .git/refs/head/lonely && - git branch -M master mistress && + git branch -M main mistress && grep lonely .git/HEAD ) ' @@ -201,7 +205,7 @@ test_expect_success 'resulting reflog can be shown by log -g' ' ' test_expect_success 'git branch -M baz bam should succeed when baz is checked out as linked working tree' ' - git checkout master && + git checkout main && git worktree add -b baz bazdir && git worktree add -f bazdir2 baz && git branch -M baz bam && @@ -224,20 +228,20 @@ test_expect_success 'git branch -M baz bam should succeed within a worktree in w git worktree prune ' -test_expect_success 'git branch -M master should work when master is checked out' ' - git checkout master && - git branch -M master +test_expect_success 'git branch -M main should work when main is checked out' ' + git checkout main && + git branch -M main ' -test_expect_success 'git branch -M master master should work when master is checked out' ' - git checkout master && - git branch -M master master +test_expect_success 'git branch -M main main should work when main is checked out' ' + git checkout main && + git branch -M main main ' -test_expect_success 'git branch -M master2 master2 should work when master is checked out' ' - git checkout master && - git branch master2 && - git branch -M master2 master2 +test_expect_success 'git branch -M topic topic should work when main is checked out' ' + git checkout main && + git branch topic && + git branch -M topic topic ' test_expect_success 'git branch -v -d t should work' ' @@ -289,11 +293,11 @@ test_expect_success 'deleting checked-out branch from repo that is a submodule' test_expect_success 'bare main worktree has HEAD at branch deleted by secondary worktree' ' test_when_finished "rm -rf nonbare base secondary" && - git init nonbare && + git init -b main nonbare && test_commit -C nonbare x && git clone --bare nonbare bare && - git -C bare worktree add --detach ../secondary master && - git -C secondary branch -D master + git -C bare worktree add --detach ../secondary main && + git -C secondary branch -D main ' test_expect_success 'git branch --list -v with --abbrev' ' @@ -305,7 +309,9 @@ test_expect_success 'git branch --list -v with --abbrev' ' git branch -v --list --no-abbrev t >actual.noabbrev && git branch -v --list --abbrev=0 t >actual.0abbrev && + git -c core.abbrev=no branch -v --list t >actual.noabbrev-conf && test_cmp actual.noabbrev actual.0abbrev && + test_cmp actual.noabbrev actual.noabbrev-conf && git branch -v --list --abbrev=36 t >actual.36abbrev && # how many hexdigits are used? @@ -324,8 +330,8 @@ test_expect_success 'git branch --list -v with --abbrev' ' test_expect_success 'git branch --column' ' COLUMNS=81 git branch --column=column >actual && cat >expect <<\EOF && - a/b/c bam foo l * master mb o/o q - abc bar j/k m/m master2 n o/p r + a/b/c bam foo l * main n o/p r + abc bar j/k m/m mb o/o q topic EOF test_cmp expect actual ' @@ -345,14 +351,14 @@ test_expect_success 'git branch --column with an extremely long branch name' ' j/k l m/m -* master - master2 +* main mb n o/o o/p q r + topic $long EOF test_cmp expect actual @@ -365,8 +371,8 @@ test_expect_success 'git branch with column.*' ' git config --unset column.branch && git config --unset column.ui && cat >expect <<\EOF && - a/b/c bam foo l * master mb o/o q - abc bar j/k m/m master2 n o/p r + a/b/c bam foo l * main n o/p r + abc bar j/k m/m mb o/o q topic EOF test_cmp expect actual ' @@ -377,7 +383,7 @@ test_expect_success 'git branch --column -v should fail' ' test_expect_success 'git branch -v with column.ui ignored' ' git config column.ui column && - COLUMNS=80 git branch -v | cut -c -10 | sed "s/ *$//" >actual && + COLUMNS=80 git branch -v | cut -c -8 | sed "s/ *$//" >actual && git config --unset column.ui && cat >expect <<\EOF && a/b/c @@ -388,14 +394,14 @@ test_expect_success 'git branch -v with column.ui ignored' ' j/k l m/m -* master - master2 +* main mb n o/o o/p q r + topic EOF test_cmp expect actual ' @@ -427,8 +433,8 @@ test_expect_success 'config information was renamed, too' ' ' test_expect_success 'git branch -m correctly renames multiple config sections' ' - test_when_finished "git checkout master" && - git checkout -b source master && + test_when_finished "git checkout main" && + git checkout -b source main && # Assert that a config file with multiple config sections has # those sections preserved... @@ -587,20 +593,20 @@ test_expect_success 'git branch -C c1 c2 should never touch HEAD' ' ! grep "$msg$" .git/logs/HEAD ' -test_expect_success 'git branch -C master should work when master is checked out' ' - git checkout master && - git branch -C master +test_expect_success 'git branch -C main should work when main is checked out' ' + git checkout main && + git branch -C main ' -test_expect_success 'git branch -C master master should work when master is checked out' ' - git checkout master && - git branch -C master master +test_expect_success 'git branch -C main main should work when main is checked out' ' + git checkout main && + git branch -C main main ' -test_expect_success 'git branch -C master5 master5 should work when master is checked out' ' - git checkout master && - git branch master5 && - git branch -C master5 master5 +test_expect_success 'git branch -C main5 main5 should work when main is checked out' ' + git checkout main && + git branch main5 && + git branch -C main5 main5 ' test_expect_success 'git branch -C ab cd should overwrite existing config for cd' ' @@ -620,8 +626,8 @@ test_expect_success 'git branch -C ab cd should overwrite existing config for cd test_expect_success 'git branch -c correctly copies multiple config sections' ' FOO=1 && export FOO && - test_when_finished "git checkout master" && - git checkout -b source2 master && + test_when_finished "git checkout main" && + git checkout -b source2 main && # Assert that a config file with multiple config sections has # those sections preserved... @@ -689,7 +695,7 @@ test_expect_success 'deleting a symref' ' git branch -d symref >actual && test_path_is_file .git/refs/heads/target && test_path_is_missing .git/refs/heads/symref && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'deleting a dangling symref' ' @@ -698,7 +704,7 @@ test_expect_success 'deleting a dangling symref' ' echo "Deleted branch dangling-symref (was nowhere)." >expect && git branch -d dangling-symref >actual && test_path_is_missing .git/refs/heads/dangling-symref && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'deleting a self-referential symref' ' @@ -707,15 +713,15 @@ test_expect_success 'deleting a self-referential symref' ' echo "Deleted branch self-reference (was refs/heads/self-reference)." >expect && git branch -d self-reference >actual && test_path_is_missing .git/refs/heads/self-reference && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'renaming a symref is not allowed' ' - git symbolic-ref refs/heads/master2 refs/heads/master && - test_must_fail git branch -m master2 master3 && - git symbolic-ref refs/heads/master2 && - test_path_is_file .git/refs/heads/master && - test_path_is_missing .git/refs/heads/master3 + git symbolic-ref refs/heads/topic refs/heads/main && + test_must_fail git branch -m topic new-topic && + git symbolic-ref refs/heads/topic && + test_path_is_file .git/refs/heads/main && + test_path_is_missing .git/refs/heads/new-topic ' test_expect_success SYMLINKS 'git branch -m u v should fail when the reflog for u is a symlink' ' @@ -728,27 +734,27 @@ test_expect_success SYMLINKS 'git branch -m u v should fail when the reflog for test_expect_success 'test tracking setup via --track' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track my1 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track my1 local/main && test $(git config branch.my1.remote) = local && - test $(git config branch.my1.merge) = refs/heads/master + test $(git config branch.my1.merge) = refs/heads/main ' test_expect_success 'test tracking setup (non-wildcard, matching)' ' git config remote.local.url . && - git config remote.local.fetch refs/heads/master:refs/remotes/local/master && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track my4 local/master && + git config remote.local.fetch refs/heads/main:refs/remotes/local/main && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track my4 local/main && test $(git config branch.my4.remote) = local && - test $(git config branch.my4.merge) = refs/heads/master + test $(git config branch.my4.merge) = refs/heads/main ' test_expect_success 'tracking setup fails on non-matching refspec' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git config remote.local.fetch refs/heads/s:refs/remotes/local/s && - test_must_fail git branch --track my5 local/master && + test_must_fail git branch --track my5 local/main && test_must_fail git config branch.my5.remote && test_must_fail git config branch.my5.merge ' @@ -757,21 +763,21 @@ test_expect_success 'test tracking setup via config' ' git config branch.autosetupmerge true && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch my3 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch my3 local/main && test $(git config branch.my3.remote) = local && - test $(git config branch.my3.merge) = refs/heads/master + test $(git config branch.my3.merge) = refs/heads/main ' test_expect_success 'test overriding tracking setup via --no-track' ' git config branch.autosetupmerge true && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track my2 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track my2 local/main && git config branch.autosetupmerge false && ! test "$(git config branch.my2.remote)" = local && - ! test "$(git config branch.my2.merge)" = refs/heads/master + ! test "$(git config branch.my2.merge)" = refs/heads/main ' test_expect_success 'no tracking without .fetch entries' ' @@ -802,7 +808,7 @@ test_expect_success 'test deleting branch without config' ' sha1=$(git rev-parse my7 | cut -c 1-7) && echo "Deleted branch my7 (was $sha1)." >expect && git branch -d my7 >actual 2>&1 && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'deleting currently checked out branch fails' ' @@ -836,33 +842,33 @@ test_expect_success 'branch from tag w/--track causes failure' ' test_expect_success '--set-upstream-to fails on multiple branches' ' echo "fatal: too many arguments to set new upstream" >expect && - test_must_fail git branch --set-upstream-to master a b c 2>err && - test_i18ncmp expect err + test_must_fail git branch --set-upstream-to main a b c 2>err && + test_cmp expect err ' test_expect_success '--set-upstream-to fails on detached HEAD' ' git checkout HEAD^{} && test_when_finished git checkout - && - echo "fatal: could not set upstream of HEAD to master when it does not point to any branch." >expect && - test_must_fail git branch --set-upstream-to master 2>err && - test_i18ncmp expect err + echo "fatal: could not set upstream of HEAD to main when it does not point to any branch." >expect && + test_must_fail git branch --set-upstream-to main 2>err && + test_cmp expect err ' test_expect_success '--set-upstream-to fails on a missing dst branch' ' echo "fatal: branch '"'"'does-not-exist'"'"' does not exist" >expect && - test_must_fail git branch --set-upstream-to master does-not-exist 2>err && - test_i18ncmp expect err + test_must_fail git branch --set-upstream-to main does-not-exist 2>err && + test_cmp expect err ' test_expect_success '--set-upstream-to fails on a missing src branch' ' - test_must_fail git branch --set-upstream-to does-not-exist master 2>err && + test_must_fail git branch --set-upstream-to does-not-exist main 2>err && test_i18ngrep "the requested upstream branch '"'"'does-not-exist'"'"' does not exist" err ' test_expect_success '--set-upstream-to fails on a non-ref' ' echo "fatal: Cannot setup tracking information; starting point '"'"'HEAD^{}'"'"' is not a branch." >expect && test_must_fail git branch --set-upstream-to HEAD^{} 2>err && - test_i18ncmp expect err + test_cmp expect err ' test_expect_success '--set-upstream-to fails on locked config' ' @@ -874,26 +880,26 @@ test_expect_success '--set-upstream-to fails on locked config' ' ' test_expect_success 'use --set-upstream-to modify HEAD' ' - test_config branch.master.remote foo && - test_config branch.master.merge foo && + test_config branch.main.remote foo && + test_config branch.main.merge foo && git branch my12 && git branch --set-upstream-to my12 && - test "$(git config branch.master.remote)" = "." && - test "$(git config branch.master.merge)" = "refs/heads/my12" + test "$(git config branch.main.remote)" = "." && + test "$(git config branch.main.merge)" = "refs/heads/my12" ' test_expect_success 'use --set-upstream-to modify a particular branch' ' git branch my13 && - git branch --set-upstream-to master my13 && + git branch --set-upstream-to main my13 && test_when_finished "git branch --unset-upstream my13" && test "$(git config branch.my13.remote)" = "." && - test "$(git config branch.my13.merge)" = "refs/heads/master" + test "$(git config branch.my13.merge)" = "refs/heads/main" ' test_expect_success '--unset-upstream should fail if given a non-existent branch' ' echo "fatal: Branch '"'"'i-dont-exist'"'"' has no upstream information" >expect && test_must_fail git branch --unset-upstream i-dont-exist 2>err && - test_i18ncmp expect err + test_cmp expect err ' test_expect_success '--unset-upstream should fail if config is locked' ' @@ -906,22 +912,22 @@ test_expect_success '--unset-upstream should fail if config is locked' ' test_expect_success 'test --unset-upstream on HEAD' ' git branch my14 && - test_config branch.master.remote foo && - test_config branch.master.merge foo && + test_config branch.main.remote foo && + test_config branch.main.merge foo && git branch --set-upstream-to my14 && git branch --unset-upstream && - test_must_fail git config branch.master.remote && - test_must_fail git config branch.master.merge && + test_must_fail git config branch.main.remote && + test_must_fail git config branch.main.merge && # fail for a branch without upstream set - echo "fatal: Branch '"'"'master'"'"' has no upstream information" >expect && + echo "fatal: Branch '"'"'main'"'"' has no upstream information" >expect && test_must_fail git branch --unset-upstream 2>err && - test_i18ncmp expect err + test_cmp expect err ' test_expect_success '--unset-upstream should fail on multiple branches' ' echo "fatal: too many arguments to unset upstream" >expect && test_must_fail git branch --unset-upstream a b c 2>err && - test_i18ncmp expect err + test_cmp expect err ' test_expect_success '--unset-upstream should fail on detached HEAD' ' @@ -929,19 +935,19 @@ test_expect_success '--unset-upstream should fail on detached HEAD' ' test_when_finished git checkout - && echo "fatal: could not unset upstream of HEAD when it does not point to any branch." >expect && test_must_fail git branch --unset-upstream 2>err && - test_i18ncmp expect err + test_cmp expect err ' test_expect_success 'test --unset-upstream on a particular branch' ' git branch my15 && - git branch --set-upstream-to master my14 && + git branch --set-upstream-to main my14 && git branch --unset-upstream my14 && test_must_fail git config branch.my14.remote && test_must_fail git config branch.my14.merge ' test_expect_success 'disabled option --set-upstream fails' ' - test_must_fail git branch --set-upstream origin/master + test_must_fail git branch --set-upstream origin/main ' test_expect_success '--set-upstream-to notices an error to set branch as own upstream' ' @@ -951,37 +957,37 @@ test_expect_success '--set-upstream-to notices an error to set branch as own ups EOF test_expect_code 1 git config branch.my13.remote && test_expect_code 1 git config branch.my13.merge && - test_i18ncmp expect actual + test_cmp expect actual ' # Keep this test last, as it changes the current branch cat >expect <<EOF -$ZERO_OID $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master +$ZERO_OID $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from main EOF test_expect_success 'git checkout -b g/h/i -l should create a branch and a log' ' GIT_COMMITTER_DATE="2005-05-26 23:30" \ - git checkout -b g/h/i -l master && + git checkout -b g/h/i -l main && test_path_is_file .git/refs/heads/g/h/i && test_path_is_file .git/logs/refs/heads/g/h/i && test_cmp expect .git/logs/refs/heads/g/h/i ' test_expect_success 'checkout -b makes reflog by default' ' - git checkout master && + git checkout main && git config --unset core.logAllRefUpdates && git checkout -b alpha && git rev-parse --verify alpha@{0} ' test_expect_success 'checkout -b does not make reflog when core.logAllRefUpdates = false' ' - git checkout master && + git checkout main && git config core.logAllRefUpdates false && git checkout -b beta && test_must_fail git rev-parse --verify beta@{0} ' test_expect_success 'checkout -b with -l makes reflog when core.logAllRefUpdates = false' ' - git checkout master && + git checkout main && git checkout -lb gamma && git config --unset core.logAllRefUpdates && git rev-parse --verify gamma@{0} @@ -990,10 +996,10 @@ test_expect_success 'checkout -b with -l makes reflog when core.logAllRefUpdates test_expect_success 'avoid ambiguous track' ' git config branch.autosetupmerge true && git config remote.ambi1.url lalala && - git config remote.ambi1.fetch refs/heads/lalala:refs/heads/master && + git config remote.ambi1.fetch refs/heads/lalala:refs/heads/main && git config remote.ambi2.url lilili && - git config remote.ambi2.fetch refs/heads/lilili:refs/heads/master && - test_must_fail git branch all1 master && + git config remote.ambi2.fetch refs/heads/lilili:refs/heads/main && + test_must_fail git branch all1 main && test -z "$(git config branch.all1.merge)" ' @@ -1049,10 +1055,10 @@ test_expect_success 'autosetuprebase local on a tracked remote branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && git config branch.autosetuprebase local && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track myr5 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track myr5 local/main && test "$(git config branch.myr5.remote)" = local && - test "$(git config branch.myr5.merge)" = refs/heads/master && + test "$(git config branch.myr5.merge)" = refs/heads/main && ! test "$(git config branch.myr5.rebase)" = true ' @@ -1060,10 +1066,10 @@ test_expect_success 'autosetuprebase never on a tracked remote branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && git config branch.autosetuprebase never && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track myr6 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track myr6 local/main && test "$(git config branch.myr6.remote)" = local && - test "$(git config branch.myr6.merge)" = refs/heads/master && + test "$(git config branch.myr6.merge)" = refs/heads/main && ! test "$(git config branch.myr6.rebase)" = true ' @@ -1071,10 +1077,10 @@ test_expect_success 'autosetuprebase remote on a tracked remote branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && git config branch.autosetuprebase remote && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track myr7 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track myr7 local/main && test "$(git config branch.myr7.remote)" = local && - test "$(git config branch.myr7.merge)" = refs/heads/master && + test "$(git config branch.myr7.merge)" = refs/heads/main && test "$(git config branch.myr7.rebase)" = true ' @@ -1082,10 +1088,10 @@ test_expect_success 'autosetuprebase always on a tracked remote branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && git config branch.autosetuprebase remote && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track myr8 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track myr8 local/main && test "$(git config branch.myr8.remote)" = local && - test "$(git config branch.myr8.merge)" = refs/heads/master && + test "$(git config branch.myr8.merge)" = refs/heads/main && test "$(git config branch.myr8.rebase)" = true ' @@ -1093,10 +1099,10 @@ test_expect_success 'autosetuprebase unconfigured on a tracked remote branch' ' git config --unset branch.autosetuprebase && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --track myr9 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --track myr9 local/main && test "$(git config branch.myr9.remote)" = local && - test "$(git config branch.myr9.merge)" = refs/heads/master && + test "$(git config branch.myr9.merge)" = refs/heads/main && test "z$(git config branch.myr9.rebase)" = z ' @@ -1114,7 +1120,7 @@ test_expect_success 'autosetuprebase unconfigured on a tracked local branch' ' test_expect_success 'autosetuprebase unconfigured on untracked local branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git branch --no-track myr11 mybase2 && test "z$(git config branch.myr11.remote)" = z && test "z$(git config branch.myr11.merge)" = z && @@ -1124,8 +1130,8 @@ test_expect_success 'autosetuprebase unconfigured on untracked local branch' ' test_expect_success 'autosetuprebase unconfigured on untracked remote branch' ' git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track myr12 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track myr12 local/main && test "z$(git config branch.myr12.remote)" = z && test "z$(git config branch.myr12.merge)" = z && test "z$(git config branch.myr12.rebase)" = z @@ -1135,7 +1141,7 @@ test_expect_success 'autosetuprebase never on an untracked local branch' ' git config branch.autosetuprebase never && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git branch --no-track myr13 mybase2 && test "z$(git config branch.myr13.remote)" = z && test "z$(git config branch.myr13.merge)" = z && @@ -1146,7 +1152,7 @@ test_expect_success 'autosetuprebase local on an untracked local branch' ' git config branch.autosetuprebase local && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git branch --no-track myr14 mybase2 && test "z$(git config branch.myr14.remote)" = z && test "z$(git config branch.myr14.merge)" = z && @@ -1157,7 +1163,7 @@ test_expect_success 'autosetuprebase remote on an untracked local branch' ' git config branch.autosetuprebase remote && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git branch --no-track myr15 mybase2 && test "z$(git config branch.myr15.remote)" = z && test "z$(git config branch.myr15.merge)" = z && @@ -1168,7 +1174,7 @@ test_expect_success 'autosetuprebase always on an untracked local branch' ' git config branch.autosetuprebase always && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && + (git show-ref -q refs/remotes/local/main || git fetch local) && git branch --no-track myr16 mybase2 && test "z$(git config branch.myr16.remote)" = z && test "z$(git config branch.myr16.merge)" = z && @@ -1179,8 +1185,8 @@ test_expect_success 'autosetuprebase never on an untracked remote branch' ' git config branch.autosetuprebase never && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track myr17 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track myr17 local/main && test "z$(git config branch.myr17.remote)" = z && test "z$(git config branch.myr17.merge)" = z && test "z$(git config branch.myr17.rebase)" = z @@ -1190,8 +1196,8 @@ test_expect_success 'autosetuprebase local on an untracked remote branch' ' git config branch.autosetuprebase local && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track myr18 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track myr18 local/main && test "z$(git config branch.myr18.remote)" = z && test "z$(git config branch.myr18.merge)" = z && test "z$(git config branch.myr18.rebase)" = z @@ -1201,8 +1207,8 @@ test_expect_success 'autosetuprebase remote on an untracked remote branch' ' git config branch.autosetuprebase remote && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track myr19 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track myr19 local/main && test "z$(git config branch.myr19.remote)" = z && test "z$(git config branch.myr19.merge)" = z && test "z$(git config branch.myr19.rebase)" = z @@ -1212,8 +1218,8 @@ test_expect_success 'autosetuprebase always on an untracked remote branch' ' git config branch.autosetuprebase always && git config remote.local.url . && git config remote.local.fetch refs/heads/*:refs/remotes/local/* && - (git show-ref -q refs/remotes/local/master || git fetch local) && - git branch --no-track myr20 local/master && + (git show-ref -q refs/remotes/local/main || git fetch local) && + git branch --no-track myr20 local/main && test "z$(git config branch.myr20.remote)" = z && test "z$(git config branch.myr20.merge)" = z && test "z$(git config branch.myr20.rebase)" = z @@ -1221,7 +1227,7 @@ test_expect_success 'autosetuprebase always on an untracked remote branch' ' test_expect_success 'autosetuprebase always on detached HEAD' ' git config branch.autosetupmerge always && - test_when_finished git checkout master && + test_when_finished git checkout main && git checkout HEAD^0 && git branch my11 && test -z "$(git config branch.my11.remote)" && @@ -1249,18 +1255,18 @@ test_expect_success 'attempt to delete a branch without base and unmerged to HEA test_expect_success 'attempt to delete a branch merged to its base' ' # we are on my9 which is the initial commit; traditionally # we would not have allowed deleting my8 that is not merged - # to my9, but it is set to track master that already has my8 - git config branch.my8.merge refs/heads/master && + # to my9, but it is set to track main that already has my8 + git config branch.my8.merge refs/heads/main && git branch -d my8 ' test_expect_success 'attempt to delete a branch merged to its base' ' - git checkout master && + git checkout main && echo Third >>A && git commit -m "Third commit" A && git branch -t my10 my9 && git branch -f my10 HEAD^ && - # we are on master which is at the third commit, and my10 + # we are on main which is at the third commit, and my10 # is behind us, so traditionally we would have allowed deleting # it; but my10 is set to track my9 that is further behind. test_must_fail git branch -d my10 @@ -1287,6 +1293,7 @@ test_expect_success 'detect typo in branch name when using --edit-description' ' ' test_expect_success 'refuse --edit-description on unborn branch for now' ' + test_when_finished "git checkout main" && write_script editor <<-\EOF && echo "New contents" >"$1" EOF @@ -1298,24 +1305,20 @@ test_expect_success '--merged catches invalid object names' ' test_must_fail git branch --merged 0000000000000000000000000000000000000000 ' -test_expect_success '--merged is incompatible with --no-merged' ' - test_must_fail git branch --merged HEAD --no-merged HEAD -' - test_expect_success '--list during rebase' ' test_when_finished "reset_rebase" && - git checkout master && + git checkout main && FAKE_LINES="1 edit 2" && export FAKE_LINES && set_fake_editor && git rebase -i HEAD~2 && git branch --list >actual && - test_i18ngrep "rebasing master" actual + test_i18ngrep "rebasing main" actual ' test_expect_success '--list during rebase from detached HEAD' ' - test_when_finished "reset_rebase && git checkout master" && - git checkout master^0 && + test_when_finished "reset_rebase && git checkout main" && + git checkout main^0 && oid=$(git rev-parse --short HEAD) && FAKE_LINES="1 edit 2" && export FAKE_LINES && @@ -1327,17 +1330,17 @@ test_expect_success '--list during rebase from detached HEAD' ' test_expect_success 'tracking with unexpected .fetch refspec' ' rm -rf a b c d && - git init a && + git init -b main a && ( cd a && test_commit a ) && - git init b && + git init -b main b && ( cd b && test_commit b ) && - git init c && + git init -b main c && ( cd c && test_commit c && @@ -1345,23 +1348,23 @@ test_expect_success 'tracking with unexpected .fetch refspec' ' git remote add b ../b && git fetch --all ) && - git init d && + git init -b main d && ( cd d && git remote add c ../c && git config remote.c.fetch "+refs/remotes/*:refs/remotes/*" && git fetch c && - git branch --track local/a/master remotes/a/master && - test "$(git config branch.local/a/master.remote)" = "c" && - test "$(git config branch.local/a/master.merge)" = "refs/remotes/a/master" && + git branch --track local/a/main remotes/a/main && + test "$(git config branch.local/a/main.remote)" = "c" && + test "$(git config branch.local/a/main.merge)" = "refs/remotes/a/main" && git rev-parse --verify a >expect && - git rev-parse --verify local/a/master >actual && + git rev-parse --verify local/a/main >actual && test_cmp expect actual ) ' test_expect_success 'configured committerdate sort' ' - git init sort && + git init -b main sort && ( cd sort && git config branch.sort committerdate && @@ -1374,7 +1377,7 @@ test_expect_success 'configured committerdate sort' ' test_commit b && git branch >actual && cat >expect <<-\EOF && - master + main a c * b @@ -1392,7 +1395,7 @@ test_expect_success 'option override configured sort' ' a * b c - master + main EOF test_cmp expect actual ) diff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh index 40251c9f8f..349a810cee 100755 --- a/t/t3201-branch-contains.sh +++ b/t/t3201-branch-contains.sh @@ -2,6 +2,9 @@ test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -10,51 +13,52 @@ test_expect_success setup ' git add file && test_tick && git commit -m initial && + git branch -M main && git branch side && echo 1 >file && test_tick && - git commit -a -m "second on master" && + git commit -a -m "second on main" && git checkout side && echo 1 >file && test_tick && git commit -a -m "second on side" && - git merge master + git merge main ' -test_expect_success 'branch --contains=master' ' +test_expect_success 'branch --contains=main' ' - git branch --contains=master >actual && + git branch --contains=main >actual && { - echo " master" && echo "* side" + echo " main" && echo "* side" } >expect && test_cmp expect actual ' -test_expect_success 'branch --contains master' ' +test_expect_success 'branch --contains main' ' - git branch --contains master >actual && + git branch --contains main >actual && { - echo " master" && echo "* side" + echo " main" && echo "* side" } >expect && test_cmp expect actual ' -test_expect_success 'branch --no-contains=master' ' +test_expect_success 'branch --no-contains=main' ' - git branch --no-contains=master >actual && + git branch --no-contains=main >actual && test_must_be_empty actual ' -test_expect_success 'branch --no-contains master' ' +test_expect_success 'branch --no-contains main' ' - git branch --no-contains master >actual && + git branch --no-contains main >actual && test_must_be_empty actual ' @@ -73,7 +77,7 @@ test_expect_success 'branch --no-contains=side' ' git branch --no-contains=side >actual && { - echo " master" + echo " main" } >expect && test_cmp expect actual @@ -81,9 +85,9 @@ test_expect_success 'branch --no-contains=side' ' test_expect_success 'branch --contains with pattern implies --list' ' - git branch --contains=master master >actual && + git branch --contains=main main >actual && { - echo " master" + echo " main" } >expect && test_cmp expect actual @@ -91,7 +95,7 @@ test_expect_success 'branch --contains with pattern implies --list' ' test_expect_success 'branch --no-contains with pattern implies --list' ' - git branch --no-contains=master master >actual && + git branch --no-contains=main main >actual && test_must_be_empty actual ' @@ -100,7 +104,7 @@ test_expect_success 'side: branch --merged' ' git branch --merged >actual && { - echo " master" && + echo " main" && echo "* side" } >expect && test_cmp expect actual @@ -109,9 +113,9 @@ test_expect_success 'side: branch --merged' ' test_expect_success 'branch --merged with pattern implies --list' ' - git branch --merged=side master >actual && + git branch --merged=side main >actual && { - echo " master" + echo " main" } >expect && test_cmp expect actual @@ -124,18 +128,18 @@ test_expect_success 'side: branch --no-merged' ' ' -test_expect_success 'master: branch --merged' ' +test_expect_success 'main: branch --merged' ' - git checkout master && + git checkout main && git branch --merged >actual && { - echo "* master" + echo "* main" } >expect && test_cmp expect actual ' -test_expect_success 'master: branch --no-merged' ' +test_expect_success 'main: branch --no-merged' ' git branch --no-merged >actual && { @@ -147,22 +151,22 @@ test_expect_success 'master: branch --no-merged' ' test_expect_success 'branch --no-merged with pattern implies --list' ' - git branch --no-merged=master master >actual && + git branch --no-merged=main main >actual && test_must_be_empty actual ' test_expect_success 'implicit --list conflicts with modification options' ' - test_must_fail git branch --contains=master -d && - test_must_fail git branch --contains=master -m foo && - test_must_fail git branch --no-contains=master -d && - test_must_fail git branch --no-contains=master -m foo + test_must_fail git branch --contains=main -d && + test_must_fail git branch --contains=main -m foo && + test_must_fail git branch --no-contains=main -d && + test_must_fail git branch --no-contains=main -m foo ' test_expect_success 'Assert that --contains only works on commits, not trees & blobs' ' - test_must_fail git branch --contains master^{tree} && + test_must_fail git branch --contains main^{tree} && blob=$(git hash-object -w --stdin <<-\EOF Some blob EOF @@ -171,44 +175,96 @@ test_expect_success 'Assert that --contains only works on commits, not trees & b test_must_fail git branch --no-contains $blob ' +test_expect_success 'multiple branch --contains' ' + git checkout -b side2 main && + >feature && + git add feature && + git commit -m "add feature" && + git checkout -b next main && + git merge side && + git branch --contains side --contains side2 >actual && + cat >expect <<-\EOF && + * next + side + side2 + EOF + test_cmp expect actual +' + +test_expect_success 'multiple branch --merged' ' + git branch --merged next --merged main >actual && + cat >expect <<-\EOF && + main + * next + side + EOF + test_cmp expect actual +' + +test_expect_success 'multiple branch --no-contains' ' + git branch --no-contains side --no-contains side2 >actual && + cat >expect <<-\EOF && + main + EOF + test_cmp expect actual +' + +test_expect_success 'multiple branch --no-merged' ' + git branch --no-merged next --no-merged main >actual && + cat >expect <<-\EOF && + side2 + EOF + test_cmp expect actual +' + +test_expect_success 'branch --contains combined with --no-contains' ' + git checkout -b seen main && + git merge side && + git merge side2 && + git branch --contains side --no-contains side2 >actual && + cat >expect <<-\EOF && + next + side + EOF + test_cmp expect actual +' + +test_expect_success 'branch --merged combined with --no-merged' ' + git branch --merged seen --no-merged next >actual && + cat >expect <<-\EOF && + * seen + side2 + EOF + test_cmp expect actual +' + # We want to set up a case where the walk for the tracking info # of one branch crosses the tip of another branch (and make sure # that the latter walk does not mess up our flag to see if it was # merged). # -# Here "topic" tracks "master" with one extra commit, and "zzz" points to the -# same tip as master The name "zzz" must come alphabetically after "topic" +# Here "topic" tracks "main" with one extra commit, and "zzz" points to the +# same tip as main The name "zzz" must come alphabetically after "topic" # as we process them in that order. test_expect_success 'branch --merged with --verbose' ' - git branch --track topic master && + git branch --track topic main && git branch zzz topic && git checkout topic && test_commit foo && git branch --merged topic >actual && cat >expect <<-\EOF && - master + main * topic zzz EOF test_cmp expect actual && git branch --verbose --merged topic >actual && cat >expect <<-EOF && - master $(git rev-parse --short master) second on master - * topic $(git rev-parse --short topic ) [ahead 1] foo - zzz $(git rev-parse --short zzz ) second on master - EOF - test_i18ncmp expect actual -' - -test_expect_success 'branch --contains combined with --no-contains' ' - git branch --contains zzz --no-contains topic >actual && - cat >expect <<-\EOF && - master - side - zzz + main $(git rev-parse --short main) second on main + * topic $(git rev-parse --short topic ) [ahead 1] foo + zzz $(git rev-parse --short zzz ) second on main EOF test_cmp expect actual - ' test_done diff --git a/t/t3202-show-branch-octopus.sh b/t/t3202-show-branch-octopus.sh deleted file mode 100755 index 6adf47869c..0000000000 --- a/t/t3202-show-branch-octopus.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -test_description='test show-branch with more than 8 heads' - -. ./test-lib.sh - -numbers="1 2 3 4 5 6 7 8 9 10" - -test_expect_success 'setup' ' - - > file && - git add file && - test_tick && - git commit -m initial && - - for i in $numbers - do - git checkout -b branch$i master && - > file$i && - git add file$i && - test_tick && - git commit -m branch$i || return 1 - done - -' - -cat > expect << EOF -! [branch1] branch1 - ! [branch2] branch2 - ! [branch3] branch3 - ! [branch4] branch4 - ! [branch5] branch5 - ! [branch6] branch6 - ! [branch7] branch7 - ! [branch8] branch8 - ! [branch9] branch9 - * [branch10] branch10 ----------- - * [branch10] branch10 - + [branch9] branch9 - + [branch8] branch8 - + [branch7] branch7 - + [branch6] branch6 - + [branch5] branch5 - + [branch4] branch4 - + [branch3] branch3 - + [branch2] branch2 -+ [branch1] branch1 -+++++++++* [branch10^] initial -EOF - -test_expect_success 'show-branch with more than 8 branches' ' - - git show-branch $(for i in $numbers; do echo branch$i; done) > out && - test_cmp expect out - -' - -test_expect_success 'show-branch with showbranch.default' ' - for i in $numbers; do - git config --add showbranch.default branch$i - done && - git show-branch >out && - test_cmp expect out -' - -test_done diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh new file mode 100755 index 0000000000..ad9902a06b --- /dev/null +++ b/t/t3202-show-branch.sh @@ -0,0 +1,149 @@ +#!/bin/sh + +test_description='test show-branch' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit initial && + for i in $(test_seq 1 10) + do + git checkout -b branch$i initial && + test_commit --no-tag branch$i + done && + git for-each-ref \ + --sort=version:refname \ + --format="%(refname:strip=2)" \ + "refs/heads/branch*" >branches.sorted && + sed "s/^> //" >expect <<-\EOF + > ! [branch1] branch1 + > ! [branch2] branch2 + > ! [branch3] branch3 + > ! [branch4] branch4 + > ! [branch5] branch5 + > ! [branch6] branch6 + > ! [branch7] branch7 + > ! [branch8] branch8 + > ! [branch9] branch9 + > * [branch10] branch10 + > ---------- + > * [branch10] branch10 + > + [branch9] branch9 + > + [branch8] branch8 + > + [branch7] branch7 + > + [branch6] branch6 + > + [branch5] branch5 + > + [branch4] branch4 + > + [branch3] branch3 + > + [branch2] branch2 + > + [branch1] branch1 + > +++++++++* [branch10^] initial + EOF +' + +test_expect_success 'show-branch with more than 8 branches' ' + git show-branch $(cat branches.sorted) >actual && + test_cmp expect actual +' + +test_expect_success 'show-branch with showbranch.default' ' + for branch in $(cat branches.sorted) + do + test_config showbranch.default $branch --add + done && + git show-branch >actual && + test_cmp expect actual +' + +test_expect_success 'show-branch --color output' ' + sed "s/^> //" >expect <<-\EOF && + > <RED>!<RESET> [branch1] branch1 + > <GREEN>!<RESET> [branch2] branch2 + > <YELLOW>!<RESET> [branch3] branch3 + > <BLUE>!<RESET> [branch4] branch4 + > <MAGENTA>!<RESET> [branch5] branch5 + > <CYAN>!<RESET> [branch6] branch6 + > <BOLD;RED>!<RESET> [branch7] branch7 + > <BOLD;GREEN>!<RESET> [branch8] branch8 + > <BOLD;YELLOW>!<RESET> [branch9] branch9 + > <BOLD;BLUE>*<RESET> [branch10] branch10 + > ---------- + > <BOLD;BLUE>*<RESET> [branch10] branch10 + > <BOLD;YELLOW>+<RESET> [branch9] branch9 + > <BOLD;GREEN>+<RESET> [branch8] branch8 + > <BOLD;RED>+<RESET> [branch7] branch7 + > <CYAN>+<RESET> [branch6] branch6 + > <MAGENTA>+<RESET> [branch5] branch5 + > <BLUE>+<RESET> [branch4] branch4 + > <YELLOW>+<RESET> [branch3] branch3 + > <GREEN>+<RESET> [branch2] branch2 + > <RED>+<RESET> [branch1] branch1 + > <RED>+<RESET><GREEN>+<RESET><YELLOW>+<RESET><BLUE>+<RESET><MAGENTA>+<RESET><CYAN>+<RESET><BOLD;RED>+<RESET><BOLD;GREEN>+<RESET><BOLD;YELLOW>+<RESET><BOLD;BLUE>*<RESET> [branch10^] initial + EOF + git show-branch --color=always $(cat branches.sorted) >actual.raw && + test_decode_color <actual.raw >actual && + test_cmp expect actual +' + +test_expect_success 'show branch --remotes' ' + cat >expect.err <<-\EOF && + No revs to be shown. + EOF + git show-branch -r 2>actual.err >actual.out && + test_cmp expect.err actual.err && + test_must_be_empty actual.out +' + +test_expect_success 'setup show branch --list' ' + sed "s/^> //" >expect <<-\EOF + > [branch1] branch1 + > [branch2] branch2 + > [branch3] branch3 + > [branch4] branch4 + > [branch5] branch5 + > [branch6] branch6 + > [branch7] branch7 + > [branch8] branch8 + > [branch9] branch9 + > * [branch10] branch10 + EOF +' + +test_expect_success 'show branch --list' ' + git show-branch --list $(cat branches.sorted) >actual && + test_cmp expect actual +' + +test_expect_success 'show branch --list has no --color output' ' + git show-branch --color=always --list $(cat branches.sorted) >actual && + test_cmp expect actual +' + +test_expect_success 'show branch --merge-base with one argument' ' + for branch in $(cat branches.sorted) + do + git rev-parse $branch >expect && + git show-branch --merge-base $branch >actual && + test_cmp expect actual + done +' + +test_expect_success 'show branch --merge-base with two arguments' ' + for branch in $(cat branches.sorted) + do + git rev-parse initial >expect && + git show-branch --merge-base initial $branch >actual && + test_cmp expect actual + done +' + +test_expect_success 'show branch --merge-base with N arguments' ' + git rev-parse initial >expect && + git show-branch --merge-base $(cat branches.sorted) >actual && + test_cmp expect actual && + + git merge-base $(cat branches.sorted) >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index 71818b90f0..5325b9f67a 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git branch display tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -8,6 +11,7 @@ test_expect_success 'make commits' ' echo content >file && git add file && git commit -m one && + git branch -M main && echo content >>file && git commit -a -m two ' @@ -26,7 +30,7 @@ test_expect_success 'make remote branches' ' cat >expect <<'EOF' branch-one branch-two -* master +* main EOF test_expect_success 'git branch shows local branches' ' git branch >actual && @@ -60,7 +64,7 @@ test_expect_success 'git branch -r shows remote branches' ' cat >expect <<'EOF' branch-one branch-two -* master +* main remotes/origin/HEAD -> origin/branch-one remotes/origin/branch-one remotes/origin/branch-two @@ -152,24 +156,24 @@ test_expect_success 'git branch shows detached HEAD properly' ' * (HEAD detached at $(git rev-parse --short HEAD^0)) branch-one branch-two - master + main EOF git checkout HEAD^0 && git branch >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'git branch shows detached HEAD properly after checkout --detach' ' - git checkout master && + git checkout main && cat >expect <<EOF && * (HEAD detached at $(git rev-parse --short HEAD^0)) branch-one branch-two - master + main EOF git checkout --detach && git branch >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'git branch shows detached HEAD properly after moving' ' @@ -177,11 +181,11 @@ test_expect_success 'git branch shows detached HEAD properly after moving' ' * (HEAD detached from $(git rev-parse --short HEAD)) branch-one branch-two - master + main EOF git reset --hard HEAD^1 && git branch >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'git branch shows detached HEAD properly from tag' ' @@ -189,12 +193,12 @@ test_expect_success 'git branch shows detached HEAD properly from tag' ' * (HEAD detached at fromtag) branch-one branch-two - master + main EOF - git tag fromtag master && + git tag fromtag main && git checkout fromtag && git branch >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'git branch shows detached HEAD properly after moving from tag' ' @@ -202,28 +206,77 @@ test_expect_success 'git branch shows detached HEAD properly after moving from t * (HEAD detached from fromtag) branch-one branch-two - master + main EOF git reset --hard HEAD^1 && git branch >actual && - test_i18ncmp expect actual + test_cmp expect actual ' -test_expect_success 'git branch `--sort` option' ' +test_expect_success 'git branch `--sort=[-]objectsize` option' ' cat >expect <<-\EOF && * (HEAD detached from fromtag) branch-two branch-one - master + main EOF git branch --sort=objectsize >actual && - test_i18ncmp expect actual + test_cmp expect actual && + + cat >expect <<-\EOF && + * (HEAD detached from fromtag) + branch-one + main + branch-two + EOF + git branch --sort=-objectsize >actual && + test_cmp expect actual +' + +test_expect_success 'git branch `--sort=[-]type` option' ' + cat >expect <<-\EOF && + * (HEAD detached from fromtag) + branch-one + branch-two + main + EOF + git branch --sort=type >actual && + test_cmp expect actual && + + cat >expect <<-\EOF && + * (HEAD detached from fromtag) + branch-one + branch-two + main + EOF + git branch --sort=-type >actual && + test_cmp expect actual +' + +test_expect_success 'git branch `--sort=[-]version:refname` option' ' + cat >expect <<-\EOF && + * (HEAD detached from fromtag) + branch-one + branch-two + main + EOF + git branch --sort=version:refname >actual && + test_cmp expect actual && + + cat >expect <<-\EOF && + * (HEAD detached from fromtag) + main + branch-two + branch-one + EOF + git branch --sort=-version:refname >actual && + test_cmp expect actual ' test_expect_success 'git branch --points-at option' ' cat >expect <<-\EOF && branch-one - master + main EOF git branch --points-at=branch-one >actual && test_cmp expect actual @@ -251,7 +304,7 @@ test_expect_success 'local-branch symrefs shortened properly' ' test_expect_success 'sort branches, ignore case' ' ( - git init sort-icase && + git init -b main sort-icase && cd sort-icase && test_commit initial && git branch branch-one && @@ -260,14 +313,14 @@ test_expect_success 'sort branches, ignore case' ' cat >expected <<-\EOF && BRANCH-two branch-one - master + main EOF test_cmp expected actual && git branch --list -i | awk "{print \$NF}" >actual && cat >expected <<-\EOF && branch-one BRANCH-two - master + main EOF test_cmp expected actual ) @@ -279,12 +332,12 @@ test_expect_success 'git branch --format option' ' Refname is refs/heads/ambiguous Refname is refs/heads/branch-one Refname is refs/heads/branch-two - Refname is refs/heads/master + Refname is refs/heads/main Refname is refs/heads/ref-to-branch Refname is refs/heads/ref-to-remote EOF git branch --format="Refname is %(refname)" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'worktree colors correct' ' @@ -293,7 +346,7 @@ test_expect_success 'worktree colors correct' ' ambiguous<RESET> branch-one<RESET> + <CYAN>branch-two<RESET> - master<RESET> + main<RESET> ref-to-branch<RESET> -> branch-one ref-to-remote<RESET> -> origin/branch-one EOF @@ -302,13 +355,13 @@ test_expect_success 'worktree colors correct' ' rm -r worktree_dir && git worktree prune && test_decode_color <actual.raw >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success "set up color tests" ' - echo "<RED>master<RESET>" >expect.color && - echo "master" >expect.bare && - color_args="--format=%(color:red)%(refname:short) --list master" + echo "<RED>main<RESET>" >expect.color && + echo "main" >expect.bare && + color_args="--format=%(color:red)%(refname:short) --list main" ' test_expect_success '%(color) omitted without tty' ' @@ -331,13 +384,13 @@ test_expect_success '--color overrides auto-color' ' test_expect_success 'verbose output lists worktree path' ' one=$(git rev-parse --short HEAD) && - two=$(git rev-parse --short master) && + two=$(git rev-parse --short main) && cat >expect <<-EOF && * (HEAD detached from fromtag) $one one ambiguous $one one branch-one $two two + branch-two $one ($(pwd)/worktree_dir) one - master $two two + main $two two ref-to-branch $two two ref-to-remote $two two EOF @@ -345,7 +398,7 @@ test_expect_success 'verbose output lists worktree path' ' git branch -vv >actual && rm -r worktree_dir && git worktree prune && - test_i18ncmp expect actual + test_cmp expect actual ' test_done diff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh index 698d9cc4f3..993a6b5eff 100755 --- a/t/t3204-branch-name-interpretation.sh +++ b/t/t3204-branch-name-interpretation.sh @@ -6,6 +6,9 @@ Branch name arguments are usually names which are taken to be inside of refs/heads/, but we interpret some magic syntax like @{-1}, @{upstream}, etc. This script aims to check the behavior of those corner cases. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh expect_branch() { @@ -28,7 +31,7 @@ test_expect_success 'update branch via @{-1}' ' git branch previous one && git checkout previous && - git checkout master && + git checkout main && git branch -f @{-1} two && expect_branch previous two @@ -58,7 +61,7 @@ test_expect_success 'delete branch via @{-1}' ' git branch previous-del && git checkout previous-del && - git checkout master && + git checkout main && git branch -D @{-1} && expect_deleted previous-del @@ -98,7 +101,7 @@ test_expect_success 'disallow deleting remote branch via @{-1}' ' git update-ref refs/remotes/origin/previous one && git checkout -b origin/previous two && - git checkout master && + git checkout main && test_must_fail git branch -r -D @{-1} && expect_branch refs/remotes/origin/previous one && diff --git a/t/t3205-branch-color.sh b/t/t3205-branch-color.sh index 4f1e16bb44..08bd906173 100755 --- a/t/t3205-branch-color.sh +++ b/t/t3205-branch-color.sh @@ -1,11 +1,15 @@ #!/bin/sh test_description='basic branch output coloring' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'set up some sample branches' ' test_commit foo && - git update-ref refs/remotes/origin/master HEAD && + git branch -M main && + git update-ref refs/remotes/origin/main HEAD && git update-ref refs/heads/other HEAD ' @@ -19,9 +23,9 @@ test_expect_success 'set up some color config' ' test_expect_success 'regular output shows colors' ' cat >expect <<-\EOF && - * <CYAN>master<RESET> + * <CYAN>main<RESET> <BLUE>other<RESET> - <YELLOW>remotes/origin/master<RESET> + <YELLOW>remotes/origin/main<RESET> EOF git branch --color -a >actual.raw && test_decode_color <actual.raw >actual && @@ -31,9 +35,9 @@ test_expect_success 'regular output shows colors' ' test_expect_success 'verbose output shows colors' ' oid=$(git rev-parse --short HEAD) && cat >expect <<-EOF && - * <CYAN>master <RESET> $oid foo - <BLUE>other <RESET> $oid foo - <YELLOW>remotes/origin/master<RESET> $oid foo + * <CYAN>main <RESET> $oid foo + <BLUE>other <RESET> $oid foo + <YELLOW>remotes/origin/main<RESET> $oid foo EOF git branch --color -v -a >actual.raw && test_decode_color <actual.raw >actual && diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index e024cff65c..e30bc48a29 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -2,6 +2,9 @@ test_description='range-diff tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Note that because of the range-diff's heuristics, test_commit does more @@ -127,7 +130,7 @@ test_expect_success 'setup' ' ' test_expect_success 'simple A..B A..C (unmodified)' ' - git range-diff --no-color master..topic master..unmodified \ + git range-diff --no-color main..topic main..unmodified \ >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid u1) s/5/A/ @@ -145,13 +148,26 @@ test_expect_success 'simple B...C (unmodified)' ' ' test_expect_success 'simple A B C (unmodified)' ' - git range-diff --no-color master topic unmodified >actual && + git range-diff --no-color main topic unmodified >actual && # same "expect" as above test_cmp expect actual ' +test_expect_success 'A^! and A^-<n> (unmodified)' ' + git range-diff --no-color topic^! unmodified^-1 >actual && + cat >expect <<-EOF && + 1: $(test_oid t4) = 1: $(test_oid u4) s/12/B/ + EOF + test_cmp expect actual +' + +test_expect_success 'A^{/..} is not mistaken for a range' ' + test_must_fail git range-diff topic^.. topic^{/..} 2>error && + test_i18ngrep "not a commit range" error +' + test_expect_success 'trivial reordering' ' - git range-diff --no-color master topic reordered >actual && + git range-diff --no-color main topic reordered >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid r1) s/5/A/ 3: $(test_oid t3) = 2: $(test_oid r2) s/11/B/ @@ -162,7 +178,7 @@ test_expect_success 'trivial reordering' ' ' test_expect_success 'removed a commit' ' - git range-diff --no-color master topic removed >actual && + git range-diff --no-color main topic removed >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid d1) s/5/A/ 2: $(test_oid t2) < -: $(test_oid __) s/4/A/ @@ -173,7 +189,7 @@ test_expect_success 'removed a commit' ' ' test_expect_success 'added a commit' ' - git range-diff --no-color master topic added >actual && + git range-diff --no-color main topic added >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid a1) s/5/A/ 2: $(test_oid t2) = 2: $(test_oid a2) s/4/A/ @@ -185,7 +201,7 @@ test_expect_success 'added a commit' ' ' test_expect_success 'new base, A B C' ' - git range-diff --no-color master topic rebased >actual && + git range-diff --no-color main topic rebased >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid b1) s/5/A/ 2: $(test_oid t2) = 2: $(test_oid b2) s/4/A/ @@ -196,7 +212,7 @@ test_expect_success 'new base, A B C' ' ' test_expect_success 'new base, B...C' ' - # this syntax includes the commits from master! + # this syntax includes the commits from main! git range-diff --no-color topic...rebased >actual && cat >expect <<-EOF && -: $(test_oid __) > 1: $(test_oid b5) unrelated @@ -252,17 +268,13 @@ test_expect_success 'changed commit with --stat diff option' ' git range-diff --no-color --stat topic...changed >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid c1) s/5/A/ - a => b | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) 2: $(test_oid t2) = 2: $(test_oid c2) s/4/A/ - a => b | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) 3: $(test_oid t3) ! 3: $(test_oid c3) s/11/B/ - a => b | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) + a => b | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) 4: $(test_oid t4) ! 4: $(test_oid c4) s/12/B/ - a => b | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) + a => b | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) EOF test_cmp expect actual ' @@ -424,7 +436,7 @@ test_expect_success 'file added and later removed' ' test_expect_success 'no commits on one side' ' git commit --amend -m "new message" && - git range-diff master HEAD@{1} HEAD + git range-diff main HEAD@{1} HEAD ' test_expect_success 'changed message' ' @@ -486,11 +498,11 @@ test_expect_success 'dual-coloring' ' test_cmp expect actual ' -for prev in topic master..topic +for prev in topic main..topic do test_expect_success "format-patch --range-diff=$prev" ' git format-patch --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -509,25 +521,49 @@ test_expect_success 'format-patch --range-diff as commentary' ' grep "> 1: .* new message" 0001-* ' +test_expect_success 'format-patch --range-diff reroll-count with a non-integer' ' + git format-patch --range-diff=HEAD~1 -v2.9 HEAD~1 >actual && + test_when_finished "rm v2.9-0001-*" && + test_line_count = 1 actual && + test_i18ngrep "^Range-diff:$" v2.9-0001-* && + grep "> 1: .* new message" v2.9-0001-* +' + +test_expect_success 'format-patch --range-diff reroll-count with a integer' ' + git format-patch --range-diff=HEAD~1 -v2 HEAD~1 >actual && + test_when_finished "rm v2-0001-*" && + test_line_count = 1 actual && + test_i18ngrep "^Range-diff ..* v1:$" v2-0001-* && + grep "> 1: .* new message" v2-0001-* +' + +test_expect_success 'format-patch --range-diff with v0' ' + git format-patch --range-diff=HEAD~1 -v0 HEAD~1 >actual && + test_when_finished "rm v0-0001-*" && + test_line_count = 1 actual && + test_i18ngrep "^Range-diff:$" v0-0001-* && + grep "> 1: .* new message" v0-0001-* +' + test_expect_success 'range-diff overrides diff.noprefix internally' ' git -c diff.noprefix=true range-diff HEAD^... ' test_expect_success 'basic with modified format.pretty with suffix' ' git -c format.pretty="format:commit %H%d%n" range-diff \ - master..topic master..unmodified + main..topic main..unmodified ' test_expect_success 'basic with modified format.pretty without "commit "' ' git -c format.pretty="format:%H%n" range-diff \ - master..topic master..unmodified + main..topic main..unmodified ' test_expect_success 'range-diff compares notes by default' ' git notes add -m "topic note" topic && git notes add -m "unmodified note" unmodified && test_when_finished git notes remove topic unmodified && - git range-diff --no-color master..topic master..unmodified \ + git range-diff --no-color main..topic main..unmodified \ >actual && sed s/Z/\ /g >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid u1) s/5/A/ @@ -551,7 +587,7 @@ test_expect_success 'range-diff with --no-notes' ' git notes add -m "topic note" topic && git notes add -m "unmodified note" unmodified && test_when_finished git notes remove topic unmodified && - git range-diff --no-color --no-notes master..topic master..unmodified \ + git range-diff --no-color --no-notes main..topic main..unmodified \ >actual && cat >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid u1) s/5/A/ @@ -569,7 +605,7 @@ test_expect_success 'range-diff with multiple --notes' ' git notes --ref=note2 add -m "topic note2" topic && git notes --ref=note2 add -m "unmodified note2" unmodified && test_when_finished git notes --ref=note2 remove topic unmodified && - git range-diff --no-color --notes=note1 --notes=note2 master..topic master..unmodified \ + git range-diff --no-color --notes=note1 --notes=note2 main..topic main..unmodified \ >actual && sed s/Z/\ /g >expect <<-EOF && 1: $(test_oid t1) = 1: $(test_oid u1) s/5/A/ @@ -599,7 +635,7 @@ test_expect_success 'format-patch --range-diff does not compare notes by default git notes add -m "unmodified note" unmodified && test_when_finished git notes remove topic unmodified && git format-patch --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -616,7 +652,7 @@ test_expect_success 'format-patch --range-diff with --no-notes' ' git notes add -m "unmodified note" unmodified && test_when_finished git notes remove topic unmodified && git format-patch --no-notes --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -633,7 +669,7 @@ test_expect_success 'format-patch --range-diff with --notes' ' git notes add -m "unmodified note" unmodified && test_when_finished git notes remove topic unmodified && git format-patch --notes --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -662,7 +698,7 @@ test_expect_success 'format-patch --range-diff with format.notes config' ' test_when_finished git notes remove topic unmodified && test_config format.notes true && git format-patch --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -693,7 +729,7 @@ test_expect_success 'format-patch --range-diff with multiple notes' ' git notes --ref=note2 add -m "unmodified note2" unmodified && test_when_finished git notes --ref=note2 remove topic unmodified && git format-patch --notes=note1 --notes=note2 --cover-letter --range-diff=$prev \ - master..unmodified >actual && + main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && test_i18ngrep "^Range-diff:$" 0000-* && @@ -721,4 +757,19 @@ test_expect_success 'format-patch --range-diff with multiple notes' ' test_cmp expect actual ' +test_expect_success '--left-only/--right-only' ' + git switch --orphan left-right && + test_commit first && + test_commit unmatched && + test_commit common && + git switch -C left-right first && + git cherry-pick common && + + git range-diff -s --left-only ...common >actual && + head_oid=$(git rev-parse --short HEAD) && + common_oid=$(git rev-parse --short common) && + echo "1: $head_oid = 2: $common_oid common" >expect && + test_cmp expect actual +' + test_done diff --git a/t/t3206/history.export b/t/t3206/history.export index 4c808e5b3b..4485adc37b 100644 --- a/t/t3206/history.export +++ b/t/t3206/history.export @@ -168,7 +168,7 @@ mark :11 data 10 unrelated -commit refs/heads/master +commit refs/heads/main mark :12 author Thomas Rast <trast@inf.ethz.ch> 1374485127 +0200 committer Thomas Rast <trast@inf.ethz.ch> 1374485127 +0200 diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index f41b2afb99..577f32dc71 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -9,6 +9,9 @@ test_description='git pack-refs should not change the branch semantic This test runs git pack-refs and git show-ref and checks that the branch semantic is still the same. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'enable reflogs' ' @@ -135,7 +138,7 @@ test_expect_success 'delete ref with dangling packed version' ' git commit --allow-empty -m "future garbage" && git pack-refs --all && git reset --hard HEAD^ && - git checkout master && + git checkout main && git reflog expire --expire=all --all && git prune --expire=all && git branch -d lamb 2>result && @@ -240,7 +243,7 @@ test_expect_success 'retry acquiring packed-refs.lock' ' test_expect_success SYMLINKS 'pack symlinked packed-refs' ' # First make sure that symlinking works when reading: - git update-ref refs/heads/lossy refs/heads/master && + git update-ref refs/heads/lossy refs/heads/main && git for-each-ref >all-refs-before && mv .git/packed-refs .git/my-deviant-packed-refs && ln -s my-deviant-packed-refs .git/packed-refs && @@ -250,7 +253,7 @@ test_expect_success SYMLINKS 'pack symlinked packed-refs' ' git for-each-ref >all-refs-packed && test_cmp all-refs-before all-refs-packed && test -h .git/packed-refs && - test "$(readlink .git/packed-refs)" = "my-deviant-packed-refs" + test "$(test_readlink .git/packed-refs)" = "my-deviant-packed-refs" ' test_done diff --git a/t/t3211-peel-ref.sh b/t/t3211-peel-ref.sh index 3b7caca421..37b9d26f4b 100755 --- a/t/t3211-peel-ref.sh +++ b/t/t3211-peel-ref.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='tests for the peel_ref optimization of packed-refs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'create annotated tag in refs/tags' ' @@ -19,7 +22,7 @@ print_ref() { test_expect_success 'set up expected show-ref output' ' { - print_ref "refs/heads/master" && + print_ref "refs/heads/main" && print_ref "refs/outside/foo" && print_ref "refs/outside/foo^{}" && print_ref "refs/tags/base" && @@ -47,7 +50,7 @@ test_expect_success 'create old-style pack-refs without fully-peeled' ' # know we are emulating exactly what an older git would have written. { echo "# pack-refs with: peeled " && - print_ref "refs/heads/master" && + print_ref "refs/heads/main" && print_ref "refs/outside/foo" && print_ref "refs/tags/base" && print_ref "refs/tags/foo" && diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh index 04de03cad0..f5bf16abcd 100755 --- a/t/t3300-funny-names.sh +++ b/t/t3300-funny-names.sh @@ -181,7 +181,7 @@ test_expect_success 'diffstat for rename quotes funny filename' ' git diff-index -M -p $t0 >diff && git apply --stat <diff >diffstat && sed -e "s/|.*//" -e "s/ *\$//" <diffstat >current && - test_i18ncmp expected current + test_cmp expected current ' test_expect_success 'numstat for rename quotes funny filename' ' diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index 8f43303007..d742be8840 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -672,6 +672,11 @@ test_expect_success 'notes.displayRef respects order' ' test_cmp expect-both-reversed actual ' +test_expect_success 'notes.displayRef with no value handled gracefully' ' + test_must_fail git -c notes.displayRef log -0 --notes && + test_must_fail git -c notes.displayRef diff-tree --notes HEAD +' + test_expect_success 'GIT_NOTES_DISPLAY_REF works' ' GIT_NOTES_DISPLAY_REF=refs/notes/commits:refs/notes/other \ git log -2 >actual && @@ -1288,18 +1293,18 @@ test_expect_success 'GIT_NOTES_REWRITE_REF overrides config' ' grep "replacement note 3" actual ' -test_expect_success 'git notes copy diagnoses too many or too few parameters' ' +test_expect_success 'git notes copy diagnoses too many or too few arguments' ' test_must_fail git notes copy 2>error && - test_i18ngrep "too few parameters" error && + test_i18ngrep "too few arguments" error && test_must_fail git notes copy one two three 2>error && - test_i18ngrep "too many parameters" error + test_i18ngrep "too many arguments" error ' -test_expect_success 'git notes get-ref expands refs/heads/master to refs/notes/refs/heads/master' ' +test_expect_success 'git notes get-ref expands refs/heads/main to refs/notes/refs/heads/main' ' test_unconfig core.notesRef && sane_unset GIT_NOTES_REF && - echo refs/notes/refs/heads/master >expect && - git notes --ref=refs/heads/master get-ref >actual && + echo refs/notes/refs/heads/main >expect && + git notes --ref=refs/heads/main get-ref >actual && test_cmp expect actual ' diff --git a/t/t3302-notes-index-expensive.sh b/t/t3302-notes-index-expensive.sh index 7217c5e222..ef8b63952e 100755 --- a/t/t3302-notes-index-expensive.sh +++ b/t/t3302-notes-index-expensive.sh @@ -5,6 +5,9 @@ test_description='Test commit notes index (expensive!)' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh create_repo () { @@ -20,7 +23,7 @@ create_repo () { notemark=$(($mark+1)) test_tick && cat <<-INPUT_END && - commit refs/heads/master + commit refs/heads/main mark :$mark committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT diff --git a/t/t3303-notes-subtrees.sh b/t/t3303-notes-subtrees.sh index 704aee81ef..d47ce00f69 100755 --- a/t/t3303-notes-subtrees.sh +++ b/t/t3303-notes-subtrees.sh @@ -2,6 +2,9 @@ test_description='Test commit notes organized in subtrees' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh number_of_commits=100 @@ -40,7 +43,7 @@ test_expect_success "setup: create $number_of_commits commits" ' nr=$(($nr+1)) && test_tick && cat <<INPUT_END -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT commit #$nr @@ -75,7 +78,7 @@ test_sha1_based () { ( start_note_commit && nr=$number_of_commits && - git rev-list refs/heads/master | + git rev-list refs/heads/main | while read sha1; do note_path=$(echo "$sha1" | sed "$1") cat <<INPUT_END && @@ -105,7 +108,7 @@ test_same_notes () { ( start_note_commit && nr=$number_of_commits && - git rev-list refs/heads/master | + git rev-list refs/heads/main | while read sha1; do first_note_path=$(echo "$sha1" | sed "$1") second_note_path=$(echo "$sha1" | sed "$2") @@ -144,7 +147,7 @@ test_concatenated_notes () { ( start_note_commit && nr=$number_of_commits && - git rev-list refs/heads/master | + git rev-list refs/heads/main | while read sha1; do first_note_path=$(echo "$sha1" | sed "$1") second_note_path=$(echo "$sha1" | sed "$2") diff --git a/t/t3304-notes-mixed.sh b/t/t3304-notes-mixed.sh index 1709e8c00b..03dfcd3954 100755 --- a/t/t3304-notes-mixed.sh +++ b/t/t3304-notes-mixed.sh @@ -2,6 +2,9 @@ test_description='Test notes trees that also contain non-notes' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh number_of_commits=100 @@ -36,7 +39,7 @@ test_expect_success "setup: create a couple of commits" ' test_tick && cat <<INPUT_END >input && -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT commit #1 @@ -51,7 +54,7 @@ INPUT_END test_tick && cat <<INPUT_END >>input && -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT commit #2 @@ -68,8 +71,8 @@ INPUT_END test_expect_success "create a notes tree with both notes and non-notes" ' - commit1=$(git rev-parse refs/heads/master^) && - commit2=$(git rev-parse refs/heads/master) && + commit1=$(git rev-parse refs/heads/main^) && + commit2=$(git rev-parse refs/heads/main) && test_tick && cat <<INPUT_END >input && commit refs/notes/commits diff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh index d69c84c640..202702be1a 100755 --- a/t/t3308-notes-merge.sh +++ b/t/t3308-notes-merge.sh @@ -108,7 +108,7 @@ test_expect_success 'fail to merge into various non-notes refs' ' git update-ref refs/notes/dir/foo HEAD && test_must_fail git -c "core.notesRef=refs/notes/dir" notes merge x && test_must_fail git -c "core.notesRef=refs/notes/dir/" notes merge x && - test_must_fail git -c "core.notesRef=refs/heads/master" notes merge x && + test_must_fail git -c "core.notesRef=refs/heads/main" notes merge x && test_must_fail git -c "core.notesRef=refs/notes/y:" notes merge x && test_must_fail git -c "core.notesRef=refs/notes/y:foo" notes merge x && test_must_fail git -c "core.notesRef=refs/notes/foo^{bar" notes merge x diff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh index 823fdbda1f..052516e6c6 100755 --- a/t/t3320-notes-merge-worktrees.sh +++ b/t/t3320-notes-merge-worktrees.sh @@ -5,6 +5,9 @@ test_description='Test merging of notes trees in multiple worktrees' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup commit' ' @@ -36,8 +39,8 @@ test_expect_success 'modify notes ref ourselves (x)' ' ' test_expect_success 'create some new worktrees' ' - git worktree add -b newbranch worktree master && - git worktree add -b newbranch2 worktree2 master + git worktree add -b newbranch worktree main && + git worktree add -b newbranch2 worktree2 main ' test_expect_success 'merge z into y fails and sets NOTES_MERGE_REF' ' diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index 40d2975995..0bb88aa982 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -8,6 +8,9 @@ test_description='git rebase assorted tests This test runs git rebase and checks that the author information is not lost among other things. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh GIT_AUTHOR_NAME=author@name @@ -24,15 +27,15 @@ test_expect_success 'prepare repository with topic branches' ' git update-index --add Y && git commit -m "Add Y." && git checkout -b filemove && - git reset --soft master && + git reset --soft main && mkdir D && git mv A D/A && git commit -m "Move A." && - git checkout -b my-topic-branch master && + git checkout -b my-topic-branch main && echo Second >B && git update-index --add B && git commit -m "Add B." && - git checkout -f master && + git checkout -f main && echo Third >>A && git update-index A && git commit -m "Modify A." && @@ -46,23 +49,23 @@ test_expect_success 'prepare repository with topic branches' ' test_expect_success 'rebase on dirty worktree' ' echo dirty >>A && - test_must_fail git rebase master + test_must_fail git rebase main ' test_expect_success 'rebase on dirty cache' ' git add A && - test_must_fail git rebase master + test_must_fail git rebase main ' -test_expect_success 'rebase against master' ' +test_expect_success 'rebase against main' ' git reset --hard HEAD && - git rebase master + git rebase main ' test_expect_success 'rebase sets ORIG_HEAD to pre-rebase state' ' git checkout -b orig-head topic && pre="$(git rev-parse --verify HEAD)" && - git rebase master && + git rebase main && test_cmp_rev "$pre" ORIG_HEAD && test_cmp_rev ! "$pre" HEAD ' @@ -93,28 +96,28 @@ test_expect_success 'HEAD was detached during rebase' ' test_expect_success 'rebase from ambiguous branch name' ' git checkout -b topic side && - git rebase master + git rebase main ' test_expect_success 'rebase off of the previous branch using "-"' ' - git checkout master && + git checkout main && git checkout HEAD^ && git rebase @{-1} >expect.messages && - git merge-base master HEAD >expect.forkpoint && + git merge-base main HEAD >expect.forkpoint && - git checkout master && + git checkout main && git checkout HEAD^ && git rebase - >actual.messages && - git merge-base master HEAD >actual.forkpoint && + git merge-base main HEAD >actual.forkpoint && test_cmp expect.forkpoint actual.forkpoint && # the next one is dubious---we may want to say "-", # instead of @{-1}, in the message - test_i18ncmp expect.messages actual.messages + test_cmp expect.messages actual.messages ' test_expect_success 'rebase a single mode change' ' - git checkout master && + git checkout main && git branch -D topic && echo 1 >X && git add X && @@ -126,7 +129,7 @@ test_expect_success 'rebase a single mode change' ' test_chmod +x A && test_tick && git commit -m modechange && - GIT_TRACE=1 git rebase master + GIT_TRACE=1 git rebase main ' test_expect_success 'rebase is not broken by diff.renames' ' @@ -162,11 +165,11 @@ test_expect_success 'fail when upstream arg is missing and not configured' ' test_expect_success 'rebase works with format.useAutoBase' ' test_config format.useAutoBase true && git checkout topic && - git rebase master + git rebase main ' test_expect_success 'default to common base in @{upstream}s reflog if no upstream arg (--merge)' ' - git checkout -b default-base master && + git checkout -b default-base main && git checkout -b default topic && git config branch.default.remote . && git config branch.default.merge refs/heads/default-base && @@ -184,7 +187,7 @@ test_expect_success 'default to common base in @{upstream}s reflog if no upstrea ' test_expect_success 'default to common base in @{upstream}s reflog if no upstream arg (--apply)' ' - git checkout -B default-base master && + git checkout -B default-base main && git checkout -B default topic && git config branch.default.remote . && git config branch.default.merge refs/heads/default-base && @@ -226,13 +229,13 @@ test_expect_success 'cherry-picked commits and fork-point work together' ' test_expect_success 'rebase --apply -q is quiet' ' git checkout -b quiet topic && - git rebase --apply -q master >output.out 2>&1 && + git rebase --apply -q main >output.out 2>&1 && test_must_be_empty output.out ' test_expect_success 'rebase --merge -q is quiet' ' git checkout -B quiet topic && - git rebase --merge -q master >output.out 2>&1 && + git rebase --merge -q main >output.out 2>&1 && test_must_be_empty output.out ' @@ -294,7 +297,7 @@ test_expect_success 'rebase commit with an ancient timestamp' ' ' test_expect_success 'rebase with "From " line in commit message' ' - git checkout -b preserve-from master~1 && + git checkout -b preserve-from main~1 && cat >From_.msg <<EOF && Somebody embedded an mbox in a commit message @@ -310,7 +313,7 @@ EOF >From_ && git add From_ && git commit -F From_.msg && - git rebase master && + git rebase main && git log -1 --pretty=format:%B >out && test_cmp From_.msg out ' @@ -357,12 +360,12 @@ test_expect_success 'rebase --apply and .gitattributes' ' git cherry-pick test && git checkout test && - git rebase master && + git rebase main && grep "smudged" a.txt && git checkout removal && git reset --hard && - git rebase master && + git rebase main && grep "clean" a.txt ) ' @@ -385,37 +388,21 @@ test_expect_success 'rebase--merge.sh and --show-current-patch' ' ) ' -test_expect_success 'rebase -c rebase.useBuiltin=false warning' ' - expected="rebase.useBuiltin support has been removed" && - - # Only warn when the legacy rebase is requested... - test_must_fail git -c rebase.useBuiltin=false rebase 2>err && - test_i18ngrep "$expected" err && - test_must_fail env GIT_TEST_REBASE_USE_BUILTIN=false git rebase 2>err && - test_i18ngrep "$expected" err && - - # ...not when we would have used the built-in anyway - test_must_fail git -c rebase.useBuiltin=true rebase 2>err && - test_must_be_empty err && - test_must_fail env GIT_TEST_REBASE_USE_BUILTIN=true git rebase 2>err && - test_must_be_empty err -' - test_expect_success 'switch to branch checked out here' ' - git checkout master && - git rebase master master + git checkout main && + git rebase main main ' test_expect_success 'switch to branch not checked out' ' - git checkout master && + git checkout main && git branch other && - git rebase master other + git rebase main other ' test_expect_success 'refuse to switch to branch checked out elsewhere' ' - git checkout master && + git checkout main && git worktree add wt && - test_must_fail git -C wt rebase master master 2>err && + test_must_fail git -C wt rebase main main 2>err && test_i18ngrep "already checked out" err ' diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh index 6e032716a6..cfde68f193 100755 --- a/t/t3402-rebase-merge.sh +++ b/t/t3402-rebase-merge.sh @@ -5,6 +5,9 @@ test_description='git rebase --merge test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh T="A quick brown fox @@ -19,10 +22,10 @@ test_expect_success setup ' git commit -m"initial" && git branch side && echo "11 $T" >>original && - git commit -a -m"master updates a bit." && + git commit -a -m"main updates a bit." && echo "12 $T" >>original && - git commit -a -m"master updates a bit more." && + git commit -a -m"main updates a bit more." && git checkout side && (echo "0 $T" && cat original) >renamed && @@ -47,13 +50,13 @@ test_expect_success setup ' ' test_expect_success 'reference merge' ' - git merge -s recursive -m "reference merge" master + git merge -s recursive -m "reference merge" main ' PRE_REBASE=$(git rev-parse test-rebase) test_expect_success rebase ' git checkout test-rebase && - GIT_TRACE=1 git rebase --merge master + GIT_TRACE=1 git rebase --merge main ' test_expect_success 'test-rebase@{1} is pre rebase' ' @@ -72,24 +75,24 @@ test_expect_success 'merge and rebase should match' ' ' test_expect_success 'rebase the other way' ' - git reset --hard master && + git reset --hard main && git rebase --merge side ' test_expect_success 'rebase -Xtheirs' ' - git checkout -b conflicting master~2 && + git checkout -b conflicting main~2 && echo "AB $T" >> original && git commit -mconflicting original && - git rebase -Xtheirs master && + git rebase -Xtheirs main && grep AB original && ! grep 11 original ' test_expect_success 'rebase -Xtheirs from orphan' ' - git checkout --orphan orphan-conflicting master~2 && + git checkout --orphan orphan-conflicting main~2 && echo "AB $T" >> original && git commit -morphan-conflicting original && - git rebase -Xtheirs master && + git rebase -Xtheirs main && grep AB original && ! grep 11 original ' @@ -107,9 +110,9 @@ test_expect_success 'merge and rebase should match' ' test_expect_success 'picking rebase' ' git reset --hard side && - git rebase --merge --onto master side^^ && - mb=$(git merge-base master HEAD) && - if test "$mb" = "$(git rev-parse master)" + git rebase --merge --onto main side^^ && + mb=$(git merge-base main HEAD) && + if test "$mb" = "$(git rev-parse main)" then echo happy else @@ -140,11 +143,11 @@ test_expect_success 'rebase -s funny -Xopt' ' EOF chmod +x test-bin/git-merge-funny && git reset --hard && - git checkout -b test-funny master^ && + git checkout -b test-funny main^ && test_commit funny && ( PATH=./test-bin:$PATH && - git rebase -s funny -Xopt master + git rebase -s funny -Xopt main ) && test -f funny.was.run ' @@ -165,7 +168,7 @@ test_expect_success 'rebase --skip works with two conflicts in a row' ' test_expect_success '--reapply-cherry-picks' ' git init repo && - # O(1-10) -- O(1-11) -- O(0-10) master + # O(1-10) -- O(1-11) -- O(0-10) main # \ # -- O(1-11) -- O(1-12) otherbranch @@ -187,18 +190,18 @@ test_expect_success '--reapply-cherry-picks' ' git -C repo commit -a -m "add 12 in another branch" && # Regular rebase fails, because the 1-11 commit is deduplicated - test_must_fail git -C repo rebase --merge master 2> err && + test_must_fail git -C repo rebase --merge main 2> err && test_i18ngrep "error: could not apply.*add 12 in another branch" err && git -C repo rebase --abort && # With --reapply-cherry-picks, it works - git -C repo rebase --merge --reapply-cherry-picks master + git -C repo rebase --merge --reapply-cherry-picks main ' test_expect_success '--reapply-cherry-picks refrains from reading unneeded blobs' ' git init server && - # O(1-10) -- O(1-11) -- O(1-12) master + # O(1-10) -- O(1-11) -- O(1-12) main # \ # -- O(0-10) otherbranch @@ -220,18 +223,18 @@ test_expect_success '--reapply-cherry-picks refrains from reading unneeded blobs test_config -C server uploadpack.allowanysha1inwant 1 && git clone --filter=blob:none "file://$(pwd)/server" client && - git -C client checkout origin/master && + git -C client checkout origin/main && git -C client checkout origin/otherbranch && # Sanity check to ensure that the blobs from the merge base and "add # 11" are missing git -C client rev-list --objects --all --missing=print >missing_list && - MERGE_BASE_BLOB=$(git -C server rev-parse master^^:file.txt) && - ADD_11_BLOB=$(git -C server rev-parse master^:file.txt) && + MERGE_BASE_BLOB=$(git -C server rev-parse main^^:file.txt) && + ADD_11_BLOB=$(git -C server rev-parse main^:file.txt) && grep "[?]$MERGE_BASE_BLOB" missing_list && grep "[?]$ADD_11_BLOB" missing_list && - git -C client rebase --merge --reapply-cherry-picks origin/master && + git -C client rebase --merge --reapply-cherry-picks origin/main && # The blob from the merge base had to be fetched, but not "add 11" git -C client rev-list --objects --all --missing=print >missing_list && diff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh index a927774910..e26762d0b2 100755 --- a/t/t3403-rebase-skip.sh +++ b/t/t3403-rebase-skip.sh @@ -5,6 +5,9 @@ test_description='git rebase --merge --skip tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -48,7 +51,7 @@ test_expect_success setup ' ' test_expect_success 'rebase with git am -3 (default)' ' - test_must_fail git rebase master + test_must_fail git rebase main ' test_expect_success 'rebase --skip can not be used with other options' ' @@ -64,7 +67,7 @@ test_expect_success 'rebase moves back to skip-reference' ' test refs/heads/skip-reference = $(git symbolic-ref HEAD) && git branch post-rebase && git reset --hard pre-rebase && - test_must_fail git rebase master && + test_must_fail git rebase main && echo "hello" > hello && git add hello && git rebase --continue && @@ -75,7 +78,7 @@ test_expect_success 'rebase moves back to skip-reference' ' test_expect_success 'checkout skip-merge' 'git checkout -f skip-merge' test_expect_success 'rebase with --merge' ' - test_must_fail git rebase --merge master + test_must_fail git rebase --merge main ' test_expect_success 'rebase --skip with --merge' ' diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 07a1617351..66bcbbf952 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -12,7 +12,7 @@ Initial setup: one - two - three - four (conflict-branch) / - A - B - C - D - E (master) + A - B - C - D - E (primary) | \ | F - G - H (branch1) | \ @@ -25,11 +25,15 @@ Initial setup: where A, B, D and G all touch file1, and one, two, three, four all touch file "conflict". ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh test_expect_success 'setup' ' + git switch -C primary && test_commit A file1 && test_commit B file1 && test_commit C file2 && @@ -65,7 +69,7 @@ SHELL= export SHELL test_expect_success 'rebase --keep-empty' ' - git checkout -b emptybranch master && + git checkout -b emptybranch primary && git commit --allow-empty -m "empty" && git rebase --keep-empty -i HEAD~2 && git log --oneline >actual && @@ -82,11 +86,11 @@ test_expect_success 'rebase -i with empty todo list' ' git rebase -i HEAD^ >output 2>&1 ) && tail -n 1 output >actual && # Ignore output about changing todo list - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rebase -i with the exec command' ' - git checkout master && + git checkout primary && ( set_fake_editor && FAKE_LINES="1 exec_>touch-one @@ -97,18 +101,19 @@ test_expect_success 'rebase -i with the exec command' ' ) && test_path_is_file touch-one && test_path_is_file touch-two && - test_path_is_missing touch-three " (should have stopped before)" && + # Missing because we should have stopped by now. + test_path_is_missing touch-three && test_cmp_rev C HEAD && git rebase --continue && test_path_is_file touch-three && test_path_is_file "touch-file name with spaces" && test_path_is_file touch-after-semicolon && - test_cmp_rev master HEAD && + test_cmp_rev primary HEAD && rm -f touch-* ' test_expect_success 'rebase -i with the exec command runs from tree root' ' - git checkout master && + git checkout primary && mkdir subdir && (cd subdir && set_fake_editor && FAKE_LINES="1 exec_>touch-subdir" \ @@ -121,7 +126,7 @@ test_expect_success 'rebase -i with the exec command runs from tree root' ' test_expect_success 'rebase -i with exec allows git commands in subdirs' ' test_when_finished "rm -rf subdir" && test_when_finished "git rebase --abort ||:" && - git checkout master && + git checkout primary && mkdir subdir && (cd subdir && set_fake_editor && FAKE_LINES="1 x_cd_subdir_&&_git_rev-parse_--is-inside-work-tree" \ @@ -139,13 +144,13 @@ test_expect_success 'rebase -i sets work tree properly' ' ' test_expect_success 'rebase -i with the exec command checks tree cleanness' ' - git checkout master && + git checkout primary && ( set_fake_editor && test_must_fail env FAKE_LINES="exec_echo_foo_>file1 1" \ git rebase -i HEAD^ ) && - test_cmp_rev master^ HEAD && + test_cmp_rev primary^ HEAD && git reset --hard && git rebase --continue ' @@ -154,9 +159,9 @@ test_expect_success 'rebase -x with empty command fails' ' test_when_finished "git rebase --abort ||:" && test_must_fail env git rebase -x "" @ 2>actual && test_write_lines "error: empty exec command" >expected && - test_i18ncmp expected actual && + test_cmp expected actual && test_must_fail env git rebase -x " " @ 2>actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'rebase -x with newline in command fails' ' @@ -164,11 +169,11 @@ test_expect_success 'rebase -x with newline in command fails' ' test_must_fail env git rebase -x "a${LF}b" @ 2>actual && test_write_lines "error: exec commands cannot contain newlines" \ >expected && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'rebase -i with exec of inexistent command' ' - git checkout master && + git checkout primary && test_when_finished "git rebase --abort" && ( set_fake_editor && @@ -259,8 +264,8 @@ test_expect_success 'stop on conflicting pick' ' >>>>>>> $commit (G) EOF git tag new-branch1 && - test_must_fail git rebase -i master && - test "$(git rev-parse HEAD~3)" = "$(git rev-parse master)" && + test_must_fail git rebase -i primary && + test "$(git rev-parse HEAD~3)" = "$(git rev-parse primary)" && test_cmp expect .git/rebase-merge/patch && test_cmp expect2 file1 && test "$(git diff --name-status | @@ -287,7 +292,7 @@ test_expect_success 'abort' ' test_expect_success 'abort with error when new base cannot be checked out' ' git rm --cached file1 && git commit -m "remove file in base" && - test_must_fail git rebase -i master > output 2>&1 && + test_must_fail git rebase -i primary > output 2>&1 && test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" \ output && test_i18ngrep "file1" output && @@ -301,7 +306,7 @@ test_expect_success 'retain authorship' ' test_tick && GIT_AUTHOR_NAME="Twerp Snog" git commit -m "different author" && git tag twerp && - git rebase -i --onto master HEAD^ && + git rebase -i --onto primary HEAD^ && git show HEAD | grep "^Author: Twerp Snog" ' @@ -336,10 +341,10 @@ test_expect_success 'squash' ' ( set_fake_editor && FAKE_LINES="1 squash 2" EXPECT_HEADER_COUNT=2 \ - git rebase -i --onto master HEAD~2 + git rebase -i --onto primary HEAD~2 ) && test B = $(cat file7) && - test_cmp_rev HEAD^ master + test_cmp_rev HEAD^ primary ' test_expect_success 'retain authorship when squashing' ' @@ -366,12 +371,12 @@ test_expect_failure REBASE_P 'exchange two commits with -p' ' ' test_expect_success REBASE_P 'preserve merges with -p' ' - git checkout -b to-be-preserved master^ && + git checkout -b to-be-preserved primary^ && : > unrelated-file && git add unrelated-file && test_tick && git commit -m "unrelated" && - git checkout -b another-branch master && + git checkout -b another-branch primary && echo B > file1 && test_tick && git commit -m J file1 && @@ -394,7 +399,7 @@ test_expect_success REBASE_P 'preserve merges with -p' ' git commit -m M file1 && git checkout -b to-be-rebased && test_tick && - git rebase -i -p --onto branch1 master && + git rebase -i -p --onto branch1 primary && git update-index --refresh && git diff-files --quiet && git diff-index --quiet --cached HEAD -- && @@ -437,7 +442,7 @@ test_expect_success '--continue tries to commit' ' ' test_expect_success 'verbose flag is heeded, even after --continue' ' - git reset --hard master@{1} && + git reset --hard primary@{1} && test_tick && test_must_fail git rebase -v -i --onto new-branch1 HEAD^ && echo resolved > file1 && @@ -446,7 +451,7 @@ test_expect_success 'verbose flag is heeded, even after --continue' ' grep "^ file1 | 2 +-$" output ' -test_expect_success C_LOCALE_OUTPUT 'multi-squash only fires up editor once' ' +test_expect_success 'multi-squash only fires up editor once' ' base=$(git rev-parse HEAD~4) && ( set_fake_editor && @@ -459,7 +464,7 @@ test_expect_success C_LOCALE_OUTPUT 'multi-squash only fires up editor once' ' test 1 = $(git show | grep ONCE | wc -l) ' -test_expect_success C_LOCALE_OUTPUT 'multi-fixup does not fire up editor' ' +test_expect_success 'multi-fixup does not fire up editor' ' git checkout -b multi-fixup E && base=$(git rev-parse HEAD~4) && ( @@ -510,7 +515,7 @@ test_expect_success 'commit message retained after conflict' ' git branch -D conflict-squash ' -test_expect_success C_LOCALE_OUTPUT 'squash and fixup generate correct log messages' ' +test_expect_success 'squash and fixup generate correct log messages' ' cat >expect-squash-fixup <<-\EOF && B @@ -537,7 +542,7 @@ test_expect_success C_LOCALE_OUTPUT 'squash and fixup generate correct log messa git branch -D squash-fixup ' -test_expect_success C_LOCALE_OUTPUT 'squash ignores comments' ' +test_expect_success 'squash ignores comments' ' git checkout -b skip-comments E && base=$(git rev-parse HEAD~4) && ( @@ -553,7 +558,7 @@ test_expect_success C_LOCALE_OUTPUT 'squash ignores comments' ' git branch -D skip-comments ' -test_expect_success C_LOCALE_OUTPUT 'squash ignores blank lines' ' +test_expect_success 'squash ignores blank lines' ' git checkout -b skip-blank-lines E && base=$(git rev-parse HEAD~4) && ( @@ -802,7 +807,7 @@ test_expect_success 'rebase -i continue with unstaged submodule' ' ' test_expect_success 'avoid unnecessary reset' ' - git checkout master && + git checkout primary && git reset --hard && test-tool chmtime =123456789 file3 && git update-index --refresh && @@ -814,14 +819,14 @@ test_expect_success 'avoid unnecessary reset' ' ' test_expect_success 'reword' ' - git checkout -b reword-branch master && + git checkout -b reword-branch primary && ( set_fake_editor && FAKE_LINES="1 2 3 reword 4" FAKE_COMMIT_MESSAGE="E changed" \ git rebase -i A && git show HEAD | grep "E changed" && - test $(git rev-parse master) != $(git rev-parse HEAD) && - test_cmp_rev master^ HEAD^ && + test $(git rev-parse primary) != $(git rev-parse HEAD) && + test_cmp_rev primary^ HEAD^ && FAKE_LINES="1 2 reword 3 4" FAKE_COMMIT_MESSAGE="D changed" \ git rebase -i A && git show HEAD^ | grep "D changed" && @@ -918,7 +923,7 @@ test_expect_success 'rebase-i history with funny messages' ' ' test_expect_success 'prepare for rebase -i --exec' ' - git checkout master && + git checkout primary && git checkout -b execute && test_commit one_exec main.txt one_exec && test_commit two_exec main.txt two_exec && @@ -991,7 +996,7 @@ test_expect_success 'rebase -ix with several instances of --exec' ' test_cmp expected actual ' -test_expect_success C_LOCALE_OUTPUT 'rebase -ix with --autosquash' ' +test_expect_success 'rebase -ix with --autosquash' ' git reset --hard execute && git checkout -b autosquash && echo second >second.txt && @@ -1027,7 +1032,7 @@ test_expect_success 'rebase -i --exec without <CMD>' ' git reset --hard execute && test_must_fail git rebase -i --exec 2>actual && test_i18ngrep "requires a value" actual && - git checkout master + git checkout primary ' test_expect_success 'rebase -i --root re-order and drop commits' ' @@ -1079,7 +1084,7 @@ test_expect_success 'rebase -i --root fixup root commit' ' test_expect_success 'rebase -i --root reword original root commit' ' test_when_finished "test_might_fail git rebase --abort" && - git checkout -b reword-original-root-branch master && + git checkout -b reword-original-root-branch primary && ( set_fake_editor && FAKE_LINES="reword 1 2" FAKE_COMMIT_MESSAGE="A changed" \ @@ -1091,7 +1096,7 @@ test_expect_success 'rebase -i --root reword original root commit' ' test_expect_success 'rebase -i --root reword new root commit' ' test_when_finished "test_might_fail git rebase --abort" && - git checkout -b reword-now-root-branch master && + git checkout -b reword-now-root-branch primary && ( set_fake_editor && FAKE_LINES="reword 3 1" FAKE_COMMIT_MESSAGE="C changed" \ @@ -1132,7 +1137,7 @@ test_expect_success 'rebase -i --root reword root when root has untracked file c test "$(git rev-list --count HEAD)" = 2 ' -test_expect_success C_LOCALE_OUTPUT 'rebase --edit-todo does not work on non-interactive rebase' ' +test_expect_success 'rebase --edit-todo does not work on non-interactive rebase' ' git checkout reword-original-root-branch && git reset --hard && git checkout conflict-branch && @@ -1251,7 +1256,7 @@ test_expect_success 'rebase -i error on commits with \ in message' ' ' test_expect_success 'short commit ID setup' ' - test_when_finished "git checkout master" && + test_when_finished "git checkout primary" && git checkout --orphan collide && git rm -rf . && ( @@ -1292,7 +1297,7 @@ test_expect_success 'short commit ID collide' ' t3404_collider sha1:ac4f2ee t3404_collider sha256:16697 EOF - test_when_finished "reset_rebase && git checkout master" && + test_when_finished "reset_rebase && git checkout primary" && git checkout collide && colliding_id=$(test_oid t3404_collision) && hexsz=$(test_oid hexsz) && @@ -1416,11 +1421,11 @@ test_expect_success 'rebase --continue removes CHERRY_PICK_HEAD' ' rebase_setup_and_clean () { test_when_finished " - git checkout master && + git checkout primary && test_might_fail git branch -D $1 && test_might_fail git rebase --abort " && - git checkout -b $1 ${2:-master} + git checkout -b $1 ${2:-primary} } test_expect_success 'drop' ' @@ -1451,7 +1456,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = warn' ' cat >expect <<-EOF && Warning: some commits may have been dropped accidentally. Dropped commits (newer to older): - - $(git rev-list --pretty=oneline --abbrev-commit -1 master) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary) To avoid this message, use "drop" to explicitly remove a commit. EOF test_config rebase.missingCommitsCheck warn && @@ -1461,7 +1466,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = warn' ' FAKE_LINES="1 2 3 4" git rebase -i --root 2>actual.2 ) && head -n4 actual.2 >actual && - test_i18ncmp expect actual && + test_cmp expect actual && test D = $(git cat-file commit HEAD | sed -ne \$p) ' @@ -1469,8 +1474,8 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = error' ' cat >expect <<-EOF && Warning: some commits may have been dropped accidentally. Dropped commits (newer to older): - - $(git rev-list --pretty=oneline --abbrev-commit -1 master) - - $(git rev-list --pretty=oneline --abbrev-commit -1 master~2) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary~2) To avoid this message, use "drop" to explicitly remove a commit. Use '\''git config rebase.missingCommitsCheck'\'' to change the level of warnings. @@ -1485,7 +1490,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = error' ' set_fake_editor && test_must_fail env FAKE_LINES="1 2 4" \ git rebase -i --root 2>actual && - test_i18ncmp expect actual && + test_cmp expect actual && cp .git/rebase-merge/git-rebase-todo.backup \ .git/rebase-merge/git-rebase-todo && FAKE_LINES="1 2 drop 3 4 drop 5" git rebase --edit-todo @@ -1512,11 +1517,11 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = ig test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = warn' ' cat >expect <<-EOF && - error: invalid line 1: badcmd $(git rev-list --pretty=oneline --abbrev-commit -1 master~4) + error: invalid line 1: badcmd $(git rev-list --pretty=oneline --abbrev-commit -1 primary~4) Warning: some commits may have been dropped accidentally. Dropped commits (newer to older): - - $(git rev-list --pretty=oneline --abbrev-commit -1 master) - - $(git rev-list --pretty=oneline --abbrev-commit -1 master~4) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary~4) To avoid this message, use "drop" to explicitly remove a commit. EOF head -n4 expect >expect.2 && @@ -1531,11 +1536,11 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = wa cp .git/rebase-merge/git-rebase-todo.backup orig && FAKE_LINES="2 3 4" git rebase --edit-todo 2>actual.2 && head -n6 actual.2 >actual && - test_i18ncmp expect actual && + test_cmp expect actual && cp orig .git/rebase-merge/git-rebase-todo && FAKE_LINES="1 2 3 4" git rebase --edit-todo 2>actual.2 && head -n4 actual.2 >actual && - test_i18ncmp expect.3 actual && + test_cmp expect.3 actual && git rebase --continue 2>actual ) && test D = $(git cat-file commit HEAD | sed -ne \$p) && @@ -1546,11 +1551,11 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = wa test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = error' ' cat >expect <<-EOF && - error: invalid line 1: badcmd $(git rev-list --pretty=oneline --abbrev-commit -1 master~4) + error: invalid line 1: badcmd $(git rev-list --pretty=oneline --abbrev-commit -1 primary~4) Warning: some commits may have been dropped accidentally. Dropped commits (newer to older): - - $(git rev-list --pretty=oneline --abbrev-commit -1 master) - - $(git rev-list --pretty=oneline --abbrev-commit -1 master~4) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary) + - $(git rev-list --pretty=oneline --abbrev-commit -1 primary~4) To avoid this message, use "drop" to explicitly remove a commit. Use '\''git config rebase.missingCommitsCheck'\'' to change the level of warnings. @@ -1571,16 +1576,16 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = er cp .git/rebase-merge/git-rebase-todo.backup orig && test_must_fail env FAKE_LINES="2 3 4" \ git rebase --edit-todo 2>actual && - test_i18ncmp expect actual && + test_cmp expect actual && test_must_fail git rebase --continue 2>actual && - test_i18ncmp expect.2 actual && + test_cmp expect.2 actual && test_must_fail git rebase --edit-todo && cp orig .git/rebase-merge/git-rebase-todo && test_must_fail env FAKE_LINES="1 2 3 4" \ git rebase --edit-todo 2>actual && - test_i18ncmp expect.3 actual && + test_cmp expect.3 actual && test_must_fail git rebase --continue 2>actual && - test_i18ncmp expect.3 actual && + test_cmp expect.3 actual && cp orig .git/rebase-merge/git-rebase-todo && FAKE_LINES="1 2 3 4 drop 5" git rebase --edit-todo && git rebase --continue 2>actual @@ -1635,7 +1640,7 @@ test_expect_success 'respects rebase.abbreviateCommands with fixup, squash and e ( set_cat_todo_editor && test_must_fail git rebase -i --exec "git show HEAD" \ - --autosquash master >actual + --autosquash primary >actual ) && test_cmp expected actual ' @@ -1646,7 +1651,7 @@ test_expect_success 'static check of bad command' ' set_fake_editor && test_must_fail env FAKE_LINES="1 2 3 bad 4 5" \ git rebase -i --root 2>actual && - test_i18ngrep "badcmd $(git rev-list --oneline -1 master~1)" \ + test_i18ngrep "badcmd $(git rev-list --oneline -1 primary~1)" \ actual && test_i18ngrep "You can fix this with .git rebase --edit-todo.." \ actual && @@ -1797,6 +1802,17 @@ test_expect_success 'todo has correct onto hash' ' test_i18ngrep "^# Rebase ..* onto $onto" actual ' +test_expect_success 'ORIG_HEAD is updated correctly' ' + test_when_finished "git checkout primary && git branch -D test-orig-head" && + git checkout -b test-orig-head A && + git commit --allow-empty -m A1 && + git commit --allow-empty -m A2 && + git commit --allow-empty -m A3 && + git commit --allow-empty -m A4 && + git rebase primary && + test_cmp_rev ORIG_HEAD test-orig-head@{1} +' + # This must be the last test in this file test_expect_success '$EDITOR and friends are unchanged' ' test_editor_unchanged diff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh index 860e63e444..2524331861 100755 --- a/t/t3405-rebase-malformed.sh +++ b/t/t3405-rebase-malformed.sh @@ -2,6 +2,9 @@ test_description='rebase should handle arbitrary git message' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -52,7 +55,7 @@ test_expect_success setup ' git add file3 && git commit --allow-empty-message -m "" && - git checkout master && + git checkout main && echo One >file1 && test_tick && @@ -62,7 +65,7 @@ test_expect_success setup ' test_expect_success 'rebase commit with multi-line subject' ' - git rebase master multi-line-subject && + git rebase main multi-line-subject && git cat-file commit HEAD | sed -e "1,/^\$/d" >F1 && test_cmp F0 F1 && @@ -70,14 +73,14 @@ test_expect_success 'rebase commit with multi-line subject' ' ' test_expect_success 'rebase commit with diff in message' ' - git rebase master diff-in-message && + git rebase main diff-in-message && git cat-file commit HEAD | sed -e "1,/^$/d" >G1 && test_cmp G0 G1 && test_cmp G G0 ' test_expect_success 'rebase -m commit with empty message' ' - git rebase -m master empty-message-merge + git rebase -m main empty-message-merge ' test_expect_success 'rebase -i commit with empty message' ' diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh index 927a4f4a4e..77a313f62e 100755 --- a/t/t3406-rebase-message.sh +++ b/t/t3406-rebase-message.sh @@ -2,6 +2,9 @@ test_description='messages from rebase operation' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -18,27 +21,27 @@ test_expect_success 'setup' ' ' test_expect_success 'rebase -m' ' - git rebase -m master >actual && + git rebase -m main >actual && test_must_be_empty actual ' -test_expect_success 'rebase against master twice' ' - git rebase --apply master >out && +test_expect_success 'rebase against main twice' ' + git rebase --apply main >out && test_i18ngrep "Current branch topic is up to date" out ' -test_expect_success 'rebase against master twice with --force' ' - git rebase --force-rebase --apply master >out && +test_expect_success 'rebase against main twice with --force' ' + git rebase --force-rebase --apply main >out && test_i18ngrep "Current branch topic is up to date, rebase forced" out ' -test_expect_success 'rebase against master twice from another branch' ' +test_expect_success 'rebase against main twice from another branch' ' git checkout topic^ && - git rebase --apply master topic >out && + git rebase --apply main topic >out && test_i18ngrep "Current branch topic is up to date" out ' -test_expect_success 'rebase fast-forward to master' ' +test_expect_success 'rebase fast-forward to main' ' git checkout topic^ && git rebase --apply topic >out && test_i18ngrep "Fast-forwarded HEAD to topic" out @@ -46,31 +49,24 @@ test_expect_success 'rebase fast-forward to master' ' test_expect_success 'rebase --stat' ' git reset --hard start && - git rebase --stat master >diffstat.txt && - grep "^ fileX | *1 +$" diffstat.txt + git rebase --stat main >diffstat.txt && + grep "^ fileX | *1 +$" diffstat.txt ' test_expect_success 'rebase w/config rebase.stat' ' git reset --hard start && - git config rebase.stat true && - git rebase master >diffstat.txt && - grep "^ fileX | *1 +$" diffstat.txt + git config rebase.stat true && + git rebase main >diffstat.txt && + grep "^ fileX | *1 +$" diffstat.txt ' test_expect_success 'rebase -n overrides config rebase.stat config' ' git reset --hard start && - git config rebase.stat true && - git rebase -n master >diffstat.txt && - ! grep "^ fileX | *1 +$" diffstat.txt + git config rebase.stat true && + git rebase -n main >diffstat.txt && + ! grep "^ fileX | *1 +$" diffstat.txt ' -# Output to stderr: -# -# "Does not point to a valid commit: invalid-ref" -# -# NEEDSWORK: This "grep" is fine in real non-C locales, but -# GIT_TEST_GETTEXT_POISON poisons the refname along with the enclosing -# error message. test_expect_success 'rebase --onto outputs the invalid ref' ' test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err && test_i18ngrep "invalid-ref" err @@ -113,7 +109,7 @@ test_expect_success 'rebase -i onto unrelated history' ' git init unrelated && test_commit -C unrelated 1 && git -C unrelated remote add -f origin "$PWD" && - git -C unrelated branch --set-upstream-to=origin/master && + git -C unrelated branch --set-upstream-to=origin/main && git -C unrelated -c core.editor=true rebase -i -v --stat >actual && test_i18ngrep "Changes to " actual && test_i18ngrep "5 files changed" actual diff --git a/t/t3407-rebase-abort.sh b/t/t3407-rebase-abort.sh index 97efea0f56..7c381fbc89 100755 --- a/t/t3407-rebase-abort.sh +++ b/t/t3407-rebase-abort.sh @@ -2,6 +2,9 @@ test_description='git rebase --abort tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh ### Test that we handle space characters properly @@ -37,7 +40,7 @@ testrebase() { cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase$type master && + test_must_fail git rebase$type main && test_path_is_dir "$dotest" && git rebase --abort && test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) && @@ -48,10 +51,10 @@ testrebase() { cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase$type master && + test_must_fail git rebase$type main && test_path_is_dir "$dotest" && test_must_fail git rebase --skip && - test $(git rev-parse HEAD) = $(git rev-parse master) && + test $(git rev-parse HEAD) = $(git rev-parse main) && git rebase --abort && test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) && test ! -d "$dotest" @@ -61,13 +64,13 @@ testrebase() { cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase$type master && + test_must_fail git rebase$type main && test_path_is_dir "$dotest" && echo c > a && echo d >> a && git add a && test_must_fail git rebase --continue && - test $(git rev-parse HEAD) != $(git rev-parse master) && + test $(git rev-parse HEAD) != $(git rev-parse main) && git rebase --abort && test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) && test ! -d "$dotest" @@ -78,7 +81,7 @@ testrebase() { # Clean up the state from the previous one git reset --hard pre-rebase && git reflog show to-rebase > reflog_before && - test_must_fail git rebase$type master && + test_must_fail git rebase$type main && git rebase --abort && git reflog show to-rebase > reflog_after && test_cmp reflog_before reflog_after && @@ -89,7 +92,7 @@ testrebase() { cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase$type master && + test_must_fail git rebase$type main && test_must_fail git rebase -v --abort && test_must_fail git rebase --abort -v && git rebase --abort @@ -103,7 +106,7 @@ test_expect_success 'rebase --apply --quit' ' cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase --apply master && + test_must_fail git rebase --apply main && test_path_is_dir .git/rebase-apply && head_before=$(git rev-parse HEAD) && git rebase --quit && @@ -115,7 +118,7 @@ test_expect_success 'rebase --merge --quit' ' cd "$work_dir" && # Clean up the state from the previous one git reset --hard pre-rebase && - test_must_fail git rebase --merge master && + test_must_fail git rebase --merge main && test_path_is_dir .git/rebase-merge && head_before=$(git rev-parse HEAD) && git rebase --quit && diff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh index d2bd7c17b0..ab0960e6d9 100755 --- a/t/t3408-rebase-multi-line.sh +++ b/t/t3408-rebase-multi-line.sh @@ -2,6 +2,9 @@ test_description='rebasing a commit with multi-line first paragraph.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -46,7 +49,7 @@ But otherwise with a sane description." side2 && test_expect_success rebase ' git checkout side && - git rebase master && + git rebase main && git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && git cat-file commit side@{1} | sed -e "1,/^\$/d" >expect && test_cmp expect actual diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 3b340f1ece..ec8062a66a 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -6,6 +6,9 @@ test_description='git rebase -p should preserve merges Run "git rebase -p" and check that merges are properly carried along ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq REBASE_P; then @@ -18,7 +21,7 @@ export GIT_AUTHOR_EMAIL # Clone 2 (conflicting merge): # -# A1--A2--B3 <-- origin/master +# A1--A2--B3 <-- origin/main # \ \ # B1------M <-- topic # \ @@ -26,7 +29,7 @@ export GIT_AUTHOR_EMAIL # # Clone 3 (no-ff merge): # -# A1--A2--B3 <-- origin/master +# A1--A2--B3 <-- origin/main # \ # B1------M <-- topic # \ / @@ -44,7 +47,7 @@ test_expect_success 'setup for merge-preserving rebase' \ echo Second > B && git add B && git commit -m "Add B1" && - git checkout -f master && + git checkout -f main && echo Third >> A && git commit -a -m "Modify A2" && echo Fifth > B && @@ -55,10 +58,10 @@ test_expect_success 'setup for merge-preserving rebase' \ ( cd clone2 && git checkout -b topic origin/topic && - test_must_fail git merge origin/master && + test_must_fail git merge origin/main && echo Resolved >B && git add B && - git commit -m "Merge origin/master into topic" + git commit -m "Merge origin/main into topic" ) && git clone ./. clone3 && diff --git a/t/t3412-rebase-root.sh b/t/t3412-rebase-root.sh index 21632a984e..fda62c65bd 100755 --- a/t/t3412-rebase-root.sh +++ b/t/t3412-rebase-root.sh @@ -4,6 +4,9 @@ test_description='git rebase --root Tests if git rebase --root --onto <newparent> can rebase the root commit. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh log_with_names () { @@ -24,7 +27,7 @@ test_expect_success 'prepare repository' ' test_expect_success 'rebase --root fails with too many args' ' git checkout -B fail other && - test_must_fail git rebase --onto master --root fail fail + test_must_fail git rebase --onto main --root fail fail ' test_expect_success 'setup pre-rebase hook' ' @@ -44,7 +47,7 @@ EOF test_expect_success 'rebase --root --onto <newbase>' ' git checkout -b work other && - git rebase --root --onto master && + git rebase --root --onto main && git log --pretty=tformat:"%s" > rebased && test_cmp expect rebased ' @@ -55,7 +58,7 @@ test_expect_success 'pre-rebase got correct input (1)' ' test_expect_success 'rebase --root --onto <newbase> <branch>' ' git branch work2 other && - git rebase --root --onto master work2 && + git rebase --root --onto main work2 && git log --pretty=tformat:"%s" > rebased2 && test_cmp expect rebased2 ' @@ -66,7 +69,7 @@ test_expect_success 'pre-rebase got correct input (2)' ' test_expect_success 'rebase -i --root --onto <newbase>' ' git checkout -b work3 other && - git rebase -i --root --onto master && + git rebase -i --root --onto main && git log --pretty=tformat:"%s" > rebased3 && test_cmp expect rebased3 ' @@ -77,7 +80,7 @@ test_expect_success 'pre-rebase got correct input (3)' ' test_expect_success 'rebase -i --root --onto <newbase> <branch>' ' git branch work4 other && - git rebase -i --root --onto master work4 && + git rebase -i --root --onto main work4 && git log --pretty=tformat:"%s" > rebased4 && test_cmp expect rebased4 ' @@ -88,7 +91,7 @@ test_expect_success 'pre-rebase got correct input (4)' ' test_expect_success REBASE_P 'rebase -i -p with linear history' ' git checkout -b work5 other && - git rebase -i -p --root --onto master && + git rebase -i -p --root --onto main && git log --pretty=tformat:"%s" > rebased5 && test_cmp expect rebased5 ' @@ -122,7 +125,7 @@ EOF test_expect_success REBASE_P 'rebase -i -p with merge' ' git checkout -b work6 other && - git rebase -i -p --root --onto master && + git rebase -i -p --root --onto main && log_with_names work6 > rebased6 && test_cmp expect-side rebased6 ' @@ -157,7 +160,7 @@ EOF test_expect_success REBASE_P 'rebase -i -p with two roots' ' git checkout -b work7 other && - git rebase -i -p --root --onto master && + git rebase -i -p --root --onto main && log_with_names work7 > rebased7 && test_cmp expect-third rebased7 ' @@ -173,14 +176,14 @@ EOF test_expect_success 'pre-rebase hook stops rebase' ' git checkout -b stops1 other && - test_must_fail git rebase --root --onto master && + test_must_fail git rebase --root --onto main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops1 && test 0 = $(git rev-list other...stops1 | wc -l) ' test_expect_success 'pre-rebase hook stops rebase -i' ' git checkout -b stops2 other && - test_must_fail git rebase --root --onto master && + test_must_fail git rebase --root --onto main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops2 && test 0 = $(git rev-list other...stops2 | wc -l) ' @@ -190,7 +193,7 @@ test_expect_success 'remove pre-rebase hook' ' ' test_expect_success 'set up a conflict' ' - git checkout master && + git checkout main && echo conflict > B && git add B && git commit -m conflict @@ -198,7 +201,7 @@ test_expect_success 'set up a conflict' ' test_expect_success 'rebase --root with conflict (first part)' ' git checkout -b conflict1 other && - test_must_fail git rebase --root --onto master && + test_must_fail git rebase --root --onto main && git ls-files -u | grep "B$" ' @@ -225,7 +228,7 @@ test_expect_success 'rebase --root with conflict (second part)' ' test_expect_success 'rebase -i --root with conflict (first part)' ' git checkout -b conflict2 other && - test_must_fail git rebase -i --root --onto master && + test_must_fail git rebase -i --root --onto main && git ls-files -u | grep "B$" ' @@ -263,7 +266,7 @@ EOF test_expect_success REBASE_P 'rebase -i -p --root with conflict (first part)' ' git checkout -b conflict3 other && - test_must_fail git rebase -i -p --root --onto master && + test_must_fail git rebase -i -p --root --onto main && git ls-files -u | grep "B$" ' diff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh index b6833e9a5f..b4acb3be5c 100755 --- a/t/t3413-rebase-hook.sh +++ b/t/t3413-rebase-hook.sh @@ -2,6 +2,9 @@ test_description='git rebase with its hook(s)' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -18,7 +21,7 @@ test_expect_success setup ' git add git && test_tick && git commit -m side && - git checkout master && + git checkout main && git log --pretty=oneline --abbrev-commit --graph --all && git branch test side ' @@ -26,14 +29,14 @@ test_expect_success setup ' test_expect_success 'rebase' ' git checkout test && git reset --hard side && - git rebase master && + git rebase main && test "z$(cat git)" = zworld ' test_expect_success 'rebase -i' ' git checkout test && git reset --hard side && - EDITOR=true git rebase -i master && + EDITOR=true git rebase -i main && test "z$(cat git)" = zworld ' @@ -49,53 +52,53 @@ EOF test_expect_success 'pre-rebase hook gets correct input (1)' ' git checkout test && git reset --hard side && - git rebase master && + git rebase main && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster, + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain, ' test_expect_success 'pre-rebase hook gets correct input (2)' ' git checkout test && git reset --hard side && - git rebase master test && + git rebase main test && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (3)' ' git checkout test && git reset --hard side && - git checkout master && - git rebase master test && + git checkout main && + git rebase main test && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (4)' ' git checkout test && git reset --hard side && - EDITOR=true git rebase -i master && + EDITOR=true git rebase -i main && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster, + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain, ' test_expect_success 'pre-rebase hook gets correct input (5)' ' git checkout test && git reset --hard side && - EDITOR=true git rebase -i master test && + EDITOR=true git rebase -i main test && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (6)' ' git checkout test && git reset --hard side && - git checkout master && - EDITOR=true git rebase -i master test && + git checkout main && + EDITOR=true git rebase -i main test && test "z$(cat git)" = zworld && - test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test + test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'setup pre-rebase hook that fails' ' @@ -110,7 +113,7 @@ EOF test_expect_success 'pre-rebase hook stops rebase (1)' ' git checkout test && git reset --hard side && - test_must_fail git rebase master && + test_must_fail git rebase main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test 0 = $(git rev-list HEAD...side | wc -l) ' @@ -118,7 +121,7 @@ test_expect_success 'pre-rebase hook stops rebase (1)' ' test_expect_success 'pre-rebase hook stops rebase (2)' ' git checkout test && git reset --hard side && - test_must_fail env EDITOR=: git rebase -i master && + test_must_fail env EDITOR=: git rebase -i main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test 0 = $(git rev-list HEAD...side | wc -l) ' @@ -126,7 +129,7 @@ test_expect_success 'pre-rebase hook stops rebase (2)' ' test_expect_success 'rebase --no-verify overrides pre-rebase (1)' ' git checkout test && git reset --hard side && - git rebase --no-verify master && + git rebase --no-verify main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test "z$(cat git)" = zworld ' @@ -134,7 +137,7 @@ test_expect_success 'rebase --no-verify overrides pre-rebase (1)' ' test_expect_success 'rebase --no-verify overrides pre-rebase (2)' ' git checkout test && git reset --hard side && - EDITOR=true git rebase --no-verify -i master && + EDITOR=true git rebase --no-verify -i main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test "z$(cat git)" = zworld ' diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh index 7bab6000dc..78c27496d6 100755 --- a/t/t3415-rebase-autosquash.sh +++ b/t/t3415-rebase-autosquash.sh @@ -2,6 +2,9 @@ test_description='auto squash' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -81,8 +84,7 @@ test_auto_squash () { echo 1 >file1 && git add -u && test_tick && - git commit -m "squash! first" && - + git commit -m "squash! first" -m "extra para for first" && git tag $1 && test_tick && git rebase $2 -i HEAD^^^ && @@ -139,7 +141,7 @@ test_expect_success 'auto squash that matches 2 commits' ' echo 1 >file1 && git add -u && test_tick && - git commit -m "squash! first" && + git commit -m "squash! first" -m "extra para for first" && git tag final-multisquash && test_tick && git rebase --autosquash -i HEAD~4 && @@ -192,7 +194,7 @@ test_expect_success 'auto squash that matches a sha1' ' git add -u && test_tick && oid=$(git rev-parse --short HEAD^) && - git commit -m "squash! $oid" && + git commit -m "squash! $oid" -m "extra para" && git tag final-shasquash && test_tick && git rebase --autosquash -i HEAD^^^ && @@ -203,7 +205,8 @@ test_expect_success 'auto squash that matches a sha1' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - grep squash commit >actual && + ! grep "squash" commit && + grep "^extra para" commit >actual && test_line_count = 1 actual ' @@ -213,7 +216,7 @@ test_expect_success 'auto squash that matches longer sha1' ' git add -u && test_tick && oid=$(git rev-parse --short=11 HEAD^) && - git commit -m "squash! $oid" && + git commit -m "squash! $oid" -m "extra para" && git tag final-longshasquash && test_tick && git rebase --autosquash -i HEAD^^^ && @@ -224,7 +227,8 @@ test_expect_success 'auto squash that matches longer sha1' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - grep squash commit >actual && + ! grep "squash" commit && + grep "^extra para" commit >actual && test_line_count = 1 actual ' @@ -233,7 +237,7 @@ test_auto_commit_flags () { echo 1 >file1 && git add -u && test_tick && - git commit --$1 first-commit && + git commit --$1 first-commit -m "extra para for first" && git tag final-commit-$1 && test_tick && git rebase --autosquash -i HEAD^^^ && @@ -261,11 +265,11 @@ test_auto_fixup_fixup () { echo 1 >file1 && git add -u && test_tick && - git commit -m "$1! first" && + git commit -m "$1! first" -m "extra para for first" && echo 2 >file1 && git add -u && test_tick && - git commit -m "$1! $2! first" && + git commit -m "$1! $2! first" -m "second extra para for first" && git tag "final-$1-$2" && test_tick && ( @@ -303,35 +307,35 @@ test_auto_fixup_fixup () { fi } -test_expect_success C_LOCALE_OUTPUT 'fixup! fixup!' ' +test_expect_success 'fixup! fixup!' ' test_auto_fixup_fixup fixup fixup ' -test_expect_success C_LOCALE_OUTPUT 'fixup! squash!' ' +test_expect_success 'fixup! squash!' ' test_auto_fixup_fixup fixup squash ' -test_expect_success C_LOCALE_OUTPUT 'squash! squash!' ' +test_expect_success 'squash! squash!' ' test_auto_fixup_fixup squash squash ' -test_expect_success C_LOCALE_OUTPUT 'squash! fixup!' ' +test_expect_success 'squash! fixup!' ' test_auto_fixup_fixup squash fixup ' -test_expect_success C_LOCALE_OUTPUT 'autosquash with custom inst format' ' +test_expect_success 'autosquash with custom inst format' ' git reset --hard base && git config --add rebase.instructionFormat "[%an @ %ar] %s" && echo 2 >file1 && git add -u && test_tick && oid=$(git rev-parse --short HEAD^) && - git commit -m "squash! $oid" && + git commit -m "squash! $oid" -m "extra para for first" && echo 1 >file1 && git add -u && test_tick && subject=$(git log -n 1 --format=%s HEAD~2) && - git commit -m "squash! $subject" && + git commit -m "squash! $subject" -m "second extra para for first" && git tag final-squash-instFmt && test_tick && git rebase --autosquash -i HEAD~4 && @@ -342,8 +346,9 @@ test_expect_success C_LOCALE_OUTPUT 'autosquash with custom inst format' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - grep squash commit >actual && - test_line_count = 2 actual + ! grep "squash" commit && + grep first commit >actual && + test_line_count = 3 actual ' test_expect_success 'autosquash with empty custom instructionFormat' ' @@ -407,7 +412,7 @@ test_expect_success 'wrapped original subject' ' test_expect_success 'abort last squash' ' test_when_finished "test_might_fail git rebase --abort" && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout -b some-squashes && git commit --allow-empty -m first && @@ -440,4 +445,12 @@ test_expect_success 'fixup a fixup' ' test XZWY = $(git show | tr -cd W-Z) ' +test_expect_success 'fixup does not clean up commit message' ' + oneline="#818" && + git commit --allow-empty -m "$oneline" && + git commit --fixup HEAD --allow-empty && + git -c commit.cleanup=strip rebase -ki --autosquash HEAD~2 && + test "$oneline" = "$(git show -s --format=%s)" +' + test_done diff --git a/t/t3416-rebase-onto-threedots.sh b/t/t3416-rebase-onto-threedots.sh index 9c2548423b..3716a42e81 100755 --- a/t/t3416-rebase-onto-threedots.sh +++ b/t/t3416-rebase-onto-threedots.sh @@ -2,17 +2,20 @@ test_description='git rebase --onto A...B' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-rebase.sh" -# Rebase only the tip commit of "topic" on merge base between "master" -# and "topic". Cannot do this for "side" with "master" because there +# Rebase only the tip commit of "topic" on merge base between "main" +# and "topic". Cannot do this for "side" with "main" because there # is no single merge base. # # # F---G topic G' # / / -# A---B---C---D---E master --> A---B---C---D---E +# A---B---C---D---E main --> A---B---C---D---E # \ \ / # \ x # \ / \ @@ -26,7 +29,7 @@ test_expect_success setup ' git branch topic && git checkout side && test_commit H && - git checkout master && + git checkout main && test_tick && git merge H && git tag D && @@ -42,83 +45,83 @@ test_expect_success setup ' test_commit K ' -test_expect_success 'rebase --onto master...topic' ' +test_expect_success 'rebase --onto main...topic' ' git reset --hard && git checkout topic && git reset --hard G && - git rebase --onto master...topic F && + git rebase --onto main...topic F && git rev-parse HEAD^1 >actual && git rev-parse C^0 >expect && test_cmp expect actual ' -test_expect_success 'rebase --onto master...' ' +test_expect_success 'rebase --onto main...' ' git reset --hard && git checkout topic && git reset --hard G && - git rebase --onto master... F && + git rebase --onto main... F && git rev-parse HEAD^1 >actual && git rev-parse C^0 >expect && test_cmp expect actual ' -test_expect_success 'rebase --onto master...side' ' +test_expect_success 'rebase --onto main...side' ' git reset --hard && git checkout side && git reset --hard K && - test_must_fail git rebase --onto master...side J + test_must_fail git rebase --onto main...side J ' -test_expect_success 'rebase -i --onto master...topic' ' +test_expect_success 'rebase -i --onto main...topic' ' git reset --hard && git checkout topic && git reset --hard G && set_fake_editor && - EXPECT_COUNT=1 git rebase -i --onto master...topic F && + EXPECT_COUNT=1 git rebase -i --onto main...topic F && git rev-parse HEAD^1 >actual && git rev-parse C^0 >expect && test_cmp expect actual ' -test_expect_success 'rebase -i --onto master...' ' +test_expect_success 'rebase -i --onto main...' ' git reset --hard && git checkout topic && git reset --hard G && set_fake_editor && - EXPECT_COUNT=1 git rebase -i --onto master... F && + EXPECT_COUNT=1 git rebase -i --onto main... F && git rev-parse HEAD^1 >actual && git rev-parse C^0 >expect && test_cmp expect actual ' -test_expect_success 'rebase -i --onto master...side' ' +test_expect_success 'rebase -i --onto main...side' ' git reset --hard && git checkout side && git reset --hard K && set_fake_editor && - test_must_fail git rebase -i --onto master...side J + test_must_fail git rebase -i --onto main...side J ' test_expect_success 'rebase --keep-base --onto incompatible' ' - test_must_fail git rebase --keep-base --onto master... + test_must_fail git rebase --keep-base --onto main... ' test_expect_success 'rebase --keep-base --root incompatible' ' test_must_fail git rebase --keep-base --root ' -test_expect_success 'rebase --keep-base master from topic' ' +test_expect_success 'rebase --keep-base main from topic' ' git reset --hard && git checkout topic && git reset --hard G && - git rebase --keep-base master && + git rebase --keep-base main && git rev-parse C >base.expect && - git merge-base master HEAD >base.actual && + git merge-base main HEAD >base.actual && test_cmp base.expect base.actual && git rev-parse HEAD~2 >actual && @@ -126,23 +129,23 @@ test_expect_success 'rebase --keep-base master from topic' ' test_cmp expect actual ' -test_expect_success 'rebase --keep-base master from side' ' +test_expect_success 'rebase --keep-base main from side' ' git reset --hard && git checkout side && git reset --hard K && - test_must_fail git rebase --keep-base master + test_must_fail git rebase --keep-base main ' -test_expect_success 'rebase -i --keep-base master from topic' ' +test_expect_success 'rebase -i --keep-base main from topic' ' git reset --hard && git checkout topic && git reset --hard G && set_fake_editor && - EXPECT_COUNT=2 git rebase -i --keep-base master && + EXPECT_COUNT=2 git rebase -i --keep-base main && git rev-parse C >base.expect && - git merge-base master HEAD >base.actual && + git merge-base main HEAD >base.actual && test_cmp base.expect base.actual && git rev-parse HEAD~2 >actual && @@ -150,13 +153,13 @@ test_expect_success 'rebase -i --keep-base master from topic' ' test_cmp expect actual ' -test_expect_success 'rebase -i --keep-base master from side' ' +test_expect_success 'rebase -i --keep-base main from side' ' git reset --hard && git checkout side && git reset --hard K && set_fake_editor && - test_must_fail git rebase -i --keep-base master + test_must_fail git rebase -i --keep-base main ' test_done diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh index 7a2da972fd..f4c2ee02bc 100755 --- a/t/t3418-rebase-continue.sh +++ b/t/t3418-rebase-continue.sh @@ -2,6 +2,9 @@ test_description='git rebase --continue tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -15,13 +18,13 @@ test_expect_success 'setup' ' git checkout -b topic HEAD^ && test_commit "commit-new-file-F2-on-topic-branch" F2 22 && - git checkout master + git checkout main ' test_expect_success 'interactive rebase --continue works with touched file' ' rm -fr .git/rebase-* && git reset --hard && - git checkout master && + git checkout main && FAKE_LINES="edit 1" git rebase -i HEAD^ && test-tool chmtime =-60 F1 && @@ -31,9 +34,9 @@ test_expect_success 'interactive rebase --continue works with touched file' ' test_expect_success 'non-interactive rebase --continue works with touched file' ' rm -fr .git/rebase-* && git reset --hard && - git checkout master && + git checkout main && - test_must_fail git rebase --onto master master topic && + test_must_fail git rebase --onto main main topic && echo "Resolved" >F2 && git add F2 && test-tool chmtime =-60 F1 && @@ -61,7 +64,7 @@ test_expect_success 'rebase --continue remembers merge strategy and options' ' chmod +x test-bin/git-merge-funny && ( PATH=./test-bin:$PATH && - test_must_fail git rebase -s funny -Xopt master topic + test_must_fail git rebase -s funny -Xopt main topic ) && test -f funny.was.run && rm funny.was.run && @@ -93,7 +96,7 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' ' chmod +x test-bin/git-merge-funny && ( PATH=./test-bin:$PATH && - test_must_fail git rebase -i -s funny -Xopt -Xfoo master topic + test_must_fail git rebase -i -s funny -Xopt -Xfoo main topic ) && test -f funny.was.run && rm funny.was.run && @@ -188,11 +191,11 @@ test_expect_success '--skip after failed fixup cleans commit message' ' test_expect_success 'setup rerere database' ' rm -fr .git/rebase-* && git reset --hard commit-new-file-F3-on-topic-branch && - git checkout master && + git checkout main && test_commit "commit-new-file-F3" F3 3 && test_config rerere.enabled true && git update-ref refs/heads/topic commit-new-file-F3-on-topic-branch && - test_must_fail git rebase -m master topic && + test_must_fail git rebase -m main topic && echo "Resolved" >F2 && cp F2 expected-F2 && git add F2 && @@ -207,7 +210,7 @@ test_expect_success 'setup rerere database' ' prepare () { rm -fr .git/rebase-* && git reset --hard commit-new-file-F3-on-topic-branch && - git checkout master && + git checkout main && test_config rerere.enabled true } @@ -215,7 +218,7 @@ test_rerere_autoupdate () { action=$1 && test_expect_success "rebase $action --continue remembers --rerere-autoupdate" ' prepare && - test_must_fail git rebase $action --rerere-autoupdate master topic && + test_must_fail git rebase $action --rerere-autoupdate main topic && test_cmp expected-F2 F2 && git diff-files --quiet && test_must_fail git rebase --continue && @@ -227,7 +230,7 @@ test_rerere_autoupdate () { test_expect_success "rebase $action --continue honors rerere.autoUpdate" ' prepare && test_config rerere.autoupdate true && - test_must_fail git rebase $action master topic && + test_must_fail git rebase $action main topic && test_cmp expected-F2 F2 && git diff-files --quiet && test_must_fail git rebase --continue && @@ -239,7 +242,7 @@ test_rerere_autoupdate () { test_expect_success "rebase $action --continue remembers --no-rerere-autoupdate" ' prepare && test_config rerere.autoupdate true && - test_must_fail git rebase $action --no-rerere-autoupdate master topic && + test_must_fail git rebase $action --no-rerere-autoupdate main topic && test_cmp expected-F2 F2 && test_must_fail git diff-files --quiet && git add F2 && @@ -279,12 +282,35 @@ test_expect_success '--reschedule-failed-exec' ' test_i18ngrep "has been rescheduled" err ' -test_expect_success 'rebase.reschedulefailedexec only affects `rebase -i`' ' - test_config rebase.reschedulefailedexec true && +test_expect_success 'rebase.rescheduleFailedExec only affects `rebase -i`' ' + test_config rebase.rescheduleFailedExec true && test_must_fail git rebase -x false HEAD^ && grep "^exec false" .git/rebase-merge/git-rebase-todo && git rebase --abort && git rebase HEAD^ ' +test_expect_success 'rebase.rescheduleFailedExec=true & --no-reschedule-failed-exec' ' + test_when_finished "git rebase --abort" && + test_config rebase.rescheduleFailedExec true && + test_must_fail git rebase -x false --no-reschedule-failed-exec HEAD~2 && + test_must_fail git rebase --continue 2>err && + ! grep "has been rescheduled" err +' + +test_expect_success 'new rebase.rescheduleFailedExec=true setting in an ongoing rebase is ignored' ' + test_when_finished "git rebase --abort" && + test_must_fail git rebase -x false HEAD~2 && + test_config rebase.rescheduleFailedExec true && + test_must_fail git rebase --continue 2>err && + ! grep "has been rescheduled" err +' + +test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebase' ' + test_when_finished "git rebase --abort" && + test_must_fail git rebase -x false HEAD~2 && + test_expect_code 129 git rebase --continue --no-reschedule-failed-exec && + test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec +' + test_done diff --git a/t/t3419-rebase-patch-id.sh b/t/t3419-rebase-patch-id.sh index 1f32faa4a4..295040f2fe 100755 --- a/t/t3419-rebase-patch-id.sh +++ b/t/t3419-rebase-patch-id.sh @@ -2,6 +2,9 @@ test_description='git rebase - test patch id computation' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh scramble () { @@ -24,7 +27,7 @@ test_expect_success 'setup' ' test_expect_success 'setup: 500 lines' ' rm -f .gitattributes && - git checkout -q -f master && + git checkout -q -f main && git reset --hard root && test_seq 500 >file && git add file && @@ -40,7 +43,7 @@ test_expect_success 'setup: 500 lines' ' git add newfile && git commit -q -m "add small file" && - git cherry-pick master >/dev/null 2>&1 + git cherry-pick main >/dev/null 2>&1 ' test_expect_success 'setup attributes' ' @@ -48,18 +51,18 @@ test_expect_success 'setup attributes' ' ' test_expect_success 'detect upstream patch' ' - git checkout -q master && + git checkout -q main && scramble file && git add file && git commit -q -m "change big file again" && git checkout -q other^{} && - git rebase master && - git rev-list master...HEAD~ >revs && + git rebase main && + git rev-list main...HEAD~ >revs && test_must_be_empty revs ' test_expect_success 'do not drop patch' ' - git branch -f squashed master && + git branch -f squashed main && git checkout -q -f squashed && git reset -q --soft HEAD~2 && git commit -q -m squashed && diff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh index ca331733fb..43fcb68f27 100755 --- a/t/t3420-rebase-autostash.sh +++ b/t/t3420-rebase-autostash.sh @@ -4,6 +4,9 @@ # test_description='git rebase --autostash tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -21,12 +24,12 @@ test_expect_success setup ' git add . && test_tick && git commit -m "third commit" && - git checkout -b unrelated-onto-branch master && + git checkout -b unrelated-onto-branch main && echo unrelated >file4 && git add . && test_tick && git commit -m "unrelated commit" && - git checkout -b related-onto-branch master && + git checkout -b related-onto-branch main && echo conflicting-change >file2 && git add . && test_tick && @@ -107,7 +110,7 @@ testrebase () { fi && create_expected_success_$suffix && sed "$remove_progress_re" <actual >actual2 && - test_i18ncmp expected actual2 + test_cmp expected actual2 ' test_expect_success "rebase$type: dirty index, non-conflicting rebase" ' @@ -228,7 +231,7 @@ testrebase () { fi && create_expected_failure_$suffix && sed "$remove_progress_re" <actual >actual2 && - test_i18ncmp expected actual2 + test_cmp expected actual2 ' } @@ -305,7 +308,7 @@ test_expect_success 'autostash is saved on editor failure with conflict' ' ' test_expect_success 'autostash with dirty submodules' ' - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && git checkout -b with-submodule && git submodule add ./ sub && test_tick && @@ -324,7 +327,7 @@ test_expect_success 'branch is left alone when possible' ' test_expect_success 'never change active branch' ' git checkout -b not-the-feature-branch unrelated-onto-branch && - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && echo changed >file0 && git rebase --autostash not-the-feature-branch feature-branch && test_cmp_rev not-the-feature-branch unrelated-onto-branch diff --git a/t/t3423-rebase-reword.sh b/t/t3423-rebase-reword.sh index 6963750794..4859bb8f72 100755 --- a/t/t3423-rebase-reword.sh +++ b/t/t3423-rebase-reword.sh @@ -7,7 +7,7 @@ test_description='git rebase interactive with rewording' . "$TEST_DIRECTORY"/lib-rebase.sh test_expect_success 'setup' ' - test_commit master file-1 test && + test_commit main file-1 test && git checkout -b stuff && @@ -22,7 +22,7 @@ test_expect_success 'reword without issues functions as intended' ' set_fake_editor && FAKE_LINES="pick 1 reword 2" FAKE_COMMIT_MESSAGE="feature_b_reworded" \ - git rebase -i -v master && + git rebase -i -v main && test "$(git log -1 --format=%B)" = "feature_b_reworded" && test $(git rev-list --count HEAD) = 3 @@ -35,7 +35,7 @@ test_expect_success 'reword after a conflict preserves commit' ' set_fake_editor && test_must_fail env FAKE_LINES="reword 2" \ - git rebase -i -v master && + git rebase -i -v main && git checkout --theirs file-2 && git add file-2 && diff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh index 79e43a370b..e78c7e3796 100755 --- a/t/t3427-rebase-subtree.sh +++ b/t/t3427-rebase-subtree.sh @@ -4,6 +4,9 @@ test_description='git rebase tests for -Xsubtree This test runs git rebase and tests the subtree strategy. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -15,12 +18,12 @@ commit_message() { # this test script tries to document them. First, the following commit history # is generated (the onelines are shown, time flows from left to right): # -# master1 - master2 - master3 +# topic_1 - topic_2 - topic_3 # \ -# README ---------------------- Add subproject master - master4 - files_subtree/master5 +# README ---------------------- Add subproject main - topic_4 - files_subtree/topic_5 # -# Where the merge moves the files master[123].t into the subdirectory -# files_subtree/ and master4 as well as files_subtree/master5 add files to that +# Where the merge moves the files topic_[123].t into the subdirectory +# files_subtree/ and topic_4 as well as files_subtree/topic_5 add files to that # directory directly. # # Then, in subsequent test cases, `git filter-branch` is used to distill just @@ -28,11 +31,11 @@ commit_message() { # an empty commit is added on top. The pre-rebase commit history looks like # this: # -# Add subproject master - master4 - files_subtree/master5 - Empty commit +# Add subproject main - topic_4 - files_subtree/topic_5 - Empty commit # -# where the root commit adds three files: master1.t, master2.t and master3.t. +# where the root commit adds three files: topic_1.t, topic_2.t and topic_3.t. # -# This commit history is then rebased onto `master3` with the +# This commit history is then rebased onto `topic_3` with the # `-Xsubtree=files_subtree` option in three different ways: # # 1. using `--preserve-merges` @@ -43,20 +46,20 @@ test_expect_success 'setup' ' test_commit README && git init files && - test_commit -C files master1 && - test_commit -C files master2 && - test_commit -C files master3 && + test_commit -C files topic_1 && + test_commit -C files topic_2 && + test_commit -C files topic_3 && : perform subtree merge into files_subtree/ && - git fetch files refs/heads/master:refs/heads/files-master && + git fetch files refs/heads/main:refs/heads/files-main && git merge -s ours --no-commit --allow-unrelated-histories \ - files-master && - git read-tree --prefix=files_subtree -u files-master && - git commit -m "Add subproject master" && + files-main && + git read-tree --prefix=files_subtree -u files-main && + git commit -m "Add subproject main" && : add two extra commits to rebase && - test_commit -C files_subtree master4 && - test_commit files_subtree/master5 && + test_commit -C files_subtree topic_4 && + test_commit files_subtree/topic_5 && git checkout -b to-rebase && git fast-export --no-data HEAD -- files_subtree/ | @@ -66,44 +69,44 @@ test_expect_success 'setup' ' git commit -m "Empty commit" --allow-empty ' -# FAILURE: Does not preserve master4. +# FAILURE: Does not preserve topic_4. test_expect_failure REBASE_P 'Rebase -Xsubtree --preserve-merges --onto commit' ' reset_rebase && git checkout -b rebase-preserve-merges to-rebase && - git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master && - verbose test "$(commit_message HEAD~)" = "master4" && - verbose test "$(commit_message HEAD)" = "files_subtree/master5" + git rebase -Xsubtree=files_subtree --preserve-merges --onto files-main main && + verbose test "$(commit_message HEAD~)" = "topic_4" && + verbose test "$(commit_message HEAD)" = "files_subtree/topic_5" ' -# FAILURE: Does not preserve master4. +# FAILURE: Does not preserve topic_4. test_expect_failure REBASE_P 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit' ' reset_rebase && git checkout -b rebase-keep-empty to-rebase && - git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master && - verbose test "$(commit_message HEAD~2)" = "master4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/master5" && + git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-main main && + verbose test "$(commit_message HEAD~2)" = "topic_4" && + verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" && verbose test "$(commit_message HEAD)" = "Empty commit" ' test_expect_success 'Rebase -Xsubtree --empty=ask --onto commit' ' reset_rebase && git checkout -b rebase-onto to-rebase && - test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --onto files-master master && + test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --onto files-main main && : first pick results in no changes && git rebase --skip && - verbose test "$(commit_message HEAD~2)" = "master4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/master5" && + verbose test "$(commit_message HEAD~2)" = "topic_4" && + verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" && verbose test "$(commit_message HEAD)" = "Empty commit" ' test_expect_success 'Rebase -Xsubtree --empty=ask --rebase-merges --onto commit' ' reset_rebase && git checkout -b rebase-merges-onto to-rebase && - test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --rebase-merges --onto files-master --root && + test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --rebase-merges --onto files-main --root && : first pick results in no changes && git rebase --skip && - verbose test "$(commit_message HEAD~2)" = "master4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/master5" && + verbose test "$(commit_message HEAD~2)" = "topic_4" && + verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" && verbose test "$(commit_message HEAD)" = "Empty commit" ' diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index b454f400eb..6748070df5 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -12,12 +12,15 @@ Initial setup: -- B -- (first) / \ - A - C - D - E - H (master) + A - C - D - E - H (main) \ \ / \ F - G (second) \ Conflicting-G ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh . "$TEST_DIRECTORY"/lib-log-graph.sh @@ -37,7 +40,7 @@ test_expect_success 'setup' ' git checkout -b first && test_commit B && b=$(git rev-parse --short HEAD) && - git checkout master && + git checkout main && test_commit C && c=$(git rev-parse --short HEAD) && test_commit D && @@ -52,7 +55,7 @@ test_expect_success 'setup' ' f=$(git rev-parse --short HEAD) && test_commit G && g=$(git rev-parse --short HEAD) && - git checkout master && + git checkout main && git merge --no-commit G && test_tick && git commit -m H && @@ -82,7 +85,7 @@ test_expect_success 'create completely different structure' ' EOF test_config sequence.editor \""$PWD"/replace-editor.sh\" && test_tick && - git rebase -i -r A master && + git rebase -i -r A main && test_cmp_graph <<-\EOF * Merge the topic branch '\''onebranch'\'' |\ @@ -183,7 +186,7 @@ test_expect_success 'fast-forward merge -c still rewords' ' ' test_expect_success 'with a branch tip that was cherry-picked already' ' - git checkout -b already-upstream master && + git checkout -b already-upstream main && base="$(git rev-parse --verify HEAD)" && test_commit A1 && @@ -211,7 +214,7 @@ test_expect_success 'with a branch tip that was cherry-picked already' ' ' test_expect_success 'do not rebase cousins unless asked for' ' - git checkout -b cousins master && + git checkout -b cousins main && before="$(git rev-parse --verify HEAD)" && test_tick && git rebase -r HEAD^ && @@ -340,7 +343,7 @@ test_expect_success 'a "merge" into a root commit is a fast-forward' ' test_expect_success 'A root commit can be a cousin, treat it that way' ' git checkout --orphan khnum && test_commit yama && - git checkout -b asherah master && + git checkout -b asherah main && test_commit shamkat && git merge --allow-unrelated-histories khnum && test_tick && @@ -367,7 +370,7 @@ test_expect_success 'labels that are object IDs are rewritten' ' git checkout -b third B && test_commit I && third=$(git rev-parse HEAD) && - git checkout -b labels master && + git checkout -b labels main && git merge --no-commit third && test_tick && git commit -m "Merge commit '\''$third'\'' into labels" && diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh index 172562789e..4c98d99e7e 100755 --- a/t/t3431-rebase-fork-point.sh +++ b/t/t3431-rebase-fork-point.sh @@ -5,13 +5,16 @@ test_description='git rebase --fork-point test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh -# A---B---D---E (master) +# A---B---D---E (main) # \ # C*---F---G (side) # -# C was formerly part of master but master was rewound to remove C +# C was formerly part of main but main was rewound to remove C # test_expect_success setup ' test_commit A && @@ -26,19 +29,23 @@ test_expect_success setup ' test_commit G ' +do_test_rebase () { + expected="$1" && + shift && + git checkout main && + git reset --hard E && + git checkout side && + git reset --hard G && + git rebase $* && + test_write_lines $expected >expect && + git log --pretty=%s >actual && + test_cmp expect actual +} + test_rebase () { expected="$1" && shift && - test_expect_success "git rebase $*" " - git checkout master && - git reset --hard E && - git checkout side && - git reset --hard G && - git rebase $* && - test_write_lines $expected >expect && - git log --pretty=%s >actual && - test_cmp expect actual - " + test_expect_success "git rebase $*" "do_test_rebase '$expected' $*" } test_rebase 'G F E D B A' @@ -48,30 +55,61 @@ test_rebase 'G F C E D B A' --no-fork-point test_rebase 'G F C D B A' --no-fork-point --onto D test_rebase 'G F C B A' --no-fork-point --keep-base -test_rebase 'G F E D B A' --fork-point refs/heads/master -test_rebase 'G F E D B A' --fork-point master +test_rebase 'G F E D B A' --fork-point refs/heads/main +test_rebase 'G F E D B A' --fork-point main -test_rebase 'G F D B A' --fork-point --onto D refs/heads/master -test_rebase 'G F D B A' --fork-point --onto D master +test_rebase 'G F D B A' --fork-point --onto D refs/heads/main +test_rebase 'G F D B A' --fork-point --onto D main -test_rebase 'G F B A' --fork-point --keep-base refs/heads/master -test_rebase 'G F B A' --fork-point --keep-base master +test_rebase 'G F B A' --fork-point --keep-base refs/heads/main +test_rebase 'G F B A' --fork-point --keep-base main -test_rebase 'G F C E D B A' refs/heads/master -test_rebase 'G F C E D B A' master +test_rebase 'G F C E D B A' refs/heads/main +test_rebase 'G F C E D B A' main -test_rebase 'G F C D B A' --onto D refs/heads/master -test_rebase 'G F C D B A' --onto D master +test_rebase 'G F C D B A' --onto D refs/heads/main +test_rebase 'G F C D B A' --onto D main -test_rebase 'G F C B A' --keep-base refs/heads/master -test_rebase 'G F C B A' --keep-base master +test_rebase 'G F C B A' --keep-base refs/heads/main +test_rebase 'G F C B A' --keep-base main test_expect_success 'git rebase --fork-point with ambigous refname' ' - git checkout master && + git checkout main && git checkout -b one && git checkout side && git tag one && test_must_fail git rebase --fork-point --onto D one ' +test_expect_success '--fork-point and --root both given' ' + test_must_fail git rebase --fork-point --root 2>err && + test_i18ngrep "cannot combine" err +' + +test_expect_success 'rebase.forkPoint set to false' ' + test_config rebase.forkPoint false && + do_test_rebase "G F C E D B A" +' + +test_expect_success 'rebase.forkPoint set to false and then to true' ' + test_config_global rebase.forkPoint false && + test_config rebase.forkPoint true && + do_test_rebase "G F E D B A" +' + +test_expect_success 'rebase.forkPoint set to false and command line says --fork-point' ' + test_config rebase.forkPoint false && + do_test_rebase "G F E D B A" --fork-point +' + +test_expect_success 'rebase.forkPoint set to true and command line says --no-fork-point' ' + test_config rebase.forkPoint true && + do_test_rebase "G F C E D B A" --no-fork-point +' + +test_expect_success 'rebase.forkPoint set to true and --root given' ' + test_config rebase.forkPoint true && + git rebase --root +' + test_done diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh index a29eda87e9..5086e14c02 100755 --- a/t/t3432-rebase-fast-forward.sh +++ b/t/t3432-rebase-fast-forward.sh @@ -5,6 +5,9 @@ test_description='ensure rebase fast-forwards commits when possible' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -84,19 +87,19 @@ test_rebase_same_head_ () { changes='no changes' test_rebase_same_head success noop same success work same -test_rebase_same_head success noop same success work same master +test_rebase_same_head success noop same success work same main test_rebase_same_head success noop same success work diff --onto B B test_rebase_same_head success noop same success work diff --onto B... B -test_rebase_same_head success noop same success work same --onto master... master -test_rebase_same_head success noop same success work same --keep-base master +test_rebase_same_head success noop same success work same --onto main... main +test_rebase_same_head success noop same success work same --keep-base main test_rebase_same_head success noop same success work same --keep-base test_rebase_same_head success noop same success work same --no-fork-point test_rebase_same_head success noop same success work same --keep-base --no-fork-point -test_rebase_same_head success noop same success work same --fork-point master +test_rebase_same_head success noop same success work same --fork-point main test_rebase_same_head success noop same success work diff --fork-point --onto B B test_rebase_same_head success noop same success work diff --fork-point --onto B... B -test_rebase_same_head success noop same success work same --fork-point --onto master... master -test_rebase_same_head success noop same success work same --keep-base --keep-base master +test_rebase_same_head success noop same success work same --fork-point --onto main... main +test_rebase_same_head success noop same success work same --keep-base --keep-base main test_expect_success 'add work same to side' ' test_commit E @@ -104,22 +107,22 @@ test_expect_success 'add work same to side' ' changes='our changes' test_rebase_same_head success noop same success work same -test_rebase_same_head success noop same success work same master +test_rebase_same_head success noop same success work same main test_rebase_same_head success noop same success work diff --onto B B test_rebase_same_head success noop same success work diff --onto B... B -test_rebase_same_head success noop same success work same --onto master... master -test_rebase_same_head success noop same success work same --keep-base master +test_rebase_same_head success noop same success work same --onto main... main +test_rebase_same_head success noop same success work same --keep-base main test_rebase_same_head success noop same success work same --keep-base test_rebase_same_head success noop same success work same --no-fork-point test_rebase_same_head success noop same success work same --keep-base --no-fork-point -test_rebase_same_head success noop same success work same --fork-point master +test_rebase_same_head success noop same success work same --fork-point main test_rebase_same_head success noop same success work diff --fork-point --onto B B test_rebase_same_head success noop same success work diff --fork-point --onto B... B -test_rebase_same_head success noop same success work same --fork-point --onto master... master -test_rebase_same_head success noop same success work same --fork-point --keep-base master +test_rebase_same_head success noop same success work same --fork-point --onto main... main +test_rebase_same_head success noop same success work same --fork-point --keep-base main test_expect_success 'add work same to upstream' ' - git checkout master && + git checkout main && test_commit F && git checkout side ' @@ -127,12 +130,12 @@ test_expect_success 'add work same to upstream' ' changes='our and their changes' test_rebase_same_head success noop same success work diff --onto B B test_rebase_same_head success noop same success work diff --onto B... B -test_rebase_same_head success noop same success work diff --onto master... master -test_rebase_same_head success noop same success work diff --keep-base master +test_rebase_same_head success noop same success work diff --onto main... main +test_rebase_same_head success noop same success work diff --keep-base main test_rebase_same_head success noop same success work diff --keep-base test_rebase_same_head failure work same success work diff --fork-point --onto B B test_rebase_same_head failure work same success work diff --fork-point --onto B... B -test_rebase_same_head success noop same success work diff --fork-point --onto master... master -test_rebase_same_head success noop same success work diff --fork-point --keep-base master +test_rebase_same_head success noop same success work diff --fork-point --onto main... main +test_rebase_same_head success noop same success work diff --fork-point --keep-base main test_done diff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh index c7c835cde9..e6fef696bb 100755 --- a/t/t3434-rebase-i18n.sh +++ b/t/t3434-rebase-i18n.sh @@ -7,13 +7,16 @@ test_description='rebase with changing encoding Initial setup: -1 - 2 master +1 - 2 main \ 3 - 4 first \ 5 - 6 second ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh compare_msg () { @@ -41,7 +44,7 @@ test_expect_success 'rebase --rebase-merges update encoding eucJP to UTF-8' ' git config i18n.commitencoding eucJP && git merge -F "$TEST_DIRECTORY/t3434/eucJP.txt" second && git config i18n.commitencoding UTF-8 && - git rebase --rebase-merges master && + git rebase --rebase-merges main && compare_msg eucJP.txt eucJP UTF-8 ' @@ -50,7 +53,7 @@ test_expect_success 'rebase --rebase-merges update encoding eucJP to ISO-2022-JP git config i18n.commitencoding eucJP && git merge -F "$TEST_DIRECTORY/t3434/eucJP.txt" second && git config i18n.commitencoding ISO-2022-JP && - git rebase --rebase-merges master && + git rebase --rebase-merges main && compare_msg eucJP.txt eucJP ISO-2022-JP ' @@ -66,7 +69,7 @@ test_rebase_continue_update_encode () { git config i18n.commitencoding $old && git commit -F "$TEST_DIRECTORY/t3434/$msgfile" && git config i18n.commitencoding $new && - test_must_fail git rebase -m master && + test_must_fail git rebase -m main && test -f .git/rebase-merge/message && git stripspace <.git/rebase-merge/message >two.t && git add two.t && diff --git a/t/t3435-rebase-gpg-sign.sh b/t/t3435-rebase-gpg-sign.sh index b47c59c190..ec10766858 100755 --- a/t/t3435-rebase-gpg-sign.sh +++ b/t/t3435-rebase-gpg-sign.sh @@ -5,6 +5,9 @@ test_description='test rebase --[no-]gpg-sign' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-rebase.sh" . "$TEST_DIRECTORY/lib-gpg.sh" @@ -46,7 +49,7 @@ test_expect_success 'setup: merge commit' ' test_commit fork-point && git switch -c side && test_commit three && - git switch master && + git switch main && git merge --no-ff side && git tag merged ' @@ -64,7 +67,63 @@ test_rebase_gpg_sign false -i --no-gpg-sign --gpg-sign test_expect_failure 'rebase -p --no-gpg-sign override commit.gpgsign' ' git reset --hard merged && git config commit.gpgsign true && - git rebase -p --no-gpg-sign --onto=one fork-point master && + git rebase -p --no-gpg-sign --onto=one fork-point main && + test_must_fail git verify-commit HEAD +' + +test_expect_success 'rebase -r, merge strategy, --gpg-sign will sign commit' ' + git reset --hard merged && + test_unconfig commit.gpgsign && + git rebase -fr --gpg-sign -s resolve --root && + git verify-commit HEAD +' + +test_expect_success 'rebase -r, merge strategy, commit.gpgsign=true will sign commit' ' + git reset --hard merged && + git config commit.gpgsign true && + git rebase -fr -s resolve --root && + git verify-commit HEAD +' + +test_expect_success 'rebase -r, merge strategy, commit.gpgsign=false --gpg-sign will sign commit' ' + git reset --hard merged && + git config commit.gpgsign false && + git rebase -fr --gpg-sign -s resolve --root && + git verify-commit HEAD +' + +test_expect_success "rebase -r, merge strategy, commit.gpgsign=true --no-gpg-sign won't sign commit" ' + git reset --hard merged && + git config commit.gpgsign true && + git rebase -fr --no-gpg-sign -s resolve --root && + test_must_fail git verify-commit HEAD +' + +test_expect_success 'rebase -r --gpg-sign will sign commit' ' + git reset --hard merged && + test_unconfig commit.gpgsign && + git rebase -fr --gpg-sign --root && + git verify-commit HEAD +' + +test_expect_success 'rebase -r with commit.gpgsign=true will sign commit' ' + git reset --hard merged && + git config commit.gpgsign true && + git rebase -fr --root && + git verify-commit HEAD +' + +test_expect_success 'rebase -r --gpg-sign with commit.gpgsign=false will sign commit' ' + git reset --hard merged && + git config commit.gpgsign false && + git rebase -fr --gpg-sign --root && + git verify-commit HEAD +' + +test_expect_success "rebase -r --no-gpg-sign with commit.gpgsign=true won't sign commit" ' + git reset --hard merged && + git config commit.gpgsign true && + git rebase -fr --no-gpg-sign --root && test_must_fail git verify-commit HEAD ' diff --git a/t/t3436-rebase-more-options.sh b/t/t3436-rebase-more-options.sh index 996e82787e..4d106642ba 100755 --- a/t/t3436-rebase-more-options.sh +++ b/t/t3436-rebase-more-options.sh @@ -28,7 +28,7 @@ test_expect_success 'setup' ' test_commit commit2 foo foo2 && test_commit commit3 foo foo3 && - git checkout --orphan master && + git checkout --orphan main && rm foo && test_write_lines "line 1" " line 2" "line 3" >file && git commit -am "add file" && @@ -65,8 +65,8 @@ test_expect_success '--ignore-whitespace is remembered when continuing' ' ' test_ctime_is_atime () { - git log $1 --format=%ai >authortime && - git log $1 --format=%ci >committertime && + git log $1 --format="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> %ai" >authortime && + git log $1 --format="%cn <%ce> %ci" >committertime && test_cmp authortime committertime } diff --git a/t/t3437-rebase-fixup-options.sh b/t/t3437-rebase-fixup-options.sh new file mode 100755 index 0000000000..c023fefd68 --- /dev/null +++ b/t/t3437-rebase-fixup-options.sh @@ -0,0 +1,211 @@ +#!/bin/sh +# +# Copyright (c) 2018 Phillip Wood +# + +test_description='git rebase interactive fixup options + +This test checks the "fixup [-C|-c]" command of rebase interactive. +In addition to amending the contents of the commit, "fixup -C" +replaces the original commit message with the message of the fixup +commit. "fixup -c" also replaces the original message, but opens the +editor to allow the user to edit the message before committing. Similar +to the "fixup" command that works with "fixup!", "fixup -C" works with +"amend!" upon --autosquash. +' + +. ./test-lib.sh + +. "$TEST_DIRECTORY"/lib-rebase.sh + +EMPTY="" + +# test_commit_message <rev> -m <msg> +# test_commit_message <rev> <path> +# Verify that the commit message of <rev> matches +# <msg> or the content of <path>. +test_commit_message () { + git show --no-patch --pretty=format:%B "$1" >actual && + case "$2" in + -m) + echo "$3" >expect && + test_cmp expect actual ;; + *) + test_cmp "$2" actual ;; + esac +} + +get_author () { + rev="$1" && + git log -1 --pretty=format:"%an %ae %at" "$rev" +} + +test_expect_success 'setup' ' + cat >message <<-EOF && + amend! B + $EMPTY + new subject + $EMPTY + new + body + EOF + + test_commit A A && + test_commit B B && + get_author HEAD >expected-author && + ORIG_AUTHOR_NAME="$GIT_AUTHOR_NAME" && + ORIG_AUTHOR_EMAIL="$GIT_AUTHOR_EMAIL" && + GIT_AUTHOR_NAME="Amend Author" && + GIT_AUTHOR_EMAIL="amend@example.com" && + test_commit "$(cat message)" A A1 A1 && + test_commit A2 A && + test_commit A3 A && + GIT_AUTHOR_NAME="$ORIG_AUTHOR_NAME" && + GIT_AUTHOR_EMAIL="$ORIG_AUTHOR_EMAIL" && + git checkout -b conflicts-branch A && + test_commit conflicts A && + + set_fake_editor && + git checkout -b branch B && + echo B1 >B && + test_tick && + git commit --fixup=HEAD -a && + git tag B1 && + test_tick && + FAKE_COMMIT_AMEND="edited 1" git commit --fixup=reword:B && + test_tick && + FAKE_COMMIT_AMEND="edited 2" git commit --fixup=reword:HEAD && + echo B2 >B && + test_tick && + FAKE_COMMIT_AMEND="edited squash" git commit --squash=HEAD -a && + git tag B2 && + echo B3 >B && + test_tick && + FAKE_COMMIT_AMEND="edited 3" git commit -a --fixup=amend:HEAD^ && + git tag B3 && + + GIT_AUTHOR_NAME="Rebase Author" && + GIT_AUTHOR_EMAIL="rebase.author@example.com" && + GIT_COMMITTER_NAME="Rebase Committer" && + GIT_COMMITTER_EMAIL="rebase.committer@example.com" +' + +test_expect_success 'simple fixup -C works' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A2 && + FAKE_LINES="1 fixup_-C 2" git rebase -i B && + test_cmp_rev HEAD^ B && + test_cmp_rev HEAD^{tree} A2^{tree} && + test_commit_message HEAD -m "A2" +' + +test_expect_success 'simple fixup -c works' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A2 && + git log -1 --pretty=format:%B >expected-fixup-message && + test_write_lines "" "Modified A2" >>expected-fixup-message && + FAKE_LINES="1 fixup_-c 2" \ + FAKE_COMMIT_AMEND="Modified A2" \ + git rebase -i B && + test_cmp_rev HEAD^ B && + test_cmp_rev HEAD^{tree} A2^{tree} && + test_commit_message HEAD expected-fixup-message +' + +test_expect_success 'fixup -C removes amend! from message' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A1 && + git log -1 --pretty=format:%b >expected-message && + FAKE_LINES="1 fixup_-C 2" git rebase -i A && + test_cmp_rev HEAD^ A && + test_cmp_rev HEAD^{tree} A1^{tree} && + test_commit_message HEAD expected-message && + get_author HEAD >actual-author && + test_cmp expected-author actual-author +' + +test_expect_success 'fixup -C with conflicts gives correct message' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A1 && + git log -1 --pretty=format:%b >expected-message && + test_write_lines "" "edited" >>expected-message && + test_must_fail env FAKE_LINES="1 fixup_-C 2" git rebase -i conflicts && + git checkout --theirs -- A && + git add A && + FAKE_COMMIT_AMEND=edited git rebase --continue && + test_cmp_rev HEAD^ conflicts && + test_cmp_rev HEAD^{tree} A1^{tree} && + test_commit_message HEAD expected-message && + get_author HEAD >actual-author && + test_cmp expected-author actual-author +' + +test_expect_success 'skipping fixup -C after fixup gives correct message' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A3 && + test_must_fail env FAKE_LINES="1 fixup 2 fixup_-C 4" git rebase -i A && + git reset --hard && + FAKE_COMMIT_AMEND=edited git rebase --continue && + test_commit_message HEAD -m "B" +' + +test_expect_success 'sequence of fixup, fixup -C & squash --signoff works' ' + git checkout --detach B3 && + FAKE_LINES="1 fixup 2 fixup_-C 3 fixup_-C 4 squash 5 fixup_-C 6" \ + FAKE_COMMIT_AMEND=squashed \ + FAKE_MESSAGE_COPY=actual-squash-message \ + git -c commit.status=false rebase -ik --signoff A && + git diff-tree --exit-code --patch HEAD B3 -- && + test_cmp_rev HEAD^ A && + test_cmp "$TEST_DIRECTORY/t3437/expected-squash-message" \ + actual-squash-message +' + +test_expect_success 'first fixup -C commented out in sequence fixup fixup -C fixup -C' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach B2~ && + git log -1 --pretty=format:%b >expected-message && + FAKE_LINES="1 fixup 2 fixup_-C 3 fixup_-C 4" git rebase -i A && + test_cmp_rev HEAD^ A && + test_commit_message HEAD expected-message +' + +test_expect_success 'multiple fixup -c opens editor once' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A3 && + git log -1 --pretty=format:%B >expected-message && + test_write_lines "" "Modified-A3" >>expected-message && + FAKE_COMMIT_AMEND="Modified-A3" \ + FAKE_LINES="1 fixup_-C 2 fixup_-c 3 fixup_-c 4" \ + EXPECT_HEADER_COUNT=4 \ + git rebase -i A && + test_cmp_rev HEAD^ A && + get_author HEAD >actual-author && + test_cmp expected-author actual-author && + test_commit_message HEAD expected-message +' + +test_expect_success 'sequence squash, fixup & fixup -c gives combined message' ' + test_when_finished "test_might_fail git rebase --abort" && + git checkout --detach A3 && + FAKE_LINES="1 squash 2 fixup 3 fixup_-c 4" \ + FAKE_MESSAGE_COPY=actual-combined-message \ + git -c commit.status=false rebase -i A && + test_cmp "$TEST_DIRECTORY/t3437/expected-combined-message" \ + actual-combined-message && + test_cmp_rev HEAD^ A +' + +test_expect_success 'fixup -C works upon --autosquash with amend!' ' + git checkout --detach B3 && + FAKE_COMMIT_AMEND=squashed \ + FAKE_MESSAGE_COPY=actual-squash-message \ + git -c commit.status=false rebase -ik --autosquash \ + --signoff A && + git diff-tree --exit-code --patch HEAD B3 -- && + test_cmp_rev HEAD^ A && + test_cmp "$TEST_DIRECTORY/t3437/expected-squash-message" \ + actual-squash-message +' + +test_done diff --git a/t/t3437/expected-combined-message b/t/t3437/expected-combined-message new file mode 100644 index 0000000000..a26cfb2fa9 --- /dev/null +++ b/t/t3437/expected-combined-message @@ -0,0 +1,21 @@ +# This is a combination of 4 commits. +# This is the 1st commit message: + +B + +# This is the commit message #2: + +# amend! B + +new subject + +new +body + +# The commit message #3 will be skipped: + +# A2 + +# This is the commit message #4: + +A3 diff --git a/t/t3437/expected-squash-message b/t/t3437/expected-squash-message new file mode 100644 index 0000000000..ab2434f90e --- /dev/null +++ b/t/t3437/expected-squash-message @@ -0,0 +1,51 @@ +# This is a combination of 6 commits. +# The 1st commit message will be skipped: + +# B +# +# Signed-off-by: Rebase Committer <rebase.committer@example.com> + +# The commit message #2 will be skipped: + +# fixup! B + +# The commit message #3 will be skipped: + +# amend! B +# +# B +# +# edited 1 +# +# Signed-off-by: Rebase Committer <rebase.committer@example.com> + +# This is the commit message #4: + +# amend! amend! B + +B + +edited 1 + +edited 2 + +Signed-off-by: Rebase Committer <rebase.committer@example.com> + +# This is the commit message #5: + +# squash! amend! amend! B + +edited squash + +# This is the commit message #6: + +# amend! amend! amend! B + +B + +edited 1 + +edited 2 + +edited 3 +squashed diff --git a/t/t3500-cherry.sh b/t/t3500-cherry.sh index 2b8d9cb38e..0458a58b4b 100755 --- a/t/t3500-cherry.sh +++ b/t/t3500-cherry.sh @@ -5,9 +5,12 @@ test_description='git cherry should detect patches integrated upstream -This test cherry-picks one local change of two into master branch, and +This test cherry-picks one local change of two into main branch, and checks that git cherry only returns the second patch in the local branch ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh GIT_AUTHOR_EMAIL=bogus_email_address @@ -32,7 +35,7 @@ test_expect_success \ test_tick && git commit -m "Add C." && - git checkout -f master && + git checkout -f main && rm -f B C && echo Third >> A && @@ -40,19 +43,19 @@ test_expect_success \ test_tick && git commit -m "Modify A." && - expr "$(echo $(git cherry master my-topic-branch) )" : "+ [^ ]* + .*" + expr "$(echo $(git cherry main my-topic-branch) )" : "+ [^ ]* + .*" ' test_expect_success \ 'check that cherry with limit returns only the top patch'\ - 'expr "$(echo $(git cherry master my-topic-branch my-topic-branch^1) )" : "+ [^ ]*" + 'expr "$(echo $(git cherry main my-topic-branch my-topic-branch^1) )" : "+ [^ ]*" ' test_expect_success \ 'cherry-pick one of the 2 patches, and check cherry recognized one and only one as new' \ 'git cherry-pick my-topic-branch^0 && - echo $(git cherry master my-topic-branch) && - expr "$(echo $(git cherry master my-topic-branch) )" : "+ [^ ]* - .*" + echo $(git cherry main my-topic-branch) && + expr "$(echo $(git cherry main my-topic-branch) )" : "+ [^ ]* - .*" ' test_expect_success 'cherry ignores whitespace' ' diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh index 3669dfb1be..9d100cd188 100755 --- a/t/t3501-revert-cherry-pick.sh +++ b/t/t3501-revert-cherry-pick.sh @@ -10,6 +10,9 @@ test_description='test cherry-pick and revert with renames ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -112,7 +115,7 @@ test_expect_success 'cherry-pick on unborn branch' ' test_expect_success 'cherry-pick "-" to pick from previous branch' ' git checkout unborn && test_commit to-pick actual content && - git checkout master && + git checkout main && git cherry-pick - && echo content >expect && test_cmp expect actual @@ -132,7 +135,7 @@ test_expect_success 'cherry-pick "-" is meaningless without checkout' ' test_expect_success 'cherry-pick "-" works with arguments' ' git checkout -b side-branch && test_commit change actual change && - git checkout master && + git checkout main && git cherry-pick -s - && echo "Signed-off-by: C O Mitter <committer@example.com>" >expect && git cat-file commit HEAD | grep ^Signed-off-by: >signoff && diff --git a/t/t3502-cherry-pick-merge.sh b/t/t3502-cherry-pick-merge.sh index 8b635a196d..5495eacfec 100755 --- a/t/t3502-cherry-pick-merge.sh +++ b/t/t3502-cherry-pick-merge.sh @@ -8,6 +8,9 @@ test_description='cherry picking and reverting a merge ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -25,7 +28,7 @@ test_expect_success setup ' echo new line >B && git commit -m "add line to B" B && git tag b && - git checkout master && + git checkout main && git merge side && git tag c diff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh index e27f39d1e5..95fe4feaee 100755 --- a/t/t3503-cherry-pick-root.sh +++ b/t/t3503-cherry-pick-root.sh @@ -2,6 +2,9 @@ test_description='test cherry-picking (and reverting) a root commit' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -30,7 +33,7 @@ test_expect_success setup ' test_expect_success 'cherry-pick a root commit' ' git checkout second^0 && - git cherry-pick master && + git cherry-pick main && echo first >expect && test_cmp expect file1 @@ -38,14 +41,14 @@ test_expect_success 'cherry-pick a root commit' ' test_expect_success 'revert a root commit' ' - git revert master && + git revert main && test_path_is_missing file1 ' test_expect_success 'cherry-pick a root commit with an external strategy' ' - git cherry-pick --strategy=resolve master && + git cherry-pick --strategy=resolve main && echo first >expect && test_cmp expect file1 @@ -53,7 +56,7 @@ test_expect_success 'cherry-pick a root commit with an external strategy' ' test_expect_success 'revert a root commit with an external strategy' ' - git revert --strategy=resolve master && + git revert --strategy=resolve main && test_path_is_missing file1 ' @@ -65,7 +68,7 @@ test_expect_success 'cherry-pick two root commits' ' echo third >expect.file3 && git checkout second^0 && - git cherry-pick master third && + git cherry-pick main third && test_cmp expect.file1 file1 && test_cmp expect.file2 file2 && diff --git a/t/t3504-cherry-pick-rerere.sh b/t/t3504-cherry-pick-rerere.sh index 80a0d08706..4581ae98b8 100755 --- a/t/t3504-cherry-pick-rerere.sh +++ b/t/t3504-cherry-pick-rerere.sh @@ -2,12 +2,15 @@ test_description='cherry-pick should rerere for conflicts' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' test_commit foo && - test_commit foo-master foo && - test_commit bar-master bar && + test_commit foo-main foo && + test_commit bar-main bar && git checkout -b dev foo && test_commit foo-dev foo && @@ -16,7 +19,7 @@ test_expect_success setup ' ' test_expect_success 'conflicting merge' ' - test_must_fail git merge master + test_must_fail git merge main ' test_expect_success 'fixup' ' @@ -29,7 +32,7 @@ test_expect_success 'fixup' ' ' test_expect_success 'cherry-pick conflict with --rerere-autoupdate' ' - test_must_fail git cherry-pick --rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --rerere-autoupdate foo..bar-main && test_cmp foo-expect foo && git diff-files --quiet && test_must_fail git cherry-pick --continue && @@ -41,7 +44,7 @@ test_expect_success 'cherry-pick conflict with --rerere-autoupdate' ' test_expect_success 'cherry-pick conflict repsects rerere.autoUpdate' ' test_config rerere.autoUpdate true && - test_must_fail git cherry-pick foo..bar-master && + test_must_fail git cherry-pick foo..bar-main && test_cmp foo-expect foo && git diff-files --quiet && test_must_fail git cherry-pick --continue && @@ -53,7 +56,7 @@ test_expect_success 'cherry-pick conflict repsects rerere.autoUpdate' ' test_expect_success 'cherry-pick conflict with --no-rerere-autoupdate' ' test_config rerere.autoUpdate true && - test_must_fail git cherry-pick --no-rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --no-rerere-autoupdate foo..bar-main && test_cmp foo-expect foo && test_must_fail git diff-files --quiet && git add foo && @@ -66,38 +69,38 @@ test_expect_success 'cherry-pick conflict with --no-rerere-autoupdate' ' ' test_expect_success 'cherry-pick --continue rejects --rerere-autoupdate' ' - test_must_fail git cherry-pick --rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --rerere-autoupdate foo..bar-main && test_cmp foo-expect foo && git diff-files --quiet && test_must_fail git cherry-pick --continue --rerere-autoupdate >actual 2>&1 && echo "fatal: cherry-pick: --rerere-autoupdate cannot be used with --continue" >expect && - test_i18ncmp expect actual && + test_cmp expect actual && test_must_fail git cherry-pick --continue --no-rerere-autoupdate >actual 2>&1 && echo "fatal: cherry-pick: --no-rerere-autoupdate cannot be used with --continue" >expect && - test_i18ncmp expect actual && + test_cmp expect actual && git cherry-pick --abort ' test_expect_success 'cherry-pick --rerere-autoupdate more than once' ' - test_must_fail git cherry-pick --rerere-autoupdate --rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --rerere-autoupdate --rerere-autoupdate foo..bar-main && test_cmp foo-expect foo && git diff-files --quiet && git cherry-pick --abort && - test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate foo..bar-main && test_cmp foo-expect foo && git diff-files --quiet && git cherry-pick --abort && - test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate foo..bar-master && + test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate foo..bar-main && test_must_fail git diff-files --quiet && git cherry-pick --abort ' test_expect_success 'cherry-pick conflict without rerere' ' test_config rerere.enabled false && - test_must_fail git cherry-pick foo-master && + test_must_fail git cherry-pick foo-main && grep ===== foo && grep foo-dev foo && - grep foo-master foo + grep foo-main foo ' test_done diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh index 5f911bb529..eba3c38d5a 100755 --- a/t/t3505-cherry-pick-empty.sh +++ b/t/t3505-cherry-pick-empty.sh @@ -2,6 +2,9 @@ test_description='test cherry-picking an empty commit' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -17,7 +20,7 @@ test_expect_success setup ' test_tick && git commit --allow-empty-message -m "" && - git checkout master && + git checkout main && git checkout -b empty-change-branch && test_tick && git commit --allow-empty -m "empty" @@ -25,7 +28,7 @@ test_expect_success setup ' ' test_expect_success 'cherry-pick an empty commit' ' - git checkout master && + git checkout main && test_expect_code 1 git cherry-pick empty-change-branch ' @@ -35,7 +38,7 @@ test_expect_success 'index lockfile was removed' ' test_expect_success 'cherry-pick a commit with an empty message' ' test_when_finished "git reset --hard empty-message-branch~1" && - git checkout master && + git checkout main && git cherry-pick empty-message-branch ' @@ -44,12 +47,12 @@ test_expect_success 'index lockfile was removed' ' ' test_expect_success 'cherry-pick a commit with an empty message with --allow-empty-message' ' - git checkout -f master && + git checkout -f main && git cherry-pick --allow-empty-message empty-message-branch ' test_expect_success 'cherry pick an empty non-ff commit without --allow-empty' ' - git checkout master && + git checkout main && echo fourth >>file2 && git add file2 && git commit -m "fourth" && @@ -57,22 +60,22 @@ test_expect_success 'cherry pick an empty non-ff commit without --allow-empty' ' ' test_expect_success 'cherry pick an empty non-ff commit with --allow-empty' ' - git checkout master && + git checkout main && git cherry-pick --allow-empty empty-change-branch ' test_expect_success 'cherry pick with --keep-redundant-commits' ' - git checkout master && + git checkout main && git cherry-pick --keep-redundant-commits HEAD^ ' test_expect_success 'cherry-pick a commit that becomes no-op (prep)' ' - git checkout master && + git checkout main && git branch fork && echo foo >file2 && git add file2 && test_tick && - git commit -m "add file2 on master" && + git commit -m "add file2 on main" && git checkout fork && echo foo >file2 && @@ -84,15 +87,15 @@ test_expect_success 'cherry-pick a commit that becomes no-op (prep)' ' test_expect_success 'cherry-pick a no-op without --keep-redundant' ' git reset --hard && git checkout fork^0 && - test_must_fail git cherry-pick master + test_must_fail git cherry-pick main ' test_expect_success 'cherry-pick a no-op with --keep-redundant' ' git reset --hard && git checkout fork^0 && - git cherry-pick --keep-redundant-commits master && + git cherry-pick --keep-redundant-commits main && git show -s --format=%s >actual && - echo "add file2 on master" >expect && + echo "add file2 on main" >expect && test_cmp expect actual ' diff --git a/t/t3506-cherry-pick-ff.sh b/t/t3506-cherry-pick-ff.sh index 9d5adbc130..7e11bd4a4c 100755 --- a/t/t3506-cherry-pick-ff.sh +++ b/t/t3506-cherry-pick-ff.sh @@ -2,6 +2,9 @@ test_description='test cherry-picking with --ff option' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -24,7 +27,7 @@ test_expect_success setup ' ' test_expect_success 'cherry-pick using --ff fast forwards' ' - git checkout master && + git checkout main && git reset --hard first && test_tick && git cherry-pick --ff second && @@ -32,7 +35,7 @@ test_expect_success 'cherry-pick using --ff fast forwards' ' ' test_expect_success 'cherry-pick not using --ff does not fast forwards' ' - git checkout master && + git checkout main && git reset --hard first && test_tick && git cherry-pick second && @@ -49,7 +52,7 @@ test_expect_success 'cherry-pick not using --ff does not fast forwards' ' # (This has been taken from t3502-cherry-pick-merge.sh) # test_expect_success 'merge setup' ' - git checkout master && + git checkout main && git reset --hard first && echo new line >A && git add A && @@ -62,7 +65,7 @@ test_expect_success 'merge setup' ' test_tick && git commit -m "add line to B" B && git tag B && - git checkout master && + git checkout main && git merge side && git tag C && git checkout -b new A diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh index a21adcf0e4..014001b8f3 100755 --- a/t/t3507-cherry-pick-conflict.sh +++ b/t/t3507-cherry-pick-conflict.sh @@ -9,6 +9,9 @@ test_description='test cherry-pick and revert with conflicts ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh pristine_detach () { @@ -29,7 +32,7 @@ test_expect_success setup ' test_commit redundant-pick foo c redundant && git commit --allow-empty --allow-empty-message && git tag empty && - git checkout master && + git checkout main && git config advice.detachedhead false ' @@ -56,7 +59,7 @@ test_expect_success 'advice from failed cherry-pick' " EOF test_must_fail git cherry-pick picked 2>actual && - test_i18ncmp expected actual + test_cmp expected actual " test_expect_success 'advice from failed cherry-pick --no-commit' " @@ -70,7 +73,7 @@ test_expect_success 'advice from failed cherry-pick --no-commit' " EOF test_must_fail git cherry-pick --no-commit picked 2>actual && - test_i18ncmp expected actual + test_cmp expected actual " test_expect_success 'failed cherry-pick sets CHERRY_PICK_HEAD' ' @@ -253,7 +256,7 @@ test_expect_success \ test_must_fail git cherry-pick picked && - test_i18ncmp expected .git/MERGE_MSG + test_cmp expected .git/MERGE_MSG ' test_expect_success \ @@ -273,7 +276,7 @@ test_expect_success \ test_must_fail git cherry-pick --cleanup=scissors picked && - test_i18ncmp expected .git/MERGE_MSG + test_cmp expected .git/MERGE_MSG ' test_expect_success 'failed cherry-pick describes conflict in work tree' ' @@ -462,7 +465,7 @@ test_expect_success \ test_must_fail git revert picked && sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success \ @@ -485,7 +488,7 @@ test_expect_success \ test_must_fail git revert --cleanup=scissors picked && sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'failed cherry-pick does not forget -s' ' diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh index 23070a7b73..e8375d1c97 100755 --- a/t/t3508-cherry-pick-many-commits.sh +++ b/t/t3508-cherry-pick-many-commits.sh @@ -2,6 +2,9 @@ test_description='test cherry-picking many commits' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_head_differs_from() { @@ -31,7 +34,7 @@ test_expect_success setup ' ' test_expect_success 'cherry-pick first..fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick first..fourth && @@ -45,7 +48,7 @@ test_expect_success 'cherry-pick three one two works' ' test_commit one && test_commit two && test_commit three && - git checkout -f master && + git checkout -f main && git reset --hard first && git cherry-pick three one two && git diff --quiet three && @@ -56,38 +59,38 @@ two" ' test_expect_success 'cherry-pick three one two: fails' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_must_fail git cherry-pick three one two: ' test_expect_success 'output to keep user entertained during multi-pick' ' cat <<-\EOF >expected && - [master OBJID] second + [main OBJID] second Author: A U Thor <author@example.com> Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) - [master OBJID] third + [main OBJID] third Author: A U Thor <author@example.com> Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) - [master OBJID] fourth + [main OBJID] fourth Author: A U Thor <author@example.com> Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick first..fourth >actual && sed -e "s/$_x05[0-9a-f][0-9a-f]/OBJID/" <actual >actual.fuzzy && test_line_count -ge 3 actual.fuzzy && - test_i18ncmp expected actual.fuzzy + test_cmp expected actual.fuzzy ' test_expect_success 'cherry-pick --strategy resolve first..fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick --strategy resolve first..fourth && @@ -99,32 +102,32 @@ test_expect_success 'cherry-pick --strategy resolve first..fourth works' ' test_expect_success 'output during multi-pick indicates merge strategy' ' cat <<-\EOF >expected && Trying simple merge. - [master OBJID] second + [main OBJID] second Author: A U Thor <author@example.com> Date: Thu Apr 7 15:14:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. - [master OBJID] third + [main OBJID] third Author: A U Thor <author@example.com> Date: Thu Apr 7 15:15:13 2005 -0700 1 file changed, 1 insertion(+) Trying simple merge. - [master OBJID] fourth + [main OBJID] fourth Author: A U Thor <author@example.com> Date: Thu Apr 7 15:16:13 2005 -0700 1 file changed, 1 insertion(+) EOF - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick --strategy resolve first..fourth >actual && sed -e "s/$_x05[0-9a-f][0-9a-f]/OBJID/" <actual >actual.fuzzy && - test_i18ncmp expected actual.fuzzy + test_cmp expected actual.fuzzy ' test_expect_success 'cherry-pick --ff first..fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick --ff first..fourth && @@ -134,7 +137,7 @@ test_expect_success 'cherry-pick --ff first..fourth works' ' ' test_expect_success 'cherry-pick -n first..fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick -n first..fourth && @@ -144,7 +147,7 @@ test_expect_success 'cherry-pick -n first..fourth works' ' ' test_expect_success 'revert first..fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard fourth && test_tick && git revert first..fourth && @@ -154,7 +157,7 @@ test_expect_success 'revert first..fourth works' ' ' test_expect_success 'revert ^first fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard fourth && test_tick && git revert ^first fourth && @@ -164,7 +167,7 @@ test_expect_success 'revert ^first fourth works' ' ' test_expect_success 'revert fourth fourth~1 fourth~2 works' ' - git checkout -f master && + git checkout -f main && git reset --hard fourth && test_tick && git revert fourth fourth~1 fourth~2 && @@ -174,7 +177,7 @@ test_expect_success 'revert fourth fourth~1 fourth~2 works' ' ' test_expect_success 'cherry-pick -3 fourth works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git cherry-pick -3 fourth && @@ -184,7 +187,7 @@ test_expect_success 'cherry-pick -3 fourth works' ' ' test_expect_success 'cherry-pick --stdin works' ' - git checkout -f master && + git checkout -f main && git reset --hard first && test_tick && git rev-list --reverse first..fourth | git cherry-pick --stdin && diff --git a/t/t3509-cherry-pick-merge-df.sh b/t/t3509-cherry-pick-merge-df.sh index 1e5b3948df..f4159246e1 100755 --- a/t/t3509-cherry-pick-merge-df.sh +++ b/t/t3509-cherry-pick-merge-df.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Test cherry-pick with directory/file conflicts' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'Initialize repository' ' @@ -28,7 +31,7 @@ test_expect_success 'Setup rename across paths each below D/F conflicts' ' test_expect_success 'Cherry-pick succeeds with rename across D/F conflicts' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && git cherry-pick branch ' diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 5b94fdaa67..49010aa946 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -65,7 +65,7 @@ test_expect_success 'cherry-pick persists opts correctly' ' # gets interrupted, use a high-enough number that is larger # than the number of parents of any commit we have created mainline=4 && - test_expect_code 128 git cherry-pick -s -m $mainline --strategy=recursive -X patience -X ours initial..anotherpick && + test_expect_code 128 git cherry-pick -s -m $mainline --strategy=recursive -X patience -X ours --edit initial..anotherpick && test_path_is_dir .git/sequencer && test_path_is_file .git/sequencer/head && test_path_is_file .git/sequencer/todo && @@ -84,6 +84,36 @@ test_expect_success 'cherry-pick persists opts correctly' ' ours EOF git config --file=.git/sequencer/opts --get-all options.strategy-option >actual && + test_cmp expect actual && + echo "true" >expect && + git config --file=.git/sequencer/opts --get-all options.edit >actual && + test_cmp expect actual +' + +test_expect_success 'revert persists opts correctly' ' + pristine_detach initial && + # to make sure that the session to revert a sequence + # gets interrupted, revert commits that are not in the history + # of HEAD. + test_expect_code 1 git revert -s --strategy=recursive -X patience -X ours --no-edit picked yetanotherpick && + test_path_is_dir .git/sequencer && + test_path_is_file .git/sequencer/head && + test_path_is_file .git/sequencer/todo && + test_path_is_file .git/sequencer/opts && + echo "true" >expect && + git config --file=.git/sequencer/opts --get-all options.signoff >actual && + test_cmp expect actual && + echo "recursive" >expect && + git config --file=.git/sequencer/opts --get-all options.strategy >actual && + test_cmp expect actual && + cat >expect <<-\EOF && + patience + ours + EOF + git config --file=.git/sequencer/opts --get-all options.strategy-option >actual && + test_cmp expect actual && + echo "false" >expect && + git config --file=.git/sequencer/opts --get-all options.edit >actual && test_cmp expect actual ' @@ -170,7 +200,7 @@ test_expect_success 'check advice when we move HEAD by committing' ' git commit -a && test_path_is_missing .git/CHERRY_PICK_HEAD && test_must_fail git cherry-pick --skip 2>advice && - test_i18ncmp expect advice + test_cmp expect advice ' test_expect_success 'selectively advise --skip while launching another sequence' ' @@ -182,7 +212,7 @@ test_expect_success 'selectively advise --skip while launching another sequence' EOF test_must_fail git cherry-pick picked..yetanotherpick && test_must_fail git cherry-pick picked..yetanotherpick 2>advice && - test_i18ncmp expect advice && + test_cmp expect advice && cat >expect <<-EOF && error: cherry-pick is already in progress hint: try "git cherry-pick (--continue | --abort | --quit)" @@ -190,7 +220,7 @@ test_expect_success 'selectively advise --skip while launching another sequence' EOF git reset --merge && test_must_fail git cherry-pick picked..yetanotherpick 2>advice && - test_i18ncmp expect advice + test_cmp expect advice ' test_expect_success 'allow skipping commit but not abort for a new history' ' @@ -204,7 +234,7 @@ test_expect_success 'allow skipping commit but not abort for a new history' ' test_must_fail git cherry-pick anotherpick && test_must_fail git cherry-pick --abort 2>advice && git cherry-pick --skip && - test_i18ncmp expect advice + test_cmp expect advice ' test_expect_success 'allow skipping stopped cherry-pick because of untracked file modifications' ' diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh index 6ece1d8573..c657840db3 100755 --- a/t/t3512-cherry-pick-submodule.sh +++ b/t/t3512-cherry-pick-submodule.sh @@ -2,11 +2,17 @@ test_description='cherry-pick can handle submodules' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-submodule-update.sh -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" != ort +then + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch "cherry-pick" test_expect_success 'unrelated submodule/file conflict is ignored' ' @@ -35,7 +41,7 @@ test_expect_success 'unrelated submodule/file conflict is ignored' ' git add a_file && git commit -m "modify a file" && - git checkout master && + git checkout main && git submodule add ../sub sub && git submodule update sub && diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh index a759f12cbb..8bfe3ed246 100755 --- a/t/t3513-revert-submodule.sh +++ b/t/t3513-revert-submodule.sh @@ -14,7 +14,7 @@ test_description='revert can handle submodules' git_revert () { git status -su >expect && ls -1pR * >>expect && - tar cf "$TRASH_DIRECTORY/tmp.tar" * && + "$TAR" cf "$TRASH_DIRECTORY/tmp.tar" * && may_only_be_test_must_fail "$2" && $2 git checkout "$1" && if test -n "$2" @@ -23,14 +23,17 @@ git_revert () { fi && git revert HEAD && rm -rf * && - tar xf "$TRASH_DIRECTORY/tmp.tar" && + "$TAR" xf "$TRASH_DIRECTORY/tmp.tar" && git status -su >actual && ls -1pR * >>actual && test_cmp expect actual && git revert HEAD } -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 +if test "$GIT_TEST_MERGE_ALGORITHM" != ort +then + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 +fi test_submodule_switch_func "git_revert" test_done diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index efec8d13b6..bb9ef35dac 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -5,6 +5,9 @@ test_description='Test of the various options to git rm.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Setup some files to be removed, some with funny characters @@ -240,7 +243,7 @@ test_expect_success 'refresh index before checking if it is up-to-date' ' test_path_is_missing frotz/nitfol ' -test_expect_success 'choking "git rm" should not let it die with cruft' ' +choke_git_rm_setup() { git reset -q --hard && test_when_finished "rm -f .git/index.lock && git reset -q --hard" && i=0 && @@ -249,12 +252,24 @@ test_expect_success 'choking "git rm" should not let it die with cruft' ' do echo "100644 $hash 0 some-file-$i" i=$(( $i + 1 )) - done | git update-index --index-info && + done | git update-index --index-info +} + +test_expect_success 'choking "git rm" should not let it die with cruft (induce SIGPIPE)' ' + choke_git_rm_setup && # git command is intentionally placed upstream of pipe to induce SIGPIPE git rm -n "some-file-*" | : && test_path_is_missing .git/index.lock ' + +test_expect_success !MINGW 'choking "git rm" should not let it die with cruft (induce and check SIGPIPE)' ' + choke_git_rm_setup && + OUT=$( ((trap "" PIPE; git rm -n "some-file-*"; echo $? 1>&3) | :) 3>&1 ) && + test_match_signal 13 "$OUT" && + test_path_is_missing .git/index.lock +' + test_expect_success 'Resolving by removal is not a warning-worthy event' ' git reset -q --hard && test_when_finished "rm -f .git/index.lock msg && git reset -q --hard" && @@ -439,7 +454,7 @@ test_expect_success 'rm issues a warning when section is not found in .gitmodule git add .gitmodules && echo "warning: Could not find section in .gitmodules where path=submod" >expect.err && git rm submod >actual 2>actual.err && - test_i18ncmp expect.err actual.err && + test_cmp expect.err actual.err && test_path_is_missing submod && test_path_is_missing submod/.git && git status -s -uno >actual && @@ -483,16 +498,16 @@ test_expect_success 'setup submodule conflict' ' echo 1 >nitfol && git add nitfol && git commit -m "added nitfol 1" && - git checkout -b branch2 master && + git checkout -b branch2 main && echo 2 >nitfol && git add nitfol && git commit -m "added nitfol 2" && - git checkout -b conflict1 master && + git checkout -b conflict1 main && git -C submod fetch && git -C submod checkout branch1 && git add submod && git commit -m "submod 1" && - git checkout -b conflict2 master && + git checkout -b conflict2 main && git -C submod checkout branch2 && git add submod && git commit -m "submod 2" @@ -604,7 +619,7 @@ test_expect_success 'rm of a conflicted unpopulated submodule succeeds' ' ' test_expect_success 'rm of a populated submodule with a .git directory migrates git dir' ' - git checkout -f master && + git checkout -f main && git reset --hard && git submodule update && ( @@ -717,7 +732,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual git checkout HEAD^ && git submodule update && git checkout -q HEAD^ && - git checkout -q master 2>actual && + git checkout -q main 2>actual && test_i18ngrep "^warning: unable to rmdir '\''submod'\'':" actual && git status -s submod >actual && echo "?? submod/" >expected && @@ -809,7 +824,7 @@ test_expect_success 'rm files with different staged content' ' echo content1 >foo.txt && echo content1 >bar.txt && test_must_fail git rm foo.txt bar.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm files with different staged content without hints' ' @@ -822,7 +837,7 @@ test_expect_success 'rm files with different staged content without hints' ' echo content2 >foo.txt && echo content2 >bar.txt && test_must_fail git -c advice.rmhints=false rm foo.txt bar.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm file with local modification' ' @@ -834,7 +849,7 @@ test_expect_success 'rm file with local modification' ' git commit -m "testing rm 3" && echo content3 >foo.txt && test_must_fail git rm foo.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm file with local modification without hints' ' @@ -844,7 +859,7 @@ test_expect_success 'rm file with local modification without hints' ' EOF echo content4 >bar.txt && test_must_fail git -c advice.rmhints=false rm bar.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm file with changes in the index' ' @@ -857,7 +872,7 @@ test_expect_success 'rm file with changes in the index' ' echo content5 >foo.txt && git add foo.txt && test_must_fail git rm foo.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm file with changes in the index without hints' ' @@ -866,7 +881,7 @@ test_expect_success 'rm file with changes in the index without hints' ' foo.txt EOF test_must_fail git -c advice.rmhints=false rm foo.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm files with two different errors' ' @@ -885,7 +900,7 @@ test_expect_success 'rm files with two different errors' ' echo content6 >bar1.txt && git add bar1.txt && test_must_fail git rm bar1.txt foo1.txt 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'rm empty string should fail' ' diff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh new file mode 100755 index 0000000000..e9e9a15c74 --- /dev/null +++ b/t/t3602-rm-sparse-checkout.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +test_description='git rm in sparse checked out working trees' + +. ./test-lib.sh + +test_expect_success 'setup' " + mkdir -p sub/dir && + touch a b c sub/d sub/dir/e && + git add -A && + git commit -m files && + + cat >sparse_error_header <<-EOF && + The following pathspecs didn't match any eligible path, but they do match index + entries outside the current sparse checkout: + EOF + + cat >sparse_hint <<-EOF && + hint: Disable or modify the sparsity rules if you intend to update such entries. + hint: Disable this message with \"git config advice.updateSparsePath false\" + EOF + + echo b | cat sparse_error_header - >sparse_entry_b_error && + cat sparse_entry_b_error sparse_hint >b_error_and_hint +" + +for opt in "" -f --dry-run +do + test_expect_success "rm${opt:+ $opt} does not remove sparse entries" ' + git sparse-checkout set a && + test_must_fail git rm $opt b 2>stderr && + test_cmp b_error_and_hint stderr && + git ls-files --error-unmatch b + ' +done + +test_expect_success 'recursive rm does not remove sparse entries' ' + git reset --hard && + git sparse-checkout set sub/dir && + git rm -r sub && + git status --porcelain -uno >actual && + echo "D sub/dir/e" >expected && + test_cmp expected actual +' + +test_expect_success 'rm obeys advice.updateSparsePath' ' + git reset --hard && + git sparse-checkout set a && + test_must_fail git -c advice.updateSparsePath=false rm b 2>stderr && + test_cmp sparse_entry_b_error stderr +' + +test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' + git reset --hard && + git sparse-checkout set a && + test_must_fail git rm nonexistent 2>stderr && + grep "fatal: pathspec .nonexistent. did not match any files" stderr && + ! grep -F -f sparse_error_header stderr +' + +test_expect_success 'do not warn about sparse entries when pathspec matches dense entries' ' + git reset --hard && + git sparse-checkout set a && + git rm "[ba]" 2>stderr && + test_must_be_empty stderr && + git ls-files --error-unmatch b && + test_must_fail git ls-files --error-unmatch a +' + +test_expect_success 'do not warn about sparse entries with --ignore-unmatch' ' + git reset --hard && + git sparse-checkout set a && + git rm --ignore-unmatch b 2>stderr && + test_must_be_empty stderr && + git ls-files --error-unmatch b +' + +test_done diff --git a/t/t3700-add.sh b/t/t3700-add.sh index b7d4ba608c..4086e1ebbc 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -196,6 +196,12 @@ test_expect_success 'git add --refresh with pathspec' ' grep baz actual ' +test_expect_success 'git add --refresh correctly reports no match error' " + echo \"fatal: pathspec ':(icase)nonexistent' did not match any files\" >expect && + test_must_fail git add --refresh ':(icase)nonexistent' 2>actual && + test_cmp expect actual +" + test_expect_success POSIXPERM,SANITY 'git add should fail atomically upon an unreadable file' ' git reset --hard && date >foo1 && @@ -304,7 +310,7 @@ test_expect_success 'error on a repository with no commits' ' error: '"'empty/'"' does not have a commit checked out fatal: adding files failed EOF - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'git add --dry-run of existing changed file' " @@ -320,7 +326,7 @@ test_expect_success 'git add --dry-run of non-existing file' " test_expect_success 'git add --dry-run of an existing file output' " echo \"fatal: pathspec 'ignored-file' did not match any files\" >expect && - test_i18ncmp expect actual + test_cmp expect actual " cat >expect.err <<\EOF @@ -339,8 +345,12 @@ test_expect_success 'git add --dry-run --ignore-missing of non-existing file' ' ' test_expect_success 'git add --dry-run --ignore-missing of non-existing file output' ' - test_i18ncmp expect.out actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.out actual.out && + test_cmp expect.err actual.err +' + +test_expect_success 'git add --dry-run --interactive should fail' ' + test_must_fail git add --dry-run --interactive ' test_expect_success 'git add empty string should fail' ' @@ -386,6 +396,36 @@ test_expect_success POSIXPERM 'git add --chmod=[+-]x does not change the working ! test -x foo4 ' +test_expect_success 'git add --chmod fails with non regular files (but updates the other paths)' ' + git reset --hard && + test_ln_s_add foo foo3 && + touch foo4 && + test_must_fail git add --chmod=+x foo3 foo4 2>stderr && + test_i18ngrep "cannot chmod +x .foo3." stderr && + test_mode_in_index 120000 foo3 && + test_mode_in_index 100755 foo4 +' + +test_expect_success 'git add --chmod honors --dry-run' ' + git reset --hard && + echo foo >foo4 && + git add foo4 && + git add --chmod=+x --dry-run foo4 && + test_mode_in_index 100644 foo4 +' + +test_expect_success 'git add --chmod --dry-run reports error for non regular files' ' + git reset --hard && + test_ln_s_add foo foo4 && + test_must_fail git add --chmod=+x --dry-run foo4 2>stderr && + test_i18ngrep "cannot chmod +x .foo4." stderr +' + +test_expect_success 'git add --chmod --dry-run reports error for unmatched pathspec' ' + test_must_fail git add --chmod=+x --dry-run nonexistent 2>stderr && + test_i18ngrep "pathspec .nonexistent. did not match any files" stderr +' + test_expect_success 'no file status change if no pathspec is given' ' >foo5 && >foo6 && @@ -409,11 +449,17 @@ test_expect_success 'no file status change if no pathspec is given in subdir' ' ' test_expect_success 'all statuses changed in folder if . is given' ' - rm -fr empty && - git add --chmod=+x . && - test $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 && - git add --chmod=-x . && - test $(git ls-files --stage | grep ^100755 | wc -l) -eq 0 + git init repo && + ( + cd repo && + mkdir -p sub/dir && + touch x y z sub/a sub/dir/b && + git add -A && + git add --chmod=+x . && + test $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 && + git add --chmod=-x . && + test $(git ls-files --stage | grep ^100755 | wc -l) -eq 0 + ) ' test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' ' diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index fb73a847cb..207714655f 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='add -i basic tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -367,7 +370,7 @@ test_expect_success 'setup expected' ' ' # Test splitting the first patch, then adding both -test_expect_success C_LOCALE_OUTPUT 'add first line works' ' +test_expect_success 'add first line works' ' git commit -am "clear local changes" && git apply patch && printf "%s\n" s y y | git add -p file 2>error | @@ -549,8 +552,8 @@ test_expect_success 'patch mode ignores unmerged entries' ' test_commit non-conflict && git checkout -b side && test_commit side conflict.t && - git checkout master && - test_commit master conflict.t && + git checkout main && + test_commit main conflict.t && test_must_fail git merge side && echo changed >non-conflict.t && echo y | git add -p >output && @@ -569,18 +572,110 @@ test_expect_success 'patch mode ignores unmerged entries' ' diff_cmp expected diff ' +test_expect_success 'index is refreshed after applying patch' ' + git reset --hard && + echo content >test && + printf y | git add -p && + git diff-files --exit-code +' + test_expect_success 'diffs can be colorized' ' git reset --hard && echo content >test && printf y >y && force_color git add -p >output 2>&1 <y && + git diff-files --exit-code && # We do not want to depend on the exact coloring scheme # git uses for diffs, so just check that we saw some kind of color. grep "$(printf "\\033")" output ' +test_expect_success 'colors can be overridden' ' + git reset --hard && + test_when_finished "git rm -f color-test" && + test_write_lines context old more-context >color-test && + git add color-test && + test_write_lines context new more-context another-one >color-test && + + echo trigger an error message >input && + force_color git \ + -c color.interactive.error=blue \ + add -i 2>err.raw <input && + test_decode_color <err.raw >err && + grep "<BLUE>Huh (trigger)?<RESET>" err && + + test_write_lines help quit >input && + force_color git \ + -c color.interactive.header=red \ + -c color.interactive.help=green \ + -c color.interactive.prompt=yellow \ + add -i >actual.raw <input && + test_decode_color <actual.raw >actual && + cat >expect <<-\EOF && + <RED> staged unstaged path<RESET> + 1: +3/-0 +2/-1 color-test + + <RED>*** Commands ***<RESET> + 1: <YELLOW>s<RESET>tatus 2: <YELLOW>u<RESET>pdate 3: <YELLOW>r<RESET>evert 4: <YELLOW>a<RESET>dd untracked + 5: <YELLOW>p<RESET>atch 6: <YELLOW>d<RESET>iff 7: <YELLOW>q<RESET>uit 8: <YELLOW>h<RESET>elp + <YELLOW>What now<RESET>> <GREEN>status - show paths with changes<RESET> + <GREEN>update - add working tree state to the staged set of changes<RESET> + <GREEN>revert - revert staged set of changes back to the HEAD version<RESET> + <GREEN>patch - pick hunks and update selectively<RESET> + <GREEN>diff - view diff between HEAD and index<RESET> + <GREEN>add untracked - add contents of untracked files to the staged set of changes<RESET> + <RED>*** Commands ***<RESET> + 1: <YELLOW>s<RESET>tatus 2: <YELLOW>u<RESET>pdate 3: <YELLOW>r<RESET>evert 4: <YELLOW>a<RESET>dd untracked + 5: <YELLOW>p<RESET>atch 6: <YELLOW>d<RESET>iff 7: <YELLOW>q<RESET>uit 8: <YELLOW>h<RESET>elp + <YELLOW>What now<RESET>> Bye. + EOF + test_cmp expect actual && + + : exercise recolor_hunk by editing and then look at the hunk again && + test_write_lines s e K q >input && + force_color git \ + -c color.interactive.prompt=yellow \ + -c color.diff.meta=italic \ + -c color.diff.frag=magenta \ + -c color.diff.context=cyan \ + -c color.diff.old=bold \ + -c color.diff.new=blue \ + -c core.editor=touch \ + add -p >actual.raw <input && + test_decode_color <actual.raw >actual.decoded && + sed "s/index [0-9a-f]*\\.\\.[0-9a-f]* 100644/<INDEX-LINE>/" <actual.decoded >actual && + cat >expect <<-\EOF && + <ITALIC>diff --git a/color-test b/color-test<RESET> + <ITALIC><INDEX-LINE><RESET> + <ITALIC>--- a/color-test<RESET> + <ITALIC>+++ b/color-test<RESET> + <MAGENTA>@@ -1,3 +1,4 @@<RESET> + <CYAN> context<RESET> + <BOLD>-old<RESET> + <BLUE>+<RESET><BLUE>new<RESET> + <CYAN> more-context<RESET> + <BLUE>+<RESET><BLUE>another-one<RESET> + <YELLOW>(1/1) Stage this hunk [y,n,q,a,d,s,e,?]? <RESET><BOLD>Split into 2 hunks.<RESET> + <MAGENTA>@@ -1,3 +1,3 @@<RESET> + <CYAN> context<RESET> + <BOLD>-old<RESET> + <BLUE>+<RESET><BLUE>new<RESET> + <CYAN> more-context<RESET> + <YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? <RESET><MAGENTA>@@ -3 +3,2 @@<RESET> + <CYAN> more-context<RESET> + <BLUE>+<RESET><BLUE>another-one<RESET> + <YELLOW>(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? <RESET><MAGENTA>@@ -1,3 +1,3 @@<RESET> + <CYAN> context<RESET> + <BOLD>-old<RESET> + <BLUE>+new<RESET> + <CYAN> more-context<RESET> + <YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? <RESET> + EOF + test_cmp expect actual +' + test_expect_success 'colorized diffs respect diff.wsErrorHighlight' ' git reset --hard && @@ -757,6 +852,12 @@ test_expect_success 'setup different kinds of dirty submodules' ' cat >expected <<-\EOF && dirty-both-ways dirty-head + EOF + test_cmp expected actual && + git -C for-submodules diff-files --name-only --ignore-submodules=none >actual && + cat >expected <<-\EOF && + dirty-both-ways + dirty-head dirty-otherwise EOF test_cmp expected actual && @@ -814,6 +915,44 @@ test_expect_success 'checkout -p works with pathological context lines' ' test_cmp expect a ' +# This should be called from a subshell as it sets a temporary editor +setup_new_file() { + write_script new-file-editor.sh <<-\EOF && + sed /^#/d "$1" >patch && + sed /^+c/d patch >"$1" + EOF + test_set_editor "$(pwd)/new-file-editor.sh" && + test_write_lines a b c d e f >new-file && + test_write_lines a b d e f >new-file-expect && + test_write_lines "@@ -0,0 +1,6 @@" +a +b +c +d +e +f >patch-expect +} + +test_expect_success 'add -N followed by add -p patch editing' ' + git reset --hard && + ( + setup_new_file && + git add -N new-file && + test_write_lines e n q | git add -p && + git cat-file blob :new-file >actual && + test_cmp new-file-expect actual && + test_cmp patch-expect patch + ) +' + +test_expect_success 'checkout -p patch editing of added file' ' + git reset --hard && + ( + setup_new_file && + git add new-file && + git commit -m "add new file" && + git rm new-file && + git commit -m "remove new file" && + test_write_lines e n q | git checkout -p HEAD^ && + test_cmp new-file-expect new-file && + test_cmp patch-expect patch + ) +' + test_expect_success 'show help from add--helper' ' git reset --hard && cat >expect <<-EOF && @@ -835,7 +974,7 @@ test_expect_success 'show help from add--helper' ' EOF test_write_lines h | force_color git add -i >actual.colored && test_decode_color <actual.colored >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_done diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh new file mode 100755 index 0000000000..2b1fd0d0ee --- /dev/null +++ b/t/t3705-add-sparse-checkout.sh @@ -0,0 +1,155 @@ +#!/bin/sh + +test_description='git add in sparse checked out working trees' + +. ./test-lib.sh + +SPARSE_ENTRY_BLOB="" + +# Optionally take a printf format string to write to the sparse_entry file +setup_sparse_entry () { + # 'sparse_entry' might already be in the index with the skip-worktree + # bit set. Remove it so that the subsequent git add can update it. + git update-index --force-remove sparse_entry && + if test $# -eq 1 + then + printf "$1" >sparse_entry + else + >sparse_entry + fi && + git add sparse_entry && + git update-index --skip-worktree sparse_entry && + SPARSE_ENTRY_BLOB=$(git rev-parse :sparse_entry) +} + +test_sparse_entry_unchanged () { + echo "100644 $SPARSE_ENTRY_BLOB 0 sparse_entry" >expected && + git ls-files --stage sparse_entry >actual && + test_cmp expected actual +} + +setup_gitignore () { + test_when_finished rm -f .gitignore && + cat >.gitignore <<-EOF + * + !/sparse_entry + EOF +} + +test_expect_success 'setup' " + cat >sparse_error_header <<-EOF && + The following pathspecs didn't match any eligible path, but they do match index + entries outside the current sparse checkout: + EOF + + cat >sparse_hint <<-EOF && + hint: Disable or modify the sparsity rules if you intend to update such entries. + hint: Disable this message with \"git config advice.updateSparsePath false\" + EOF + + echo sparse_entry | cat sparse_error_header - >sparse_entry_error && + cat sparse_entry_error sparse_hint >error_and_hint +" + +test_expect_success 'git add does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + test_must_fail git add sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + test_sparse_entry_unchanged +' + +test_expect_success 'git add -A does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + setup_gitignore && + git add -A 2>stderr && + test_must_be_empty stderr && + test_sparse_entry_unchanged +' + +test_expect_success 'git add . does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + setup_gitignore && + test_must_fail git add . 2>stderr && + + cat sparse_error_header >expect && + echo . >>expect && + cat sparse_hint >>expect && + + test_cmp expect stderr && + test_sparse_entry_unchanged +' + +for opt in "" -f -u --ignore-removal --dry-run +do + test_expect_success "git add${opt:+ $opt} does not update sparse entries" ' + setup_sparse_entry && + echo modified >sparse_entry && + test_must_fail git add $opt sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + test_sparse_entry_unchanged + ' +done + +test_expect_success 'git add --refresh does not update sparse entries' ' + setup_sparse_entry && + git ls-files --debug sparse_entry | grep mtime >before && + test-tool chmtime -60 sparse_entry && + test_must_fail git add --refresh sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + git ls-files --debug sparse_entry | grep mtime >after && + test_cmp before after +' + +test_expect_success 'git add --chmod does not update sparse entries' ' + setup_sparse_entry && + test_must_fail git add --chmod=+x sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + test_sparse_entry_unchanged && + ! test -x sparse_entry +' + +test_expect_success 'git add --renormalize does not update sparse entries' ' + test_config core.autocrlf false && + setup_sparse_entry "LINEONE\r\nLINETWO\r\n" && + echo "sparse_entry text=auto" >.gitattributes && + test_must_fail git add --renormalize sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + test_sparse_entry_unchanged +' + +test_expect_success 'git add --dry-run --ignore-missing warn on sparse path' ' + setup_sparse_entry && + rm sparse_entry && + test_must_fail git add --dry-run --ignore-missing sparse_entry 2>stderr && + test_cmp error_and_hint stderr && + test_sparse_entry_unchanged +' + +test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' + setup_sparse_entry && + test_must_fail git add nonexistent 2>stderr && + grep "fatal: pathspec .nonexistent. did not match any files" stderr && + ! grep -F -f sparse_error_header stderr +' + +test_expect_success 'do not warn when pathspec matches dense entries' ' + setup_sparse_entry && + echo modified >sparse_entry && + >dense_entry && + git add "*_entry" 2>stderr && + test_must_be_empty stderr && + test_sparse_entry_unchanged && + git ls-files --error-unmatch dense_entry +' + +test_expect_success 'add obeys advice.updateSparsePath' ' + setup_sparse_entry && + test_must_fail git -c advice.updateSparsePath=false add sparse_entry 2>stderr && + test_cmp sparse_entry_error stderr + +' + +test_done diff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh index d696aa4e52..0544d58a6e 100755 --- a/t/t3800-mktag.sh +++ b/t/t3800-mktag.sh @@ -12,10 +12,105 @@ test_description='git mktag: tag object verify test' # given in the expect.pat file. check_verify_failure () { - expect="$2" + subject=$1 && + message=$2 && + shift 2 && + + no_strict= && + fsck_obj_ok= && + no_strict= && + while test $# != 0 + do + case "$1" in + --no-strict) + no_strict=yes + ;; + --fsck-obj-ok) + fsck_obj_ok=yes + ;; + esac && + shift + done && + + test_expect_success "fail with [--[no-]strict]: $subject" ' + test_must_fail git mktag <tag.sig 2>err && + if test -z "$no_strict" + then + test_must_fail git mktag <tag.sig 2>err2 && + test_cmp err err2 + else + git mktag --no-strict <tag.sig + fi + ' + + test_expect_success "setup: $subject" ' + tag_ref=refs/tags/bad_tag && + + # Reset any leftover state from the last $subject + rm -rf bad-tag && + + git init --bare bad-tag && + bad_tag=$(git -C bad-tag hash-object -t tag -w --stdin --literally <tag.sig) + ' + + test_expect_success "hash-object & fsck unreachable: $subject" ' + if test -n "$fsck_obj_ok" + then + git -C bad-tag fsck + else + test_must_fail git -C bad-tag fsck + fi + ' + + test_expect_success "update-ref & fsck reachable: $subject" ' + # Make sure the earlier test created it for us + git rev-parse "$bad_tag" && + + # The update-ref of the bad content will fail, do it + # anyway to see if it segfaults + test_might_fail git -C bad-tag update-ref "$tag_ref" "$bad_tag" && + + # Manually create the broken, we cannot do it with + # update-ref + echo "$bad_tag" >"bad-tag/$tag_ref" && + + # Unlike fsck-ing unreachable content above, this + # will always fail. + test_must_fail git -C bad-tag fsck + ' + + test_expect_success "for-each-ref: $subject" ' + # Make sure the earlier test created it for us + git rev-parse "$bad_tag" && + + echo "$bad_tag" >"bad-tag/$tag_ref" && + + printf "%s tag\t%s\n" "$bad_tag" "$tag_ref" >expected && + git -C bad-tag for-each-ref "$tag_ref" >actual && + test_cmp expected actual && + + test_must_fail git -C bad-tag for-each-ref --format="%(*objectname)" + ' + + test_expect_success "fast-export & fast-import: $subject" ' + # Make sure the earlier test created it for us + git rev-parse "$bad_tag" && + + test_must_fail git -C bad-tag fast-export --all && + test_must_fail git -C bad-tag fast-export "$bad_tag" + ' +} + +test_expect_mktag_success() { test_expect_success "$1" ' - ( test_must_fail git mktag <tag.sig 2>message ) && - grep "$expect" message + git hash-object -t tag -w --stdin <tag.sig >expected && + git fsck --strict && + + git mktag <tag.sig >hash && + test_cmp expected hash && + test_when_finished "git update-ref -d refs/tags/mytag $(cat hash)" && + git update-ref refs/tags/mytag $(cat hash) $(test_oid zero) && + git fsck --strict ' } @@ -23,10 +118,24 @@ check_verify_failure () { # first create a commit, so we have a valid object/type # for the tag. test_expect_success 'setup' ' - echo Hello >A && - git update-index --add A && - git commit -m "Initial commit" && - head=$(git rev-parse --verify HEAD) + test_commit A && + test_commit B && + head=$(git rev-parse --verify HEAD) && + head_parent=$(git rev-parse --verify HEAD~) && + tree=$(git rev-parse HEAD^{tree}) && + blob=$(git rev-parse --verify HEAD:B.t) +' + +test_expect_success 'basic usage' ' + cat >tag.sig <<-EOF && + object $head + type commit + tag mytag + tagger T A Gger <tagger@example.com> 1206478233 -0500 + EOF + git mktag <tag.sig && + git mktag --end-of-options <tag.sig && + test_expect_code 129 git mktag --unknown-option ' ############################################################ @@ -37,33 +146,33 @@ too short for a tag EOF check_verify_failure 'Tag object length check' \ - '^error: .*size wrong.*$' + '^error:.* missingObject:' 'strict' ############################################################ # 2. object line label check cat >tag.sig <<EOF -xxxxxx 139e9b33986b1c2670fff52c5067603117b3e895 +xxxxxx $head type tag tag mytag tagger . <> 0 +0000 EOF -check_verify_failure '"object" line label check' '^error: char0: .*"object "$' +check_verify_failure '"object" line label check' '^error:.* missingObject:' ############################################################ -# 3. object line SHA1 check +# 3. object line hash check cat >tag.sig <<EOF -object zz9e9b33986b1c2670fff52c5067603117b3e895 +object $(echo $head | tr 0-9a-f z) type tag tag mytag tagger . <> 0 +0000 EOF -check_verify_failure '"object" line SHA1 check' '^error: char7: .*SHA1 hash$' +check_verify_failure '"object" line check' '^error:.* badObjectSha1:' ############################################################ # 4. type line label check @@ -76,7 +185,7 @@ tagger . <> 0 +0000 EOF -check_verify_failure '"type" line label check' '^error: char.*: .*"\\ntype "$' +check_verify_failure '"type" line label check' '^error:.* missingTypeEntry:' ############################################################ # 5. type line eol check @@ -84,7 +193,7 @@ check_verify_failure '"type" line label check' '^error: char.*: .*"\\ntype "$' echo "object $head" >tag.sig printf "type tagsssssssssssssssssssssssssssssss" >>tag.sig -check_verify_failure '"type" line eol check' '^error: char.*: .*"\\n"$' +check_verify_failure '"type" line eol check' '^error:.* unterminatedHeader:' ############################################################ # 6. tag line label check #1 @@ -98,7 +207,7 @@ tagger . <> 0 +0000 EOF check_verify_failure '"tag" line label check #1' \ - '^error: char.*: no "tag " found$' + '^error:.* missingTagEntry:' ############################################################ # 7. tag line label check #2 @@ -110,7 +219,7 @@ tag EOF check_verify_failure '"tag" line label check #2' \ - '^error: char.*: no "tag " found$' + '^error:.* badType:' ############################################################ # 8. type line type-name length check @@ -122,21 +231,86 @@ tag mytag EOF check_verify_failure '"type" line type-name length check' \ - '^error: char.*: type too long$' + '^error:.* badType:' ############################################################ -# 9. verify object (SHA1/type) check +# 9. verify object (hash/type) check cat >tag.sig <<EOF object $(test_oid deadbeef) +type tag +tag mytag +tagger . <> 0 +0000 + +EOF + +check_verify_failure 'verify object (hash/type) check -- correct type, nonexisting object' \ + '^fatal: could not read tagged object' \ + --fsck-obj-ok + +cat >tag.sig <<EOF +object $head type tagggg tag mytag tagger . <> 0 +0000 EOF -check_verify_failure 'verify object (SHA1/type) check' \ - '^error: char7: could not verify object.*$' +check_verify_failure 'verify object (hash/type) check -- made-up type, valid object' \ + '^error:.* badType:' + +cat >tag.sig <<EOF +object $(test_oid deadbeef) +type tagggg +tag mytag +tagger . <> 0 +0000 + +EOF + +check_verify_failure 'verify object (hash/type) check -- made-up type, nonexisting object' \ + '^error:.* badType:' + +cat >tag.sig <<EOF +object $head +type tree +tag mytag +tagger . <> 0 +0000 + +EOF + +check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \ + '^fatal: object.*tagged as.*tree.*but is.*commit' \ + --fsck-obj-ok + +############################################################ +# 9.5. verify object (hash/type) check -- replacement + +test_expect_success 'setup replacement of commit -> commit and tree -> blob' ' + git replace $head_parent $head && + git replace -f $tree $blob +' + +cat >tag.sig <<EOF +object $head_parent +type commit +tag mytag +tagger . <> 0 +0000 + +EOF + +test_expect_mktag_success 'tag to a commit replaced by another commit' + +cat >tag.sig <<EOF +object $tree +type tree +tag mytag +tagger . <> 0 +0000 + +EOF + +check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \ + '^fatal: object.*tagged as.*tree.*but is.*blob' \ + --fsck-obj-ok ############################################################ # 10. verify tag-name check @@ -150,7 +324,9 @@ tagger . <> 0 +0000 EOF check_verify_failure 'verify tag-name check' \ - '^error: char.*: could not verify tag name$' + '^error:.* badTagName:' \ + --no-strict \ + --fsck-obj-ok ############################################################ # 11. tagger line label check #1 @@ -164,7 +340,9 @@ This is filler EOF check_verify_failure '"tagger" line label check #1' \ - '^error: char.*: could not find "tagger "$' + '^error:.* missingTaggerEntry:' \ + --no-strict \ + --fsck-obj-ok ############################################################ # 12. tagger line label check #2 @@ -179,10 +357,12 @@ This is filler EOF check_verify_failure '"tagger" line label check #2' \ - '^error: char.*: could not find "tagger "$' + '^error:.* missingTaggerEntry:' \ + --no-strict \ + --fsck-obj-ok ############################################################ -# 13. disallow missing tag author name +# 13. allow missing tag author name like fsck cat >tag.sig <<EOF object $head @@ -193,8 +373,7 @@ tagger <> 0 +0000 This is filler EOF -check_verify_failure 'disallow missing tag author name' \ - '^error: char.*: missing tagger name$' +test_expect_mktag_success 'allow missing tag author name' ############################################################ # 14. disallow missing tag author name @@ -209,7 +388,9 @@ tagger T A Gger < EOF check_verify_failure 'disallow malformed tagger' \ - '^error: char.*: malformed tagger field$' + '^error:.* badEmail:' \ + --no-strict \ + --fsck-obj-ok ############################################################ # 15. allow empty tag email @@ -222,12 +403,10 @@ tagger T A Gger <> 0 +0000 EOF -test_expect_success \ - 'allow empty tag email' \ - 'git mktag <tag.sig >.git/refs/tags/mytag 2>message' +test_expect_mktag_success 'allow empty tag email' ############################################################ -# 16. disallow spaces in tag email +# 16. allow spaces in tag email like fsck cat >tag.sig <<EOF object $head @@ -237,8 +416,7 @@ tagger T A Gger <tag ger@example.com> 0 +0000 EOF -check_verify_failure 'disallow spaces in tag email' \ - '^error: char.*: malformed tagger field$' +test_expect_mktag_success 'allow spaces in tag email like fsck' ############################################################ # 17. disallow missing tag timestamp @@ -252,7 +430,7 @@ tagger T A Gger <tagger@example.com>__ EOF check_verify_failure 'disallow missing tag timestamp' \ - '^error: char.*: missing tag timestamp$' + '^error:.* badDate:' ############################################################ # 18. detect invalid tag timestamp1 @@ -266,7 +444,7 @@ tagger T A Gger <tagger@example.com> Tue Mar 25 15:47:44 2008 EOF check_verify_failure 'detect invalid tag timestamp1' \ - '^error: char.*: missing tag timestamp$' + '^error:.* badDate:' ############################################################ # 19. detect invalid tag timestamp2 @@ -280,7 +458,7 @@ tagger T A Gger <tagger@example.com> 2008-03-31T12:20:15-0500 EOF check_verify_failure 'detect invalid tag timestamp2' \ - '^error: char.*: malformed tag timestamp$' + '^error:.* badDate:' ############################################################ # 20. detect invalid tag timezone1 @@ -294,7 +472,7 @@ tagger T A Gger <tagger@example.com> 1206478233 GMT EOF check_verify_failure 'detect invalid tag timezone1' \ - '^error: char.*: malformed tag timezone$' + '^error:.* badTimezone:' ############################################################ # 21. detect invalid tag timezone2 @@ -308,10 +486,10 @@ tagger T A Gger <tagger@example.com> 1206478233 + 30 EOF check_verify_failure 'detect invalid tag timezone2' \ - '^error: char.*: malformed tag timezone$' + '^error:.* badTimezone:' ############################################################ -# 22. detect invalid tag timezone3 +# 22. allow invalid tag timezone3 (the maximum is -1200/+1400) cat >tag.sig <<EOF object $head @@ -321,8 +499,7 @@ tagger T A Gger <tagger@example.com> 1206478233 -1430 EOF -check_verify_failure 'detect invalid tag timezone3' \ - '^error: char.*: malformed tag timezone$' +test_expect_mktag_success 'allow invalid tag timezone' ############################################################ # 23. detect invalid header entry @@ -337,10 +514,29 @@ this line should not be here EOF check_verify_failure 'detect invalid header entry' \ - '^error: char.*: trailing garbage in tag header$' + '^error:.* extraHeaderEntry:' \ + --no-strict \ + --fsck-obj-ok -############################################################ -# 24. create valid tag +test_expect_success 'invalid header entry config & fsck' ' + test_must_fail git mktag <tag.sig && + git mktag --no-strict <tag.sig && + + test_must_fail git -c fsck.extraHeaderEntry=error mktag <tag.sig && + test_must_fail git -c fsck.extraHeaderEntry=error mktag --no-strict <tag.sig && + + test_must_fail git -c fsck.extraHeaderEntry=warn mktag <tag.sig && + git -c fsck.extraHeaderEntry=warn mktag --no-strict <tag.sig && + + git -c fsck.extraHeaderEntry=ignore mktag <tag.sig && + git -c fsck.extraHeaderEntry=ignore mktag --no-strict <tag.sig && + + git fsck && + git -c fsck.extraHeaderEntry=warn fsck 2>err && + grep "warning .*extraHeaderEntry:" err && + test_must_fail git -c fsck.extraHeaderEntry=error 2>err fsck && + grep "error .* extraHeaderEntry:" err +' cat >tag.sig <<EOF object $head @@ -348,18 +544,41 @@ type commit tag mytag tagger T A Gger <tagger@example.com> 1206478233 -0500 + +this line comes after an extra newline EOF -test_expect_success \ - 'create valid tag' \ - 'git mktag <tag.sig >.git/refs/tags/mytag 2>message' +test_expect_mktag_success 'allow extra newlines at start of body' + +cat >tag.sig <<EOF +object $head +type commit +tag mytag +tagger T A Gger <tagger@example.com> 1206478233 -0500 + +EOF + +test_expect_mktag_success 'allow a blank line before an empty body (1)' + +cat >tag.sig <<EOF +object $head +type commit +tag mytag +tagger T A Gger <tagger@example.com> 1206478233 -0500 +EOF + +test_expect_mktag_success 'allow no blank line before an empty body (2)' ############################################################ -# 25. check mytag +# 24. create valid tag -test_expect_success \ - 'check mytag' \ - 'git tag -l | grep mytag' +cat >tag.sig <<EOF +object $head +type commit +tag mytag +tagger T A Gger <tagger@example.com> 1206478233 -0500 +EOF +test_expect_mktag_success 'create valid tag object' test_done diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh index d277a9f4b7..bfab245eb3 100755 --- a/t/t3900-i18n-commit.sh +++ b/t/t3900-i18n-commit.sh @@ -226,10 +226,6 @@ test_commit_autosquash_multi_encoding () { git rev-list HEAD >actual && test_line_count = 3 actual && iconv -f $old -t UTF-8 "$TEST_DIRECTORY"/t3900/$msg >expect && - if test $flag = squash; then - subject="$(head -1 expect)" && - printf "\nsquash! %s\n" "$subject" >>expect - fi && git cat-file commit HEAD^ >raw && (sed "1,/^$/d" raw | iconv -f $new -t utf-8) >actual && test_cmp expect actual diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh index 923eb01f0e..4f16a735d9 100755 --- a/t/t3901-i18n-patch.sh +++ b/t/t3901-i18n-patch.sh @@ -5,6 +5,9 @@ test_description='i18n settings and format-patch | am pipe' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_encoding () { @@ -45,7 +48,7 @@ test_expect_success setup ' # the first commit on the side branch is UTF-8 test_tick && - git checkout -b side master^ && + git checkout -b side main^ && echo Another file >yours && git add yours && git commit -s -m "Second on side" && @@ -69,7 +72,7 @@ test_expect_success setup ' test_expect_success 'format-patch output (ISO-8859-1)' ' git config i18n.logoutputencoding ISO8859-1 && - git format-patch --stdout master..HEAD^ >out-l1 && + git format-patch --stdout main..HEAD^ >out-l1 && git format-patch --stdout HEAD^ >out-l2 && grep "^Content-Type: text/plain; charset=ISO8859-1" out-l1 && grep "^From: =?ISO8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l1 && @@ -80,7 +83,7 @@ test_expect_success 'format-patch output (ISO-8859-1)' ' test_expect_success 'format-patch output (UTF-8)' ' git config i18n.logoutputencoding UTF-8 && - git format-patch --stdout master..HEAD^ >out-u1 && + git format-patch --stdout main..HEAD^ >out-u1 && git format-patch --stdout HEAD^ >out-u2 && grep "^Content-Type: text/plain; charset=UTF-8" out-u1 && grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u1 && @@ -102,7 +105,7 @@ test_expect_success 'rebase (U/U)' ' # we want UTF-8 encoded name. . "$TEST_DIRECTORY"/t3901/utf8.txt && git checkout -b test && - git rebase master && + git rebase main && check_encoding 2 ' @@ -113,7 +116,7 @@ test_expect_success 'rebase (U/L)' ' . "$TEST_DIRECTORY"/t3901/utf8.txt && git reset --hard side && - git rebase master && + git rebase main && check_encoding 2 ' @@ -125,7 +128,7 @@ test_expect_success !MINGW 'rebase (L/L)' ' . "$TEST_DIRECTORY"/t3901/8859-1.txt && git reset --hard side && - git rebase master && + git rebase main && check_encoding 2 8859 ' @@ -138,7 +141,7 @@ test_expect_success !MINGW 'rebase (L/U)' ' . "$TEST_DIRECTORY"/t3901/8859-1.txt && git reset --hard side && - git rebase master && + git rebase main && check_encoding 2 8859 ' @@ -150,7 +153,7 @@ test_expect_success 'cherry-pick(U/U)' ' git config i18n.logoutputencoding UTF-8 && . "$TEST_DIRECTORY"/t3901/utf8.txt && - git reset --hard master && + git reset --hard main && git cherry-pick side^ && git cherry-pick side && git revert HEAD && @@ -165,7 +168,7 @@ test_expect_success !MINGW 'cherry-pick(L/L)' ' git config i18n.logoutputencoding ISO8859-1 && . "$TEST_DIRECTORY"/t3901/8859-1.txt && - git reset --hard master && + git reset --hard main && git cherry-pick side^ && git cherry-pick side && git revert HEAD && @@ -180,7 +183,7 @@ test_expect_success 'cherry-pick(U/L)' ' git config i18n.logoutputencoding ISO8859-1 && . "$TEST_DIRECTORY"/t3901/utf8.txt && - git reset --hard master && + git reset --hard main && git cherry-pick side^ && git cherry-pick side && git revert HEAD && @@ -196,7 +199,7 @@ test_expect_success !MINGW 'cherry-pick(L/U)' ' git config i18n.logoutputencoding UTF-8 && . "$TEST_DIRECTORY"/t3901/8859-1.txt && - git reset --hard master && + git reset --hard main && git cherry-pick side^ && git cherry-pick side && git revert HEAD && @@ -210,7 +213,7 @@ test_expect_success 'rebase --merge (U/U)' ' . "$TEST_DIRECTORY"/t3901/utf8.txt && git reset --hard side && - git rebase --merge master && + git rebase --merge main && check_encoding 2 ' @@ -221,7 +224,7 @@ test_expect_success 'rebase --merge (U/L)' ' . "$TEST_DIRECTORY"/t3901/utf8.txt && git reset --hard side && - git rebase --merge master && + git rebase --merge main && check_encoding 2 ' @@ -233,7 +236,7 @@ test_expect_success 'rebase --merge (L/L)' ' . "$TEST_DIRECTORY"/t3901/8859-1.txt && git reset --hard side && - git rebase --merge master && + git rebase --merge main && check_encoding 2 8859 ' @@ -246,7 +249,7 @@ test_expect_success 'rebase --merge (L/U)' ' . "$TEST_DIRECTORY"/t3901/8859-1.txt && git reset --hard side && - git rebase --merge master && + git rebase --merge main && check_encoding 2 8859 ' @@ -256,7 +259,7 @@ test_expect_success 'am (U/U)' ' git config i18n.commitencoding UTF-8 && . "$TEST_DIRECTORY"/t3901/utf8.txt && - git reset --hard master && + git reset --hard main && git am out-u1 out-u2 && check_encoding 2 @@ -267,7 +270,7 @@ test_expect_success !MINGW 'am (L/L)' ' git config i18n.commitencoding ISO8859-1 && . "$TEST_DIRECTORY"/t3901/8859-1.txt && - git reset --hard master && + git reset --hard main && git am out-l1 out-l2 && check_encoding 2 8859 @@ -277,7 +280,7 @@ test_expect_success 'am (U/L)' ' # Apply ISO-8859-1 patches with UTF-8 commitencoding git config i18n.commitencoding UTF-8 && . "$TEST_DIRECTORY"/t3901/utf8.txt && - git reset --hard master && + git reset --hard main && # am specifies --utf8 by default. git am out-l1 out-l2 && @@ -290,7 +293,7 @@ test_expect_success 'am --no-utf8 (U/L)' ' git config i18n.commitencoding UTF-8 && . "$TEST_DIRECTORY"/t3901/utf8.txt && - git reset --hard master && + git reset --hard main && git am --no-utf8 out-l1 out-l2 2>err && # commit-tree will warn that the commit message does not contain valid UTF-8 @@ -305,7 +308,7 @@ test_expect_success !MINGW 'am (L/U)' ' git config i18n.commitencoding ISO8859-1 && . "$TEST_DIRECTORY"/t3901/8859-1.txt && - git reset --hard master && + git reset --hard main && # mailinfo will re-code the commit message to the charset specified by # i18n.commitencoding git am out-u1 out-u2 && diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 9f7ca98967..873aa56e35 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -5,6 +5,9 @@ test_description='Test git stash' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh diff_cmp () { @@ -220,14 +223,14 @@ test_expect_success 'stash branch' ' git commit file -m second && git stash branch stashbranch && test refs/heads/stashbranch = $(git symbolic-ref HEAD) && - test $(git rev-parse HEAD) = $(git rev-parse master^) && + test $(git rev-parse HEAD) = $(git rev-parse main^) && git diff --cached >output && diff_cmp expect output && git diff >output && diff_cmp expect1 output && git add file && git commit -m alternate\ second && - git diff master..stashbranch >output && + git diff main..stashbranch >output && diff_cmp output expect2 && test 0 = $(git stash list | wc -l) ' @@ -520,7 +523,7 @@ test_expect_success 'stash branch - no stashes on stack, stash-like argument' ' STASH_ID=$(git stash create) && git reset --hard && git stash branch stash-branch ${STASH_ID} && - test_when_finished "git reset --hard HEAD && git checkout master && + test_when_finished "git reset --hard HEAD && git checkout main && git branch -D stash-branch" && test $(git ls-files --modified | wc -l) -eq 1 ' @@ -536,7 +539,7 @@ test_expect_success 'stash branch - stashes on stack, stash-like argument' ' STASH_ID=$(git stash create) && git reset --hard && git stash branch stash-branch ${STASH_ID} && - test_when_finished "git reset --hard HEAD && git checkout master && + test_when_finished "git reset --hard HEAD && git checkout main && git branch -D stash-branch" && test $(git ls-files --modified | wc -l) -eq 1 ' @@ -561,7 +564,7 @@ test_expect_success 'stash show format defaults to --stat' ' 1 file changed, 1 insertion(+) EOF git stash show ${STASH_ID} >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'stash show - stashes on stack, stash-like argument' ' @@ -738,7 +741,7 @@ test_expect_success 'valid ref of the form "n", n < N' ' git stash && git stash show 0 && git stash branch tmp 0 && - git checkout master && + git checkout main && git stash && git stash apply 0 && git reset --hard && @@ -755,7 +758,7 @@ test_expect_success 'branch: do not drop the stash if the branch exists' ' git commit -m initial && echo bar >file && git stash && - test_must_fail git stash branch master stash@{0} && + test_must_fail git stash branch main stash@{0} && git rev-parse stash@{0} -- ' @@ -768,7 +771,7 @@ test_expect_success 'branch: should not drop the stash if the apply fails' ' echo bar >file && git stash && echo baz >file && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && test_must_fail git stash branch new_branch stash@{0} && git rev-parse stash@{0} -- ' @@ -789,7 +792,7 @@ test_expect_success 'apply: show same status as git status (relative to ./)' ' git stash apply ) | sed -e 1d >actual && # drop "Saved..." - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<EOF @@ -856,7 +859,7 @@ test_expect_success 'setup stash with index and worktree changes' ' git stash ' -test_expect_success 'stash list implies --first-parent -m' ' +test_expect_success 'stash list -p shows simple diff' ' cat >expect <<-EOF && stash@{0} @@ -902,7 +905,7 @@ test_expect_success 'push -m shows right message' ' >foo && git add foo && git stash push -m "test message" && - echo "stash@{0}: On master: test message" >expect && + echo "stash@{0}: On main: test message" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -911,7 +914,7 @@ test_expect_success 'push -m also works without space' ' >foo && git add foo && git stash push -m"unspaced test message" && - echo "stash@{0}: On master: unspaced test message" >expect && + echo "stash@{0}: On main: unspaced test message" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -968,7 +971,7 @@ test_expect_success 'push -mfoo uses right message' ' >foo && git add foo && git stash push -m"test mfoo" && - echo "stash@{0}: On master: test mfoo" >expect && + echo "stash@{0}: On main: test mfoo" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -977,7 +980,7 @@ test_expect_success 'push --message foo is synonym for -mfoo' ' >foo && git add foo && git stash push --message "test message foo" && - echo "stash@{0}: On master: test message foo" >expect && + echo "stash@{0}: On main: test message foo" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -986,7 +989,7 @@ test_expect_success 'push --message=foo is synonym for -mfoo' ' >foo && git add foo && git stash push --message="test message=foo" && - echo "stash@{0}: On master: test message=foo" >expect && + echo "stash@{0}: On main: test message=foo" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -995,7 +998,7 @@ test_expect_success 'push -m shows right message' ' >foo && git add foo && git stash push -m "test m foo" && - echo "stash@{0}: On master: test m foo" >expect && + echo "stash@{0}: On main: test m foo" >expect && git stash list -1 >actual && test_cmp expect actual ' @@ -1004,7 +1007,7 @@ test_expect_success 'create stores correct message' ' >foo && git add foo && STASH_ID=$(git stash create "create test message") && - echo "On master: create test message" >expect && + echo "On main: create test message" >expect && git show --pretty=%s -s ${STASH_ID} >actual && test_cmp expect actual ' @@ -1013,13 +1016,13 @@ test_expect_success 'create with multiple arguments for the message' ' >foo && git add foo && STASH_ID=$(git stash create test untracked) && - echo "On master: test untracked" >expect && + echo "On main: test untracked" >expect && git show --pretty=%s -s ${STASH_ID} >actual && test_cmp expect actual ' test_expect_success 'create in a detached state' ' - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout HEAD~1 && >foo && git add foo && @@ -1111,7 +1114,7 @@ test_expect_success 'stash push -p with pathspec shows no changes only once' ' git stash push -p foo >actual && echo "No local changes to save" >expect && git reset --hard HEAD~ && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'push <pathspec>: show no changes when there are none' ' @@ -1121,7 +1124,7 @@ test_expect_success 'push <pathspec>: show no changes when there are none' ' git stash push foo >actual && echo "No local changes to save" >expect && git reset --hard HEAD~ && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'push: <pathspec> not in the repository errors out' ' diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh index f075c7f1f3..dd2cdcc114 100755 --- a/t/t3905-stash-include-untracked.sh +++ b/t/t3905-stash-include-untracked.sh @@ -8,16 +8,16 @@ test_description='Test git stash --include-untracked' . ./test-lib.sh test_expect_success 'stash save --include-untracked some dirty working directory' ' - echo 1 > file && + echo 1 >file && git add file && test_tick && git commit -m initial && - echo 2 > file && + echo 2 >file && git add file && - echo 3 > file && + echo 3 >file && test_tick && - echo 1 > file2 && - echo 1 > HEAD && + echo 1 >file2 && + echo 1 >HEAD && mkdir untracked && echo untracked >untracked/untracked && git stash --include-untracked && @@ -25,48 +25,50 @@ test_expect_success 'stash save --include-untracked some dirty working directory git diff-index --cached --quiet HEAD ' -cat > expect <<EOF -?? actual -?? expect -EOF - test_expect_success 'stash save --include-untracked cleaned the untracked files' ' + cat >expect <<-EOF && + ?? actual + ?? expect + EOF + git status --porcelain >actual && test_cmp expect actual ' -tracked=$(git rev-parse --short $(echo 1 | git hash-object --stdin)) -untracked=$(git rev-parse --short $(echo untracked | git hash-object --stdin)) -cat > expect.diff <<EOF -diff --git a/HEAD b/HEAD -new file mode 100644 -index 0000000..$tracked ---- /dev/null -+++ b/HEAD -@@ -0,0 +1 @@ -+1 -diff --git a/file2 b/file2 -new file mode 100644 -index 0000000..$tracked ---- /dev/null -+++ b/file2 -@@ -0,0 +1 @@ -+1 -diff --git a/untracked/untracked b/untracked/untracked -new file mode 100644 -index 0000000..$untracked ---- /dev/null -+++ b/untracked/untracked -@@ -0,0 +1 @@ -+untracked -EOF -cat > expect.lstree <<EOF -HEAD -file2 -untracked -EOF - test_expect_success 'stash save --include-untracked stashed the untracked files' ' + one_blob=$(echo 1 | git hash-object --stdin) && + tracked=$(git rev-parse --short "$one_blob") && + untracked_blob=$(echo untracked | git hash-object --stdin) && + untracked=$(git rev-parse --short "$untracked_blob") && + cat >expect.diff <<-EOF && + diff --git a/HEAD b/HEAD + new file mode 100644 + index 0000000..$tracked + --- /dev/null + +++ b/HEAD + @@ -0,0 +1 @@ + +1 + diff --git a/file2 b/file2 + new file mode 100644 + index 0000000..$tracked + --- /dev/null + +++ b/file2 + @@ -0,0 +1 @@ + +1 + diff --git a/untracked/untracked b/untracked/untracked + new file mode 100644 + index 0000000..$untracked + --- /dev/null + +++ b/untracked/untracked + @@ -0,0 +1 @@ + +untracked + EOF + cat >expect.lstree <<-EOF && + HEAD + file2 + untracked + EOF + test_path_is_missing file2 && test_path_is_missing untracked && test_path_is_missing HEAD && @@ -83,57 +85,64 @@ test_expect_success 'stash save --patch --all fails' ' test_must_fail git stash --patch --all ' -git clean --force --quiet +test_expect_success 'clean up untracked/untracked file to prepare for next tests' ' + git clean --force --quiet -cat > expect <<EOF - M file -?? HEAD -?? actual -?? expect -?? file2 -?? untracked/ -EOF +' test_expect_success 'stash pop after save --include-untracked leaves files untracked again' ' + cat >expect <<-EOF && + M file + ?? HEAD + ?? actual + ?? expect + ?? file2 + ?? untracked/ + EOF + git stash pop && git status --porcelain >actual && test_cmp expect actual && - test "1" = "$(cat file2)" && - test untracked = "$(cat untracked/untracked)" + echo 1 >expect_file2 && + test_cmp expect_file2 file2 && + echo untracked >untracked_expect && + test_cmp untracked_expect untracked/untracked ' -git clean --force --quiet -d +test_expect_success 'clean up untracked/ directory to prepare for next tests' ' + git clean --force --quiet -d +' test_expect_success 'stash save -u dirty index' ' - echo 4 > file3 && + echo 4 >file3 && git add file3 && test_tick && git stash -u ' -blob=$(git rev-parse --short $(echo 4 | git hash-object --stdin)) -cat > expect <<EOF -diff --git a/file3 b/file3 -new file mode 100644 -index 0000000..$blob ---- /dev/null -+++ b/file3 -@@ -0,0 +1 @@ -+4 -EOF - test_expect_success 'stash save --include-untracked dirty index got stashed' ' + four_blob=$(echo 4 | git hash-object --stdin) && + blob=$(git rev-parse --short "$four_blob") && + cat >expect <<-EOF && + diff --git a/file3 b/file3 + new file mode 100644 + index 0000000..$blob + --- /dev/null + +++ b/file3 + @@ -0,0 +1 @@ + +4 + EOF + git stash pop --index && + test_when_finished "git reset" && git diff --cached >actual && test_cmp expect actual ' -git reset > /dev/null - # Must direct output somewhere where it won't be considered an untracked file test_expect_success 'stash save --include-untracked -q is quiet' ' - echo 1 > file5 && - git stash save --include-untracked --quiet > .git/stash-output.out 2>&1 && + echo 1 >file5 && + git stash save --include-untracked --quiet >.git/stash-output.out 2>&1 && test_line_count = 0 .git/stash-output.out && rm -f .git/stash-output.out ' @@ -141,35 +150,34 @@ test_expect_success 'stash save --include-untracked -q is quiet' ' test_expect_success 'stash save --include-untracked removed files' ' rm -f file && git stash save --include-untracked && - echo 1 > expect && + echo 1 >expect && + test_when_finished "rm -f expect" && test_cmp expect file ' -rm -f expect - test_expect_success 'stash save --include-untracked removed files got stashed' ' git stash pop && test_path_is_missing file ' -cat > .gitignore <<EOF -.gitignore -ignored -ignored.d/ -EOF - test_expect_success 'stash save --include-untracked respects .gitignore' ' - echo ignored > ignored && + cat >.gitignore <<-EOF && + .gitignore + ignored + ignored.d/ + EOF + + echo ignored >ignored && mkdir ignored.d && echo ignored >ignored.d/untracked && git stash -u && - test -s ignored && - test -s ignored.d/untracked && - test -s .gitignore + test_file_not_empty ignored && + test_file_not_empty ignored.d/untracked && + test_file_not_empty .gitignore ' test_expect_success 'stash save -u can stash with only untracked files different' ' - echo 4 > file4 && + echo 4 >file4 && git stash -u && test_path_is_missing file4 ' @@ -183,9 +191,9 @@ test_expect_success 'stash save --all does not respect .gitignore' ' test_expect_success 'stash save --all is stash poppable' ' git stash pop && - test -s ignored && - test -s ignored.d/untracked && - test -s .gitignore + test_file_not_empty ignored && + test_file_not_empty ignored.d/untracked && + test_file_not_empty .gitignore ' test_expect_success 'stash push --include-untracked with pathspec' ' @@ -214,17 +222,17 @@ test_expect_success 'stash push with $IFS character' ' test_path_is_file bar ' -cat > .gitignore <<EOF -ignored -ignored.d/* -EOF - test_expect_success 'stash previously ignored file' ' + cat >.gitignore <<-EOF && + ignored + ignored.d/* + EOF + git reset HEAD && git add .gitignore && git commit -m "Add .gitignore" && >ignored.d/foo && - echo "!ignored.d/foo" >> .gitignore && + echo "!ignored.d/foo" >>.gitignore && git stash save --include-untracked && test_path_is_missing ignored.d/foo && git stash pop && @@ -280,7 +288,7 @@ test_expect_success 'stash -u -- <ignored> leaves ignored file alone' ' test_expect_success 'stash -u -- <non-existent> shows no changes when there are none' ' git stash push -u -- non-existent >actual && echo "No local changes to save" >expect && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'stash -u with globs' ' @@ -289,4 +297,129 @@ test_expect_success 'stash -u with globs' ' test_path_is_missing untracked.txt ' +test_expect_success 'stash show --include-untracked shows untracked files' ' + git reset --hard && + git clean -xf && + >untracked && + >tracked && + git add tracked && + empty_blob_oid=$(git rev-parse --short :tracked) && + git stash -u && + + cat >expect <<-EOF && + tracked | 0 + untracked | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + EOF + git stash show --include-untracked >actual && + test_cmp expect actual && + git stash show -u >actual && + test_cmp expect actual && + git stash show --no-include-untracked --include-untracked >actual && + test_cmp expect actual && + git stash show --only-untracked --include-untracked >actual && + test_cmp expect actual && + git -c stash.showIncludeUntracked=true stash show >actual && + test_cmp expect actual && + + cat >expect <<-EOF && + diff --git a/tracked b/tracked + new file mode 100644 + index 0000000..$empty_blob_oid + diff --git a/untracked b/untracked + new file mode 100644 + index 0000000..$empty_blob_oid + EOF + git stash show -p --include-untracked >actual && + test_cmp expect actual && + git stash show --include-untracked -p >actual && + test_cmp expect actual && + git -c stash.showIncludeUntracked=true stash show -p >actual && + test_cmp expect actual +' + +test_expect_success 'stash show --only-untracked only shows untracked files' ' + git reset --hard && + git clean -xf && + >untracked && + >tracked && + git add tracked && + empty_blob_oid=$(git rev-parse --short :tracked) && + git stash -u && + + cat >expect <<-EOF && + untracked | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + EOF + git stash show --only-untracked >actual && + test_cmp expect actual && + git stash show --no-include-untracked --only-untracked >actual && + test_cmp expect actual && + git stash show --include-untracked --only-untracked >actual && + test_cmp expect actual && + + cat >expect <<-EOF && + diff --git a/untracked b/untracked + new file mode 100644 + index 0000000..$empty_blob_oid + EOF + git stash show -p --only-untracked >actual && + test_cmp expect actual && + git stash show --only-untracked -p >actual && + test_cmp expect actual +' + +test_expect_success 'stash show --no-include-untracked cancels --{include,only}-untracked' ' + git reset --hard && + git clean -xf && + >untracked && + >tracked && + git add tracked && + git stash -u && + + cat >expect <<-EOF && + tracked | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + EOF + git stash show --only-untracked --no-include-untracked >actual && + test_cmp expect actual && + git stash show --include-untracked --no-include-untracked >actual && + test_cmp expect actual +' + +test_expect_success 'stash show --include-untracked errors on duplicate files' ' + git reset --hard && + git clean -xf && + >tracked && + git add tracked && + tree=$(git write-tree) && + i_commit=$(git commit-tree -p HEAD -m "index on any-branch" "$tree") && + test_when_finished "rm -f untracked_index" && + u_commit=$( + GIT_INDEX_FILE="untracked_index" && + export GIT_INDEX_FILE && + git update-index --add tracked && + u_tree=$(git write-tree) && + git commit-tree -m "untracked files on any-branch" "$u_tree" + ) && + w_commit=$(git commit-tree -p HEAD -p "$i_commit" -p "$u_commit" -m "WIP on any-branch" "$tree") && + test_must_fail git stash show --include-untracked "$w_commit" 2>err && + test_i18ngrep "worktree and untracked commit have duplicate entries: tracked" err +' + +test_expect_success 'stash show --{include,only}-untracked on stashes without untracked entries' ' + git reset --hard && + git clean -xf && + >tracked && + git add tracked && + git stash && + + git stash show >expect && + git stash show --include-untracked >actual && + test_cmp expect actual && + + git stash show --only-untracked >actual && + test_must_be_empty actual +' + test_done diff --git a/t/t3910-mac-os-precompose.sh b/t/t3910-mac-os-precompose.sh index 54ce19e353..898267a6bd 100755 --- a/t/t3910-mac-os-precompose.sh +++ b/t/t3910-mac-os-precompose.sh @@ -5,6 +5,9 @@ test_description='utf-8 decomposed (nfd) converted to precomposed (nfc)' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq UTF8_NFD_TO_NFC @@ -151,7 +154,7 @@ test_expect_success "git checkout link nfd" ' git checkout l.$Odiarnfd ' test_expect_success "setup case mac2" ' - git checkout master && + git checkout main && git reset --hard && git checkout -b mac_os_2 ' @@ -163,7 +166,7 @@ test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" ' git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd ' test_expect_success "setup for long decomposed filename" ' - git checkout master && + git checkout main && git reset --hard && git checkout -b mac_os_long_nfd_fn ' @@ -173,7 +176,7 @@ test_expect_success "Add long decomposed filename" ' git commit -m "Long filename" ' test_expect_success "setup for long precomposed filename" ' - git checkout master && + git checkout main && git reset --hard && git checkout -b mac_os_long_nfc_fn ' @@ -191,6 +194,22 @@ test_expect_failure 'handle existing decomposed filenames' ' test_must_be_empty untracked ' +test_expect_success "unicode decomposed: git restore -p . " ' + DIRNAMEPWD=dir.Odiarnfc && + DIRNAMEINREPO=dir.$Adiarnfc && + export DIRNAMEPWD DIRNAMEINREPO && + git init "$DIRNAMEPWD" && + ( + cd "$DIRNAMEPWD" && + mkdir "$DIRNAMEINREPO" && + cd "$DIRNAMEINREPO" && + echo "Initial" >file && + git add file && + echo "More stuff" >>file && + echo y | git restore -p . + ) +' + # Test if the global core.precomposeunicode stops autosensing # Must be the last test case test_expect_success "respect git config --global core.precomposeunicode" ' diff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh new file mode 100755 index 0000000000..a8ad5462d9 --- /dev/null +++ b/t/t3920-crlf-messages.sh @@ -0,0 +1,126 @@ +#!/bin/sh + +test_description='Test ref-filter and pretty APIs for commit and tag messages using CRLF' +. ./test-lib.sh + +LIB_CRLF_BRANCHES="" + +create_crlf_ref () { + branch="$1" && + cat >.crlf-orig-$branch.txt && + cat .crlf-orig-$branch.txt | append_cr >.crlf-message-$branch.txt && + grep 'Subject' .crlf-orig-$branch.txt | tr '\n' ' ' | sed 's/[ ]*$//' | tr -d '\n' >.crlf-subject-$branch.txt && + grep 'Body' .crlf-message-$branch.txt >.crlf-body-$branch.txt || true && + LIB_CRLF_BRANCHES="${LIB_CRLF_BRANCHES} ${branch}" && + test_tick && + hash=$(git commit-tree HEAD^{tree} -p HEAD -F .crlf-message-${branch}.txt) && + git branch ${branch} ${hash} && + git tag tag-${branch} ${branch} -F .crlf-message-${branch}.txt --cleanup=verbatim +} + +create_crlf_refs () { + create_crlf_ref crlf <<-\EOF && + Subject first line + + Body first line + Body second line + EOF + create_crlf_ref crlf-empty-lines-after-subject <<-\EOF && + Subject first line + + + Body first line + Body second line + EOF + create_crlf_ref crlf-two-line-subject <<-\EOF && + Subject first line + Subject second line + + Body first line + Body second line + EOF + create_crlf_ref crlf-two-line-subject-no-body <<-\EOF && + Subject first line + Subject second line + EOF + create_crlf_ref crlf-two-line-subject-no-body-trailing-newline <<-\EOF + Subject first line + Subject second line + + EOF +} + +test_crlf_subject_body_and_contents() { + command_and_args="$@" && + command=$1 && + if test ${command} = "branch" || test ${command} = "for-each-ref" || test ${command} = "tag" + then + atoms="(contents:subject) (contents:body) (contents)" + elif test ${command} = "log" || test ${command} = "show" + then + atoms="s b B" + fi && + files="subject body message" && + while test -n "${atoms}" + do + set ${atoms} && atom=$1 && shift && atoms="$*" && + set ${files} && file=$1 && shift && files="$*" && + test_expect_success "${command}: --format='%${atom}' works with messages using CRLF" " + rm -f expect && + for ref in ${LIB_CRLF_BRANCHES} + do + cat .crlf-${file}-\"\${ref}\".txt >>expect && + printf \"\n\" >>expect + done && + git $command_and_args --format=\"%${atom}\" >actual && + test_cmp expect actual + " + done +} + + +test_expect_success 'Setup refs with commit and tag messages using CRLF' ' + test_commit inital && + create_crlf_refs +' + +test_expect_success 'branch: --verbose works with messages using CRLF' ' + rm -f expect && + for branch in $LIB_CRLF_BRANCHES + do + printf " " >>expect && + cat .crlf-subject-${branch}.txt >>expect && + printf "\n" >>expect + done && + git branch -v >tmp && + # Remove first two columns, and the line for the currently checked out branch + current=$(git branch --show-current) && + grep -v $current <tmp | awk "{\$1=\$2=\"\"}1" >actual && + test_cmp expect actual +' + +test_crlf_subject_body_and_contents branch --list crlf* + +test_crlf_subject_body_and_contents tag --list tag-crlf* + +test_crlf_subject_body_and_contents for-each-ref refs/heads/crlf* + +test_expect_success 'log: --oneline works with messages using CRLF' ' + for branch in $LIB_CRLF_BRANCHES + do + cat .crlf-subject-${branch}.txt >expect && + printf "\n" >>expect && + git log --oneline -1 ${branch} >tmp-branch && + git log --oneline -1 tag-${branch} >tmp-tag && + cut -d" " -f2- <tmp-branch >actual-branch && + cut -d" " -f2- <tmp-tag >actual-tag && + test_cmp expect actual-branch && + test_cmp expect actual-tag || return 1 + done +' + +test_crlf_subject_body_and_contents log --all --reverse --grep Subject + +test_crlf_subject_body_and_contents show $LIB_CRLF_BRANCHES + +test_done diff --git a/t/t4000-diff-format.sh b/t/t4000-diff-format.sh index e5116a76a1..cce334981e 100755 --- a/t/t4000-diff-format.sh +++ b/t/t4000-diff-format.sh @@ -7,7 +7,7 @@ test_description='Test built-in diff output engine. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh echo >path0 'Line 1 Line 2 diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh index c16486a9d4..68f2ebca58 100755 --- a/t/t4001-diff-rename.sh +++ b/t/t4001-diff-rename.sh @@ -7,7 +7,7 @@ test_description='Test rename detection in diff engine. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh test_expect_success 'setup' ' cat >path0 <<-\EOF && @@ -262,4 +262,28 @@ test_expect_success 'diff-tree -l0 defaults to a big rename limit, not zero' ' grep "myotherfile.*myfile" actual ' +test_expect_success 'basename similarity vs best similarity' ' + mkdir subdir && + test_write_lines line1 line2 line3 line4 line5 \ + line6 line7 line8 line9 line10 >subdir/file.txt && + git add subdir/file.txt && + git commit -m "base txt" && + + git rm subdir/file.txt && + test_write_lines line1 line2 line3 line4 line5 \ + line6 line7 line8 >file.txt && + test_write_lines line1 line2 line3 line4 line5 \ + line6 line7 line8 line9 >file.md && + git add file.txt file.md && + git commit -a -m "rename" && + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + # subdir/file.txt is 88% similar to file.md, 78% similar to file.txt, + # but since same basenames are checked first... + cat >expected <<-\EOF && + A file.md + R078 subdir/file.txt file.txt + EOF + test_cmp expected actual +' + test_done diff --git a/t/t4003-diff-rename-1.sh b/t/t4003-diff-rename-1.sh index df2accb655..db07ff3eb1 100755 --- a/t/t4003-diff-rename-1.sh +++ b/t/t4003-diff-rename-1.sh @@ -7,11 +7,11 @@ test_description='More rename detection ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success \ 'prepare reference tree' \ - 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && tree=$(git write-tree) && @@ -99,7 +99,7 @@ test_expect_success \ test_expect_success \ 'prepare work tree once again' \ - 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1' # tree has COPYING and rezrov. work tree has COPYING and COPYING.1, diff --git a/t/t4004-diff-rename-symlink.sh b/t/t4004-diff-rename-symlink.sh index 6e562c80d1..3d495e37bb 100755 --- a/t/t4004-diff-rename-symlink.sh +++ b/t/t4004-diff-rename-symlink.sh @@ -10,7 +10,7 @@ copy of symbolic links, but should not produce rename/copy followed by an edit for them. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh test_expect_success SYMLINKS \ 'prepare reference tree' \ diff --git a/t/t4005-diff-rename-2.sh b/t/t4005-diff-rename-2.sh index d18a80493c..8647906132 100755 --- a/t/t4005-diff-rename-2.sh +++ b/t/t4005-diff-rename-2.sh @@ -6,10 +6,10 @@ test_description='Same rename detection as t4003 but testing diff-raw.' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success 'setup reference tree' ' - cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && tree=$(git write-tree) && @@ -64,7 +64,7 @@ test_expect_success 'validate output from rename/copy detection (#2)' ' # nows how to say Copy. test_expect_success 'validate output from rename/copy detection (#3)' ' - cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1 && cat <<-EOF >expected && diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh index 03489aff14..6cdee2a216 100755 --- a/t/t4006-diff-mode.sh +++ b/t/t4006-diff-mode.sh @@ -26,10 +26,8 @@ test_expect_success 'chmod' ' ' test_expect_success 'prepare binary file' ' - git commit -m rezrov && - printf "\00\01\02\03\04\05\06" >binbin && - git add binbin && - git commit -m binbin + git commit -m one && + test_commit --printf two binbin "\00\01\02\03\04\05\06" ' test_expect_success '--stat output after text chmod' ' @@ -39,13 +37,13 @@ test_expect_success '--stat output after text chmod' ' 1 file changed, 0 insertions(+), 0 deletions(-) EOF git diff HEAD --stat >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success '--shortstat output after text chmod' ' tail -n 1 <expect >expect.short && git diff HEAD --shortstat >actual && - test_i18ncmp expect.short actual + test_cmp expect.short actual ' test_expect_success '--stat output after binary chmod' ' @@ -56,13 +54,13 @@ test_expect_success '--stat output after binary chmod' ' 2 files changed, 0 insertions(+), 0 deletions(-) EOF git diff HEAD --stat >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success '--shortstat output after binary chmod' ' tail -n 1 <expect >expect.short && git diff HEAD --shortstat >actual && - test_i18ncmp expect.short actual + test_cmp expect.short actual ' test_done diff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh index b187b7f6c6..cbb9c62f53 100755 --- a/t/t4007-rename-3.sh +++ b/t/t4007-rename-3.sh @@ -7,17 +7,17 @@ test_description='Rename interaction with pathspec. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success 'prepare reference tree' ' mkdir path0 path1 && - cp "$TEST_DIRECTORY"/diff-lib/COPYING path0/COPYING && + cp "$TEST_DIRECTORY"/lib-diff/COPYING path0/COPYING && git update-index --add path0/COPYING && tree=$(git write-tree) && echo $tree ' -blob=$(git hash-object "$TEST_DIRECTORY/diff-lib/COPYING") +blob=$(git hash-object "$TEST_DIRECTORY/lib-diff/COPYING") test_expect_success 'prepare work tree' ' cp path0/COPYING path1/COPYING && git update-index --add --remove path0/COPYING path1/COPYING diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh index b1ccd4102e..2299f27511 100755 --- a/t/t4008-diff-break-rewrite.sh +++ b/t/t4008-diff-break-rewrite.sh @@ -22,11 +22,11 @@ With -B, this should be detected as two complete rewrites. Further, with -B and -M together, these should turn into two renames. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success setup ' - cat "$TEST_DIRECTORY"/diff-lib/README >file0 && - cat "$TEST_DIRECTORY"/diff-lib/COPYING >file1 && + cat "$TEST_DIRECTORY"/lib-diff/README >file0 && + cat "$TEST_DIRECTORY"/lib-diff/COPYING >file1 && blob0_id=$(git hash-object file0) && blob1_id=$(git hash-object file1) && git update-index --add file0 file1 && diff --git a/t/t4009-diff-rename-4.sh b/t/t4009-diff-rename-4.sh index b63bdf031f..b1da807f16 100755 --- a/t/t4009-diff-rename-4.sh +++ b/t/t4009-diff-rename-4.sh @@ -7,11 +7,11 @@ test_description='Same rename detection as t4003 but testing diff-raw -z. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success \ 'prepare reference tree' \ - 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && orig=$(git hash-object COPYING) && @@ -81,7 +81,7 @@ test_expect_success \ test_expect_success \ 'prepare work tree once again' \ - 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/lib-diff/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1' git diff-index -z -C --find-copies-harder $tree >current diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh index 65cc703c65..1bbced79ec 100755 --- a/t/t4010-diff-pathspec.sh +++ b/t/t4010-diff-pathspec.sh @@ -10,7 +10,7 @@ Prepare: path1/file1 ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash test_expect_success \ setup \ diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh index 717034bb50..5a25c259fe 100755 --- a/t/t4011-diff-symlink.sh +++ b/t/t4011-diff-symlink.sh @@ -7,7 +7,7 @@ test_description='Test diff of symlinks. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh # Print the short OID of a symlink with the given name. symlink_oid () { diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh index 6579c81216..33ff588ebc 100755 --- a/t/t4012-diff-binary.sh +++ b/t/t4012-diff-binary.sh @@ -34,19 +34,19 @@ EOF test_expect_success 'apply --stat output for binary file change' ' git diff >diff && git apply --stat --summary <diff >current && - test_i18ncmp expected current + test_cmp expected current ' test_expect_success 'diff --shortstat output for binary file change' ' tail -n 1 expected >expect && git diff --shortstat >current && - test_i18ncmp expect current + test_cmp expect current ' test_expect_success 'diff --shortstat output for binary file change only' ' echo " 1 file changed, 0 insertions(+), 0 deletions(-)" >expected && git diff --shortstat -- b >current && - test_i18ncmp expected current + test_cmp expected current ' test_expect_success 'apply --numstat notices binary file change' ' @@ -63,7 +63,7 @@ test_expect_success 'apply --numstat understands diff --binary format' ' # apply needs to be able to skip the binary material correctly # in order to report the line number of a corrupt patch. -test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' ' +test_expect_success 'apply detecting corrupt patch correctly' ' git diff >output && sed -e "s/-CIT/xCIT/" <output >broken && test_must_fail git apply --stat --summary broken 2>detected && @@ -73,7 +73,7 @@ test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' ' test "$detected" = xCIT ' -test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' ' +test_expect_success 'apply detecting corrupt patch correctly' ' git diff --binary | sed -e "s/-CIT/xCIT/" >broken && test_must_fail git apply --stat --summary broken 2>detected && detected=$(cat detected) && diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index 5c7b0122b4..7fadc985cc 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -5,7 +5,11 @@ test_description='Various diff formatting options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh test_expect_success setup ' @@ -174,6 +178,7 @@ process_diffs () { V=$(git version | sed -e 's/^git version //' -e 's/\./\\./g') while read magic cmd do + status=success case "$magic" in '' | '#'*) continue ;; @@ -182,6 +187,10 @@ do label="$magic-$cmd" case "$magic" in noellipses) ;; + failure) + status=failure + magic= + label="$cmd" ;; *) BUG "unknown magic $magic" ;; esac ;; @@ -194,7 +203,7 @@ do expect="$TEST_DIRECTORY/t4013/diff.$test" actual="$pfx-diff.$test" - test_expect_success "git $cmd # magic is ${magic:-(not used)}" ' + test_expect_$status "git $cmd # magic is ${magic:-(not used)}" ' { echo "$ git $cmd" case "$magic" in @@ -213,7 +222,7 @@ do process_diffs "$expect" >expect && case $cmd in *format-patch* | *-stat*) - test_i18ncmp expect actual;; + test_cmp expect actual;; *) test_cmp expect actual;; esac && @@ -284,6 +293,7 @@ diff-tree --stat initial mode diff-tree --summary initial mode diff-tree master +diff-tree -m master diff-tree -p master diff-tree -p -m master diff-tree -c master @@ -322,8 +332,14 @@ log --no-diff-merges -p --first-parent master log --diff-merges=off -p --first-parent master log --first-parent --diff-merges=off -p master log -p --first-parent master +log -p --diff-merges=first-parent master +log --diff-merges=first-parent master log -m -p --first-parent master log -m -p master +log --cc -m -p master +log -c -m -p master +log -m --raw master +log -m --stat master log -SF master log -S F master log -SF -p master @@ -333,6 +349,7 @@ log -SF master --max-count=2 log -GF master log -GF -p master log -GF -p --pickaxe-all master +log -IA -IB -I1 -I2 -p master log --decorate --all log --decorate=full --all @@ -438,6 +455,58 @@ diff-tree --stat --compact-summary initial mode diff-tree -R --stat --compact-summary initial mode EOF +test_expect_success 'log -m matches log -m -p' ' + git log -m -p master >result && + process_diffs result >expected && + git log -m >result && + process_diffs result >actual && + test_cmp expected actual +' + +test_expect_success 'log --diff-merges=on matches --diff-merges=separate' ' + git log -p --diff-merges=separate master >result && + process_diffs result >expected && + git log -p --diff-merges=on master >result && + process_diffs result >actual && + test_cmp expected actual +' + +test_expect_success 'deny wrong log.diffMerges config' ' + test_config log.diffMerges wrong-value && + test_expect_code 128 git log +' + +test_expect_success 'git config log.diffMerges first-parent' ' + git log -p --diff-merges=first-parent master >result && + process_diffs result >expected && + test_config log.diffMerges first-parent && + git log -p --diff-merges=on master >result && + process_diffs result >actual && + test_cmp expected actual +' + +test_expect_success 'git config log.diffMerges first-parent vs -m' ' + git log -p --diff-merges=first-parent master >result && + process_diffs result >expected && + test_config log.diffMerges first-parent && + git log -p -m master >result && + process_diffs result >actual && + test_cmp expected actual +' + +# -m in "git diff-index" means "match missing", that differs +# from its meaning in "git diff". Let's check it in diff-index. +# The line in the output for removed file should disappear when +# we provide -m in diff-index. +test_expect_success 'git diff-index -m' ' + rm -f file1 && + git diff-index HEAD >without-m && + lines_count=$(wc -l <without-m) && + git diff-index -m HEAD >with-m && + git restore file1 && + test_line_count = $((lines_count - 1)) with-m +' + test_expect_success 'log -S requires an argument' ' test_must_fail git log -S ' @@ -473,4 +542,43 @@ test_expect_success 'diff-tree --stdin with log formatting' ' test_cmp expect actual ' +test_expect_success 'diff -I<regex>: setup' ' + git checkout master && + test_seq 50 >file0 && + git commit -m "Set up -I<regex> test file" file0 && + test_seq 50 | sed -e "s/13/ten and three/" -e "/7\$/d" >file0 && + echo >>file0 +' +test_expect_success 'diff -I<regex>' ' + git diff --ignore-blank-lines -I"ten.*e" -I"^[124-9]" >actual && + cat >expect <<-\EOF && + diff --git a/file0 b/file0 + --- a/file0 + +++ b/file0 + @@ -34,7 +31,6 @@ + 34 + 35 + 36 + -37 + 38 + 39 + 40 + EOF + compare_diff_patch expect actual +' + +test_expect_success 'diff -I<regex> --stat' ' + git diff --stat --ignore-blank-lines -I"ten.*e" -I"^[124-9]" >actual && + cat >expect <<-\EOF && + file0 | 1 - + 1 file changed, 1 deletion(-) + EOF + test_cmp expect actual +' + +test_expect_success 'diff -I<regex>: detect malformed regex' ' + test_expect_code 129 git diff --ignore-matching-lines="^[124-9" 2>error && + test_i18ngrep "invalid regex given to -I: " error +' + test_done diff --git a/t/t4013/diff.diff-tree_-m_master b/t/t4013/diff.diff-tree_-m_master new file mode 100644 index 0000000000..6d0a2207fb --- /dev/null +++ b/t/t4013/diff.diff-tree_-m_master @@ -0,0 +1,11 @@ +$ git diff-tree -m master +59d314ad6f356dd08601a4cd5e530381da3e3c64 +:040000 040000 65f5c9dd60ce3b2b3324b618ac7accf8d912c113 0564e026437809817a64fff393079714b6dd4628 M dir +:100644 100644 b414108e81e5091fe0974a1858b4d0d22b107f70 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M file0 +59d314ad6f356dd08601a4cd5e530381da3e3c64 +:040000 040000 f977ed46ae6873c1c30ab878e15a4accedc3618b 0564e026437809817a64fff393079714b6dd4628 M dir +:100644 100644 f4615da674c09df322d6ba8d6b21ecfb1b1ba510 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M file0 +:000000 100644 0000000000000000000000000000000000000000 b1e67221afe8461efd244b487afca22d46b95eb8 A file1 +:100644 000000 01e79c32a8c99c557f0757da7cb6d65b3414466d 0000000000000000000000000000000000000000 D file2 +:100644 000000 7289e35bff32727c08dda207511bec138fdb9ea5 0000000000000000000000000000000000000000 D file3 +$ diff --git a/t/t4013/diff.log_--cc_-m_-p_master b/t/t4013/diff.log_--cc_-m_-p_master new file mode 100644 index 0000000000..7c217cf348 --- /dev/null +++ b/t/t4013/diff.log_--cc_-m_-p_master @@ -0,0 +1,200 @@ +$ git log --cc -m -p master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index cead32e..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -4,3 +4,5 @@ C + D + E + F ++1 ++2 +diff --git a/file0 b/file0 +index b414108..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -4,3 +4,6 @@ + 4 + 5 + 6 ++A ++B ++C + +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index 7289e35..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,4 +1,8 @@ + A + B ++C ++D ++E ++F + 1 + 2 +diff --git a/file0 b/file0 +index f4615da..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -1,6 +1,9 @@ + 1 + 2 + 3 ++4 ++5 ++6 + A + B + C +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 +diff --git a/file3 b/file3 +deleted file mode 100644 +index 7289e35..0000000 +--- a/file3 ++++ /dev/null +@@ -1,4 +0,0 @@ +-A +-B +-1 +-2 + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +diff --git a/dir/sub b/dir/sub +index 35d242b..7289e35 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++1 ++2 +diff --git a/file0 b/file0 +index 01e79c3..f4615da 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++A ++B ++C +diff --git a/file3 b/file3 +new file mode 100644 +index 0000000..7289e35 +--- /dev/null ++++ b/file3 +@@ -0,0 +1,4 @@ ++A ++B ++1 ++2 + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +diff --git a/dir/sub b/dir/sub +index 8422d40..cead32e 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -2,3 +2,5 @@ A + B + C + D ++E ++F +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +diff --git a/dir/sub b/dir/sub +index 35d242b..8422d40 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++C ++D +diff --git a/file0 b/file0 +index 01e79c3..b414108 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++4 ++5 ++6 +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_--diff-merges=first-parent_master b/t/t4013/diff.log_--diff-merges=first-parent_master new file mode 100644 index 0000000000..fa63a557dd --- /dev/null +++ b/t/t4013/diff.log_--diff-merges=first-parent_master @@ -0,0 +1,56 @@ +$ git log --diff-merges=first-parent master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index cead32e..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -4,3 +4,5 @@ C + D + E + F ++1 ++2 +diff --git a/file0 b/file0 +index b414108..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -4,3 +4,6 @@ + 4 + 5 + 6 ++A ++B ++C + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_-IA_-IB_-I1_-I2_-p_master b/t/t4013/diff.log_-IA_-IB_-I1_-I2_-p_master new file mode 100644 index 0000000000..929f35a05b --- /dev/null +++ b/t/t4013/diff.log_-IA_-IB_-I1_-I2_-p_master @@ -0,0 +1,99 @@ +$ git log -IA -IB -I1 -I2 -p master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +diff --git a/file0 b/file0 +index 01e79c3..f4615da 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++A ++B ++C +diff --git a/file3 b/file3 +new file mode 100644 +index 0000000..7289e35 + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +diff --git a/dir/sub b/dir/sub +index 8422d40..cead32e 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -2,3 +2,5 @@ A + B + C + D ++E ++F +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +diff --git a/dir/sub b/dir/sub +index 35d242b..8422d40 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++C ++D +diff --git a/file0 b/file0 +index 01e79c3..b414108 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++4 ++5 ++6 +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_-c_-m_-p_master b/t/t4013/diff.log_-c_-m_-p_master new file mode 100644 index 0000000000..b660f3d5f2 --- /dev/null +++ b/t/t4013/diff.log_-c_-m_-p_master @@ -0,0 +1,200 @@ +$ git log -c -m -p master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index cead32e..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -4,3 +4,5 @@ C + D + E + F ++1 ++2 +diff --git a/file0 b/file0 +index b414108..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -4,3 +4,6 @@ + 4 + 5 + 6 ++A ++B ++C + +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index 7289e35..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,4 +1,8 @@ + A + B ++C ++D ++E ++F + 1 + 2 +diff --git a/file0 b/file0 +index f4615da..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -1,6 +1,9 @@ + 1 + 2 + 3 ++4 ++5 ++6 + A + B + C +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 +diff --git a/file3 b/file3 +deleted file mode 100644 +index 7289e35..0000000 +--- a/file3 ++++ /dev/null +@@ -1,4 +0,0 @@ +-A +-B +-1 +-2 + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +diff --git a/dir/sub b/dir/sub +index 35d242b..7289e35 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++1 ++2 +diff --git a/file0 b/file0 +index 01e79c3..f4615da 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++A ++B ++C +diff --git a/file3 b/file3 +new file mode 100644 +index 0000000..7289e35 +--- /dev/null ++++ b/file3 +@@ -0,0 +1,4 @@ ++A ++B ++1 ++2 + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +diff --git a/dir/sub b/dir/sub +index 8422d40..cead32e 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -2,3 +2,5 @@ A + B + C + D ++E ++F +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +diff --git a/dir/sub b/dir/sub +index 35d242b..8422d40 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++C ++D +diff --git a/file0 b/file0 +index 01e79c3..b414108 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++4 ++5 ++6 +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_-m_--raw_master b/t/t4013/diff.log_-m_--raw_master new file mode 100644 index 0000000000..cd2ecc4628 --- /dev/null +++ b/t/t4013/diff.log_-m_--raw_master @@ -0,0 +1,61 @@ +$ git log -m --raw master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +:100644 100644 cead32e... 992913c... M dir/sub +:100644 100644 b414108... 10a8a9f... M file0 + +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +:100644 100644 7289e35... 992913c... M dir/sub +:100644 100644 f4615da... 10a8a9f... M file0 +:000000 100644 0000000... b1e6722... A file1 +:100644 000000 01e79c3... 0000000... D file2 +:100644 000000 7289e35... 0000000... D file3 + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +:100644 100644 35d242b... 7289e35... M dir/sub +:100644 100644 01e79c3... f4615da... M file0 +:000000 100644 0000000... 7289e35... A file3 + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +:100644 100644 8422d40... cead32e... M dir/sub +:000000 100644 0000000... b1e6722... A file1 + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +:100644 100644 35d242b... 8422d40... M dir/sub +:100644 100644 01e79c3... b414108... M file0 +:100644 000000 01e79c3... 0000000... D file2 + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_-m_--stat_master b/t/t4013/diff.log_-m_--stat_master new file mode 100644 index 0000000000..c7db084fd9 --- /dev/null +++ b/t/t4013/diff.log_-m_--stat_master @@ -0,0 +1,66 @@ +$ git log -m --stat master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + + dir/sub | 2 ++ + file0 | 3 +++ + 2 files changed, 5 insertions(+) + +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a) +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + + dir/sub | 4 ++++ + file0 | 3 +++ + file1 | 3 +++ + file2 | 3 --- + file3 | 4 ---- + 5 files changed, 10 insertions(+), 7 deletions(-) + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ + 3 files changed, 9 insertions(+) + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + + dir/sub | 2 ++ + file1 | 3 +++ + 2 files changed, 5 insertions(+) + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- + 3 files changed, 5 insertions(+), 3 deletions(-) + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4013/diff.log_-p_--diff-merges=first-parent_master b/t/t4013/diff.log_-p_--diff-merges=first-parent_master new file mode 100644 index 0000000000..9538a27511 --- /dev/null +++ b/t/t4013/diff.log_-p_--diff-merges=first-parent_master @@ -0,0 +1,137 @@ +$ git log -p --diff-merges=first-parent master +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 +Merge: 9a6d494 c7a2ab9 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:04:00 2006 +0000 + + Merge branch 'side' + +diff --git a/dir/sub b/dir/sub +index cead32e..992913c 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -4,3 +4,5 @@ C + D + E + F ++1 ++2 +diff --git a/file0 b/file0 +index b414108..10a8a9f 100644 +--- a/file0 ++++ b/file0 +@@ -4,3 +4,6 @@ + 4 + 5 + 6 ++A ++B ++C + +commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:03:00 2006 +0000 + + Side + +diff --git a/dir/sub b/dir/sub +index 35d242b..7289e35 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++1 ++2 +diff --git a/file0 b/file0 +index 01e79c3..f4615da 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++A ++B ++C +diff --git a/file3 b/file3 +new file mode 100644 +index 0000000..7289e35 +--- /dev/null ++++ b/file3 +@@ -0,0 +1,4 @@ ++A ++B ++1 ++2 + +commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:02:00 2006 +0000 + + Third + +diff --git a/dir/sub b/dir/sub +index 8422d40..cead32e 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -2,3 +2,5 @@ A + B + C + D ++E ++F +diff --git a/file1 b/file1 +new file mode 100644 +index 0000000..b1e6722 +--- /dev/null ++++ b/file1 +@@ -0,0 +1,3 @@ ++A ++B ++C + +commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:01:00 2006 +0000 + + Second + + This is the second commit. + +diff --git a/dir/sub b/dir/sub +index 35d242b..8422d40 100644 +--- a/dir/sub ++++ b/dir/sub +@@ -1,2 +1,4 @@ + A + B ++C ++D +diff --git a/file0 b/file0 +index 01e79c3..b414108 100644 +--- a/file0 ++++ b/file0 +@@ -1,3 +1,6 @@ + 1 + 2 + 3 ++4 ++5 ++6 +diff --git a/file2 b/file2 +deleted file mode 100644 +index 01e79c3..0000000 +--- a/file2 ++++ /dev/null +@@ -1,3 +0,0 @@ +-1 +-2 +-3 + +commit 444ac553ac7612cc88969031b02b3767fb8a353a +Author: A U Thor <author@example.com> +Date: Mon Jun 26 00:00:00 2006 +0000 + + Initial +$ diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 958c2da56e..712d4b5ddf 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -5,6 +5,9 @@ test_description='various format-patch tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -32,11 +35,11 @@ test_expect_success setup ' test_tick && git commit -m "Side changes #3 with \\n backslash-n in it." && - git checkout master && + git checkout main && git diff-tree -p C2 >patch && git apply --index <patch && test_tick && - git commit -m "Master accepts moral equivalent of #2" && + git commit -m "Main accepts moral equivalent of #2" && git checkout side && git checkout -b patchid && @@ -56,39 +59,39 @@ test_expect_success setup ' test_tick && git commit -m "patchid 3" && - git checkout master + git checkout main ' test_expect_success 'format-patch --ignore-if-in-upstream' ' - git format-patch --stdout master..side >patch0 && + git format-patch --stdout main..side >patch0 && grep "^From " patch0 >from0 && test_line_count = 3 from0 ' test_expect_success 'format-patch --ignore-if-in-upstream' ' git format-patch --stdout \ - --ignore-if-in-upstream master..side >patch1 && + --ignore-if-in-upstream main..side >patch1 && grep "^From " patch1 >from1 && test_line_count = 2 from1 ' test_expect_success 'format-patch --ignore-if-in-upstream handles tags' ' git tag -a v1 -m tag side && - git tag -a v2 -m tag master && + git tag -a v2 -m tag main && git format-patch --stdout --ignore-if-in-upstream v2..v1 >patch1 && grep "^From " patch1 >from1 && test_line_count = 2 from1 ' test_expect_success "format-patch doesn't consider merge commits" ' - git checkout -b feature master && + git checkout -b feature main && echo "Another line" >>file && test_tick && git commit -am "Feature branch change #1" && echo "Yet another line" >>file && test_tick && git commit -am "Feature branch change #2" && - git checkout -b merger master && + git checkout -b merger main && test_tick && git merge --no-ff feature && git format-patch -3 --stdout >patch && @@ -97,16 +100,16 @@ test_expect_success "format-patch doesn't consider merge commits" ' ' test_expect_success 'format-patch result applies' ' - git checkout -b rebuild-0 master && + git checkout -b rebuild-0 main && git am -3 patch0 && - git rev-list master.. >list && + git rev-list main.. >list && test_line_count = 2 list ' test_expect_success 'format-patch --ignore-if-in-upstream result applies' ' - git checkout -b rebuild-1 master && + git checkout -b rebuild-1 main && git am -3 patch1 && - git rev-list master.. >list && + git rev-list main.. >list && test_line_count = 2 list ' @@ -130,7 +133,7 @@ test_expect_success 'extra headers' ' " && git config --add format.headers "Cc: S E Cipient <scipient@example.com> " && - git format-patch --stdout master..side >patch2 && + git format-patch --stdout main..side >patch2 && sed -e "/^\$/q" patch2 >hdrs2 && grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 && grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2 @@ -139,7 +142,7 @@ test_expect_success 'extra headers' ' test_expect_success 'extra headers without newlines' ' git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && git config --add format.headers "Cc: S E Cipient <scipient@example.com>" && - git format-patch --stdout master..side >patch3 && + git format-patch --stdout main..side >patch3 && sed -e "/^\$/q" patch3 >hdrs3 && grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 && grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3 @@ -148,7 +151,7 @@ test_expect_success 'extra headers without newlines' ' test_expect_success 'extra headers with multiple To:s' ' git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && git config --add format.headers "To: S E Cipient <scipient@example.com>" && - git format-patch --stdout master..side >patch4 && + git format-patch --stdout main..side >patch4 && sed -e "/^\$/q" patch4 >hdrs4 && grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 && grep "^ *S E Cipient <scipient@example.com>\$" hdrs4 @@ -156,7 +159,7 @@ test_expect_success 'extra headers with multiple To:s' ' test_expect_success 'additional command line cc (ascii)' ' git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && - git format-patch --cc="S E Cipient <scipient@example.com>" --stdout master..side >patch5 && + git format-patch --cc="S E Cipient <scipient@example.com>" --stdout main..side >patch5 && sed -e "/^\$/q" patch5 >hdrs5 && grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && grep "^ *S E Cipient <scipient@example.com>\$" hdrs5 @@ -164,7 +167,7 @@ test_expect_success 'additional command line cc (ascii)' ' test_expect_failure 'additional command line cc (rfc822)' ' git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && - git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout master..side >patch5 && + git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 && sed -e "/^\$/q" patch5 >hdrs5 && grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5 @@ -172,14 +175,14 @@ test_expect_failure 'additional command line cc (rfc822)' ' test_expect_success 'command line headers' ' git config --unset-all format.headers && - git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout master..side >patch6 && + git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout main..side >patch6 && sed -e "/^\$/q" patch6 >hdrs6 && grep "^Cc: R E Cipient <rcipient@example.com>\$" hdrs6 ' test_expect_success 'configuration headers and command line headers' ' git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && - git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout master..side >patch7 && + git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout main..side >patch7 && sed -e "/^\$/q" patch7 >hdrs7 && grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs7 && grep "^ *S E Cipient <scipient@example.com>\$" hdrs7 @@ -187,40 +190,40 @@ test_expect_success 'configuration headers and command line headers' ' test_expect_success 'command line To: header (ascii)' ' git config --unset-all format.headers && - git format-patch --to="R E Cipient <rcipient@example.com>" --stdout master..side >patch8 && + git format-patch --to="R E Cipient <rcipient@example.com>" --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && grep "^To: R E Cipient <rcipient@example.com>\$" hdrs8 ' test_expect_failure 'command line To: header (rfc822)' ' - git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout master..side >patch8 && + git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8 ' test_expect_failure 'command line To: header (rfc2047)' ' - git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout master..side >patch8 && + git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8 ' test_expect_success 'configuration To: header (ascii)' ' git config format.to "R E Cipient <rcipient@example.com>" && - git format-patch --stdout master..side >patch9 && + git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && grep "^To: R E Cipient <rcipient@example.com>\$" hdrs9 ' test_expect_failure 'configuration To: header (rfc822)' ' git config format.to "R. E. Cipient <rcipient@example.com>" && - git format-patch --stdout master..side >patch9 && + git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9 ' test_expect_failure 'configuration To: header (rfc2047)' ' git config format.to "R Ä Cipient <rcipient@example.com>" && - git format-patch --stdout master..side >patch9 && + git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9 ' @@ -234,35 +237,35 @@ check_patch () { } test_expect_success 'format.from=false' ' - git -c format.from=false format-patch --stdout master..side >patch && + git -c format.from=false format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch patch && ! grep "^From: C O Mitter <committer@example.com>\$" hdrs ' test_expect_success 'format.from=true' ' - git -c format.from=true format-patch --stdout master..side >patch && + git -c format.from=true format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && grep "^From: C O Mitter <committer@example.com>\$" hdrs ' test_expect_success 'format.from with address' ' - git -c format.from="F R Om <from@example.com>" format-patch --stdout master..side >patch && + git -c format.from="F R Om <from@example.com>" format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && grep "^From: F R Om <from@example.com>\$" hdrs ' test_expect_success '--no-from overrides format.from' ' - git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout master..side >patch && + git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && ! grep "^From: F R Om <from@example.com>\$" hdrs ' test_expect_success '--from overrides format.from' ' - git -c format.from="F R Om <from@example.com>" format-patch --from --stdout master..side >patch && + git -c format.from="F R Om <from@example.com>" format-patch --from --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && ! grep "^From: F R Om <from@example.com>\$" hdrs @@ -271,7 +274,7 @@ test_expect_success '--from overrides format.from' ' test_expect_success '--no-to overrides config.to' ' git config --replace-all format.to \ "R E Cipient <rcipient@example.com>" && - git format-patch --no-to --stdout master..side >patch10 && + git format-patch --no-to --stdout main..side >patch10 && sed -e "/^\$/q" patch10 >hdrs10 && check_patch hdrs10 && ! grep "^To: R E Cipient <rcipient@example.com>\$" hdrs10 @@ -281,7 +284,7 @@ test_expect_success '--no-to and --to replaces config.to' ' git config --replace-all format.to \ "Someone <someone@out.there>" && git format-patch --no-to --to="Someone Else <else@out.there>" \ - --stdout master..side >patch11 && + --stdout main..side >patch11 && sed -e "/^\$/q" patch11 >hdrs11 && check_patch hdrs11 && ! grep "^To: Someone <someone@out.there>\$" hdrs11 && @@ -291,7 +294,7 @@ test_expect_success '--no-to and --to replaces config.to' ' test_expect_success '--no-cc overrides config.cc' ' git config --replace-all format.cc \ "C E Cipient <rcipient@example.com>" && - git format-patch --no-cc --stdout master..side >patch12 && + git format-patch --no-cc --stdout main..side >patch12 && sed -e "/^\$/q" patch12 >hdrs12 && check_patch hdrs12 && ! grep "^Cc: C E Cipient <rcipient@example.com>\$" hdrs12 @@ -300,7 +303,7 @@ test_expect_success '--no-cc overrides config.cc' ' test_expect_success '--no-add-header overrides config.headers' ' git config --replace-all format.headers \ "Header1: B E Cipient <rcipient@example.com>" && - git format-patch --no-add-header --stdout master..side >patch13 && + git format-patch --no-add-header --stdout main..side >patch13 && sed -e "/^\$/q" patch13 >hdrs13 && check_patch hdrs13 && ! grep "^Header1: B E Cipient <rcipient@example.com>\$" hdrs13 @@ -309,13 +312,67 @@ test_expect_success '--no-add-header overrides config.headers' ' test_expect_success 'multiple files' ' rm -rf patches/ && git checkout side && - git format-patch -o patches/ master && + git format-patch -o patches/ main && ls patches/0001-Side-changes-1.patch patches/0002-Side-changes-2.patch patches/0003-Side-changes-3-with-n-backslash-n-in-it.patch ' +test_expect_success 'filename length limit' ' + test_when_finished "rm -f 000*" && + rm -rf 000[1-9]-*.patch && + for len in 15 25 35 + do + git format-patch --filename-max-length=$len -3 side && + max=$( + for patch in 000[1-9]-*.patch + do + echo "$patch" | wc -c + done | + sort -nr | + head -n 1 + ) && + test $max -le $len || return 1 + done +' + +test_expect_success 'filename length limit from config' ' + test_when_finished "rm -f 000*" && + rm -rf 000[1-9]-*.patch && + for len in 15 25 35 + do + git -c format.filenameMaxLength=$len format-patch -3 side && + max=$( + for patch in 000[1-9]-*.patch + do + echo "$patch" | wc -c + done | + sort -nr | + head -n 1 + ) && + test $max -le $len || return 1 + done +' + +test_expect_success 'filename limit applies only to basename' ' + test_when_finished "rm -rf patches/" && + rm -rf patches/ && + for len in 15 25 35 + do + git format-patch -o patches --filename-max-length=$len -3 side && + max=$( + for patch in patches/000[1-9]-*.patch + do + echo "${patch#patches/}" | wc -c + done | + sort -nr | + head -n 1 + ) && + test $max -le $len || return 1 + done +' + test_expect_success 'reroll count' ' rm -fr patches && - git format-patch -o patches --cover-letter --reroll-count 4 master..side >list && + git format-patch -o patches --cover-letter --reroll-count 4 main..side >list && ! grep -v "^patches/v4-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects @@ -323,12 +380,36 @@ test_expect_success 'reroll count' ' test_expect_success 'reroll count (-v)' ' rm -fr patches && - git format-patch -o patches --cover-letter -v4 master..side >list && + git format-patch -o patches --cover-letter -v4 main..side >list && ! grep -v "^patches/v4-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects ' +test_expect_success 'reroll count (-v) with a fractional number' ' + rm -fr patches && + git format-patch -o patches --cover-letter -v4.4 main..side >list && + ! grep -v "^patches/v4.4-000[0-3]-" list && + sed -n -e "/^Subject: /p" $(cat list) >subjects && + ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects +' + +test_expect_success 'reroll (-v) count with a non number' ' + rm -fr patches && + git format-patch -o patches --cover-letter -v4rev2 main..side >list && + ! grep -v "^patches/v4rev2-000[0-3]-" list && + sed -n -e "/^Subject: /p" $(cat list) >subjects && + ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects +' + +test_expect_success 'reroll (-v) count with a non-pathname character' ' + rm -fr patches && + git format-patch -o patches --cover-letter -v4---..././../--1/.2// main..side >list && + ! grep -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list && + sed -n -e "/^Subject: /p" $(cat list) >subjects && + ! grep -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects +' + check_threading () { expect="$1" && shift && @@ -359,7 +440,7 @@ EOF test_expect_success 'no threading' ' git checkout side && - check_threading expect.no-threading master + check_threading expect.no-threading main ' cat >expect.thread <<EOF @@ -376,7 +457,7 @@ References: <0> EOF test_expect_success 'thread' ' - check_threading expect.thread --thread master + check_threading expect.thread --thread main ' cat >expect.in-reply-to <<EOF @@ -396,7 +477,7 @@ EOF test_expect_success 'thread in-reply-to' ' check_threading expect.in-reply-to --in-reply-to="<test.message>" \ - --thread master + --thread main ' cat >expect.cover-letter <<EOF @@ -417,7 +498,7 @@ References: <0> EOF test_expect_success 'thread cover-letter' ' - check_threading expect.cover-letter --cover-letter --thread master + check_threading expect.cover-letter --cover-letter --thread main ' cat >expect.cl-irt <<EOF @@ -444,12 +525,12 @@ EOF test_expect_success 'thread cover-letter in-reply-to' ' check_threading expect.cl-irt --cover-letter \ - --in-reply-to="<test.message>" --thread master + --in-reply-to="<test.message>" --thread main ' test_expect_success 'thread explicit shallow' ' check_threading expect.cl-irt --cover-letter \ - --in-reply-to="<test.message>" --thread=shallow master + --in-reply-to="<test.message>" --thread=shallow main ' cat >expect.deep <<EOF @@ -467,7 +548,7 @@ References: <0> EOF test_expect_success 'thread deep' ' - check_threading expect.deep --thread=deep master + check_threading expect.deep --thread=deep main ' cat >expect.deep-irt <<EOF @@ -490,7 +571,7 @@ EOF test_expect_success 'thread deep in-reply-to' ' check_threading expect.deep-irt --thread=deep \ - --in-reply-to="<test.message>" master + --in-reply-to="<test.message>" main ' cat >expect.deep-cl <<EOF @@ -514,7 +595,7 @@ References: <0> EOF test_expect_success 'thread deep cover-letter' ' - check_threading expect.deep-cl --cover-letter --thread=deep master + check_threading expect.deep-cl --cover-letter --thread=deep main ' cat >expect.deep-cl-irt <<EOF @@ -544,27 +625,27 @@ EOF test_expect_success 'thread deep cover-letter in-reply-to' ' check_threading expect.deep-cl-irt --cover-letter \ - --in-reply-to="<test.message>" --thread=deep master + --in-reply-to="<test.message>" --thread=deep main ' test_expect_success 'thread via config' ' test_config format.thread true && - check_threading expect.thread master + check_threading expect.thread main ' test_expect_success 'thread deep via config' ' test_config format.thread deep && - check_threading expect.deep master + check_threading expect.deep main ' test_expect_success 'thread config + override' ' test_config format.thread deep && - check_threading expect.thread --thread master + check_threading expect.thread --thread main ' test_expect_success 'thread config + --no-thread' ' test_config format.thread deep && - check_threading expect.no-threading --no-thread master + check_threading expect.no-threading --no-thread main ' test_expect_success 'excessive subject' ' @@ -577,7 +658,7 @@ test_expect_success 'excessive subject' ' after=$(git rev-parse --short $after) && git update-index file && git commit -m "This is an excessively long subject line for a message due to the habit some projects have of not having a short, one-line subject at the start of the commit message, but rather sticking a whole paragraph right at the start as the only thing in the commit message. It had better not become the filename for the patch." && - git format-patch -o patches/ master..side && + git format-patch -o patches/ main..side && ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch ' @@ -831,21 +912,21 @@ echo "fatal: --check does not make sense" >expect.check test_expect_success 'options no longer allowed for format-patch' ' test_must_fail git format-patch --name-only 2>output && - test_i18ncmp expect.name-only output && + test_cmp expect.name-only output && test_must_fail git format-patch --name-status 2>output && - test_i18ncmp expect.name-status output && + test_cmp expect.name-status output && test_must_fail git format-patch --check 2>output && - test_i18ncmp expect.check output + test_cmp expect.check output ' test_expect_success 'format-patch --numstat should produce a patch' ' - git format-patch --numstat --stdout master..side >output && + git format-patch --numstat --stdout main..side >output && grep "^diff --git a/" output >diff && test_line_count = 5 diff ' test_expect_success 'format-patch -- <path>' ' - git format-patch master..side -- file 2>error && + git format-patch main..side -- file 2>error && ! grep "Use .--" error ' @@ -1619,9 +1700,9 @@ test_expect_success 'cover letter with invalid --cover-from-description and conf test_config branch.rebuild-1.description "config subject body" && - test_must_fail git format-patch --cover-letter --cover-from-description garbage master && + test_must_fail git format-patch --cover-letter --cover-from-description garbage main && test_config format.coverFromDescription garbage && - test_must_fail git format-patch --cover-letter master + test_must_fail git format-patch --cover-letter main ' test_expect_success 'cover letter with format.coverFromDescription = default' ' @@ -1630,7 +1711,7 @@ test_expect_success 'cover letter with format.coverFromDescription = default' ' body" && test_config format.coverFromDescription default && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^config subject$" actual && @@ -1642,7 +1723,7 @@ test_expect_success 'cover letter with --cover-from-description default' ' body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description default master >actual && + git format-patch --stdout --cover-letter --cover-from-description default main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^config subject$" actual && @@ -1655,7 +1736,7 @@ test_expect_success 'cover letter with format.coverFromDescription = none' ' body" && test_config format.coverFromDescription none && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1667,7 +1748,7 @@ test_expect_success 'cover letter with --cover-from-description none' ' body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description none master >actual && + git format-patch --stdout --cover-letter --cover-from-description none main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1680,7 +1761,7 @@ test_expect_success 'cover letter with format.coverFromDescription = message' ' body" && test_config format.coverFromDescription message && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^config subject$" actual && @@ -1692,7 +1773,7 @@ test_expect_success 'cover letter with --cover-from-description message' ' body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description message master >actual && + git format-patch --stdout --cover-letter --cover-from-description message main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^config subject$" actual && @@ -1705,7 +1786,7 @@ test_expect_success 'cover letter with format.coverFromDescription = subject' ' body" && test_config format.coverFromDescription subject && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] config subject$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1717,7 +1798,7 @@ test_expect_success 'cover letter with --cover-from-description subject' ' body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description subject master >actual && + git format-patch --stdout --cover-letter --cover-from-description subject main >actual && grep "^Subject: \[PATCH 0/2\] config subject$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1730,7 +1811,7 @@ test_expect_success 'cover letter with format.coverFromDescription = auto (short body" && test_config format.coverFromDescription auto && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] config subject$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1742,7 +1823,7 @@ test_expect_success 'cover letter with --cover-from-description auto (short subj body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description auto master >actual && + git format-patch --stdout --cover-letter --cover-from-description auto main >actual && grep "^Subject: \[PATCH 0/2\] config subject$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1755,7 +1836,7 @@ test_expect_success 'cover letter with format.coverFromDescription = auto (long body" && test_config format.coverFromDescription auto && git checkout rebuild-1 && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && @@ -1767,7 +1848,7 @@ test_expect_success 'cover letter with --cover-from-description auto (long subje body" && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description auto master >actual && + git format-patch --stdout --cover-letter --cover-from-description auto main >actual && grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && @@ -1780,7 +1861,7 @@ test_expect_success 'cover letter with command-line --cover-from-description ove body" && test_config format.coverFromDescription none && git checkout rebuild-1 && - git format-patch --stdout --cover-letter --cover-from-description subject master >actual && + git format-patch --stdout --cover-letter --cover-from-description subject main >actual && grep "^Subject: \[PATCH 0/2\] config subject$" actual && ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && ! grep "^config subject$" actual && @@ -1790,7 +1871,7 @@ body" && test_expect_success 'cover letter using branch description (1)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && - git format-patch --stdout --cover-letter master >actual && + git format-patch --stdout --cover-letter main >actual && grep hello actual ' @@ -1804,14 +1885,14 @@ test_expect_success 'cover letter using branch description (2)' ' test_expect_success 'cover letter using branch description (3)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && - git format-patch --stdout --cover-letter ^master rebuild-1 >actual && + git format-patch --stdout --cover-letter ^main rebuild-1 >actual && grep hello actual ' test_expect_success 'cover letter using branch description (4)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && - git format-patch --stdout --cover-letter master.. >actual && + git format-patch --stdout --cover-letter main.. >actual && grep hello actual ' @@ -1878,8 +1959,8 @@ test_expect_success 'From line has expected format' ' test_expect_success 'format-patch -o with no leading directories' ' rm -fr patches && - git format-patch -o patches master..side && - count=$(git rev-list --count master..side) && + git format-patch -o patches main..side && + count=$(git rev-list --count main..side) && ls patches >list && test_line_count = $count list ' @@ -1887,16 +1968,16 @@ test_expect_success 'format-patch -o with no leading directories' ' test_expect_success 'format-patch -o with leading existing directories' ' rm -rf existing-dir && mkdir existing-dir && - git format-patch -o existing-dir/patches master..side && - count=$(git rev-list --count master..side) && + git format-patch -o existing-dir/patches main..side && + count=$(git rev-list --count main..side) && ls existing-dir/patches >list && test_line_count = $count list ' test_expect_success 'format-patch -o with leading non-existing directories' ' rm -rf non-existing-dir && - git format-patch -o non-existing-dir/patches master..side && - count=$(git rev-list --count master..side) && + git format-patch -o non-existing-dir/patches main..side && + count=$(git rev-list --count main..side) && test_path_is_dir non-existing-dir && ls non-existing-dir/patches >list && test_line_count = $count list @@ -1905,8 +1986,8 @@ test_expect_success 'format-patch -o with leading non-existing directories' ' test_expect_success 'format-patch format.outputDirectory option' ' test_config format.outputDirectory patches && rm -fr patches && - git format-patch master..side && - count=$(git rev-list --count master..side) && + git format-patch main..side && + count=$(git rev-list --count main..side) && ls patches >list && test_line_count = $count list ' @@ -1914,11 +1995,44 @@ test_expect_success 'format-patch format.outputDirectory option' ' test_expect_success 'format-patch -o overrides format.outputDirectory' ' test_config format.outputDirectory patches && rm -fr patches patchset && - git format-patch master..side -o patchset && + git format-patch main..side -o patchset && test_path_is_missing patches && test_path_is_dir patchset ' +test_expect_success 'format-patch forbids multiple outputs' ' + rm -fr outfile outdir && + test_must_fail \ + git format-patch --stdout --output-directory=outdir && + test_must_fail \ + git format-patch --stdout --output=outfile && + test_must_fail \ + git format-patch --output=outfile --output-directory=outdir +' + +test_expect_success 'configured outdir does not conflict with output options' ' + rm -fr outfile outdir && + test_config format.outputDirectory outdir && + git format-patch --stdout && + test_path_is_missing outdir && + git format-patch --output=outfile && + test_path_is_missing outdir +' + +test_expect_success 'format-patch --output' ' + rm -fr outfile && + git format-patch -3 --stdout HEAD >expect && + git format-patch -3 --output=outfile HEAD && + test_cmp expect outfile +' + +test_expect_success 'format-patch --cover-letter --output' ' + rm -fr outfile && + git format-patch --cover-letter -3 --stdout HEAD >expect && + git format-patch --cover-letter -3 --output=outfile HEAD && + test_cmp expect outfile +' + test_expect_success 'format-patch --base' ' git checkout patchid && @@ -1978,14 +2092,14 @@ test_expect_success 'format-patch --base errors out when base commit is not ance # ------------W # # If "format-patch Z..X" is given, P and Z can not be specified as the base commit - git checkout -b topic1 master && + git checkout -b topic1 main && git rev-parse HEAD >commit-id-base && test_commit P && git rev-parse HEAD >commit-id-P && test_commit Z && git rev-parse HEAD >commit-id-Z && test_commit Y && - git checkout -b topic2 master && + git checkout -b topic2 main && test_commit W && git merge topic1 && test_commit X && @@ -1998,7 +2112,7 @@ test_expect_success 'format-patch --base errors out when base commit is not ance ' test_expect_success 'format-patch --base=auto' ' - git checkout -b upstream master && + git checkout -b upstream main && git checkout -b local upstream && git branch --set-upstream-to=upstream && test_commit N1 && @@ -2019,11 +2133,11 @@ test_expect_success 'format-patch errors out when history involves criss-cross' # \ / \ # C---M2---E # - git checkout master && + git checkout main && test_commit A && - git checkout -b xb master && + git checkout -b xb main && test_commit B && - git checkout -b xc master && + git checkout -b xc main && test_commit C && git checkout -b xbc xb -- && git merge xc && @@ -2037,6 +2151,12 @@ test_expect_success 'format-patch errors out when history involves criss-cross' test_must_fail git format-patch --base=auto -1 ' +test_expect_success 'format-patch format.useAutoBase whenAble history involves criss-cross' ' + test_config format.useAutoBase whenAble && + git format-patch -1 >patch && + ! grep "^base-commit:" patch +' + test_expect_success 'format-patch format.useAutoBase option' ' git checkout local && test_config format.useAutoBase true && @@ -2047,6 +2167,16 @@ test_expect_success 'format-patch format.useAutoBase option' ' test_cmp expect actual ' +test_expect_success 'format-patch format.useAutoBase option with whenAble' ' + git checkout local && + test_config format.useAutoBase whenAble && + git format-patch --stdout -1 >patch && + grep "^base-commit:" patch >actual && + git rev-parse upstream >commit-id-base && + echo "base-commit: $(cat commit-id-base)" >expect && + test_cmp expect actual +' + test_expect_success 'format-patch --base overrides format.useAutoBase' ' test_config format.useAutoBase true && git format-patch --stdout --base=HEAD~1 -1 >patch && @@ -2062,6 +2192,12 @@ test_expect_success 'format-patch --no-base overrides format.useAutoBase' ' ! grep "^base-commit:" patch ' +test_expect_success 'format-patch --no-base overrides format.useAutoBase whenAble' ' + test_config format.useAutoBase whenAble && + git format-patch --stdout --no-base -1 >patch && + ! grep "^base-commit:" patch +' + test_expect_success 'format-patch --base with --attach' ' git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch && sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \ @@ -2121,7 +2257,7 @@ test_expect_success 'format-patch --pretty=mboxrd' ' ' test_expect_success 'interdiff: setup' ' - git checkout -b boop master && + git checkout -b boop main && test_commit fnorp blorp && test_commit fleep blorp ' @@ -2143,6 +2279,16 @@ test_expect_success 'interdiff: reroll-count' ' test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch ' +test_expect_success 'interdiff: reroll-count with a non-integer' ' + git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop && + test_i18ngrep "^Interdiff:$" v2.2-0000-cover-letter.patch +' + +test_expect_success 'interdiff: reroll-count with a integer' ' + git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && + test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch +' + test_expect_success 'interdiff: solo-patch' ' cat >expect <<-\EOF && +fleep diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index 8bdaa0a693..2c13b62d3c 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -7,7 +7,7 @@ test_description='Test special whitespace in diff engine. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh test_expect_success "Ray Lehtiniemi's example" ' cat <<-\EOF >x && @@ -567,6 +567,30 @@ test_expect_success '--check and --quiet are not exclusive' ' git diff --check --quiet ' +test_expect_success '-w and --exit-code interact sensibly' ' + test_when_finished "git checkout x" && + { + test_seq 15 && + echo " 16" + } >x && + test_must_fail git diff --exit-code && + git diff -w >actual && + test_must_be_empty actual && + git diff -w --exit-code +' + +test_expect_success '-I and --exit-code interact sensibly' ' + test_when_finished "git checkout x" && + { + test_seq 15 && + echo " 16" + } >x && + test_must_fail git diff --exit-code && + git diff -I. >actual && + test_must_be_empty actual && + git diff -I. --exit-code +' + test_expect_success 'check staged with no whitespace errors' ' echo "foo();" >x && git add x && @@ -877,13 +901,13 @@ test_expect_success 'rename empty' ' test_expect_success 'combined diff with autocrlf conversion' ' git reset --hard && - echo >x hello && - git commit -m "one side" x && + test_commit "one side" x hello one-side && git checkout HEAD^ && echo >x goodbye && git commit -m "the other side" x && git config core.autocrlf true && - test_must_fail git merge master && + test_must_fail git merge one-side >actual && + test_i18ngrep "Automatic merge failed" actual && git diff >actual.raw && sed -e "1,/^@@@/d" actual.raw >actual && diff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh index 9c48e5c2c9..876271d682 100755 --- a/t/t4016-diff-quote.sh +++ b/t/t4016-diff-quote.sh @@ -82,7 +82,7 @@ test_expect_success 'git diff --stat -M HEAD' ' 7 files changed, 0 insertions(+), 0 deletions(-) EOF git diff --stat -M HEAD >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_done diff --git a/t/t4017-diff-retval.sh b/t/t4017-diff-retval.sh index 95a7ca7070..ed461f481e 100755 --- a/t/t4017-diff-retval.sh +++ b/t/t4017-diff-retval.sh @@ -2,6 +2,9 @@ test_description='Return value of diffs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -111,7 +114,7 @@ test_expect_success 'check detects leftover conflict markers' ' git checkout HEAD^ && echo binary >>b && git commit -m "side" b && - test_must_fail git merge master && + test_must_fail git merge main && git add b && test_expect_code 2 git --no-pager diff --cached --check >test.out && test 3 = $(grep "conflict marker" test.out | wc -l) && diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh index 9d07797579..740696c8f7 100755 --- a/t/t4018-diff-funcname.sh +++ b/t/t4018-diff-funcname.sh @@ -25,32 +25,26 @@ test_expect_success 'setup' ' echo B >B.java ' +test_expect_success 'setup: test-tool userdiff' ' + # Make sure additions to builtin_drivers are sorted + test_when_finished "rm builtin-drivers.sorted" && + test-tool userdiff list-builtin-drivers >builtin-drivers && + test_file_not_empty builtin-drivers && + sort <builtin-drivers >builtin-drivers.sorted && + test_cmp builtin-drivers.sorted builtin-drivers && + + # Ditto, but "custom" requires the .git directory and config + # to be setup and read. + test_when_finished "rm custom-drivers.sorted" && + test-tool userdiff list-custom-drivers >custom-drivers && + test_file_not_empty custom-drivers && + sort <custom-drivers >custom-drivers.sorted && + test_cmp custom-drivers.sorted custom-drivers +' + diffpatterns=" - ada - bibtex - cpp - csharp - css - dts - elixir - fortran - fountain - golang - html - java - markdown - matlab - objc - pascal - perl - php - python - ruby - rust - tex - custom1 - custom2 - custom3 + $(cat builtin-drivers) + $(cat custom-drivers) " for p in $diffpatterns @@ -100,13 +94,7 @@ test_expect_success 'setup hunk header tests' ' # check each individual file for i in $(git ls-files) do - if grep broken "$i" >/dev/null 2>&1 - then - result=failure - else - result=success - fi - test_expect_$result "hunk header: $i" " + test_expect_success "hunk header: $i" " git diff -U1 $i >actual && grep '@@ .* @@.*RIGHT' actual " diff --git a/t/t4018/README b/t/t4018/README index 283e01cca1..2d25b2b4fc 100644 --- a/t/t4018/README +++ b/t/t4018/README @@ -7,9 +7,6 @@ at least two lines from the line that must appear in the hunk header. The text that must appear in the hunk header must contain the word "right", but in all upper-case, like in the title above. -To mark a test case that highlights a malfunction, insert the word -BROKEN in all lower-case somewhere in the file. - This text is a bit twisted and out of order, but it is itself a test case for the default hunk header pattern. Know what you are doing if you change it. diff --git a/t/t4018/bash-arithmetic-function b/t/t4018/bash-arithmetic-function new file mode 100644 index 0000000000..c0b276cb50 --- /dev/null +++ b/t/t4018/bash-arithmetic-function @@ -0,0 +1,4 @@ +RIGHT() (( + + ChangeMe = "$x" + "$y" +)) diff --git a/t/t4018/bash-bashism-style-compact b/t/t4018/bash-bashism-style-compact new file mode 100644 index 0000000000..1ca3126f61 --- /dev/null +++ b/t/t4018/bash-bashism-style-compact @@ -0,0 +1,6 @@ +function RIGHT { + function InvalidSyntax{ + : + echo 'ChangeMe' + } +} diff --git a/t/t4018/bash-bashism-style-function b/t/t4018/bash-bashism-style-function new file mode 100644 index 0000000000..f1de4fa831 --- /dev/null +++ b/t/t4018/bash-bashism-style-function @@ -0,0 +1,4 @@ +function RIGHT { + : + echo 'ChangeMe' +} diff --git a/t/t4018/bash-bashism-style-whitespace b/t/t4018/bash-bashism-style-whitespace new file mode 100644 index 0000000000..ade85dd3a5 --- /dev/null +++ b/t/t4018/bash-bashism-style-whitespace @@ -0,0 +1,4 @@ + function RIGHT ( ) { + + ChangeMe + } diff --git a/t/t4018/bash-conditional-function b/t/t4018/bash-conditional-function new file mode 100644 index 0000000000..c5949e829b --- /dev/null +++ b/t/t4018/bash-conditional-function @@ -0,0 +1,4 @@ +RIGHT() [[ \ + + "$a" > "$ChangeMe" +]] diff --git a/t/t4018/bash-missing-parentheses b/t/t4018/bash-missing-parentheses new file mode 100644 index 0000000000..8c8a05dd7a --- /dev/null +++ b/t/t4018/bash-missing-parentheses @@ -0,0 +1,6 @@ +function RIGHT { + functionInvalidSyntax { + : + echo 'ChangeMe' + } +} diff --git a/t/t4018/bash-mixed-style-compact b/t/t4018/bash-mixed-style-compact new file mode 100644 index 0000000000..d9364cba67 --- /dev/null +++ b/t/t4018/bash-mixed-style-compact @@ -0,0 +1,4 @@ +function RIGHT(){ + : + echo 'ChangeMe' +} diff --git a/t/t4018/bash-mixed-style-function b/t/t4018/bash-mixed-style-function new file mode 100644 index 0000000000..555f9b2466 --- /dev/null +++ b/t/t4018/bash-mixed-style-function @@ -0,0 +1,4 @@ +function RIGHT() { + + ChangeMe +} diff --git a/t/t4018/bash-nested-functions b/t/t4018/bash-nested-functions new file mode 100644 index 0000000000..2c9237ead4 --- /dev/null +++ b/t/t4018/bash-nested-functions @@ -0,0 +1,6 @@ +outer() { + RIGHT() { + : + echo 'ChangeMe' + } +} diff --git a/t/t4018/bash-other-characters b/t/t4018/bash-other-characters new file mode 100644 index 0000000000..a3f390d525 --- /dev/null +++ b/t/t4018/bash-other-characters @@ -0,0 +1,4 @@ +_RIGHT_0n() { + + ChangeMe +} diff --git a/t/t4018/bash-posix-style-compact b/t/t4018/bash-posix-style-compact new file mode 100644 index 0000000000..045bd2029b --- /dev/null +++ b/t/t4018/bash-posix-style-compact @@ -0,0 +1,4 @@ +RIGHT(){ + + ChangeMe +} diff --git a/t/t4018/bash-posix-style-function b/t/t4018/bash-posix-style-function new file mode 100644 index 0000000000..a4d144856e --- /dev/null +++ b/t/t4018/bash-posix-style-function @@ -0,0 +1,4 @@ +RIGHT() { + + ChangeMe +} diff --git a/t/t4018/bash-posix-style-whitespace b/t/t4018/bash-posix-style-whitespace new file mode 100644 index 0000000000..4d984f0aa4 --- /dev/null +++ b/t/t4018/bash-posix-style-whitespace @@ -0,0 +1,4 @@ + RIGHT ( ) { + + ChangeMe + } diff --git a/t/t4018/bash-subshell-function b/t/t4018/bash-subshell-function new file mode 100644 index 0000000000..80baa09484 --- /dev/null +++ b/t/t4018/bash-subshell-function @@ -0,0 +1,4 @@ +RIGHT() ( + + ChangeMe=2 +) diff --git a/t/t4018/bash-trailing-comment b/t/t4018/bash-trailing-comment new file mode 100644 index 0000000000..f1edbeda31 --- /dev/null +++ b/t/t4018/bash-trailing-comment @@ -0,0 +1,4 @@ +RIGHT() { # Comment + + ChangeMe +} diff --git a/t/t4018/css-attribute-value-selector b/t/t4018/css-attribute-value-selector new file mode 100644 index 0000000000..918256b20c --- /dev/null +++ b/t/t4018/css-attribute-value-selector @@ -0,0 +1,4 @@ +[class*="RIGHT"] { + background : #000; + border : 10px ChangeMe #C6C6C6; +} diff --git a/t/t4018/css-block-level-@-statements b/t/t4018/css-block-level-@-statements new file mode 100644 index 0000000000..d6755f2f3d --- /dev/null +++ b/t/t4018/css-block-level-@-statements @@ -0,0 +1,10 @@ +@keyframes RIGHT { + from { + background : #000; + border : 10px ChangeMe #C6C6C6; + } + to { + background : #fff; + border : 10px solid #C6C6C6; + } +} diff --git a/t/t4018/css-class-selector b/t/t4018/css-class-selector new file mode 100644 index 0000000000..f790a0062f --- /dev/null +++ b/t/t4018/css-class-selector @@ -0,0 +1,4 @@ +.RIGHT { + background : #000; + border : 10px ChangeMe #C6C6C6; +} diff --git a/t/t4018/css-id-selector b/t/t4018/css-id-selector new file mode 100644 index 0000000000..17c5111052 --- /dev/null +++ b/t/t4018/css-id-selector @@ -0,0 +1,4 @@ +#RIGHT { + background : #000; + border : 10px ChangeMe #C6C6C6; +} diff --git a/t/t4018/css-root-selector b/t/t4018/css-root-selector new file mode 100644 index 0000000000..22b958e369 --- /dev/null +++ b/t/t4018/css-root-selector @@ -0,0 +1,4 @@ +:RIGHT { + background : #000; + border : 10px ChangeMe #C6C6C6; +} diff --git a/t/t4018/php-abstract-method b/t/t4018/php-abstract-method new file mode 100644 index 0000000000..ce215df75a --- /dev/null +++ b/t/t4018/php-abstract-method @@ -0,0 +1,7 @@ +abstract class Klass +{ + abstract public function RIGHT(): ?string + { + return 'ChangeMe'; + } +} diff --git a/t/t4018/php-final-method b/t/t4018/php-final-method new file mode 100644 index 0000000000..537fb8ad9a --- /dev/null +++ b/t/t4018/php-final-method @@ -0,0 +1,7 @@ +class Klass +{ + final public function RIGHT(): string + { + return 'ChangeMe'; + } +} diff --git a/t/t4018/rust-macro-rules b/t/t4018/rust-macro-rules new file mode 100644 index 0000000000..ec610c5b62 --- /dev/null +++ b/t/t4018/rust-macro-rules @@ -0,0 +1,6 @@ +macro_rules! RIGHT { + () => { + // a comment + let x = ChangeMe; + }; +} diff --git a/t/t4018/scheme-class b/t/t4018/scheme-class new file mode 100644 index 0000000000..e5e07b43fb --- /dev/null +++ b/t/t4018/scheme-class @@ -0,0 +1,7 @@ +(define book-class% + (class* () object% RIGHT + (field (pages 5)) + (field (ChangeMe 5)) + (define/public (letters) + (* pages 500)) + (super-new))) diff --git a/t/t4018/scheme-def b/t/t4018/scheme-def new file mode 100644 index 0000000000..1e2673da96 --- /dev/null +++ b/t/t4018/scheme-def @@ -0,0 +1,4 @@ +(def (some-func x y z) RIGHT + (let ((a x) + (b y)) + (ChangeMe a b))) diff --git a/t/t4018/scheme-def-variant b/t/t4018/scheme-def-variant new file mode 100644 index 0000000000..d857a61d64 --- /dev/null +++ b/t/t4018/scheme-def-variant @@ -0,0 +1,4 @@ +(defmethod {print point} RIGHT + (lambda (self) + (with ((point x y) self) + (printf "{ChangeMe x:~a y:~a}~n" x y)))) diff --git a/t/t4018/scheme-define-slash-public b/t/t4018/scheme-define-slash-public new file mode 100644 index 0000000000..39a93a1600 --- /dev/null +++ b/t/t4018/scheme-define-slash-public @@ -0,0 +1,7 @@ +(define bar-class% + (class object% + (field (info 5)) + (define/public (foo) RIGHT + (+ info 42) + (* info ChangeMe)) + (super-new))) diff --git a/t/t4018/scheme-define-syntax b/t/t4018/scheme-define-syntax new file mode 100644 index 0000000000..7d5e99e0fc --- /dev/null +++ b/t/t4018/scheme-define-syntax @@ -0,0 +1,8 @@ +(define-syntax define-test-suite RIGHT + (syntax-rules () + ((_ suite-name (name test) ChangeMe ...) + (define suite-name + (let ((tests + `((name . ,test) ...))) + (lambda () + (run-suite 'suite-name tests))))))) diff --git a/t/t4018/scheme-define-variant b/t/t4018/scheme-define-variant new file mode 100644 index 0000000000..911708854d --- /dev/null +++ b/t/t4018/scheme-define-variant @@ -0,0 +1,4 @@ +(define* (some-func x y z) RIGHT + (let ((a x) + (b y)) + (ChangeMe a b))) diff --git a/t/t4018/scheme-library b/t/t4018/scheme-library new file mode 100644 index 0000000000..82ea3df510 --- /dev/null +++ b/t/t4018/scheme-library @@ -0,0 +1,11 @@ +(library (my-helpers id-stuff) RIGHT + (export find-dup) + (import (ChangeMe)) + (define (find-dup l) + (and (pair? l) + (let loop ((rest (cdr l))) + (cond + [(null? rest) (find-dup (cdr l))] + [(bound-identifier=? (car l) (car rest)) + (car rest)] + [else (loop (cdr rest))]))))) diff --git a/t/t4018/scheme-local-define b/t/t4018/scheme-local-define new file mode 100644 index 0000000000..bc6d8aebbe --- /dev/null +++ b/t/t4018/scheme-local-define @@ -0,0 +1,4 @@ +(define (higher-order) + (define local-function RIGHT + (lambda (x) + (car "this is" "ChangeMe")))) diff --git a/t/t4018/scheme-module b/t/t4018/scheme-module new file mode 100644 index 0000000000..edfae0ebf7 --- /dev/null +++ b/t/t4018/scheme-module @@ -0,0 +1,6 @@ +(module A RIGHT + (export with-display-exception) + (extern (display-exception display-exception ChangeMe)) + (def (with-display-exception thunk) + (with-catch (lambda (e) (display-exception e (current-error-port)) e) + thunk))) diff --git a/t/t4018/scheme-top-level-define b/t/t4018/scheme-top-level-define new file mode 100644 index 0000000000..624743c22b --- /dev/null +++ b/t/t4018/scheme-top-level-define @@ -0,0 +1,4 @@ +(define (some-func x y z) RIGHT + (let ((a x) + (b y)) + (ChangeMe a b))) diff --git a/t/t4018/scheme-user-defined-define b/t/t4018/scheme-user-defined-define new file mode 100644 index 0000000000..35fe7cc9bf --- /dev/null +++ b/t/t4018/scheme-user-defined-define @@ -0,0 +1,6 @@ +(define-test-suite record\ case-tests RIGHT + (record-case-1 (lambda (fail) + (let ((a (make-foo 1 2))) + (record-case a + ((bar x) (ChangeMe)) + ((foo a b) (+ a b))))))) diff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh index d7145ccca4..94ef77e1df 100755 --- a/t/t4027-diff-submodule.sh +++ b/t/t4027-diff-submodule.sh @@ -3,7 +3,7 @@ test_description='difference in submodules' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh test_expect_success setup ' test_tick && @@ -93,6 +93,14 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked)' ' ) && git diff HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && + expect_from_to >expect.body $subtip $subprev && + test_cmp expect.body actual.body +' + +test_expect_success 'git diff HEAD with dirty submodule (untracked) (none ignored)' ' + test_config diff.ignoreSubmodules none && + git diff HEAD >actual && + sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev-dirty && test_cmp expect.body actual.body ' @@ -168,13 +176,13 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' git clean -qfdx && >cruft ) && - git diff HEAD >actual && + git diff --ignore-submodules=none HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && git diff --ignore-submodules=all HEAD >actual2 && test_must_be_empty actual2 && - git diff --ignore-submodules=untracked HEAD >actual3 && + git diff HEAD >actual3 && test_must_be_empty actual3 && git diff --ignore-submodules=dirty HEAD >actual4 && test_must_be_empty actual4 diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh index 4cb9f0e523..a39a626664 100755 --- a/t/t4030-diff-textconv.sh +++ b/t/t4030-diff-textconv.sh @@ -26,12 +26,8 @@ EOF chmod +x hexdump test_expect_success 'setup binary file with history' ' - printf "\\0\\n" >file && - git add file && - git commit -m one && - printf "\\01\\n" >>file && - git add file && - git commit -m two + test_commit --printf one file "\\0\\n" && + test_commit --printf --append two file "\\01\\n" ' test_expect_success 'file is considered binary by porcelain' ' @@ -139,7 +135,7 @@ EOF test_expect_success 'diffstat does not run textconv' ' echo file diff=fail >.gitattributes && git diff --stat HEAD^ HEAD >actual && - test_i18ncmp expect.stat actual && + test_cmp expect.stat actual && head -n1 <expect.stat >expect.line1 && head -n1 <actual >actual.line1 && diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh index 0c8fb39ced..561c582d16 100755 --- a/t/t4034-diff-words.sh +++ b/t/t4034-diff-words.sh @@ -3,7 +3,7 @@ test_description='word diff colors' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh cat >pre.simple <<-\EOF h(4) @@ -184,6 +184,11 @@ test_expect_success 'word diff with a regular expression' ' word_diff --color-words="[a-z]+" ' +test_expect_success 'word diff with zero length matches' ' + cp expect.letter-runs-are-words expect && + word_diff --color-words="[a-z${LF}]*" +' + test_expect_success 'set up a diff driver' ' git config diff.testdriver.wordRegex "[^[:space:]]" && cat <<-\EOF >.gitattributes @@ -325,6 +330,7 @@ test_language_driver perl test_language_driver php test_language_driver python test_language_driver ruby +test_language_driver scheme test_language_driver tex test_expect_success 'word-diff with diff.sbe' ' diff --git a/t/t4034/scheme/expect b/t/t4034/scheme/expect new file mode 100644 index 0000000000..496cd5de8c --- /dev/null +++ b/t/t4034/scheme/expect @@ -0,0 +1,11 @@ +<BOLD>diff --git a/pre b/post<RESET> +<BOLD>index 74b6605..63b6ac4 100644<RESET> +<BOLD>--- a/pre<RESET> +<BOLD>+++ b/post<RESET> +<CYAN>@@ -1,6 +1,6 @@<RESET> +(define (<RED>myfunc a b<RESET><GREEN>my-func first second<RESET>) + ; This is a <RED>really<RESET><GREEN>(moderately)<RESET> cool function. + (<RED>this\place<RESET><GREEN>that\place<RESET> (+ 3 4)) + (define <RED>some-text<RESET><GREEN>|a greeting|<RESET> "hello") + (let ((c (<RED>+ a b<RESET><GREEN>add1 first<RESET>))) + (format "one more than the total is %d" (<RED>add1<RESET><GREEN>+<RESET> c <GREEN>second<RESET>)))) diff --git a/t/t4034/scheme/post b/t/t4034/scheme/post new file mode 100644 index 0000000000..63b6ac4f87 --- /dev/null +++ b/t/t4034/scheme/post @@ -0,0 +1,6 @@ +(define (my-func first second) + ; This is a (moderately) cool function. + (that\place (+ 3 4)) + (define |a greeting| "hello") + (let ((c (add1 first))) + (format "one more than the total is %d" (+ c second)))) diff --git a/t/t4034/scheme/pre b/t/t4034/scheme/pre new file mode 100644 index 0000000000..74b6605357 --- /dev/null +++ b/t/t4034/scheme/pre @@ -0,0 +1,6 @@ +(define (myfunc a b) + ; This is a really cool function. + (this\place (+ 3 4)) + (define some-text "hello") + (let ((c (+ a b))) + (format "one more than the total is %d" (add1 c)))) diff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh index 94680836ce..aeac203c42 100755 --- a/t/t4038-diff-combined.sh +++ b/t/t4038-diff-combined.sh @@ -2,8 +2,11 @@ test_description='combined diff' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh setup_helper () { one=$1 branch=$2 side=$3 && @@ -115,7 +118,7 @@ test_expect_success 'check --cc --raw with forty trees' ' ' test_expect_success 'setup combined ignore spaces' ' - git checkout master && + git checkout main && >test && git add test && git commit -m initial && @@ -143,7 +146,7 @@ test_expect_success 'setup combined ignore spaces' ' EOF git commit -m "test other space changes" -a && - test_must_fail git merge master && + test_must_fail git merge main && tr -d Q <<-\EOF >test && eol spaces Q space change @@ -404,7 +407,7 @@ test_expect_success 'combine diff missing delete bug' ' test_expect_success 'combine diff gets tree sorting right' ' # create a directory and a file that sort differently in trees # versus byte-wise (implied "/" sorts after ".") - git checkout -f master && + git checkout -f main && mkdir foo && echo base >foo/one && echo base >foo/two && @@ -414,9 +417,9 @@ test_expect_success 'combine diff gets tree sorting right' ' # one side modifies a file in the directory, along with the root # file... - echo master >foo/one && - echo master >foo.ext && - git commit -a -m master && + echo main >foo/one && + echo main >foo.ext && + git commit -a -m main && # the other side modifies the other file in the directory git checkout -b other HEAD^ && @@ -426,7 +429,7 @@ test_expect_success 'combine diff gets tree sorting right' ' # And now we merge. The files in the subdirectory will resolve cleanly, # meaning that a combined diff will not find them interesting. But it # will find the tree itself interesting, because it had to be merged. - git checkout master && + git checkout main && git merge other && printf "MM\tfoo\n" >expect && diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh index f852136585..0c1502d4b0 100755 --- a/t/t4041-diff-submodule-option.sh +++ b/t/t4041-diff-submodule-option.sh @@ -9,6 +9,9 @@ test_description='Support for verbose submodule differences in git diff This test tries to verify the sanity of the --submodule option of git diff. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Tested non-UTF-8 encoding @@ -262,7 +265,7 @@ test_expect_success 'submodule is up to date' ' test_expect_success 'submodule contains untracked content' ' echo new > sm1/new-file && - git diff-index -p --submodule=log HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content EOF @@ -270,7 +273,7 @@ test_expect_success 'submodule contains untracked content' ' ' test_expect_success 'submodule contains untracked content (untracked ignored)' ' - git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual && + git diff-index -p --submodule=log HEAD >actual && test_must_be_empty actual ' @@ -286,7 +289,7 @@ test_expect_success 'submodule contains untracked content (all ignored)' ' test_expect_success 'submodule contains untracked and modified content' ' echo new > sm1/foo6 && - git diff-index -p --submodule=log HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 contains modified content @@ -296,7 +299,7 @@ test_expect_success 'submodule contains untracked and modified content' ' test_expect_success 'submodule contains untracked and modified content (untracked ignored)' ' echo new > sm1/foo6 && - git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual && + git diff-index -p --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains modified content EOF @@ -337,7 +340,7 @@ test_expect_success 'submodule is modified' ' test_expect_success 'modified submodule contains untracked content' ' echo new > sm1/new-file && - git diff-index -p --submodule=log HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 $head6..$head8: @@ -347,7 +350,7 @@ test_expect_success 'modified submodule contains untracked content' ' ' test_expect_success 'modified submodule contains untracked content (untracked ignored)' ' - git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual && + git diff-index -p --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 $head6..$head8: > change @@ -371,7 +374,7 @@ test_expect_success 'modified submodule contains untracked content (all ignored) test_expect_success 'modified submodule contains untracked and modified content' ' echo modification >> sm1/foo6 && - git diff-index -p --submodule=log HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 contains modified content @@ -383,7 +386,7 @@ test_expect_success 'modified submodule contains untracked and modified content' test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' ' echo modification >> sm1/foo6 && - git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual && + git diff-index -p --submodule=log HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains modified content Submodule sm1 $head6..$head8: @@ -538,7 +541,7 @@ test_expect_success 'diff --submodule with objects referenced by alternates' ' (cd super && (cd sub && git fetch && - git checkout origin/master + git checkout origin/main ) && git diff --submodule > ../actual ) && diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh index 7be1de736d..61ba5f707f 100755 --- a/t/t4045-diff-relative.sh +++ b/t/t4045-diff-relative.sh @@ -61,7 +61,7 @@ check_stat () { EOF test_expect_success "--stat $*" " git -C '$dir' diff --stat $* HEAD^ >actual && - test_i18ncmp expected actual + test_cmp expected actual " } diff --git a/t/t4048-diff-combined-binary.sh b/t/t4048-diff-combined-binary.sh index 7f9ad9fa3d..0260cf64f5 100755 --- a/t/t4048-diff-combined-binary.sh +++ b/t/t4048-diff-combined-binary.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='combined and merge diff handle binary files and textconv' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup binary merge conflict' ' @@ -14,7 +17,7 @@ test_expect_success 'setup binary merge conflict' ' echo threeQ3 | q_to_nul >binary && git commit -a -m three && three=$(git rev-parse --short HEAD:binary) && - test_must_fail git merge master && + test_must_fail git merge main && echo resolvedQhooray | q_to_nul >binary && git commit -a -m resolved && res=$(git rev-parse --short HEAD:binary) @@ -62,14 +65,14 @@ test_expect_success 'diff --cc indicates binary-ness' ' ' test_expect_success 'setup non-binary with binary attribute' ' - git checkout master && + git checkout main && test_commit one text && test_commit two text && two=$(git rev-parse --short HEAD:text) && git checkout -b branch-text HEAD^ && test_commit three text && three=$(git rev-parse --short HEAD:text) && - test_must_fail git merge master && + test_must_fail git merge main && test_commit resolved text && res=$(git rev-parse --short HEAD:text) && echo text -diff >.gitattributes @@ -206,11 +209,11 @@ index $three,$two..0000000 +THREE ++======= + TWO -++>>>>>>> MASTER +++>>>>>>> MAIN EOF test_expect_success 'diff --cc respects textconv on worktree file' ' git reset --hard HEAD^ && - test_must_fail git merge master && + test_must_fail git merge main && git diff >actual && test_cmp expect actual ' diff --git a/t/t4049-diff-stat-count.sh b/t/t4049-diff-stat-count.sh index a34121740a..53061b104e 100755 --- a/t/t4049-diff-stat-count.sh +++ b/t/t4049-diff-stat-count.sh @@ -25,7 +25,7 @@ test_expect_success 'mode-only change show as a 0-line change' ' 4 files changed, 2 insertions(+) EOF git diff --stat --stat-count=2 HEAD >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'binary changes do not count in lines' ' @@ -40,7 +40,7 @@ test_expect_success 'binary changes do not count in lines' ' 3 files changed, 2 insertions(+) EOF git diff --stat --stat-count=2 >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'exclude unmerged entries from total file count' ' @@ -62,7 +62,7 @@ test_expect_success 'exclude unmerged entries from total file count' ' 3 files changed, 3 insertions(+) EOF git diff --stat --stat-count=2 >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_done diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh index 28c053849a..9eba436211 100755 --- a/t/t4052-stat-output.sh +++ b/t/t4052-stat-output.sh @@ -5,6 +5,9 @@ test_description='test --stat output of various commands' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -353,7 +356,7 @@ cat >expect <<'EOF' EOF test_expect_success 'merge --stat respects COLUMNS (big change)' ' git checkout -b branch HEAD^^ && - COLUMNS=100 git merge --stat --no-ff master^ >output && + COLUMNS=100 git merge --stat --no-ff main^ >output && grep " | " output >actual && test_cmp expect actual ' @@ -362,7 +365,7 @@ cat >expect <<'EOF' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 +++++++++++++++++++++++++++++++++++++++ EOF test_expect_success 'merge --stat respects COLUMNS (long filename)' ' - COLUMNS=100 git merge --stat --no-ff master >output && + COLUMNS=100 git merge --stat --no-ff main >output && grep " | " output >actual && test_cmp expect actual ' diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh index 0168946b63..3feadf0e35 100755 --- a/t/t4053-diff-no-index.sh +++ b/t/t4053-diff-no-index.sh @@ -16,6 +16,11 @@ test_expect_success 'setup' ' echo 1 >non/git/b ' +test_expect_success 'git diff --no-index --exit-code' ' + git diff --no-index --exit-code a/1 non/git/a && + test_expect_code 1 git diff --no-index --exit-code a/1 a/2 +' + test_expect_success 'git diff --no-index directories' ' test_expect_code 1 git diff --no-index a b >cnt && test_line_count = 14 cnt @@ -144,4 +149,59 @@ test_expect_success 'diff --no-index allows external diff' ' test_cmp expect actual ' +test_expect_success 'diff --no-index normalizes mode: no changes' ' + echo foo >x && + cp x y && + git diff --no-index x y >out && + test_must_be_empty out +' + +test_expect_success POSIXPERM 'diff --no-index normalizes mode: chmod +x' ' + chmod +x y && + cat >expected <<-\EOF && + diff --git a/x b/y + old mode 100644 + new mode 100755 + EOF + test_expect_code 1 git diff --no-index x y >actual && + test_cmp expected actual +' + +test_expect_success POSIXPERM 'diff --no-index normalizes: mode not like git mode' ' + chmod 666 x && + chmod 777 y && + cat >expected <<-\EOF && + diff --git a/x b/y + old mode 100644 + new mode 100755 + EOF + test_expect_code 1 git diff --no-index x y >actual && + test_cmp expected actual +' + +test_expect_success POSIXPERM,SYMLINKS 'diff --no-index normalizes: mode not like git mode (symlink)' ' + ln -s y z && + X_OID=$(git hash-object --stdin <x) && + Z_OID=$(printf y | git hash-object --stdin) && + cat >expected <<-EOF && + diff --git a/x b/x + deleted file mode 100644 + index $X_OID..$ZERO_OID + --- a/x + +++ /dev/null + @@ -1 +0,0 @@ + -foo + diff --git a/z b/z + new file mode 120000 + index $ZERO_OID..$Z_OID + --- /dev/null + +++ b/z + @@ -0,0 +1 @@ + +y + \ No newline at end of file + EOF + test_expect_code 1 git -c core.abbrev=no diff --no-index x z >actual && + test_cmp expected actual +' + test_done diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh index 43dd474a12..aec1d9d1b4 100755 --- a/t/t4056-diff-order.sh +++ b/t/t4056-diff-order.sh @@ -1,6 +1,9 @@ #!/bin/sh -test_description='diff order' +test_description='diff order & rotate' + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh @@ -106,7 +109,7 @@ done test_expect_success 'setup for testing combine-diff order' ' git checkout -b tmp HEAD~ && create_files 3 && - git checkout master && + git checkout main && git merge --no-commit -s ours tmp && create_files 5 ' @@ -124,4 +127,74 @@ do ' done +### rotate and skip + +test_expect_success 'rotate and skip setup' ' + >sample1.t && + >sample2.t && + >sample3.t && + >sample4.t && + git add sample[1234].t && + git commit -m "added" sample[1234].t && + echo modified >>sample1.t && + echo modified >>sample2.t && + echo modified >>sample4.t && + git commit -m "updated" sample[1234].t +' + +test_expect_success 'diff --rotate-to' ' + git diff --rotate-to=sample2.t --name-only HEAD^ >actual && + test_write_lines sample2.t sample4.t sample1.t >expect && + test_cmp expect actual +' + +test_expect_success 'diff --skip-to' ' + git diff --skip-to=sample2.t --name-only HEAD^ >actual && + test_write_lines sample2.t sample4.t >expect && + test_cmp expect actual +' + +test_expect_success 'diff --rotate/skip-to error condition' ' + test_must_fail git diff --rotate-to=sample3.t HEAD^ && + test_must_fail git diff --skip-to=sample3.t HEAD^ +' + +test_expect_success 'log --rotate-to' ' + git log --rotate-to=sample3.t --raw HEAD~2.. >raw && + # just distill the commit header and paths + sed -n -e "s/^commit.*/commit/p" \ + -e "/^:/s/^.* //p" raw >actual && + + cat >expect <<-\EOF && + commit + sample4.t + sample1.t + sample2.t + commit + sample3.t + sample4.t + sample1.t + sample2.t + EOF + + test_cmp expect actual +' + +test_expect_success 'log --skip-to' ' + git log --skip-to=sample3.t --raw HEAD~2.. >raw && + # just distill the commit header and paths + sed -n -e "s/^commit.*/commit/p" \ + -e "/^:/s/^.* //p" raw >actual && + + cat >expect <<-\EOF && + commit + sample4.t + commit + sample3.t + sample4.t + EOF + + test_cmp expect actual +' + test_done diff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh index 0b78573733..7e5b74f72e 100755 --- a/t/t4057-diff-combined-paths.sh +++ b/t/t4057-diff-combined-paths.sh @@ -2,6 +2,9 @@ test_description='combined diff show only paths that are different to all parents' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # verify that diffc.expect matches output of @@ -24,9 +27,9 @@ test_expect_success 'trivial merge - combine-diff empty' ' echo $i/2 >>$i.txt done && git commit -a -m "side 2-9" && - git checkout master && + git checkout main && echo 1/2 >1.txt && - git commit -a -m "master 1" && + git commit -a -m "main 1" && git merge side && >diffc.expect && diffc_verify @@ -41,19 +44,19 @@ test_expect_success 'only one truly conflicting path' ' done && echo "4side" >>4.txt && git commit -a -m "side 2-9 +4" && - git checkout master && + git checkout main && for i in $(test_seq 1 9) do echo $i/3 >>$i.txt done && - echo "4master" >>4.txt && - git commit -a -m "master 1-9 +4" && + echo "4main" >>4.txt && + git commit -a -m "main 1-9 +4" && test_must_fail git merge side && cat <<-\EOF >4.txt && 4 4/2 4/3 - 4master + 4main 4side EOF git add 4.txt && @@ -69,12 +72,12 @@ test_expect_success 'merge introduces new file' ' echo $i/4 >>$i.txt done && git commit -a -m "side 5-9" && - git checkout master && + git checkout main && for i in $(test_seq 1 3) do echo $i/4 >>$i.txt done && - git commit -a -m "master 1-3 +4hello" && + git commit -a -m "main 1-3 +4hello" && git merge side && echo "Hello World" >4hello.txt && git add 4hello.txt && @@ -90,12 +93,12 @@ test_expect_success 'merge removed a file' ' echo $i/5 >>$i.txt done && git commit -a -m "side 5-9" && - git checkout master && + git checkout main && for i in $(test_seq 1 3) do echo $i/4 >>$i.txt done && - git commit -a -m "master 1-3" && + git commit -a -m "main 1-3" && git merge side && git rm 4.txt && git commit --amend && diff --git a/t/t4058-diff-duplicates.sh b/t/t4058-diff-duplicates.sh index c24ee175ef..54614b814d 100755 --- a/t/t4058-diff-duplicates.sh +++ b/t/t4058-diff-duplicates.sh @@ -1,5 +1,14 @@ #!/bin/sh +# NOTICE: +# This testsuite does a number of diffs and checks that the output match. +# However, it is a "garbage in, garbage out" situation; the trees have +# duplicate entries for individual paths, and it results in diffs that do +# not make much sense. As such, it is not clear that the diffs are +# "correct". The primary purpose of these tests was to verify that +# diff-tree does not segfault, but there is perhaps some value in ensuring +# that the diff output isn't wildly unreasonable. + test_description='test tree diff when trees have duplicate entries' . ./test-lib.sh @@ -57,7 +66,16 @@ test_expect_success 'create trees with duplicate entries' ' git tag two $outer_two ' -test_expect_success 'diff-tree between trees' ' +test_expect_success 'create tree without duplicate entries' ' + blob_one=$(echo one | git hash-object -w --stdin) && + outer_three=$(make_tree \ + 100644 renamed $blob_one + ) && + git tag three $outer_three +' + +test_expect_success 'diff-tree between duplicate trees' ' + # See NOTICE at top of file { printf ":000000 100644 $ZERO_OID $blob_two A\touter/inner\n" && printf ":000000 100644 $ZERO_OID $blob_two A\touter/inner\n" && @@ -71,9 +89,101 @@ test_expect_success 'diff-tree between trees' ' ' test_expect_success 'diff-tree with renames' ' - # same expectation as above, since we disable rename detection + # See NOTICE at top of file. git diff-tree -M -r --no-abbrev one two >actual && + test_must_be_empty actual +' + +test_expect_success 'diff-tree FROM duplicate tree' ' + # See NOTICE at top of file. + { + printf ":100644 000000 $blob_one $ZERO_OID D\touter/inner\n" && + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":000000 100644 $ZERO_OID $blob_one A\trenamed\n" + } >expect && + git diff-tree -r --no-abbrev one three >actual && test_cmp expect actual ' +test_expect_success 'diff-tree FROM duplicate tree, with renames' ' + # See NOTICE at top of file. + { + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":100644 000000 $blob_two $ZERO_OID D\touter/inner\n" && + printf ":100644 100644 $blob_one $blob_one R100\touter/inner\trenamed\n" + } >expect && + git diff-tree -M -r --no-abbrev one three >actual && + test_cmp expect actual +' + +test_expect_success 'create a few commits' ' + git commit-tree -m "Duplicate Entries" two^{tree} >commit_id && + git branch base $(cat commit_id) && + + git commit-tree -p $(cat commit_id) -m "Just one" three^{tree} >up && + git branch update $(cat up) && + + git commit-tree -p $(cat up) -m "Back to weird" two^{tree} >final && + git branch final $(cat final) && + + rm commit_id up final +' + +test_expect_failure 'git read-tree does not segfault' ' + test_when_finished rm .git/index.lock && + test_might_fail git read-tree --reset base +' + +test_expect_failure 'reset --hard does not segfault' ' + test_when_finished rm .git/index.lock && + git checkout base && + test_might_fail git reset --hard +' + +test_expect_failure 'git diff HEAD does not segfault' ' + git checkout base && + GIT_TEST_CHECK_CACHE_TREE=false && + git reset --hard && + test_might_fail git diff HEAD +' + +test_expect_failure 'can switch to another branch when status is empty' ' + git clean -ffdqx && + git status --porcelain -uno >actual && + test_must_be_empty actual && + git checkout update +' + +test_expect_success 'forcibly switch to another branch, verify status empty' ' + git checkout -f update && + git status --porcelain -uno >actual && + test_must_be_empty actual +' + +test_expect_success 'fast-forward from non-duplicate entries to duplicate' ' + git merge final +' + +test_expect_failure 'clean status, switch branches, status still clean' ' + git status --porcelain -uno >actual && + test_must_be_empty actual && + git checkout base && + git status --porcelain -uno >actual && + test_must_be_empty actual +' + +test_expect_success 'switch to base branch and force status to be clean' ' + git checkout base && + GIT_TEST_CHECK_CACHE_TREE=false git reset --hard && + git status --porcelain -uno >actual && + test_must_be_empty actual +' + +test_expect_failure 'fast-forward from duplicate entries to non-duplicate' ' + git merge update +' + test_done diff --git a/t/t4060-diff-submodule-option-diff-format.sh b/t/t4060-diff-submodule-option-diff-format.sh index fc8229c726..dc7b242697 100755 --- a/t/t4060-diff-submodule-option-diff-format.sh +++ b/t/t4060-diff-submodule-option-diff-format.sh @@ -409,7 +409,7 @@ test_expect_success 'submodule is up to date' ' test_expect_success 'submodule contains untracked content' ' echo new > sm1/new-file && - git diff-index -p --submodule=diff HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content EOF @@ -417,7 +417,7 @@ test_expect_success 'submodule contains untracked content' ' ' test_expect_success 'submodule contains untracked content (untracked ignored)' ' - git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual && + git diff-index -p --submodule=diff HEAD >actual && test_must_be_empty actual ' @@ -433,7 +433,7 @@ test_expect_success 'submodule contains untracked content (all ignored)' ' test_expect_success 'submodule contains untracked and modified content' ' echo new > sm1/foo6 && - git diff-index -p --submodule=diff HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 contains modified content @@ -451,7 +451,7 @@ test_expect_success 'submodule contains untracked and modified content' ' # NOT OK test_expect_success 'submodule contains untracked and modified content (untracked ignored)' ' echo new > sm1/foo6 && - git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual && + git diff-index -p --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains modified content diff --git a/sm1/foo6 b/sm1/foo6 @@ -512,7 +512,7 @@ test_expect_success 'submodule is modified' ' test_expect_success 'modified submodule contains untracked content' ' echo new > sm1/new-file && - git diff-index -p --submodule=diff HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 $head7..$head8: @@ -528,7 +528,7 @@ test_expect_success 'modified submodule contains untracked content' ' ' test_expect_success 'modified submodule contains untracked content (untracked ignored)' ' - git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual && + git diff-index -p --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 $head7..$head8: diff --git a/sm1/foo6 b/sm1/foo6 @@ -564,7 +564,7 @@ test_expect_success 'modified submodule contains untracked content (all ignored) test_expect_success 'modified submodule contains untracked and modified content' ' echo modification >> sm1/foo6 && - git diff-index -p --submodule=diff HEAD >actual && + git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains untracked content Submodule sm1 contains modified content @@ -583,7 +583,7 @@ test_expect_success 'modified submodule contains untracked and modified content' test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' ' echo modification >> sm1/foo6 && - git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual && + git diff-index -p --submodule=diff HEAD >actual && cat >expected <<-EOF && Submodule sm1 contains modified content Submodule sm1 $head7..$head8: diff --git a/t/t4061-diff-indent.sh b/t/t4061-diff-indent.sh index 0f7a6d97a8..7750b87ca1 100755 --- a/t/t4061-diff-indent.sh +++ b/t/t4061-diff-indent.sh @@ -3,8 +3,11 @@ test_description='Test diff indent heuristic. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh # Compare two diff outputs. Ignore "index" lines, because we don't # care about SHA-1s or file modes. @@ -266,7 +269,7 @@ test_expect_success 'diff-index: nice spaces with --indent-heuristic' ' git reset --soft HEAD~ && git diff-index --indent-heuristic -p old -- spaces.txt >out-diff-index-compacted && compare_diff spaces-compacted-expect out-diff-index-compacted && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-index: nice spaces with diff.indentHeuristic=true' ' @@ -274,7 +277,7 @@ test_expect_success 'diff-index: nice spaces with diff.indentHeuristic=true' ' git reset --soft HEAD~ && git -c diff.indentHeuristic=true diff-index -p old -- spaces.txt >out-diff-index-compacted2 && compare_diff spaces-compacted-expect out-diff-index-compacted2 && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-index: ugly spaces with --no-indent-heuristic' ' @@ -282,7 +285,7 @@ test_expect_success 'diff-index: ugly spaces with --no-indent-heuristic' ' git reset --soft HEAD~ && git diff-index --no-indent-heuristic -p old -- spaces.txt >out-diff-index && compare_diff spaces-expect out-diff-index && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-index: ugly spaces with diff.indentHeuristic=false' ' @@ -290,7 +293,7 @@ test_expect_success 'diff-index: ugly spaces with diff.indentHeuristic=false' ' git reset --soft HEAD~ && git -c diff.indentHeuristic=false diff-index -p old -- spaces.txt >out-diff-index2 && compare_diff spaces-expect out-diff-index2 && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-index: --indent-heuristic overrides config' ' @@ -298,7 +301,7 @@ test_expect_success 'diff-index: --indent-heuristic overrides config' ' git reset --soft HEAD~ && git -c diff.indentHeuristic=false diff-index --indent-heuristic -p old -- spaces.txt >out-diff-index-compacted3 && compare_diff spaces-compacted-expect out-diff-index-compacted3 && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-index: --no-indent-heuristic overrides config' ' @@ -306,7 +309,7 @@ test_expect_success 'diff-index: --no-indent-heuristic overrides config' ' git reset --soft HEAD~ && git -c diff.indentHeuristic=true diff-index --no-indent-heuristic -p old -- spaces.txt >out-diff-index3 && compare_diff spaces-expect out-diff-index3 && - git checkout -f master + git checkout -f main ' # --- diff-files tests ---------------------------------------------------- @@ -317,7 +320,7 @@ test_expect_success 'diff-files: nice spaces with --indent-heuristic' ' git diff-files --indent-heuristic -p spaces.txt >out-diff-files-raw && grep -v index out-diff-files-raw >out-diff-files-compacted && compare_diff spaces-compacted-expect out-diff-files-compacted && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-files: nice spaces with diff.indentHeuristic=true' ' @@ -326,7 +329,7 @@ test_expect_success 'diff-files: nice spaces with diff.indentHeuristic=true' ' git -c diff.indentHeuristic=true diff-files -p spaces.txt >out-diff-files-raw2 && grep -v index out-diff-files-raw2 >out-diff-files-compacted2 && compare_diff spaces-compacted-expect out-diff-files-compacted2 && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-files: ugly spaces with --no-indent-heuristic' ' @@ -335,7 +338,7 @@ test_expect_success 'diff-files: ugly spaces with --no-indent-heuristic' ' git diff-files --no-indent-heuristic -p spaces.txt >out-diff-files-raw && grep -v index out-diff-files-raw >out-diff-files && compare_diff spaces-expect out-diff-files && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-files: ugly spaces with diff.indentHeuristic=false' ' @@ -344,7 +347,7 @@ test_expect_success 'diff-files: ugly spaces with diff.indentHeuristic=false' ' git -c diff.indentHeuristic=false diff-files -p spaces.txt >out-diff-files-raw2 && grep -v index out-diff-files-raw2 >out-diff-files && compare_diff spaces-expect out-diff-files && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-files: --indent-heuristic overrides config' ' @@ -353,7 +356,7 @@ test_expect_success 'diff-files: --indent-heuristic overrides config' ' git -c diff.indentHeuristic=false diff-files --indent-heuristic -p spaces.txt >out-diff-files-raw3 && grep -v index out-diff-files-raw3 >out-diff-files-compacted && compare_diff spaces-compacted-expect out-diff-files-compacted && - git checkout -f master + git checkout -f main ' test_expect_success 'diff-files: --no-indent-heuristic overrides config' ' @@ -362,7 +365,7 @@ test_expect_success 'diff-files: --no-indent-heuristic overrides config' ' git -c diff.indentHeuristic=true diff-files --no-indent-heuristic -p spaces.txt >out-diff-files-raw4 && grep -v index out-diff-files-raw4 >out-diff-files && compare_diff spaces-expect out-diff-files && - git checkout -f master + git checkout -f main ' test_done diff --git a/t/t4064-diff-oidfind.sh b/t/t4064-diff-oidfind.sh index 3bdf317af8..6d8c8986fc 100755 --- a/t/t4064-diff-oidfind.sh +++ b/t/t4064-diff-oidfind.sh @@ -65,4 +65,59 @@ test_expect_success 'find a submodule' ' test_cmp expect actual ' +test_expect_success 'set up merge tests' ' + test_commit base && + + git checkout -b boring base^ && + echo boring >file && + git add file && + git commit -m boring && + + git checkout -b interesting base^ && + echo interesting >file && + git add file && + git commit -m interesting && + + blob=$(git rev-parse interesting:file) +' + +test_expect_success 'detect merge which introduces blob' ' + git checkout -B merge base && + git merge --no-commit boring && + echo interesting >file && + git commit -am "introduce blob" && + git diff-tree --format=%s --find-object=$blob -c --name-status HEAD >actual && + cat >expect <<-\EOF && + introduce blob + + AM file + EOF + test_cmp expect actual +' + +test_expect_success 'detect merge which removes blob' ' + git checkout -B merge interesting && + git merge --no-commit base && + echo boring >file && + git commit -am "remove blob" && + git diff-tree --format=%s --find-object=$blob -c --name-status HEAD >actual && + cat >expect <<-\EOF && + remove blob + + MA file + EOF + test_cmp expect actual +' + +test_expect_success 'do not detect merge that does not touch blob' ' + git checkout -B merge interesting && + git merge -m "untouched blob" base && + git diff-tree --format=%s --find-object=$blob -c --name-status HEAD >actual && + cat >expect <<-\EOF && + untouched blob + + EOF + test_cmp expect actual +' + test_done diff --git a/t/t4066-diff-emit-delay.sh b/t/t4066-diff-emit-delay.sh index 6331f63b12..a1de63b77f 100755 --- a/t/t4066-diff-emit-delay.sh +++ b/t/t4066-diff-emit-delay.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test combined/stat/moved interaction' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # This test covers a weird 3-way interaction between "--cc -p", which will run @@ -13,7 +16,7 @@ test_expect_success 'set up history with a merge' ' test_commit B && git checkout -b side HEAD^ && test_commit C && - git merge -m M master && + git merge -m M main && test_commit D ' diff --git a/t/t4068-diff-symmetric-merge-base.sh b/t/t4068-diff-symmetric-merge-base.sh index 03487cc945..2d650d8f10 100755 --- a/t/t4068-diff-symmetric-merge-base.sh +++ b/t/t4068-diff-symmetric-merge-base.sh @@ -2,14 +2,17 @@ test_description='behavior of diff with symmetric-diff setups and --merge-base' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # build these situations: # - normal merge with one merge base (br1...b2r); -# - criss-cross merge ie 2 merge bases (br1...master); -# - disjoint subgraph (orphan branch, br3...master). +# - criss-cross merge ie 2 merge bases (br1...main); +# - disjoint subgraph (orphan branch, br3...main). # -# B---E <-- master +# B---E <-- main # / \ / # A X # \ / \ @@ -32,9 +35,9 @@ test_expect_success setup ' git add c && git commit -m C && git tag commit-C && - git merge -m D master && + git merge -m D main && git tag commit-D && - git checkout master && + git checkout main && git merge -m E commit-C && git checkout -b br2 commit-C && echo f >f && @@ -58,7 +61,7 @@ test_expect_success 'diff with one merge base' ' # It should have one of those two, which comes out # to seven lines. test_expect_success 'diff with two merge bases' ' - git diff br1...master >tmp 2>err && + git diff br1...main >tmp 2>err && test_line_count = 7 tmp && test_line_count = 1 err ' @@ -69,22 +72,22 @@ test_expect_success 'diff with no merge bases' ' ' test_expect_success 'diff with too many symmetric differences' ' - test_must_fail git diff br1...master br2...br3 2>err && + test_must_fail git diff br1...main br2...br3 2>err && test_i18ngrep "usage" err ' test_expect_success 'diff with symmetric difference and extraneous arg' ' - test_must_fail git diff master br1...master 2>err && + test_must_fail git diff main br1...main 2>err && test_i18ngrep "usage" err ' test_expect_success 'diff with two ranges' ' - test_must_fail git diff master br1..master br2..br3 2>err && + test_must_fail git diff main br1..main br2..br3 2>err && test_i18ngrep "usage" err ' test_expect_success 'diff with ranges and extra arg' ' - test_must_fail git diff master br1..master commit-D 2>err && + test_must_fail git diff main br1..main commit-D 2>err && test_i18ngrep "usage" err ' @@ -93,21 +96,21 @@ test_expect_success 'diff --merge-base with no commits' ' ' test_expect_success 'diff --merge-base with three commits' ' - test_must_fail git diff --merge-base br1 br2 master 2>err && + test_must_fail git diff --merge-base br1 br2 main 2>err && test_i18ngrep "usage" err ' for cmd in diff-index diff do test_expect_success "$cmd --merge-base with one commit" ' - git checkout master && + git checkout main && git $cmd commit-C >expect && git $cmd --merge-base br2 >actual && test_cmp expect actual ' test_expect_success "$cmd --merge-base with one commit and unstaged changes" ' - git checkout master && + git checkout main && test_when_finished git reset --hard && echo unstaged >>c && git $cmd commit-C >expect && @@ -116,7 +119,7 @@ do ' test_expect_success "$cmd --merge-base with one commit and staged and unstaged changes" ' - git checkout master && + git checkout main && test_when_finished git reset --hard && echo staged >>c && git add c && @@ -127,7 +130,7 @@ do ' test_expect_success "$cmd --merge-base --cached with one commit and staged and unstaged changes" ' - git checkout master && + git checkout main && test_when_finished git reset --hard && echo staged >>c && git add c && @@ -138,19 +141,19 @@ do ' test_expect_success "$cmd --merge-base with non-commit" ' - git checkout master && - test_must_fail git $cmd --merge-base master^{tree} 2>err && + git checkout main && + test_must_fail git $cmd --merge-base main^{tree} 2>err && test_i18ngrep "fatal: --merge-base only works with commits" err ' test_expect_success "$cmd --merge-base with no merge bases and one commit" ' - git checkout master && + git checkout main && test_must_fail git $cmd --merge-base br3 2>err && test_i18ngrep "fatal: no merge base found" err ' test_expect_success "$cmd --merge-base with multiple merge bases and one commit" ' - git checkout master && + git checkout main && test_must_fail git $cmd --merge-base br1 2>err && test_i18ngrep "fatal: multiple merge bases found" err ' @@ -159,13 +162,13 @@ done for cmd in diff-tree diff do test_expect_success "$cmd --merge-base with two commits" ' - git $cmd commit-C master >expect && - git $cmd --merge-base br2 master >actual && + git $cmd commit-C main >expect && + git $cmd --merge-base br2 main >actual && test_cmp expect actual ' test_expect_success "$cmd --merge-base commit and non-commit" ' - test_must_fail git $cmd --merge-base br2 master^{tree} 2>err && + test_must_fail git $cmd --merge-base br2 main^{tree} 2>err && test_i18ngrep "fatal: --merge-base only works with commits" err ' @@ -175,13 +178,13 @@ do ' test_expect_success "$cmd --merge-base with multiple merge bases and two commits" ' - test_must_fail git $cmd --merge-base master br1 2>err && + test_must_fail git $cmd --merge-base main br1 2>err && test_i18ngrep "fatal: multiple merge bases found" err ' done test_expect_success 'diff-tree --merge-base with one commit' ' - test_must_fail git diff-tree --merge-base master 2>err && + test_must_fail git diff-tree --merge-base main 2>err && test_i18ngrep "fatal: --merge-base only works with two commits" err ' diff --git a/t/t4100-apply-stat.sh b/t/t4100-apply-stat.sh index 744b8e51be..9b433de836 100755 --- a/t/t4100-apply-stat.sh +++ b/t/t4100-apply-stat.sh @@ -17,13 +17,13 @@ do test_expect_success "$title" ' git apply --stat --summary \ <"$TEST_DIRECTORY/t4100/t-apply-$num.patch" >current && - test_i18ncmp "$TEST_DIRECTORY"/t4100/t-apply-$num.expect current + test_cmp "$TEST_DIRECTORY"/t4100/t-apply-$num.expect current ' test_expect_success "$title with recount" ' sed -e "$UNC" <"$TEST_DIRECTORY/t4100/t-apply-$num.patch" | git apply --recount --stat --summary >current && - test_i18ncmp "$TEST_DIRECTORY"/t4100/t-apply-$num.expect current + test_cmp "$TEST_DIRECTORY"/t4100/t-apply-$num.expect current ' done <<\EOF rename diff --git a/t/t4103-apply-binary.sh b/t/t4103-apply-binary.sh index 1b420e3b5f..fad6d3f542 100755 --- a/t/t4103-apply-binary.sh +++ b/t/t4103-apply-binary.sh @@ -6,6 +6,9 @@ test_description='git apply handling binary patches ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -31,64 +34,64 @@ test_expect_success 'setup' ' git update-index --add --remove file1 file2 file3 file4 && git commit -m "Second Version" && - git diff-tree -p master binary >B.diff && - git diff-tree -p -C master binary >C.diff && + git diff-tree -p main binary >B.diff && + git diff-tree -p -C main binary >C.diff && - git diff-tree -p --binary master binary >BF.diff && - git diff-tree -p --binary -C master binary >CF.diff && + git diff-tree -p --binary main binary >BF.diff && + git diff-tree -p --binary -C main binary >CF.diff && - git diff-tree -p --full-index master binary >B-index.diff && - git diff-tree -p -C --full-index master binary >C-index.diff && + git diff-tree -p --full-index main binary >B-index.diff && + git diff-tree -p -C --full-index main binary >C-index.diff && - git diff-tree -p --binary --no-prefix master binary -- file3 >B0.diff && + git diff-tree -p --binary --no-prefix main binary -- file3 >B0.diff && git init other-repo && ( cd other-repo && - git fetch .. master && + git fetch .. main && git reset --hard FETCH_HEAD ) ' test_expect_success 'stat binary diff -- should not fail.' \ - 'git checkout master && + 'git checkout main && git apply --stat --summary B.diff' test_expect_success 'stat binary -p0 diff -- should not fail.' ' - git checkout master && + git checkout main && git apply --stat -p0 B0.diff ' test_expect_success 'stat binary diff (copy) -- should not fail.' \ - 'git checkout master && + 'git checkout main && git apply --stat --summary C.diff' test_expect_success 'check binary diff -- should fail.' \ - 'git checkout master && + 'git checkout main && test_must_fail git apply --check B.diff' test_expect_success 'check binary diff (copy) -- should fail.' \ - 'git checkout master && + 'git checkout main && test_must_fail git apply --check C.diff' test_expect_success \ 'check incomplete binary diff with replacement -- should fail.' ' - git checkout master && + git checkout main && test_must_fail git apply --check --allow-binary-replacement B.diff ' test_expect_success \ 'check incomplete binary diff with replacement (copy) -- should fail.' ' - git checkout master && + git checkout main && test_must_fail git apply --check --allow-binary-replacement C.diff ' test_expect_success 'check binary diff with replacement.' \ - 'git checkout master && + 'git checkout main && git apply --check --allow-binary-replacement BF.diff' test_expect_success 'check binary diff with replacement (copy).' \ - 'git checkout master && + 'git checkout main && git apply --check --allow-binary-replacement CF.diff' # Now we start applying them. @@ -96,7 +99,7 @@ test_expect_success 'check binary diff with replacement (copy).' \ do_reset () { rm -f file? && git reset --hard && - git checkout -f master + git checkout -f main } test_expect_success 'apply binary diff -- should fail.' \ diff --git a/t/t4108-apply-threeway.sh b/t/t4108-apply-threeway.sh index d7349ced6b..65147efdea 100755 --- a/t/t4108-apply-threeway.sh +++ b/t/t4108-apply-threeway.sh @@ -2,6 +2,9 @@ test_description='git apply --3way' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh print_sanitized_conflicted_diff () { @@ -24,14 +27,14 @@ test_expect_success setup ' test_tick && test_write_lines 1 two 3 4 5 six 7 >one && test_write_lines 1 two 3 4 5 6 7 >two && - git commit -a -m master && + git commit -a -m main && git checkout side && test_write_lines 1 2 3 4 five 6 7 >one && test_write_lines 1 2 3 4 five 6 7 >two && git commit -a -m side && - git checkout master + git checkout main ' test_expect_success 'apply without --3way' ' @@ -39,7 +42,7 @@ test_expect_success 'apply without --3way' ' # should fail to apply git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git apply --index P.diff && # should leave things intact git diff-files --exit-code && @@ -52,14 +55,14 @@ test_apply_with_3way () { # The corresponding conflicted merge git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git merge --no-commit side && git ls-files -s >expect.ls && print_sanitized_conflicted_diff >expect.diff && # should fail to apply git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git apply --index --3way P.diff && git ls-files -s >actual.ls && print_sanitized_conflicted_diff >actual.diff && @@ -86,7 +89,7 @@ test_expect_success 'apply with --3way with rerere enabled' ' # The corresponding conflicted merge git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git merge --no-commit side && # Manually resolve and record the resolution @@ -96,7 +99,7 @@ test_expect_success 'apply with --3way with rerere enabled' ' # should fail to apply git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git apply --index --3way P.diff && # but rerere should have replayed the recorded resolution @@ -157,4 +160,74 @@ test_expect_success 'apply -3 with add/add conflict (dirty working tree)' ' test_cmp three.save three ' +test_expect_success 'apply -3 with ambiguous repeating file' ' + git reset --hard && + test_write_lines 1 2 1 2 1 2 1 2 1 2 1 >one_two_repeat && + git add one_two_repeat && + git commit -m "init one" && + test_write_lines 1 2 1 2 1 2 1 2 one 2 1 >one_two_repeat && + git commit -a -m "change one" && + + git diff HEAD~ >Repeat.diff && + git reset --hard HEAD~ && + + test_write_lines 1 2 1 2 1 2 one 2 1 2 one >one_two_repeat && + git commit -a -m "change surrounding one" && + + git apply --index --3way Repeat.diff && + test_write_lines 1 2 1 2 1 2 one 2 one 2 one >expect && + + test_cmp expect one_two_repeat +' + +test_expect_success 'apply with --3way --cached clean apply' ' + # Merging side should be similar to applying this patch + git diff ...side >P.diff && + + # The corresponding cleanly applied merge + git reset --hard && + git checkout main~ && + git merge --no-commit side && + git ls-files -s >expect.ls && + + # should succeed + git reset --hard && + git checkout main~ && + git apply --cached --3way P.diff && + git ls-files -s >actual.ls && + print_sanitized_conflicted_diff >actual.diff && + + # The cache should resemble the corresponding merge + # (both files at stage #0) + test_cmp expect.ls actual.ls && + # However the working directory should not change + >expect.diff && + test_cmp expect.diff actual.diff +' + +test_expect_success 'apply with --3way --cached and conflicts' ' + # Merging side should be similar to applying this patch + git diff ...side >P.diff && + + # The corresponding conflicted merge + git reset --hard && + git checkout main^0 && + test_must_fail git merge --no-commit side && + git ls-files -s >expect.ls && + + # should fail to apply + git reset --hard && + git checkout main^0 && + test_must_fail git apply --cached --3way P.diff && + git ls-files -s >actual.ls && + print_sanitized_conflicted_diff >actual.diff && + + # The cache should resemble the corresponding merge + # (one file at stage #0, one file at stages #1 #2 #3) + test_cmp expect.ls actual.ls && + # However the working directory should not change + >expect.diff && + test_cmp expect.diff actual.diff +' + test_done diff --git a/t/t4114-apply-typechange.sh b/t/t4114-apply-typechange.sh index ebadbc347f..da3e64f811 100755 --- a/t/t4114-apply-typechange.sh +++ b/t/t4114-apply-typechange.sh @@ -88,6 +88,13 @@ test_expect_success 'symlink becomes file' ' ' test_debug 'cat patch' +test_expect_success 'symlink becomes file, in reverse' ' + git checkout -f foo-symlinked-to-bar && + git diff-tree -p HEAD foo-back-to-file > patch && + git checkout foo-back-to-file && + git apply -R --index < patch + ' + test_expect_success 'binary file becomes symlink' ' git checkout -f foo-becomes-binary && git diff-tree -p --binary HEAD foo-symlinked-to-bar > patch && diff --git a/t/t4121-apply-diffs.sh b/t/t4121-apply-diffs.sh index 66368effd5..b45454aaf4 100755 --- a/t/t4121-apply-diffs.sh +++ b/t/t4121-apply-diffs.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git apply for contextually independent diffs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh echo '1 @@ -23,7 +26,7 @@ test_expect_success 'setup' \ git commit -a -q -m 2 && echo 9 >>file && git commit -a -q -m 3 && - git checkout master' + git checkout main' test_expect_success \ 'check if contextually independent diffs for the same file apply' \ diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh index 4acb3f336e..aa52de401b 100755 --- a/t/t4122-apply-symlink-inside.sh +++ b/t/t4122-apply-symlink-inside.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='apply to deeper directory without getting fooled with symlink' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -35,11 +38,11 @@ test_expect_success apply ' test_expect_success 'check result' ' - git diff --exit-code master && - git diff --exit-code --cached master && + git diff --exit-code main && + git diff --exit-code --cached main && test_tick && git commit -m replay && - T1=$(git rev-parse "master^{tree}") && + T1=$(git rev-parse "main^{tree}") && T2=$(git rev-parse "HEAD^{tree}") && test "z$T1" = "z$T2" diff --git a/t/t4127-apply-same-fn.sh b/t/t4127-apply-same-fn.sh index 972946c174..305b7e649e 100755 --- a/t/t4127-apply-same-fn.sh +++ b/t/t4127-apply-same-fn.sh @@ -32,6 +32,10 @@ test_expect_success 'apply same filename with independent changes' ' test_expect_success 'apply same filename with overlapping changes' ' git reset --hard && + + # Store same_fn so that we can check apply -R in next test + cp same_fn same_fn1 && + modify "s/^d/z/" same_fn && git diff > patch0 && git add same_fn && @@ -43,6 +47,11 @@ test_expect_success 'apply same filename with overlapping changes' ' test_cmp same_fn same_fn2 ' +test_expect_success 'apply same filename with overlapping changes, in reverse' ' + git apply -R patch0 && + test_cmp same_fn same_fn1 +' + test_expect_success 'apply same new filename after rename' ' git reset --hard && git mv same_fn new_fn && diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh index 5cdd76dfa7..576632f868 100755 --- a/t/t4129-apply-samemode.sh +++ b/t/t4129-apply-samemode.sh @@ -73,4 +73,30 @@ test_expect_success FILEMODE 'bogus mode is rejected' ' test_i18ngrep "invalid mode" err ' +test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree files' ' + git reset --hard && + test_config core.sharedRepository 0666 && + ( + # Remove a default ACL if possible. + (setfacl -k . 2>/dev/null || true) && + umask 0077 && + + # Test both files (f1) and leading dirs (d) + mkdir d && + touch f1 d/f2 && + git add f1 d/f2 && + git diff --staged >patch-f1-and-f2.txt && + + rm -rf d f1 && + git apply patch-f1-and-f2.txt && + + echo "-rw-------" >f1_mode.expected && + echo "drwx------" >d_mode.expected && + test_modebits f1 >f1_mode.actual && + test_modebits d >d_mode.actual && + test_cmp f1_mode.expected f1_mode.actual && + test_cmp d_mode.expected d_mode.actual + ) +' + test_done diff --git a/t/t4150-am.sh b/t/t4150-am.sh index 1da8ab120b..2aaaa0d7de 100755 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@ -2,6 +2,9 @@ test_description='git am running' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup: messages' ' @@ -179,8 +182,8 @@ test_expect_success setup ' test_tick && git commit -m "added another file" && - git format-patch --stdout master >lorem-move.patch && - git format-patch --no-prefix --stdout master >lorem-zero.patch && + git format-patch --stdout main >lorem-move.patch && + git format-patch --no-prefix --stdout main >lorem-zero.patch && git checkout -b rename && git mv file renamed && @@ -453,11 +456,11 @@ test_expect_success 'am changes committer and keeps author' ' git checkout first && git am patch2 && test_path_is_missing .git/rebase-apply && - test "$(git rev-parse master^^)" = "$(git rev-parse HEAD^^)" && - git diff --exit-code master..HEAD && - git diff --exit-code master^..HEAD^ && - compare author master HEAD && - compare author master^ HEAD^ && + test "$(git rev-parse main^^)" = "$(git rev-parse HEAD^^)" && + git diff --exit-code main..HEAD && + git diff --exit-code main^..HEAD^ && + compare author main HEAD && + compare author main^ HEAD^ && test "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" = \ "$(git log -1 --pretty=format:"%cn <%ce>" HEAD)" ' @@ -465,7 +468,7 @@ test_expect_success 'am changes committer and keeps author' ' test_expect_success 'am --signoff adds Signed-off-by: line' ' rm -fr .git/rebase-apply && git reset --hard && - git checkout -b master2 first && + git checkout -b topic_2 first && git am --signoff <patch2 && { printf "third\n\nSigned-off-by: %s <%s>\n\n" \ @@ -479,7 +482,7 @@ test_expect_success 'am --signoff adds Signed-off-by: line' ' ' test_expect_success 'am stays in branch' ' - echo refs/heads/master2 >expected && + echo refs/heads/topic_2 >expected && git symbolic-ref HEAD >actual && test_cmp expected actual ' @@ -540,7 +543,7 @@ test_expect_success 'am without --keep removes Re: and [PATCH] stuff' ' git reset --hard HEAD^ && git am <patch4 && git rev-parse HEAD >expected && - git rev-parse master2 >actual && + git rev-parse topic_2 >actual && test_cmp expected actual ' @@ -567,7 +570,7 @@ test_expect_success 'am --keep-non-patch really keeps the non-patch part' ' test_expect_success 'setup am -3' ' rm -fr .git/rebase-apply && git reset --hard && - git checkout -b base3way master2 && + git checkout -b base3way topic_2 && sed -n -e "3,\$p" msg >file && head -n 9 msg >>file && git add file && @@ -759,7 +762,7 @@ test_expect_success 'am takes patches from a Pine mailbox' ' git checkout first && cat pine patch1 | git am && test_path_is_missing .git/rebase-apply && - git diff --exit-code master^..HEAD + git diff --exit-code main^..HEAD ' test_expect_success 'am fails on mail without patch' ' @@ -903,7 +906,7 @@ test_expect_success 'am empty-file does not infloop' ' test_tick && test_must_fail git am empty-file 2>actual && echo Patch format detection failed. >expected && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'am --message-id really adds the message id' ' @@ -1112,21 +1115,21 @@ test_expect_success 'am and .gitattibutes' ' test_commit sixth && git checkout test && - git format-patch --stdout master..HEAD >patches && - git reset --hard master && + git format-patch --stdout main..HEAD >patches && + git reset --hard main && git am patches && grep "smudged" a.txt && git checkout removal && git reset --hard && - git format-patch --stdout master..HEAD >patches && - git reset --hard master && + git format-patch --stdout main..HEAD >patches && + git reset --hard main && git am patches && grep "clean" a.txt && git checkout conflict && git reset --hard && - git format-patch --stdout master..HEAD >patches && + git format-patch --stdout main..HEAD >patches && git reset --hard fourth && test_must_fail git am -3 patches && grep "<<<<<<<<<<" a.txt diff --git a/t/t4153-am-resume-override-opts.sh b/t/t4153-am-resume-override-opts.sh index 8ea22d1bcb..b7c3861407 100755 --- a/t/t4153-am-resume-override-opts.sh +++ b/t/t4153-am-resume-override-opts.sh @@ -61,7 +61,7 @@ test_expect_success '--no-quiet overrides --quiet' ' # Applying side2 will be quiet. git am --no-quiet --continue >out && echo "Applying: side1" >expected && - test_i18ncmp expected out + test_cmp expected out ' test_expect_success '--signoff overrides --no-signoff' ' diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index b12b43e9e9..9f8c76dffb 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -8,7 +8,7 @@ test_description='git rerere ! [fifth] version1 ! [first] first ! [fourth] version1 - ! [master] initial + ! [main] initial ! [second] prefer first over second ! [third] version2 ------ @@ -19,9 +19,12 @@ test_description='git rerere - [second] prefer first over second + + [first] first + [second^] second -++++++ [master] initial +++++++ [main] initial ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -57,7 +60,7 @@ test_expect_success 'setup' ' test_tick && git commit -q -a -m first && - git checkout -b second master && + git checkout -b second main && git show first:a1 | sed -e "s/To die, t/To die! T/" -e "s/Some title/Some Title/" >a1 && echo "* END *" >>a1 && @@ -168,7 +171,7 @@ test_expect_success 'first postimage wins' ' oldmtimepost=$(test-tool chmtime --get -60 $rr/postimage) && - git checkout -b third master && + git checkout -b third main && git show second^:a1 | sed "s/To die: t/To die! T/" >a1 && git commit -q -a -m third && @@ -580,13 +583,13 @@ test_expect_success 'multiple identical conflicts' ' test_expect_success 'rerere with unexpected conflict markers does not crash' ' git reset --hard && - git checkout -b branch-1 master && + git checkout -b branch-1 main && echo "bar" >test && git add test && git commit -q -m two && git reset --hard && - git checkout -b branch-2 master && + git checkout -b branch-2 main && echo "foo" >test && git add test && git commit -q -a -m one && @@ -601,7 +604,7 @@ test_expect_success 'rerere with unexpected conflict markers does not crash' ' test_expect_success 'rerere with inner conflict markers' ' git reset --hard && - git checkout -b A master && + git checkout -b A main && echo "bar" >test && git add test && git commit -q -m two && @@ -610,7 +613,7 @@ test_expect_success 'rerere with inner conflict markers' ' git commit -q -m three && git reset --hard && - git checkout -b B master && + git checkout -b B main && echo "foo" >test && git add test && git commit -q -a -m one && @@ -651,11 +654,11 @@ test_expect_success 'setup simple stage 1 handling' ' git add original && git commit -m original && - git checkout -b A master && + git checkout -b A main && git mv original A && git commit -m "rename to A" && - git checkout -b B master && + git checkout -b B main && git mv original B && git commit -m "rename to B" ) diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh index d3a7ce6bbb..3095b1b2ff 100755 --- a/t/t4201-shortlog.sh +++ b/t/t4201-shortlog.sh @@ -6,6 +6,9 @@ test_description='git shortlog ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -191,7 +194,7 @@ test_expect_success 'shortlog with revision pseudo options' ' ' test_expect_success 'shortlog with --output=<file>' ' - git shortlog --output=shortlog -1 master >output && + git shortlog --output=shortlog -1 main >output && test_must_be_empty output && test_line_count = 3 shortlog ' @@ -215,4 +218,145 @@ test_expect_success 'shortlog --committer (external)' ' test_cmp expect actual ' +test_expect_success '--group=committer is the same as --committer' ' + git shortlog -ns --group=committer HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'shortlog --group=trailer:signed-off-by' ' + git commit --allow-empty -m foo -s && + GIT_COMMITTER_NAME="SOB One" \ + GIT_COMMITTER_EMAIL=sob@example.com \ + git commit --allow-empty -m foo -s && + git commit --allow-empty --amend --no-edit -s && + cat >expect <<-\EOF && + 2 C O Mitter <committer@example.com> + 1 SOB One <sob@example.com> + EOF + git shortlog -nse --group=trailer:signed-off-by HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'trailer idents are split' ' + cat >expect <<-\EOF && + 2 C O Mitter + 1 SOB One + EOF + git shortlog -ns --group=trailer:signed-off-by HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'trailer idents are mailmapped' ' + cat >expect <<-\EOF && + 2 C O Mitter + 1 Another Name + EOF + echo "Another Name <sob@example.com>" >mail.map && + git -c mailmap.file=mail.map shortlog -ns \ + --group=trailer:signed-off-by HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'shortlog de-duplicates trailers in a single commit' ' + git commit --allow-empty -F - <<-\EOF && + subject one + + this message has two distinct values, plus a repeat + + Repeated-trailer: Foo + Repeated-trailer: Bar + Repeated-trailer: Foo + EOF + + git commit --allow-empty -F - <<-\EOF && + subject two + + similar to the previous, but without the second distinct value + + Repeated-trailer: Foo + Repeated-trailer: Foo + EOF + + cat >expect <<-\EOF && + 2 Foo + 1 Bar + EOF + git shortlog -ns --group=trailer:repeated-trailer -2 HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'shortlog can match multiple groups' ' + git commit --allow-empty -F - <<-\EOF && + subject one + + this has two trailers that are distinct from the author; it will count + 3 times in the output + + Some-trailer: User A <a@example.com> + Another-trailer: User B <b@example.com> + EOF + + git commit --allow-empty -F - <<-\EOF && + subject two + + this one has two trailers, one of which is a duplicate with the author; + it will only be counted once for them + + Another-trailer: A U Thor <author@example.com> + Some-trailer: User B <b@example.com> + EOF + + cat >expect <<-\EOF && + 2 A U Thor + 2 User B + 1 User A + EOF + git shortlog -ns \ + --group=author \ + --group=trailer:some-trailer \ + --group=trailer:another-trailer \ + -2 HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'set up option selection tests' ' + git commit --allow-empty -F - <<-\EOF + subject + + body + + Trailer-one: value-one + Trailer-two: value-two + EOF +' + +test_expect_success '--no-group resets group list to author' ' + cat >expect <<-\EOF && + 1 A U Thor + EOF + git shortlog -ns \ + --group=committer \ + --group=trailer:trailer-one \ + --no-group \ + -1 HEAD >actual && + test_cmp expect actual +' + +test_expect_success '--no-group resets trailer list' ' + cat >expect <<-\EOF && + 1 value-two + EOF + git shortlog -ns \ + --group=trailer:trailer-one \ + --no-group \ + --group=trailer:trailer-two \ + -1 HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'stdin with multiple groups reports error' ' + git log >log && + test_must_fail git shortlog --group=author --group=committer <log +' + test_done diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 56d34ed465..9dfead936b 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -2,6 +2,9 @@ test_description='git log' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" . "$TEST_DIRECTORY/lib-terminal.sh" @@ -478,7 +481,7 @@ test_expect_success 'set up merge history' ' git checkout -b side HEAD~4 && test_commit side-1 1 1 && test_commit side-2 2 2 && - git checkout master && + git checkout main && git merge side ' @@ -541,17 +544,17 @@ test_expect_success 'log --graph with merge with log.graphColors' ' ' test_expect_success 'log --raw --graph -m with merge' ' - git log --raw --graph --oneline -m master | head -n 500 >actual && + git log --raw --graph --oneline -m main | head -n 500 >actual && grep "initial" actual ' test_expect_success 'diff-tree --graph' ' - git diff-tree --graph master^ | head -n 500 >actual && + git diff-tree --graph main^ | head -n 500 >actual && grep "one" actual ' cat > expect <<\EOF -* commit master +* commit main |\ Merge: A B | | Author: A U Thor <author@example.com> | | @@ -567,22 +570,22 @@ cat > expect <<\EOF | | | | side-1 | | -* | commit master~1 +* | commit main~1 | | Author: A U Thor <author@example.com> | | | | Second | | -* | commit master~2 +* | commit main~2 | | Author: A U Thor <author@example.com> | | | | sixth | | -* | commit master~3 +* | commit main~3 | | Author: A U Thor <author@example.com> | | | | fifth | | -* | commit master~4 +* | commit main~4 |/ Author: A U Thor <author@example.com> | | fourth @@ -613,19 +616,19 @@ test_expect_success 'log --graph with full output' ' test_expect_success 'set up more tangled history' ' git checkout -b tangle HEAD~6 && test_commit tangle-a tangle-a a && - git merge master~3 && + git merge main~3 && git merge side~1 && - git checkout master && + git checkout main && git merge tangle && git checkout -b reach && test_commit reach && - git checkout master && + git checkout main && git checkout -b octopus-a && test_commit octopus-a && - git checkout master && + git checkout main && git checkout -b octopus-b && test_commit octopus-b && - git checkout master && + git checkout main && test_commit seventh && git merge octopus-a octopus-b && git merge reach @@ -650,7 +653,7 @@ cat > expect <<\EOF |\ | * Merge branch 'side' (early part) into tangle | |\ -| * \ Merge branch 'master' (early part) into tangle +| * \ Merge branch 'main' (early part) into tangle | |\ \ | * | | tangle-a * | | | Merge branch 'side' @@ -794,7 +797,7 @@ test_expect_success 'multiple decorate-refs' ' test_expect_success 'decorate-refs-exclude with glob' ' cat >expect.decorate <<-\EOF && - Merge-tag-reach (HEAD -> master) + Merge-tag-reach (HEAD -> main) Merge-tags-octopus-a-and-octopus-b seventh (tag: seventh) octopus-b (tag: octopus-b) @@ -811,7 +814,7 @@ test_expect_success 'decorate-refs-exclude with glob' ' test_expect_success 'decorate-refs-exclude without globs' ' cat >expect.decorate <<-\EOF && - Merge-tag-reach (HEAD -> master) + Merge-tag-reach (HEAD -> main) Merge-tags-octopus-a-and-octopus-b seventh (tag: seventh) octopus-b (tag: octopus-b, octopus-b) @@ -828,7 +831,7 @@ test_expect_success 'decorate-refs-exclude without globs' ' test_expect_success 'multiple decorate-refs-exclude' ' cat >expect.decorate <<-\EOF && - Merge-tag-reach (HEAD -> master) + Merge-tag-reach (HEAD -> main) Merge-tags-octopus-a-and-octopus-b seventh (tag: seventh) octopus-b (tag: octopus-b) @@ -851,7 +854,7 @@ test_expect_success 'multiple decorate-refs-exclude' ' test_expect_success 'decorate-refs and decorate-refs-exclude' ' cat >expect.no-decorate <<-\EOF && - Merge-tag-reach (master) + Merge-tag-reach (main) Merge-tags-octopus-a-and-octopus-b seventh octopus-b @@ -866,7 +869,7 @@ test_expect_success 'decorate-refs and decorate-refs-exclude' ' test_expect_success 'deocrate-refs and log.excludeDecoration' ' cat >expect.decorate <<-\EOF && - Merge-tag-reach (master) + Merge-tag-reach (main) Merge-tags-octopus-a-and-octopus-b seventh octopus-b (octopus-b) @@ -881,7 +884,7 @@ test_expect_success 'deocrate-refs and log.excludeDecoration' ' test_expect_success 'decorate-refs-exclude and simplify-by-decoration' ' cat >expect.decorate <<-\EOF && - Merge-tag-reach (HEAD -> master) + Merge-tag-reach (HEAD -> main) reach (tag: reach, reach) seventh (tag: seventh) Merge-branch-tangle @@ -1080,7 +1083,7 @@ cat >expect <<\EOF | |\ \ Merge: MERGE_PARENTS | | | | Author: A U Thor <author@example.com> | | | | -| | | | Merge branch 'master' (early part) into tangle +| | | | Merge branch 'main' (early part) into tangle | | | | | * | | commit COMMIT_OBJECT_NAME | | | | Author: A U Thor <author@example.com> @@ -1355,7 +1358,7 @@ cat >expect <<\EOF *** | |\ \ Merge: MERGE_PARENTS *** | | | | Author: A U Thor <author@example.com> *** | | | | -*** | | | | Merge branch 'master' (early part) into tangle +*** | | | | Merge branch 'main' (early part) into tangle *** | | | | *** | * | | commit COMMIT_OBJECT_NAME *** | | | | Author: A U Thor <author@example.com> @@ -1588,24 +1591,24 @@ test_expect_success 'dotdot is a parent directory' ' ' test_expect_success GPG 'setup signed branch' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b signed master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b signed main && echo foo >foo && git add foo && git commit -S -m signed_commit ' test_expect_success GPG 'setup signed branch with subkey' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b signed-subkey master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b signed-subkey main && echo foo >foo && git add foo && git commit -SB7227189 -m signed_commit ' test_expect_success GPGSM 'setup signed branch x509' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b signed-x509 master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b signed-x509 main && echo foo >foo && git add foo && test_config gpg.format x509 && @@ -1638,12 +1641,12 @@ test_expect_success GPGSM 'log --graph --show-signature x509' ' ' test_expect_success GPG 'log --graph --show-signature for merged tag' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b plain master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b plain main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged master && + git checkout -b tagged main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1657,12 +1660,12 @@ test_expect_success GPG 'log --graph --show-signature for merged tag' ' ' test_expect_success GPG 'log --graph --show-signature for merged tag in shallow clone' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b plain-shallow master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b plain-shallow main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout --detach master && + git checkout --detach main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1677,12 +1680,12 @@ test_expect_success GPG 'log --graph --show-signature for merged tag in shallow ' test_expect_success GPG 'log --graph --show-signature for merged tag with missing key' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b plain-nokey master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b plain-nokey main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-nokey master && + git checkout -b tagged-nokey main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1696,12 +1699,12 @@ test_expect_success GPG 'log --graph --show-signature for merged tag with missin ' test_expect_success GPG 'log --graph --show-signature for merged tag with bad signature' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b plain-bad master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b plain-bad main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-bad master && + git checkout -b tagged-bad main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1718,12 +1721,12 @@ test_expect_success GPG 'log --graph --show-signature for merged tag with bad si ' test_expect_success GPG 'log --show-signature for merged tag with GPG failure' ' - test_when_finished "git reset --hard && git checkout master" && - git checkout -b plain-fail master && + test_when_finished "git reset --hard && git checkout main" && + git checkout -b plain-fail main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-fail master && + git checkout -b tagged-fail main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1737,14 +1740,14 @@ test_expect_success GPG 'log --show-signature for merged tag with GPG failure' ' ' test_expect_success GPGSM 'log --graph --show-signature for merged tag x509' ' - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && test_config gpg.format x509 && test_config user.signingkey $GIT_COMMITTER_EMAIL && - git checkout -b plain-x509 master && + git checkout -b plain-x509 main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-x509 master && + git checkout -b tagged-x509 main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1758,14 +1761,14 @@ test_expect_success GPGSM 'log --graph --show-signature for merged tag x509' ' ' test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 missing key' ' - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && test_config gpg.format x509 && test_config user.signingkey $GIT_COMMITTER_EMAIL && - git checkout -b plain-x509-nokey master && + git checkout -b plain-x509-nokey main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-x509-nokey master && + git checkout -b tagged-x509-nokey main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1778,14 +1781,14 @@ test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 miss ' test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 bad signature' ' - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && test_config gpg.format x509 && test_config user.signingkey $GIT_COMMITTER_EMAIL && - git checkout -b plain-x509-bad master && + git checkout -b plain-x509-bad main && echo aaa >bar && git add bar && git commit -m bar_commit && - git checkout -b tagged-x509-bad master && + git checkout -b tagged-x509-bad main && echo bbb >baz && git add baz && git commit -m baz_commit && @@ -1831,14 +1834,24 @@ test_expect_success 'log --graph --no-walk is forbidden' ' test_must_fail git log --graph --no-walk ' -test_expect_success 'log diagnoses bogus HEAD' ' +test_expect_success 'log on empty repo fails' ' git init empty && + test_when_finished "rm -rf empty" && test_must_fail git -C empty log 2>stderr && - test_i18ngrep does.not.have.any.commits stderr && - echo 1234abcd >empty/.git/refs/heads/master && + test_i18ngrep does.not.have.any.commits stderr +' + +test_expect_success REFFILES 'log diagnoses bogus HEAD hash' ' + git init empty && + test_when_finished "rm -rf empty" && + echo 1234abcd >empty/.git/refs/heads/main && test_must_fail git -C empty log 2>stderr && - test_i18ngrep broken stderr && - echo "ref: refs/heads/invalid.lock" >empty/.git/HEAD && + test_i18ngrep broken stderr +' + +test_expect_success 'log diagnoses bogus HEAD symref' ' + git init empty && + git --git-dir empty/.git symbolic-ref HEAD refs/heads/invalid.lock && test_must_fail git -C empty log 2>stderr && test_i18ngrep broken stderr && test_must_fail git -C empty log --default totally-bogus 2>stderr && @@ -1902,6 +1915,20 @@ test_expect_success '--exclude-promisor-objects does not BUG-crash' ' test_must_fail git log --exclude-promisor-objects source-a ' +test_expect_success 'log --decorate includes all levels of tag annotated tags' ' + git checkout -b branch && + git commit --allow-empty -m "new commit" && + git tag lightweight HEAD && + git tag -m annotated annotated HEAD && + git tag -m double-0 double-0 HEAD && + git tag -m double-1 double-1 double-0 && + cat >expect <<-\EOF && + HEAD -> branch, tag: lightweight, tag: double-1, tag: double-0, tag: annotated + EOF + git log -1 --format="%D" >actual && + test_cmp expect actual +' + test_expect_success 'log --end-of-options' ' git update-ref refs/heads/--source HEAD && git log --end-of-options --source >actual && diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index 586c3a86b1..0b2d21ec55 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -2,30 +2,14 @@ test_description='.mailmap configurations' -. ./test-lib.sh - -fuzz_blame () { - sed " - s/$_x05[0-9a-f][0-9a-f][0-9a-f]/OBJID/g - s/$_x05[0-9a-f][0-9a-f]/OBJI/g - s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g - " "$@" -} +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME -test_expect_success setup ' - cat >contacts <<- EOF && - $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> - nick1 <bugs@company.xx> - EOF +. ./test-lib.sh - echo one >one && - git add one && - test_tick && - git commit -m initial && - echo two >>one && - git add one && - test_tick && - git commit --author "nick1 <bugs@company.xx>" -m second +test_expect_success 'setup commits and contacts file' ' + test_commit initial one one && + test_commit --author "nick1 <bugs@company.xx>" --append second one two ' test_expect_success 'check-mailmap no arguments' ' @@ -33,7 +17,7 @@ test_expect_success 'check-mailmap no arguments' ' ' test_expect_success 'check-mailmap arguments' ' - cat >expect <<- EOF && + cat >expect <<-EOF && $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> nick1 <bugs@company.xx> EOF @@ -44,172 +28,256 @@ test_expect_success 'check-mailmap arguments' ' ' test_expect_success 'check-mailmap --stdin' ' - cat >expect <<- EOF && + cat >expect <<-EOF && $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> nick1 <bugs@company.xx> EOF - git check-mailmap --stdin <contacts >actual && + git check-mailmap --stdin <expect >actual && test_cmp expect actual ' -test_expect_success 'check-mailmap --stdin arguments' ' +test_expect_success 'check-mailmap --stdin arguments: no mapping' ' + test_when_finished "rm contacts" && + cat >contacts <<-EOF && + $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + nick1 <bugs@company.xx> + EOF cat >expect <<-\EOF && Internal Guy <bugs@company.xy> EOF - cat <contacts >>expect && + cat contacts >>expect && + git check-mailmap --stdin "Internal Guy <bugs@company.xy>" \ <contacts >actual && test_cmp expect actual ' +test_expect_success 'check-mailmap --stdin arguments: mapping' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + New Name <$GIT_AUTHOR_EMAIL> + EOF + cat >stdin <<-EOF && + Old Name <$GIT_AUTHOR_EMAIL> + EOF + + cp .mailmap expect && + git check-mailmap --stdin <stdin >actual && + test_cmp expect actual && + + cat .mailmap >>expect && + git check-mailmap --stdin "Another Old Name <$GIT_AUTHOR_EMAIL>" \ + <stdin >actual && + test_cmp expect actual +' + test_expect_success 'check-mailmap bogus contact' ' test_must_fail git check-mailmap bogus ' -cat >expect << EOF -$GIT_AUTHOR_NAME (1): - initial +test_expect_success 'check-mailmap bogus contact --stdin' ' + test_must_fail git check-mailmap --stdin bogus </dev/null +' -nick1 (1): - second +test_expect_success 'No mailmap' ' + cat >expect <<-EOF && + $GIT_AUTHOR_NAME (1): + initial -EOF + nick1 (1): + second -test_expect_success 'No mailmap' ' + EOF git shortlog HEAD >actual && test_cmp expect actual ' -cat >expect <<\EOF -Repo Guy (1): - initial +test_expect_success 'setup default .mailmap' ' + cat >default.map <<-EOF + Repo Guy <$GIT_AUTHOR_EMAIL> + EOF +' + +test_expect_success 'test default .mailmap' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && -nick1 (1): - second + cat >expect <<-\EOF && + Repo Guy (1): + initial -EOF + nick1 (1): + second -test_expect_success 'default .mailmap' ' - echo "Repo Guy <$GIT_AUTHOR_EMAIL>" > .mailmap && + EOF git shortlog HEAD >actual && test_cmp expect actual ' -# Using a mailmap file in a subdirectory of the repo here, but -# could just as well have been a file outside of the repository -cat >expect <<\EOF -Internal Guy (1): - second +test_expect_success 'mailmap.file set' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && -Repo Guy (1): - initial + test_config mailmap.file internal.map && + cat >internal.map <<-\EOF && + Internal Guy <bugs@company.xx> + EOF -EOF -test_expect_success 'mailmap.file set' ' - mkdir -p internal_mailmap && - echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap && - git config mailmap.file internal_mailmap/.mailmap && + cat >expect <<-\EOF && + Internal Guy (1): + second + + Repo Guy (1): + initial + + EOF git shortlog HEAD >actual && - test_cmp expect actual + test_cmp expect actual && + + # The internal_mailmap/.mailmap file is an a subdirectory, but + # as shown here it can also be outside the repository + test_when_finished "rm -rf sub-repo" && + git clone . sub-repo && + ( + cd sub-repo && + cp ../.mailmap . && + git config mailmap.file ../internal.map && + git shortlog HEAD >actual && + test_cmp ../expect actual + ) ' -cat >expect <<\EOF -External Guy (1): - initial +test_expect_success 'mailmap.file override' ' + test_config mailmap.file internal.map && + cat >internal.map <<-EOF && + Internal Guy <bugs@company.xx> + External Guy <$GIT_AUTHOR_EMAIL> + EOF -Internal Guy (1): - second + cat >expect <<-\EOF && + External Guy (1): + initial -EOF -test_expect_success 'mailmap.file override' ' - echo "External Guy <$GIT_AUTHOR_EMAIL>" >> internal_mailmap/.mailmap && - git config mailmap.file internal_mailmap/.mailmap && + Internal Guy (1): + second + + EOF git shortlog HEAD >actual && test_cmp expect actual ' -cat >expect <<\EOF -Repo Guy (1): - initial +test_expect_success 'mailmap.file non-existent' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && -nick1 (1): - second + cat >expect <<-\EOF && + Repo Guy (1): + initial -EOF + nick1 (1): + second -test_expect_success 'mailmap.file non-existent' ' - rm internal_mailmap/.mailmap && - rmdir internal_mailmap && + EOF git shortlog HEAD >actual && test_cmp expect actual ' -cat >expect <<\EOF -Internal Guy (1): - second +test_expect_success 'name entry after email entry' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && -Repo Guy (1): - initial + test_config mailmap.file internal.map && + cat >internal.map <<-\EOF && + <bugs@company.xy> <bugs@company.xx> + Internal Guy <bugs@company.xx> + EOF -EOF + cat >expect <<-\EOF && + Internal Guy (1): + second + + Repo Guy (1): + initial + + EOF -test_expect_success 'name entry after email entry' ' - mkdir -p internal_mailmap && - echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap && - echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap && git shortlog HEAD >actual && test_cmp expect actual ' -cat >expect <<\EOF -Internal Guy (1): - second +test_expect_success 'name entry after email entry, case-insensitive' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && -Repo Guy (1): - initial + test_config mailmap.file internal.map && + cat >internal.map <<-\EOF && + <bugs@company.xy> <bugs@company.xx> + Internal Guy <BUGS@Company.xx> + EOF -EOF + cat >expect <<-\EOF && + Internal Guy (1): + second -test_expect_success 'name entry after email entry, case-insensitive' ' - mkdir -p internal_mailmap && - echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap && - echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap && + Repo Guy (1): + initial + + EOF + git shortlog HEAD >actual && + test_cmp expect actual && + + cat >internal.map <<-\EOF && + NiCk <BuGs@CoMpAnY.Xy> NICK1 <BUGS@COMPANY.XX> + EOF + + cat >expect <<-\EOF && + NiCk (1): + second + + Repo Guy (1): + initial + + EOF git shortlog HEAD >actual && test_cmp expect actual ' -cat >expect << EOF -$GIT_AUTHOR_NAME (1): - initial +test_expect_success 'No mailmap files, but configured' ' + cat >expect <<-EOF && + $GIT_AUTHOR_NAME (1): + initial -nick1 (1): - second + nick1 (1): + second -EOF -test_expect_success 'No mailmap files, but configured' ' - rm -f .mailmap internal_mailmap/.mailmap && + EOF git shortlog HEAD >actual && test_cmp expect actual ' test_expect_success 'setup mailmap blob tests' ' git checkout -b map && - test_when_finished "git checkout master" && - cat >just-bugs <<- EOF && + test_when_finished "git checkout main" && + cat >just-bugs <<-\EOF && Blob Guy <bugs@company.xx> EOF - cat >both <<- EOF && + cat >both <<-EOF && Blob Guy <$GIT_AUTHOR_EMAIL> Blob Guy <bugs@company.xx> EOF printf "Tricky Guy <$GIT_AUTHOR_EMAIL>" >no-newline && git add just-bugs both no-newline && git commit -m "my mailmaps" && - echo "Repo Guy <$GIT_AUTHOR_EMAIL>" >.mailmap && - echo "Internal Guy <$GIT_AUTHOR_EMAIL>" >internal.map + + cat >internal.map <<-EOF + Internal Guy <$GIT_AUTHOR_EMAIL> + EOF ' test_expect_success 'mailmap.blob set' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && + cat >expect <<-\EOF && Blob Guy (1): second @@ -223,6 +291,9 @@ test_expect_success 'mailmap.blob set' ' ' test_expect_success 'mailmap.blob overrides .mailmap' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && + cat >expect <<-\EOF && Blob Guy (2): initial @@ -249,7 +320,28 @@ test_expect_success 'mailmap.file overrides mailmap.blob' ' test_cmp expect actual ' +test_expect_success 'mailmap.file can be missing' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && + + test_config mailmap.file nonexistent && + cat >expect <<-\EOF && + Repo Guy (1): + initial + + nick1 (1): + second + + EOF + git shortlog HEAD >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + test_expect_success 'mailmap.blob can be missing' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && + cat >expect <<-\EOF && Repo Guy (1): initial @@ -258,7 +350,17 @@ test_expect_success 'mailmap.blob can be missing' ' second EOF - git -c mailmap.blob=map:nonexistent shortlog HEAD >actual && + git -c mailmap.blob=map:nonexistent shortlog HEAD >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + +test_expect_success 'mailmap.blob might be the wrong type' ' + test_when_finished "rm .mailmap" && + cp default.map .mailmap && + + git -c mailmap.blob=HEAD: shortlog HEAD >actual 2>err && + test_i18ngrep "mailmap is not a blob" err && test_cmp expect actual ' @@ -267,11 +369,15 @@ test_expect_success 'mailmap.blob defaults to off in non-bare repo' ' ( cd non-bare && test_commit one .mailmap "Fake Name <$GIT_AUTHOR_EMAIL>" && - echo " 1 Fake Name" >expect && + cat >expect <<-\EOF && + 1 Fake Name + EOF git shortlog -ns HEAD >actual && test_cmp expect actual && rm .mailmap && - echo " 1 $GIT_AUTHOR_NAME" >expect && + cat >expect <<-EOF && + 1 $GIT_AUTHOR_NAME + EOF git shortlog -ns HEAD >actual && test_cmp expect actual ) @@ -281,7 +387,9 @@ test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' ' git clone --bare non-bare bare && ( cd bare && - echo " 1 Fake Name" >expect && + cat >expect <<-\EOF && + 1 Fake Name + EOF git shortlog -ns HEAD >actual && test_cmp expect actual ) @@ -300,178 +408,260 @@ test_expect_success 'mailmap.blob can handle blobs without trailing newline' ' test_cmp expect actual ' -test_expect_success 'cleanup after mailmap.blob tests' ' - rm -f .mailmap -' - test_expect_success 'single-character name' ' - echo " 1 A <$GIT_AUTHOR_EMAIL>" >expect && - echo " 1 nick1 <bugs@company.xx>" >>expect && - echo "A <$GIT_AUTHOR_EMAIL>" >.mailmap && test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + A <$GIT_AUTHOR_EMAIL> + EOF + + cat >expect <<-EOF && + 1 A <$GIT_AUTHOR_EMAIL> + 1 nick1 <bugs@company.xx> + EOF git shortlog -es HEAD >actual && test_cmp expect actual ' test_expect_success 'preserve canonical email case' ' - echo " 1 $GIT_AUTHOR_NAME <AUTHOR@example.com>" >expect && - echo " 1 nick1 <bugs@company.xx>" >>expect && - echo "<AUTHOR@example.com> <$GIT_AUTHOR_EMAIL>" >.mailmap && test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + <AUTHOR@example.com> <$GIT_AUTHOR_EMAIL> + EOF + + cat >expect <<-EOF && + 1 $GIT_AUTHOR_NAME <AUTHOR@example.com> + 1 nick1 <bugs@company.xx> + EOF git shortlog -es HEAD >actual && test_cmp expect actual ' -# Extended mailmap configurations should give us the following output for shortlog -cat >expect << EOF -$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> (1): - initial +test_expect_success 'gitmailmap(5) example output: setup' ' + test_create_repo doc && + test_commit -C doc --author "Joe Developer <joe@example.com>" A && + test_commit -C doc --author "Joe R. Developer <joe@example.com>" B && + test_commit -C doc --author "Jane Doe <jane@example.com>" C && + test_commit -C doc --author "Jane Doe <jane@laptop.(none)>" D && + test_commit -C doc --author "Jane D. <jane@desktop.(none)>" E +' + +test_expect_success 'gitmailmap(5) example output: example #1' ' + test_config -C doc mailmap.file ../doc.map && + cat >doc.map <<-\EOF && + Joe R. Developer <joe@example.com> + Jane Doe <jane@example.com> + Jane Doe <jane@desktop.(none)> + EOF + + cat >expect <<-\EOF && + Author Joe Developer <joe@example.com> maps to Joe R. Developer <joe@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Joe R. Developer <joe@example.com> maps to Joe R. Developer <joe@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane Doe <jane@example.com> maps to Jane Doe <jane@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane Doe <jane@laptop.(none)> maps to Jane Doe <jane@laptop.(none)> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane D <jane@desktop.(none)> maps to Jane Doe <jane@desktop.(none)> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' + +test_expect_success 'gitmailmap(5) example output: example #2' ' + test_config -C doc mailmap.file ../doc.map && + cat >doc.map <<-\EOF && + Joe R. Developer <joe@example.com> + Jane Doe <jane@example.com> <jane@laptop.(none)> + Jane Doe <jane@example.com> <jane@desktop.(none)> + EOF + + cat >expect <<-\EOF && + Author Joe Developer <joe@example.com> maps to Joe R. Developer <joe@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Joe R. Developer <joe@example.com> maps to Joe R. Developer <joe@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane Doe <jane@example.com> maps to Jane Doe <jane@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane Doe <jane@laptop.(none)> maps to Jane Doe <jane@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author Jane D <jane@desktop.(none)> maps to Jane Doe <jane@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' + +test_expect_success 'gitmailmap(5) example output: example #3' ' + test_config -C doc mailmap.file ../doc.map && + cat >>doc.map <<-\EOF && + Joe R. Developer <joe@example.com> Joe <bugs@example.com> + Jane Doe <jane@example.com> Jane <bugs@example.com> + EOF -CTO <cto@company.xx> (1): - seventh + test_commit -C doc --author "Joe <bugs@example.com>" F && + test_commit -C doc --author "Jane <bugs@example.com>" G && -Other Author <other@author.xx> (2): - third - fourth + cat >>expect <<-\EOF && -Santa Claus <santa.claus@northpole.xx> (2): - fifth - sixth + Author Joe <bugs@example.com> maps to Joe R. Developer <joe@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> -Some Dude <some@dude.xx> (1): - second + Author Jane <bugs@example.com> maps to Jane Doe <jane@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' -EOF test_expect_success 'Shortlog output (complex mapping)' ' - echo three >>one && - git add one && - test_tick && - git commit --author "nick2 <bugs@company.xx>" -m third && - - echo four >>one && - git add one && - test_tick && - git commit --author "nick2 <nick2@company.xx>" -m fourth && - - echo five >>one && - git add one && - test_tick && - git commit --author "santa <me@company.xx>" -m fifth && - - echo six >>one && - git add one && - test_tick && - git commit --author "claus <me@company.xx>" -m sixth && - - echo seven >>one && - git add one && - test_tick && - git commit --author "CTO <cto@coompany.xx>" -m seventh && - - mkdir -p internal_mailmap && - echo "Committed <$GIT_COMMITTER_EMAIL>" > internal_mailmap/.mailmap && - echo "<cto@company.xx> <cto@coompany.xx>" >> internal_mailmap/.mailmap && - echo "Some Dude <some@dude.xx> nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap && - echo "Other Author <other@author.xx> nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap && - echo "Other Author <other@author.xx> <nick2@company.xx>" >> internal_mailmap/.mailmap && - echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap && - echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap && + test_config mailmap.file complex.map && + cat >complex.map <<-EOF && + Committed <$GIT_COMMITTER_EMAIL> + <cto@company.xx> <cto@coompany.xx> + Some Dude <some@dude.xx> nick1 <bugs@company.xx> + Other Author <other@author.xx> nick2 <bugs@company.xx> + Other Author <other@author.xx> <nick2@company.xx> + Santa Claus <santa.claus@northpole.xx> <me@company.xx> + EOF + + test_commit --author "nick2 <bugs@company.xx>" --append third one three && + test_commit --author "nick2 <nick2@company.xx>" --append fourth one four && + test_commit --author "santa <me@company.xx>" --append fifth one five && + test_commit --author "claus <me@company.xx>" --append sixth one six && + test_commit --author "CTO <cto@coompany.xx>" --append seventh one seven && + + cat >expect <<-EOF && + $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> (1): + initial + + CTO <cto@company.xx> (1): + seventh + + Other Author <other@author.xx> (2): + third + fourth + + Santa Claus <santa.claus@northpole.xx> (2): + fifth + sixth + + Some Dude <some@dude.xx> (1): + second + + EOF git shortlog -e HEAD >actual && test_cmp expect actual ' -# git log with --pretty format which uses the name and email mailmap placemarkers -cat >expect << EOF -Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> +test_expect_success 'Log output (complex mapping)' ' + test_config mailmap.file complex.map && -Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + cat >expect <<-EOF && + Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -Author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> maps to $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> -Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> -EOF + Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + + Author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> maps to $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL> + EOF -test_expect_success 'Log output (complex mapping)' ' git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && test_cmp expect actual ' -cat >expect << EOF -Author email cto@coompany.xx has local-part cto -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME +test_expect_success 'Log output (local-part email address)' ' + cat >expect <<-EOF && + Author email cto@coompany.xx has local-part cto + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email me@company.xx has local-part me -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + Author email me@company.xx has local-part me + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email me@company.xx has local-part me -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + Author email me@company.xx has local-part me + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email nick2@company.xx has local-part nick2 -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + Author email nick2@company.xx has local-part nick2 + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email bugs@company.xx has local-part bugs -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + Author email bugs@company.xx has local-part bugs + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email bugs@company.xx has local-part bugs -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + Author email bugs@company.xx has local-part bugs + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -Author email author@example.com has local-part author -Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME -EOF + Author email author@example.com has local-part author + Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME + EOF -test_expect_success 'Log output (local-part email address)' ' git log --pretty=format:"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n" >actual && test_cmp expect actual ' -cat >expect << EOF -Author: CTO <cto@company.xx> -Author: Santa Claus <santa.claus@northpole.xx> -Author: Santa Claus <santa.claus@northpole.xx> -Author: Other Author <other@author.xx> -Author: Other Author <other@author.xx> -Author: Some Dude <some@dude.xx> -Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> -EOF - test_expect_success 'Log output with --use-mailmap' ' - git log --use-mailmap | grep Author >actual && + test_config mailmap.file complex.map && + + cat >expect <<-EOF && + Author: CTO <cto@company.xx> + Author: Santa Claus <santa.claus@northpole.xx> + Author: Santa Claus <santa.claus@northpole.xx> + Author: Other Author <other@author.xx> + Author: Other Author <other@author.xx> + Author: Some Dude <some@dude.xx> + Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + EOF + + git log --use-mailmap >log && + grep Author log >actual && test_cmp expect actual ' -cat >expect << EOF -Author: CTO <cto@company.xx> -Author: Santa Claus <santa.claus@northpole.xx> -Author: Santa Claus <santa.claus@northpole.xx> -Author: Other Author <other@author.xx> -Author: Other Author <other@author.xx> -Author: Some Dude <some@dude.xx> -Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> -EOF - test_expect_success 'Log output with log.mailmap' ' - git -c log.mailmap=True log | grep Author >actual && + test_config mailmap.file complex.map && + + cat >expect <<-EOF && + Author: CTO <cto@company.xx> + Author: Santa Claus <santa.claus@northpole.xx> + Author: Santa Claus <santa.claus@northpole.xx> + Author: Other Author <other@author.xx> + Author: Other Author <other@author.xx> + Author: Some Dude <some@dude.xx> + Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + EOF + + git -c log.mailmap=True log >log && + grep Author log >actual && test_cmp expect actual ' test_expect_success 'log.mailmap=false disables mailmap' ' - cat >expect <<- EOF && + cat >expect <<-EOF && Author: CTO <cto@coompany.xx> Author: claus <me@company.xx> Author: santa <me@company.xx> @@ -480,12 +670,13 @@ test_expect_success 'log.mailmap=false disables mailmap' ' Author: nick1 <bugs@company.xx> Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> EOF - git -c log.mailmap=False log | grep Author > actual && + git -c log.mailmap=false log >log && + grep Author log >actual && test_cmp expect actual ' test_expect_success '--no-use-mailmap disables mailmap' ' - cat >expect <<- EOF && + cat >expect <<-EOF && Author: CTO <cto@coompany.xx> Author: claus <me@company.xx> Author: santa <me@company.xx> @@ -494,64 +685,282 @@ test_expect_success '--no-use-mailmap disables mailmap' ' Author: nick1 <bugs@company.xx> Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> EOF - git log --no-use-mailmap | grep Author > actual && + git log --no-use-mailmap >log && + grep Author log >actual && test_cmp expect actual ' -cat >expect <<\EOF -Author: Santa Claus <santa.claus@northpole.xx> -Author: Santa Claus <santa.claus@northpole.xx> -EOF - test_expect_success 'Grep author with --use-mailmap' ' - git log --use-mailmap --author Santa | grep Author >actual && + test_config mailmap.file complex.map && + + cat >expect <<-\EOF && + Author: Santa Claus <santa.claus@northpole.xx> + Author: Santa Claus <santa.claus@northpole.xx> + EOF + git log --use-mailmap --author Santa >log && + grep Author log >actual && test_cmp expect actual ' -cat >expect <<\EOF -Author: Santa Claus <santa.claus@northpole.xx> -Author: Santa Claus <santa.claus@northpole.xx> -EOF test_expect_success 'Grep author with log.mailmap' ' - git -c log.mailmap=True log --author Santa | grep Author >actual && + test_config mailmap.file complex.map && + + cat >expect <<-\EOF && + Author: Santa Claus <santa.claus@northpole.xx> + Author: Santa Claus <santa.claus@northpole.xx> + EOF + + git -c log.mailmap=True log --author Santa >log && + grep Author log >actual && test_cmp expect actual ' test_expect_success 'log.mailmap is true by default these days' ' - git log --author Santa | grep Author >actual && + test_config mailmap.file complex.map && + git log --author Santa >log && + grep Author log >actual && test_cmp expect actual ' test_expect_success 'Only grep replaced author with --use-mailmap' ' + test_config mailmap.file complex.map && git log --use-mailmap --author "<cto@coompany.xx>" >actual && test_must_be_empty actual ' -# git blame -cat >expect <<EOF -^OBJI ($GIT_AUTHOR_NAME DATE 1) one -OBJID (Some Dude DATE 2) two -OBJID (Other Author DATE 3) three -OBJID (Other Author DATE 4) four -OBJID (Santa Claus DATE 5) five -OBJID (Santa Claus DATE 6) six -OBJID (CTO DATE 7) seven -EOF -test_expect_success 'Blame output (complex mapping)' ' - git blame one >actual && - fuzz_blame actual >actual.fuzz && +test_expect_success 'Blame --porcelain output (complex mapping)' ' + test_config mailmap.file complex.map && + + cat >expect <<-EOF && + 1 1 1 + A U Thor + 2 2 1 + Some Dude + 3 3 1 + Other Author + 4 4 1 + Other Author + 5 5 1 + Santa Claus + 6 6 1 + Santa Claus + 7 7 1 + CTO + EOF + + git blame --porcelain one >actual.blame && + + NUM="[0-9][0-9]*" && + sed -n <actual.blame >actual.fuzz \ + -e "s/^author //p" \ + -e "s/^$OID_REGEX \\($NUM $NUM $NUM\\)$/\\1/p" && test_cmp expect actual.fuzz ' -cat >expect <<\EOF -Some Dude <some@dude.xx> -EOF +test_expect_success 'Blame output (complex mapping)' ' + git -c mailmap.file=complex.map blame one >a && + git blame one >b && + test_file_not_empty a && + ! cmp a b +' test_expect_success 'commit --author honors mailmap' ' + test_config mailmap.file complex.map && + + cat >expect <<-\EOF && + Some Dude <some@dude.xx> + EOF + test_must_fail git commit --author "nick" --allow-empty -meight && git commit --author "Some Dude" --allow-empty -meight && git show --pretty=format:"%an <%ae>%n" >actual && test_cmp expect actual ' +test_expect_success 'comment syntax: setup' ' + test_create_repo comm && + test_commit -C comm --author "A <a@example.com>" A && + test_commit -C comm --author "B <b@example.com>" B && + test_commit -C comm --author "C <#@example.com>" C && + test_commit -C comm --author "D <d@e#ample.com>" D && + + test_config -C comm mailmap.file ../doc.map && + cat >>doc.map <<-\EOF && + # Ah <a@example.com> + + ; Bee <b@example.com> + Cee <cee@example.com> <#@example.com> + Dee <dee@example.com> <d@e#ample.com> + EOF + + cat >expect <<-\EOF && + Author A <a@example.com> maps to A <a@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author B <b@example.com> maps to ; Bee <b@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author C <#@example.com> maps to Cee <cee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author D <d@e#ample.com> maps to Dee <dee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C comm log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' + +test_expect_success 'whitespace syntax: setup' ' + test_create_repo space && + test_commit -C space --author "A <a@example.com>" A && + test_commit -C space --author "B <b@example.com>" B && + test_commit -C space --author " C <c@example.com>" C && + test_commit -C space --author " D <d@example.com>" D && + test_commit -C space --author "E E <e@example.com>" E && + test_commit -C space --author "F F <f@example.com>" F && + test_commit -C space --author "G G <g@example.com>" G && + test_commit -C space --author "H H <h@example.com>" H && + + test_config -C space mailmap.file ../space.map && + cat >>space.map <<-\EOF && + Ah <ah@example.com> < a@example.com > + Bee <bee@example.com > < b@example.com > + Cee <cee@example.com> C <c@example.com> + dee <dee@example.com> D <d@example.com> + eee <eee@example.com> E E <e@example.com> + eff <eff@example.com> F F <f@example.com> + gee <gee@example.com> G G <g@example.com> + aitch <aitch@example.com> H H <h@example.com> + EOF + + cat >expect <<-\EOF && + Author A <a@example.com> maps to A <a@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author B <b@example.com> maps to B <b@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author C <c@example.com> maps to Cee <cee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author D <d@example.com> maps to dee <dee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author E E <e@example.com> maps to eee <eee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author F F <f@example.com> maps to eff <eff@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author G G <g@example.com> maps to gee <gee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author H H <h@example.com> maps to H H <h@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C space log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' + +test_expect_success 'empty syntax: setup' ' + test_create_repo empty && + test_commit -C empty --author "A <>" A && + test_commit -C empty --author "B <b@example.com>" B && + test_commit -C empty --author "C <c@example.com>" C && + + test_config -C empty mailmap.file ../empty.map && + cat >>empty.map <<-\EOF && + Ah <ah@example.com> <> + Bee <bee@example.com> <> + Cee <> <c@example.com> + EOF + + cat >expect <<-\EOF && + Author A <> maps to Bee <bee@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author B <b@example.com> maps to B <b@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + + Author C <c@example.com> maps to C <c@example.com> + Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com> + EOF + git -C empty log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && + test_cmp expect actual +' + +test_expect_success 'set up mailmap location tests' ' + git init --bare loc-bare && + git --git-dir=loc-bare --work-tree=. commit \ + --allow-empty -m foo --author="Orig <orig@example.com>" && + echo "New <new@example.com> <orig@example.com>" >loc-bare/.mailmap +' + +test_expect_success 'bare repo with --work-tree finds mailmap at top-level' ' + git -C loc-bare --work-tree=. log -1 --format=%aE >actual && + echo new@example.com >expect && + test_cmp expect actual +' + +test_expect_success 'bare repo does not look in current directory' ' + git -C loc-bare log -1 --format=%aE >actual && + echo orig@example.com >expect && + test_cmp expect actual +' + +test_expect_success 'non-git shortlog respects mailmap in current dir' ' + git --git-dir=loc-bare log -1 >input && + nongit cp "$TRASH_DIRECTORY/loc-bare/.mailmap" . && + nongit git shortlog -s <input >actual && + echo " 1 New" >expect && + test_cmp expect actual +' + +test_expect_success 'shortlog on stdin respects mailmap from repo' ' + cp loc-bare/.mailmap . && + git shortlog -s <input >actual && + echo " 1 New" >expect && + test_cmp expect actual +' + +test_expect_success 'find top-level mailmap from subdir' ' + git clone loc-bare loc-wt && + cp loc-bare/.mailmap loc-wt && + mkdir loc-wt/subdir && + git -C loc-wt/subdir log -1 --format=%aE >actual && + echo new@example.com >expect && + test_cmp expect actual +' + +test_expect_success SYMLINKS 'set up symlink tests' ' + git commit --allow-empty -m foo --author="Orig <orig@example.com>" && + echo "New <new@example.com> <orig@example.com>" >map && + rm -f .mailmap +' + +test_expect_success SYMLINKS 'symlinks respected in mailmap.file' ' + test_when_finished "rm symlink" && + ln -s map symlink && + git -c mailmap.file="$(pwd)/symlink" log -1 --format=%aE >actual && + echo "new@example.com" >expect && + test_cmp expect actual +' + +test_expect_success SYMLINKS 'symlinks respected in non-repo shortlog' ' + git log -1 >input && + test_when_finished "nongit rm .mailmap" && + nongit ln -sf "$TRASH_DIRECTORY/map" .mailmap && + nongit git shortlog -s <input >actual && + echo " 1 New" >expect && + test_cmp expect actual +' + +test_expect_success SYMLINKS 'symlinks not respected in-tree' ' + test_when_finished "rm .mailmap" && + ln -s map .mailmap && + git log -1 --format=%aE >actual && + echo "orig@example.com" >expect && + test_cmp expect actual +' + test_done diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh index 8ff8bd84c7..f120857c20 100755 --- a/t/t4204-patch-id.sh +++ b/t/t4204-patch-id.sh @@ -2,6 +2,9 @@ test_description='git patch-id' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -13,9 +16,9 @@ test_expect_success 'setup' ' test_write_lines $as b >foo && test_write_lines $as b >bar && git commit -a -m first && - git checkout -b same master && + git checkout -b same main && git commit --amend -m same-msg && - git checkout -b notsame master && + git checkout -b notsame main && echo c >foo && echo c >bar && git commit --amend -a -m notsame-msg && @@ -46,31 +49,31 @@ get_patch_id () { } test_expect_success 'patch-id detects equality' ' - get_patch_id master && + get_patch_id main && get_patch_id same && - test_cmp patch-id_master patch-id_same + test_cmp patch-id_main patch-id_same ' test_expect_success 'patch-id detects inequality' ' - get_patch_id master && + get_patch_id main && get_patch_id notsame && - ! test_cmp patch-id_master patch-id_notsame + ! test_cmp patch-id_main patch-id_notsame ' test_expect_success 'patch-id supports git-format-patch output' ' - get_patch_id master && + get_patch_id main && git checkout same && git format-patch -1 --stdout | calc_patch_id same && - test_cmp patch-id_master patch-id_same && + test_cmp patch-id_main patch-id_same && set $(git format-patch -1 --stdout | git patch-id) && test "$2" = $(git rev-parse HEAD) ' test_expect_success 'whitespace is irrelevant in footer' ' - get_patch_id master && + get_patch_id main && git checkout same && git format-patch -1 --stdout | sed "s/ \$//" | calc_patch_id same && - test_cmp patch-id_master patch-id_same + test_cmp patch-id_main patch-id_same ' cmp_patch_id () { @@ -88,7 +91,7 @@ test_patch_id_file_order () { shift name="order-${1}-$relevant" shift - get_top_diff "master" | calc_patch_id "$name" "$@" && + get_top_diff "main" | calc_patch_id "$name" "$@" && git checkout same && git format-patch -1 --stdout -O foo-then-bar | calc_patch_id "ordered-$name" "$@" && @@ -137,10 +140,10 @@ test_expect_success '--stable overrides patchid.stable = false' ' ' test_expect_success 'patch-id supports git-format-patch MIME output' ' - get_patch_id master && + get_patch_id main && git checkout same && git format-patch -1 --attach --stdout | calc_patch_id same && - test_cmp patch-id_master patch-id_same + test_cmp patch-id_main patch-id_same ' test_expect_success 'patch-id respects config from subdir' ' diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 204c149d5a..5865daa8f8 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -123,10 +123,10 @@ test_expect_success 'NUL separation with --stat' ' stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) && printf "add bar\n$stat0_part\n\0$(commit_msg)\n$stat1_part\n" >expected && git log -z --stat --pretty="format:%s" >actual && - test_i18ncmp expected actual + test_cmp expected actual ' -test_expect_failure C_LOCALE_OUTPUT 'NUL termination with --stat' ' +test_expect_failure 'NUL termination with --stat' ' stat0_part=$(git diff --stat HEAD^ HEAD) && stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) && printf "add bar\n$stat0_part\n\0$(commit_msg)\n$stat1_part\n0" >expected && @@ -525,20 +525,25 @@ test_expect_success 'strbuf_utf8_replace() not producing NUL' ' ! grep Q actual ' -# ISO strict date format -test_expect_success 'ISO and ISO-strict date formats display the same values' ' - git log --format=%ai%n%ci | - sed -e "s/ /T/; s/ //; s/..\$/:&/" >expected && +# --date=[XXX] and corresponding %a[X] %c[X] format equivalency +test_expect_success '--date=iso-strict %ad%cd is the same as %aI%cI' ' + git log --format=%ad%n%cd --date=iso-strict >expected && git log --format=%aI%n%cI >actual && test_cmp expected actual ' -test_expect_success 'short date' ' +test_expect_success '--date=short %ad%cd is the same as %as%cs' ' git log --format=%ad%n%cd --date=short >expected && git log --format=%as%n%cs >actual && test_cmp expected actual ' +test_expect_success '--date=human %ad%cd is the same as %ah%ch' ' + git log --format=%ad%n%cd --date=human >expected && + git log --format=%ah%n%ch >actual && + test_cmp expected actual +' + # get new digests (with no abbreviations) test_expect_success 'set up log decoration tests' ' head1=$(git rev-parse --verify HEAD~0) && @@ -605,6 +610,12 @@ test_expect_success 'pretty format %(trailers) shows trailers' ' test_cmp expect actual ' +test_expect_success 'pretty format %(trailers:) enables no options' ' + git log --no-walk --pretty="%(trailers:)" >actual && + # "expect" the same as the test above + test_cmp expect actual +' + test_expect_success '%(trailers:only) shows only "key: value" trailers' ' git log --no-walk --pretty="%(trailers:only)" >actual && { @@ -709,19 +720,101 @@ test_expect_success '%(trailers:key) without value is error' ' test_cmp expect actual ' +test_expect_success '%(trailers:keyonly) shows only keys' ' + git log --no-walk --pretty="format:%(trailers:keyonly)" >actual && + test_write_lines \ + "Signed-off-by" \ + "Acked-by" \ + "[ v2 updated patch description ]" \ + "Signed-off-by" >expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=foo,keyonly) shows only key' ' + git log --no-walk --pretty="format:%(trailers:key=Acked-by,keyonly)" >actual && + echo "Acked-by" >expect && + test_cmp expect actual +' + test_expect_success '%(trailers:key=foo,valueonly) shows only value' ' git log --no-walk --pretty="format:%(trailers:key=Acked-by,valueonly)" >actual && echo "A U Thor <author@example.com>" >expect && test_cmp expect actual ' +test_expect_success '%(trailers:valueonly) shows only values' ' + git log --no-walk --pretty="format:%(trailers:valueonly)" >actual && + test_write_lines \ + "A U Thor <author@example.com>" \ + "A U Thor <author@example.com>" \ + "[ v2 updated patch description ]" \ + "A U Thor" \ + " <author@example.com>" >expect && + test_cmp expect actual +' + +test_expect_success '%(trailers:key=foo,keyonly,valueonly) shows nothing' ' + git log --no-walk --pretty="format:%(trailers:key=Acked-by,keyonly,valueonly)" >actual && + echo >expect && + test_cmp expect actual +' + test_expect_success 'pretty format %(trailers:separator) changes separator' ' + git log --no-walk --pretty=format:"X%(trailers:separator=%x00)X" >actual && + ( + printf "XSigned-off-by: A U Thor <author@example.com>\0" && + printf "Acked-by: A U Thor <author@example.com>\0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by: A U Thor\n <author@example.com>X" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separator' ' git log --no-walk --pretty=format:"X%(trailers:separator=%x00,unfold)X" >actual && - printf "XSigned-off-by: A U Thor <author@example.com>\0Acked-by: A U Thor <author@example.com>\0[ v2 updated patch description ]\0Signed-off-by: A U Thor <author@example.com>X" >expect && + ( + printf "XSigned-off-by: A U Thor <author@example.com>\0" && + printf "Acked-by: A U Thor <author@example.com>\0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by: A U Thor <author@example.com>X" + ) >expect && test_cmp expect actual ' -test_expect_success 'pretty format %(trailers) combining separator/key/valueonly' ' +test_expect_success 'pretty format %(trailers:key_value_separator) changes key-value separator' ' + git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00)X" >actual && + ( + printf "XSigned-off-by\0A U Thor <author@example.com>\n" && + printf "Acked-by\0A U Thor <author@example.com>\n" && + printf "[ v2 updated patch description ]\n" && + printf "Signed-off-by\0A U Thor\n <author@example.com>\nX" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:key_value_separator,unfold) changes key-value separator' ' + git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00,unfold)X" >actual && + ( + printf "XSigned-off-by\0A U Thor <author@example.com>\n" && + printf "Acked-by\0A U Thor <author@example.com>\n" && + printf "[ v2 updated patch description ]\n" && + printf "Signed-off-by\0A U Thor <author@example.com>\nX" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers:separator,key_value_separator) changes both separators' ' + git log --no-walk --pretty=format:"%(trailers:separator=%x00,key_value_separator=%x00%x00,unfold)" >actual && + ( + printf "Signed-off-by\0\0A U Thor <author@example.com>\0" && + printf "Acked-by\0\0A U Thor <author@example.com>\0" && + printf "[ v2 updated patch description ]\0" && + printf "Signed-off-by\0\0A U Thor <author@example.com>" + ) >expect && + test_cmp expect actual +' + +test_expect_success 'pretty format %(trailers) combining separator/key/keyonly/valueonly' ' git commit --allow-empty -F - <<-\EOF && Important fix @@ -748,6 +841,13 @@ test_expect_success 'pretty format %(trailers) combining separator/key/valueonly "Does not close any tickets" \ "Another fix #567, #890" \ "Important fix #1234" >expect && + test_cmp expect actual && + + git log --pretty="%s% (trailers:separator=%x2c%x20,key=Closes,keyonly)" HEAD~3.. >actual && + test_write_lines \ + "Does not close any tickets" \ + "Another fix Closes, Closes" \ + "Important fix Closes" >expect && test_cmp expect actual ' @@ -867,4 +967,39 @@ test_expect_success 'log --pretty=reference is colored appropriately' ' test_cmp expect actual ' +test_expect_success '%(describe) vs git describe' ' + git log --format="%H" | while read hash + do + if desc=$(git describe $hash) + then + : >expect-contains-good + else + : >expect-contains-bad + fi && + echo "$hash $desc" + done >expect && + test_path_exists expect-contains-good && + test_path_exists expect-contains-bad && + + git log --format="%H %(describe)" >actual 2>err && + test_cmp expect actual && + test_must_be_empty err +' + +test_expect_success '%(describe:match=...) vs git describe --match ...' ' + test_when_finished "git tag -d tag-match" && + git tag -a -m tagged tag-match && + git describe --match "*-match" >expect && + git log -1 --format="%(describe:match=*-match)" >actual && + test_cmp expect actual +' + +test_expect_success '%(describe:exclude=...) vs git describe --exclude ...' ' + test_when_finished "git tag -d tag-exclude" && + git tag -a -m tagged tag-exclude && + git describe --exclude "*-exclude" >expect && + git log -1 --format="%(describe:exclude=*-exclude)" >actual && + test_cmp expect actual +' + test_done diff --git a/t/t4206-log-follow-harder-copies.sh b/t/t4206-log-follow-harder-copies.sh index ad29e65fcb..4871a5dc92 100755 --- a/t/t4206-log-follow-harder-copies.sh +++ b/t/t4206-log-follow-harder-copies.sh @@ -7,7 +7,7 @@ test_description='Test --follow should always find copies hard in git log. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh +. "$TEST_DIRECTORY"/lib-diff.sh echo >path0 'Line 1 Line 2 diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh index 60f040cab8..b870942498 100755 --- a/t/t4207-log-decoration-colors.sh +++ b/t/t4207-log-decoration-colors.sh @@ -5,6 +5,9 @@ test_description='Test for "git log --decorate" colors' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -40,13 +43,13 @@ test_expect_success setup ' cat >expected <<EOF ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD ->\ - ${c_reset}${c_branch}master${c_reset}${c_commit},\ + ${c_reset}${c_branch}main${c_reset}${c_commit},\ ${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit},\ ${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A1${c_reset}${c_commit},\ - ${c_reset}${c_remoteBranch}other/master${c_reset}${c_commit})${c_reset} A1 + ${c_reset}${c_remoteBranch}other/main${c_reset}${c_commit})${c_reset} A1 ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_stash}refs/stash${c_reset}${c_commit})${c_reset}\ - On master: Changes to A.t + On main: Changes to A.t ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A EOF diff --git a/t/t4208-log-magic-pathspec.sh b/t/t4208-log-magic-pathspec.sh index 6cdbe4747a..7f0c1dcc0f 100755 --- a/t/t4208-log-magic-pathspec.sh +++ b/t/t4208-log-magic-pathspec.sh @@ -2,6 +2,9 @@ test_description='magic pathspec tests using git-log' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -26,15 +29,10 @@ test_expect_success '"git log :/a -- " should not be ambiguous' ' ' test_expect_success '"git log :/detached -- " should find a commit only in HEAD' ' - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout --detach && - # Must manually call `test_tick` instead of using `test_commit`, - # because the latter additionally creates a tag, which would make - # the commit reachable not only via HEAD. - test_tick && - git commit --allow-empty -m detached && - test_tick && - git commit --allow-empty -m something-else && + test_commit --no-tag detached && + test_commit --no-tag something-else && git log :/detached -- ' @@ -119,7 +117,7 @@ test_expect_success 'command line pathspec parsing for "git log"' ' git checkout HEAD^ && echo 2 >a && git commit -a -m "update a to 2" && - test_must_fail git merge master && + test_must_fail git merge main && git add a && git log --merge -- a ' diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh index 5d06f5f45e..75795d0b49 100755 --- a/t/t4209-log-pickaxe.sh +++ b/t/t4209-log-pickaxe.sh @@ -55,6 +55,43 @@ test_expect_success setup ' git rev-parse --verify HEAD >expect_second ' +test_expect_success 'usage' ' + test_expect_code 129 git log -S 2>err && + test_i18ngrep "switch.*requires a value" err && + + test_expect_code 129 git log -G 2>err && + test_i18ngrep "switch.*requires a value" err && + + test_expect_code 128 git log -Gregex -Sstring 2>err && + grep "mutually exclusive" err && + + test_expect_code 128 git log -Gregex --find-object=HEAD 2>err && + grep "mutually exclusive" err && + + test_expect_code 128 git log -Sstring --find-object=HEAD 2>err && + grep "mutually exclusive" err && + + test_expect_code 128 git log --pickaxe-all --find-object=HEAD 2>err && + grep "mutually exclusive" err +' + +test_expect_success 'usage: --pickaxe-regex' ' + test_expect_code 128 git log -Gregex --pickaxe-regex 2>err && + grep "mutually exclusive" err +' + +test_expect_success 'usage: --no-pickaxe-regex' ' + cat >expect <<-\EOF && + fatal: unrecognized argument: --no-pickaxe-regex + EOF + + test_expect_code 128 git log -Sstring --no-pickaxe-regex 2>actual && + test_cmp expect actual && + + test_expect_code 128 git log -Gstring --no-pickaxe-regex 2>err && + test_cmp expect actual +' + test_log expect_initial --grep initial test_log expect_nomatch --grep InItial test_log_icase expect_initial --grep InItial @@ -106,38 +143,83 @@ test_expect_success 'log -S --no-textconv (missing textconv tool)' ' rm .gitattributes ' +test_expect_success 'setup log -[GS] plain & regex' ' + test_create_repo GS-plain && + test_commit -C GS-plain --append A data.txt "a" && + test_commit -C GS-plain --append B data.txt "a a" && + test_commit -C GS-plain --append C data.txt "b" && + test_commit -C GS-plain --append D data.txt "[b]" && + test_commit -C GS-plain E data.txt "" && + + # We also include E, the deletion commit + git -C GS-plain log --grep="[ABE]" >A-to-B-then-E-log && + git -C GS-plain log --grep="[CDE]" >C-to-D-then-E-log && + git -C GS-plain log --grep="[DE]" >D-then-E-log && + git -C GS-plain log >full-log +' + +test_expect_success 'log -G trims diff new/old [-+]' ' + git -C GS-plain log -G"[+-]a" >log && + test_must_be_empty log && + git -C GS-plain log -G"^a" >log && + test_cmp log A-to-B-then-E-log +' + +test_expect_success 'log -S<pat> is not a regex, but -S<pat> --pickaxe-regex is' ' + git -C GS-plain log -S"a" >log && + test_cmp log A-to-B-then-E-log && + + git -C GS-plain log -S"[a]" >log && + test_must_be_empty log && + + git -C GS-plain log -S"[a]" --pickaxe-regex >log && + test_cmp log A-to-B-then-E-log && + + git -C GS-plain log -S"[b]" >log && + test_cmp log D-then-E-log && + + git -C GS-plain log -S"[b]" --pickaxe-regex >log && + test_cmp log C-to-D-then-E-log +' + test_expect_success 'setup log -[GS] binary & --text' ' - git checkout --orphan GS-binary-and-text && - git read-tree --empty && - printf "a\na\0a\n" >data.bin && - git add data.bin && - git commit -m "create binary file" data.bin && - printf "a\na\0a\n" >>data.bin && - git commit -m "modify binary file" data.bin && - git rm data.bin && - git commit -m "delete binary file" data.bin && - git log >full-log + test_create_repo GS-bin-txt && + test_commit -C GS-bin-txt --printf A data.bin "a\na\0a\n" && + test_commit -C GS-bin-txt --append --printf B data.bin "a\na\0a\n" && + test_commit -C GS-bin-txt C data.bin "" && + git -C GS-bin-txt log >full-log ' test_expect_success 'log -G ignores binary files' ' - git log -Ga >log && + git -C GS-bin-txt log -Ga >log && test_must_be_empty log ' test_expect_success 'log -G looks into binary files with -a' ' - git log -a -Ga >log && + git -C GS-bin-txt log -a -Ga >log && test_cmp log full-log ' test_expect_success 'log -G looks into binary files with textconv filter' ' - test_when_finished "rm .gitattributes" && - echo "* diff=bin" >.gitattributes && - git -c diff.bin.textconv=cat log -Ga >log && + test_when_finished "rm GS-bin-txt/.gitattributes" && + ( + cd GS-bin-txt && + echo "* diff=bin" >.gitattributes && + git -c diff.bin.textconv=cat log -Ga >../log + ) && test_cmp log full-log ' test_expect_success 'log -S looks into binary files' ' - git log -Sa >log && + git -C GS-bin-txt log -Sa >log && + test_cmp log full-log +' + +test_expect_success 'log -S --pickaxe-regex looks into binary files' ' + git -C GS-bin-txt log --pickaxe-regex -Sa >log && + test_cmp log full-log && + + git -C GS-bin-txt log --pickaxe-regex -S"[a]" >log && test_cmp log full-log ' diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index 2d1d7b5d19..560127cc07 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test log -L' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup (import history)' ' @@ -8,6 +11,28 @@ test_expect_success 'setup (import history)' ' git reset --hard ' +test_expect_success 'basic command line parsing' ' + # This may fail due to "no such path a.c in commit", or + # "-L is incompatible with pathspec", depending on the + # order the error is checked. Either is acceptable. + test_must_fail git log -L1,1:a.c -- a.c && + + # -L requires there is no pathspec + test_must_fail git log -L1,1:b.c -- b.c 2>error && + test_i18ngrep "cannot be used with pathspec" error && + + # This would fail because --follow wants a single path, but + # we may fail due to incompatibility between -L/--follow in + # the future. Either is acceptable. + test_must_fail git log -L1,1:b.c --follow && + test_must_fail git log --follow -L1,1:b.c && + + # This would fail because -L wants no pathspec, but + # we may fail due to incompatibility between -L/--follow in + # the future. Either is acceptable. + test_must_fail git log --follow -L1,1:b.c -- b.c +' + canned_test_1 () { test_expect_$1 "$2" " git log $2 >actual && diff --git a/t/t4211/history.export b/t/t4211/history.export index f9f41e211e..006972a1f2 100644 --- a/t/t4211/history.export +++ b/t/t4211/history.export @@ -316,7 +316,7 @@ long f(long x) return s; } -commit refs/heads/master +commit refs/heads/main mark :19 author Thomas Rast <trast@student.ethz.ch> 1362045024 +0100 committer Thomas Rast <trast@student.ethz.ch> 1362045024 +0100 diff --git a/t/t4214-log-graph-octopus.sh b/t/t4214-log-graph-octopus.sh index a080325098..f70c46bbbf 100755 --- a/t/t4214-log-graph-octopus.sh +++ b/t/t4214-log-graph-octopus.sh @@ -2,6 +2,9 @@ test_description='git log --graph of skewed left octopus merge.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-log-graph.sh @@ -17,7 +20,7 @@ test_cmp_colored_graph () { test_expect_success 'set up merge history' ' test_commit initial && for i in 1 2 3 4 ; do - git checkout master -b $i || return $? + git checkout main -b $i || return $? # Make tag name different from branch name, to avoid # ambiguity error when calling checkout. test_commit $i $i $i tag$i || return $? diff --git a/t/t4216-log-bloom.sh b/t/t4216-log-bloom.sh index 4bb9e9dbe2..50f206db55 100755 --- a/t/t4216-log-bloom.sh +++ b/t/t4216-log-bloom.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git log for a path with Bloom filters' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh GIT_TEST_COMMIT_GRAPH=0 @@ -21,7 +24,7 @@ test_expect_success 'setup test - repo, commits, commit graph, log outputs' ' test_commit c10 file_to_be_deleted && git checkout -b side HEAD~4 && test_commit side-1 file4 && - git checkout master && + git checkout main && git merge side && test_commit c11 file5 && mv file5 file5_renamed && @@ -30,6 +33,7 @@ test_expect_success 'setup test - repo, commits, commit graph, log outputs' ' rm file_to_be_deleted && git add . && git commit -m "file removed" && + git commit --allow-empty -m "empty" && git commit-graph write --reachable --changed-paths && test_oid_cache <<-EOF @@ -37,19 +41,20 @@ test_expect_success 'setup test - repo, commits, commit graph, log outputs' ' oid_version sha256:2 EOF ' + graph_read_expect () { - NUM_CHUNKS=5 + NUM_CHUNKS=6 cat >expect <<- EOF header: 43475048 1 $(test_oid oid_version) $NUM_CHUNKS 0 num_commits: $1 - chunks: oid_fanout oid_lookup commit_metadata bloom_indexes bloom_data + chunks: oid_fanout oid_lookup commit_metadata generation_data bloom_indexes bloom_data EOF test-tool read-graph >actual && test_cmp expect actual } test_expect_success 'commit-graph write wrote out the bloom chunks' ' - graph_read_expect 15 + graph_read_expect 16 ' # Turn off any inherited trace2 settings for this test. @@ -58,14 +63,14 @@ sane_unset GIT_TRACE2_PERF_BRIEF sane_unset GIT_TRACE2_CONFIG_PARAMS setup () { - rm "$TRASH_DIRECTORY/trace.perf" + rm -f "$TRASH_DIRECTORY/trace.perf" && git -c core.commitGraph=false log --pretty="format:%s" $1 >log_wo_bloom && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.perf" git -c core.commitGraph=true log --pretty="format:%s" $1 >log_w_bloom } test_bloom_filters_used () { log_args=$1 - bloom_trace_prefix="statistics:{\"filter_not_present\":0,\"maybe\"" + bloom_trace_prefix="statistics:{\"filter_not_present\":${2:-0},\"maybe\"" setup "$log_args" && grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" && test_cmp log_wo_bloom log_w_bloom && @@ -92,10 +97,12 @@ do "--topo-order" \ "--date-order" \ "--author-date-order" \ - "--ancestry-path side..master" + "--ancestry-path side..main" do test_expect_success "git log option: $option for path: $path" ' - test_bloom_filters_used "$option -- $path" + test_bloom_filters_used "$option -- $path" && + test_config commitgraph.readChangedPaths false && + test_bloom_filters_not_used "$option -- $path" ' done done @@ -139,8 +146,11 @@ test_expect_success 'setup - add commit-graph to the chain without Bloom filters test_line_count = 2 .git/objects/info/commit-graphs/commit-graph-chain ' -test_expect_success 'Do not use Bloom filters if the latest graph does not have Bloom filters.' ' - test_bloom_filters_not_used "-- A/B" +test_expect_success 'use Bloom filters even if the latest graph does not have Bloom filters' ' + # Ensure that the number of empty filters is equal to the number of + # filters in the latest graph layer to prove that they are loaded (and + # ignored). + test_bloom_filters_used "-- A/B" 3 ' test_expect_success 'setup - add commit-graph to the chain with Bloom filters' ' @@ -151,7 +161,7 @@ test_expect_success 'setup - add commit-graph to the chain with Bloom filters' ' test_bloom_filters_used_when_some_filters_are_missing () { log_args=$1 - bloom_trace_prefix="statistics:{\"filter_not_present\":3,\"maybe\":6,\"definitely_not\":8" + bloom_trace_prefix="statistics:{\"filter_not_present\":3,\"maybe\":6,\"definitely_not\":9" setup "$log_args" && grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" && test_cmp log_wo_bloom log_w_bloom @@ -169,31 +179,230 @@ test_expect_success 'persist filter settings' ' GIT_TEST_BLOOM_SETTINGS_NUM_HASHES=9 \ GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY=15 \ git commit-graph write --reachable --changed-paths && - grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15}" trace2.txt && + grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2.txt && GIT_TRACE2_EVENT="$(pwd)/trace2-auto.txt" \ GIT_TRACE2_EVENT_NESTING=5 \ git commit-graph write --reachable --changed-paths && - grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15}" trace2-auto.txt + grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2-auto.txt ' +test_max_changed_paths () { + grep "\"max_changed_paths\":$1" $2 +} + +test_filter_not_computed () { + grep "\"key\":\"filter-not-computed\",\"value\":\"$1\"" $2 +} + +test_filter_computed () { + grep "\"key\":\"filter-computed\",\"value\":\"$1\"" $2 +} + +test_filter_trunc_empty () { + grep "\"key\":\"filter-trunc-empty\",\"value\":\"$1\"" $2 +} + +test_filter_trunc_large () { + grep "\"key\":\"filter-trunc-large\",\"value\":\"$1\"" $2 +} + test_expect_success 'correctly report changes over limit' ' - git init 513changes && + git init limits && ( - cd 513changes && - for i in $(test_seq 1 513) + cd limits && + mkdir d && + mkdir d/e && + + for i in $(test_seq 1 2) do - echo $i >file$i.txt || return 1 + printf $i >d/file$i.txt && + printf $i >d/e/file$i.txt || return 1 done && - git add . && + + mkdir mode && + printf bash >mode/script.sh && + + mkdir foo && + touch foo/bar && + touch foo.txt && + + git add d foo foo.txt mode && git commit -m "files" && - git commit-graph write --reachable --changed-paths && - for i in $(test_seq 1 513) + + # Commit has 7 file and 4 directory adds + GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=10 \ + GIT_TRACE2_EVENT="$(pwd)/trace" \ + git commit-graph write --reachable --changed-paths && + test_max_changed_paths 10 trace && + test_filter_computed 1 trace && + test_filter_trunc_large 1 trace && + + for path in $(git ls-tree -r --name-only HEAD) + do + git -c commitGraph.readChangedPaths=false log \ + -- $path >expect && + git log -- $path >actual && + test_cmp expect actual || return 1 + done && + + # Make a variety of path changes + printf new1 >d/e/file1.txt && + printf new2 >d/file2.txt && + rm d/e/file2.txt && + rm -r foo && + printf text >foo && + mkdir f && + printf new1 >f/file1.txt && + + # including a mode-only change (counts as modified) + git update-index --chmod=+x mode/script.sh && + + git add foo d f && + git commit -m "complicated" && + + # start from scratch and rebuild + rm -f .git/objects/info/commit-graph && + GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=10 \ + GIT_TRACE2_EVENT="$(pwd)/trace-edit" \ + git commit-graph write --reachable --changed-paths && + test_max_changed_paths 10 trace-edit && + test_filter_computed 2 trace-edit && + test_filter_trunc_large 2 trace-edit && + + for path in $(git ls-tree -r --name-only HEAD) + do + git -c commitGraph.readChangedPaths=false log \ + -- $path >expect && + git log -- $path >actual && + test_cmp expect actual || return 1 + done && + + # start from scratch and rebuild + rm -f .git/objects/info/commit-graph && + GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS=11 \ + GIT_TRACE2_EVENT="$(pwd)/trace-update" \ + git commit-graph write --reachable --changed-paths && + test_max_changed_paths 11 trace-update && + test_filter_computed 2 trace-update && + test_filter_trunc_large 0 trace-update && + + for path in $(git ls-tree -r --name-only HEAD) do - git -c core.commitGraph=false log -- file$i.txt >expect && - git log -- file$i.txt >actual && + git -c commitGraph.readChangedPaths=false log \ + -- $path >expect && + git log -- $path >actual && test_cmp expect actual || return 1 done ) ' +test_expect_success 'correctly report commits with no changed paths' ' + git init empty && + test_when_finished "rm -fr empty" && + ( + cd empty && + + git commit --allow-empty -m "initial commit" && + + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable --changed-paths && + test_filter_computed 1 trace.event && + test_filter_not_computed 0 trace.event && + test_filter_trunc_empty 1 trace.event && + test_filter_trunc_large 0 trace.event + ) +' + +test_expect_success 'Bloom generation is limited by --max-new-filters' ' + ( + cd limits && + test_commit c2 filter && + test_commit c3 filter && + test_commit c4 no-filter && + + rm -f trace.event && + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable --split=replace \ + --changed-paths --max-new-filters=2 && + + test_filter_computed 2 trace.event && + test_filter_not_computed 3 trace.event && + test_filter_trunc_empty 0 trace.event && + test_filter_trunc_large 0 trace.event + ) +' + +test_expect_success 'Bloom generation backfills previously-skipped filters' ' + # Check specifying commitGraph.maxNewFilters over "git config" works. + test_config -C limits commitGraph.maxNewFilters 1 && + ( + cd limits && + + rm -f trace.event && + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable --changed-paths \ + --split=replace && + test_filter_computed 1 trace.event && + test_filter_not_computed 4 trace.event && + test_filter_trunc_empty 0 trace.event && + test_filter_trunc_large 0 trace.event + ) +' + +test_expect_success '--max-new-filters overrides configuration' ' + git init override && + test_when_finished "rm -fr override" && + test_config -C override commitGraph.maxNewFilters 2 && + ( + cd override && + test_commit one && + test_commit two && + + rm -f trace.event && + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable --changed-paths \ + --max-new-filters=1 && + test_filter_computed 1 trace.event && + test_filter_not_computed 1 trace.event && + test_filter_trunc_empty 0 trace.event && + test_filter_trunc_large 0 trace.event + ) +' + +test_expect_success 'Bloom generation backfills empty commits' ' + git init empty && + test_when_finished "rm -fr empty" && + ( + cd empty && + for i in $(test_seq 1 6) + do + git commit --allow-empty -m "$i" + done && + + # Generate Bloom filters for empty commits 1-6, two at a time. + for i in $(test_seq 1 3) + do + rm -f trace.event && + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable \ + --changed-paths --max-new-filters=2 && + test_filter_computed 2 trace.event && + test_filter_not_computed 4 trace.event && + test_filter_trunc_empty 2 trace.event && + test_filter_trunc_large 0 trace.event + done && + + # Finally, make sure that once all commits have filters, that + # none are subsequently recomputed. + rm -f trace.event && + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + git commit-graph write --reachable \ + --changed-paths --max-new-filters=2 && + test_filter_computed 0 trace.event && + test_filter_not_computed 6 trace.event && + test_filter_trunc_empty 0 trace.event && + test_filter_trunc_large 0 trace.event + ) +' + test_done diff --git a/t/t4253-am-keep-cr-dos.sh b/t/t4253-am-keep-cr-dos.sh index 6e1b73ec3a..0ee69d2a0c 100755 --- a/t/t4253-am-keep-cr-dos.sh +++ b/t/t4253-am-keep-cr-dos.sh @@ -6,6 +6,9 @@ test_description='git-am mbox with dos line ending. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Three patches which will be added as files with dos line ending. @@ -43,7 +46,7 @@ test_expect_success 'setup repository with dos files' ' test_expect_success 'am with dos files without --keep-cr' ' git checkout -b dosfiles initial && - git format-patch -k initial..master && + git format-patch -k initial..main && test_must_fail git am -k -3 000*.patch && git am --abort && rm -rf .git/rebase-apply 000*.patch @@ -51,23 +54,23 @@ test_expect_success 'am with dos files without --keep-cr' ' test_expect_success 'am with dos files with --keep-cr' ' git checkout -b dosfiles-keep-cr initial && - git format-patch -k --stdout initial..master >output && + git format-patch -k --stdout initial..main >output && git am --keep-cr -k -3 output && - git diff --exit-code master + git diff --exit-code main ' test_expect_success 'am with dos files config am.keepcr' ' git config am.keepcr 1 && git checkout -b dosfiles-conf-keepcr initial && - git format-patch -k --stdout initial..master >output && + git format-patch -k --stdout initial..main >output && git am -k -3 output && - git diff --exit-code master + git diff --exit-code main ' test_expect_success 'am with dos files config am.keepcr overridden by --no-keep-cr' ' git config am.keepcr 1 && git checkout -b dosfiles-conf-keepcr-override initial && - git format-patch -k initial..master && + git format-patch -k initial..main && test_must_fail git am -k -3 --no-keep-cr 000*.patch && git am --abort && rm -rf .git/rebase-apply 000*.patch @@ -75,14 +78,14 @@ test_expect_success 'am with dos files config am.keepcr overridden by --no-keep- test_expect_success 'am with dos files with --keep-cr continue' ' git checkout -b dosfiles-keep-cr-continue initial && - git format-patch -k initial..master && + git format-patch -k initial..main && append_cr <file1a >file && git commit -m "different patch" file && test_must_fail git am --keep-cr -k -3 000*.patch && append_cr <file2 >file && git add file && git am -3 --resolved && - git diff --exit-code master + git diff --exit-code main ' test_expect_success 'am with unix files config am.keepcr overridden by --no-keep-cr' ' @@ -90,9 +93,9 @@ test_expect_success 'am with unix files config am.keepcr overridden by --no-keep git checkout -b unixfiles-conf-keepcr-override initial && cp -f file1 file && git commit -m "line ending to unix" file && - git format-patch -k initial..master && + git format-patch -k initial..main && git am -k -3 --no-keep-cr 000*.patch && - git diff --exit-code -w master + git diff --exit-code -w main ' test_done diff --git a/t/t4254-am-corrupt.sh b/t/t4254-am-corrupt.sh index daf01c309d..54be7da161 100755 --- a/t/t4254-am-corrupt.sh +++ b/t/t4254-am-corrupt.sh @@ -60,7 +60,7 @@ test_expect_success 'try to apply corrupted patch' ' test_must_fail git -c advice.amWorkDir=false am bad-patch.diff 2>actual && echo "error: git diff header lacks filename information (line 4)" >expected && test_path_is_file f && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success "NUL in commit message's body" ' diff --git a/t/t4257-am-interactive.sh b/t/t4257-am-interactive.sh index 5344bd248a..aed8f4de3d 100755 --- a/t/t4257-am-interactive.sh +++ b/t/t4257-am-interactive.sh @@ -10,7 +10,7 @@ test_expect_success 'set up patches to apply' ' git format-patch --stdout -2 >mbox && git reset --hard unrelated && - test_commit conflict-master file master base + test_commit conflict-main file main base ' # Sanity check our setup. diff --git a/t/t4258-am-quoted-cr.sh b/t/t4258-am-quoted-cr.sh new file mode 100755 index 0000000000..201915b45a --- /dev/null +++ b/t/t4258-am-quoted-cr.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +test_description='test am --quoted-cr=<action>' + +. ./test-lib.sh + +DATA="$TEST_DIRECTORY/t4258" + +test_expect_success 'setup' ' + test_write_lines one two three >text && + test_commit one text && + test_write_lines one owt three >text && + test_commit two text +' + +test_expect_success 'am warn if quoted-cr is found' ' + git reset --hard one && + test_must_fail git am "$DATA/mbox" 2>err && + grep "quoted CRLF detected" err +' + +test_expect_success 'am --quoted-cr=strip' ' + test_might_fail git am --abort && + git reset --hard one && + git am --quoted-cr=strip "$DATA/mbox" && + git diff --exit-code HEAD two +' + +test_expect_success 'am with config mailinfo.quotedCr=strip' ' + test_might_fail git am --abort && + git reset --hard one && + test_config mailinfo.quotedCr strip && + git am "$DATA/mbox" && + git diff --exit-code HEAD two +' + +test_done diff --git a/t/t4258/mbox b/t/t4258/mbox new file mode 100644 index 0000000000..c62819f3d2 --- /dev/null +++ b/t/t4258/mbox @@ -0,0 +1,12 @@ +From: A U Thor <mail@example.com> +To: list@example.org +Subject: [PATCH v2] sample +Date: Mon, 3 Aug 2020 22:40:55 +0700 +Message-Id: <msg-id@example.com> +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: base64 + +VGhpcyBpcyBjb21taXQgbWVzc2FnZS4NCi0tLQ0KIHRleHQgfCAyICstDQogMSBmaWxlIGNoYW5n +ZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pDQoNCmRpZmYgLS1naXQgYS90ZXh0IGIv +dGV4dA0KaW5kZXggNTYyNmFiZi4uZjcxOWVmZCAxMDA2NDQNCi0tLSBhL3RleHQNCisrKyBiL3Rl +eHQNCkBAIC0xICsxIEBADQotb25lDQordHdvDQotLSANCjIuMzEuMQoK diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index 37655a237c..2c88d1c159 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -94,6 +94,16 @@ check_tar() { ' } +check_added() { + dir=$1 + path_in_fs=$2 + path_in_archive=$3 + + test_expect_success " validate extra file $path_in_archive" ' + diff -r $path_in_fs $dir/$path_in_archive + ' +} + test_expect_success 'setup' ' test_oid_cache <<-EOF obj sha1:19f9c8273ec45a8938e6999cb59b3ff66739902a @@ -101,25 +111,34 @@ test_expect_success 'setup' ' EOF ' -test_expect_success \ - 'populate workdir' \ - 'mkdir a && - echo simple textfile >a/a && - ten=0123456789 && hundred=$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten && - echo long filename >a/four$hundred && - mkdir a/bin && - test-tool genrandom "frotz" 500000 >a/bin/sh && - printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 && - printf "A not substituted O" >a/substfile2 && - if test_have_prereq SYMLINKS; then - ln -s a a/l1 - else - printf %s a > a/l1 - fi && - (p=long_path_to_a_file && cd a && - for depth in 1 2 3 4 5; do mkdir $p && cd $p; done && - echo text >file_with_long_path) && - (cd a && find .) | sort >a.lst' +test_expect_success 'populate workdir' ' + mkdir a && + echo simple textfile >a/a && + ten=0123456789 && + hundred="$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten" && + echo long filename >"a/four$hundred" && + mkdir a/bin && + test-tool genrandom "frotz" 500000 >a/bin/sh && + printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 && + printf "A not substituted O" >a/substfile2 && + if test_have_prereq SYMLINKS + then + ln -s a a/l1 + else + printf %s a >a/l1 + fi && + ( + p=long_path_to_a_file && + cd a && + for depth in 1 2 3 4 5 + do + mkdir $p && + cd $p + done && + echo text >file_with_long_path + ) && + (cd a && find .) | sort >a.lst +' test_expect_success \ 'add ignored file' \ @@ -137,18 +156,18 @@ test_expect_success 'setup export-subst' ' >a/substfile1 ' -test_expect_success \ - 'create bare clone' \ - 'git clone --bare . bare.git && - cp .git/info/attributes bare.git/info/attributes' +test_expect_success 'create bare clone' ' + git clone --bare . bare.git && + cp .git/info/attributes bare.git/info/attributes +' -test_expect_success \ - 'remove ignored file' \ - 'rm a/ignored' +test_expect_success 'remove ignored file' ' + rm a/ignored +' -test_expect_success \ - 'git archive' \ - 'git archive HEAD >b.tar' +test_expect_success 'git archive' ' + git archive HEAD >b.tar +' check_tar b @@ -164,27 +183,48 @@ test_expect_success 'git-archive --prefix=olde-' ' check_tar with_olde-prefix olde- +test_expect_success 'git archive --add-file' ' + echo untracked >untracked && + git archive --add-file=untracked HEAD >with_untracked.tar +' + +check_tar with_untracked +check_added with_untracked untracked untracked + +test_expect_success 'git archive --add-file twice' ' + echo untracked >untracked && + git archive --prefix=one/ --add-file=untracked \ + --prefix=two/ --add-file=untracked \ + --prefix= HEAD >with_untracked2.tar +' + +check_tar with_untracked2 +check_added with_untracked2 untracked one/untracked +check_added with_untracked2 untracked two/untracked + test_expect_success 'git archive on large files' ' - test_config core.bigfilethreshold 1 && - git archive HEAD >b3.tar && - test_cmp_bin b.tar b3.tar + test_config core.bigfilethreshold 1 && + git archive HEAD >b3.tar && + test_cmp_bin b.tar b3.tar ' -test_expect_success \ - 'git archive in a bare repo' \ - '(cd bare.git && git archive HEAD) >b3.tar' +test_expect_success 'git archive in a bare repo' ' + git --git-dir bare.git archive HEAD >b3.tar +' -test_expect_success \ - 'git archive vs. the same in a bare repo' \ - 'test_cmp_bin b.tar b3.tar' +test_expect_success 'git archive vs. the same in a bare repo' ' + test_cmp_bin b.tar b3.tar +' -test_expect_success 'git archive with --output' \ - 'git archive --output=b4.tar HEAD && - test_cmp_bin b.tar b4.tar' +test_expect_success 'git archive with --output' ' + git archive --output=b4.tar HEAD && + test_cmp_bin b.tar b4.tar +' -test_expect_success 'git archive --remote' \ - 'git archive --remote=. HEAD >b5.tar && - test_cmp_bin b.tar b5.tar' +test_expect_success 'git archive --remote' ' + git archive --remote=. HEAD >b5.tar && + test_cmp_bin b.tar b5.tar +' test_expect_success 'git archive --remote with configured remote' ' git config remote.foo.url . && @@ -195,18 +235,19 @@ test_expect_success 'git archive --remote with configured remote' ' test_cmp_bin b.tar b5-nick.tar ' -test_expect_success \ - 'validate file modification time' \ - 'mkdir extract && - "$TAR" xf b.tar -C extract a/a && - test-tool chmtime --get extract/a/a >b.mtime && - echo "1117231200" >expected.mtime && - test_cmp expected.mtime b.mtime' +test_expect_success 'validate file modification time' ' + mkdir extract && + "$TAR" xf b.tar -C extract a/a && + test-tool chmtime --get extract/a/a >b.mtime && + echo "1117231200" >expected.mtime && + test_cmp expected.mtime b.mtime +' -test_expect_success \ - 'git get-tar-commit-id' \ - 'git get-tar-commit-id <b.tar >b.commitid && - test_cmp .git/$(git symbolic-ref HEAD) b.commitid' +test_expect_success 'git get-tar-commit-id' ' + git get-tar-commit-id <b.tar >actual && + git rev-parse HEAD >expect && + test_cmp expect actual +' test_expect_success 'git archive with --output, override inferred format' ' git archive --format=tar --output=d4.zip HEAD && @@ -402,15 +443,33 @@ test_expect_success TAR_HUGE,LONG_IS_64BIT 'system tar can read our huge size' ' test_cmp expect actual ' -test_expect_success TIME_IS_64BIT 'set up repository with far-future commit' ' +test_expect_success TIME_IS_64BIT 'set up repository with far-future (2^34 - 1) commit' ' + rm -f .git/index && + echo foo >file && + git add file && + GIT_COMMITTER_DATE="@17179869183 +0000" \ + git commit -m "tempori parendum" +' + +test_expect_success TIME_IS_64BIT 'generate tar with far-future mtime' ' + git archive HEAD >future.tar +' + +test_expect_success TAR_HUGE,TIME_IS_64BIT,TIME_T_IS_64BIT 'system tar can read our future mtime' ' + echo 2514 >expect && + tar_info future.tar | cut -d" " -f2 >actual && + test_cmp expect actual +' + +test_expect_success TIME_IS_64BIT 'set up repository with far-far-future (2^36 + 1) commit' ' rm -f .git/index && echo content >file && git add file && - GIT_COMMITTER_DATE="@68719476737 +0000" \ + GIT_TEST_COMMIT_GRAPH=0 GIT_COMMITTER_DATE="@68719476737 +0000" \ git commit -m "tempori parendum" ' -test_expect_success TIME_IS_64BIT 'generate tar with future mtime' ' +test_expect_success TIME_IS_64BIT 'generate tar with far-far-future mtime' ' git archive HEAD >future.tar ' diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh index e9aa97117a..712ae52299 100755 --- a/t/t5001-archive-attr.sh +++ b/t/t5001-archive-attr.sh @@ -128,4 +128,18 @@ test_expect_success 'export-subst' ' test_cmp substfile2 archive/substfile2 ' +test_expect_success 'export-subst expands %(describe) once' ' + echo "\$Format:%(describe)\$" >substfile3 && + echo "\$Format:%(describe)\$" >>substfile3 && + echo "\$Format:%(describe)${LF}%(describe)\$" >substfile4 && + git add substfile[34] && + git commit -m export-subst-describe && + git tag -m export-subst-describe export-subst-describe && + git archive HEAD >archive-describe.tar && + extract_tar_to_dir archive-describe && + desc=$(git describe) && + grep -F "$desc" archive-describe/substfile[34] >substituted && + test_line_count = 1 substituted +' + test_done diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh index 3b76d2eb65..1e6d18b140 100755 --- a/t/t5003-archive-zip.sh +++ b/t/t5003-archive-zip.sh @@ -72,6 +72,16 @@ check_zip() { " } +check_added() { + dir=$1 + path_in_fs=$2 + path_in_archive=$3 + + test_expect_success UNZIP " validate extra file $path_in_archive" ' + diff -r $path_in_fs $dir/$path_in_archive + ' +} + test_expect_success \ 'populate workdir' \ 'mkdir a && @@ -188,4 +198,22 @@ test_expect_success 'git archive --format=zip on large files' ' check_zip large-compressed +test_expect_success 'git archive --format=zip --add-file' ' + echo untracked >untracked && + git archive --format=zip --add-file=untracked HEAD >with_untracked.zip +' + +check_zip with_untracked +check_added with_untracked untracked untracked + +test_expect_success 'git archive --format=zip --add-file twice' ' + echo untracked >untracked && + git archive --format=zip --prefix=one/ --add-file=untracked \ + --prefix=two/ --add-file=untracked \ + --prefix= HEAD >with_untracked2.zip +' +check_zip with_untracked2 +check_added with_untracked2 untracked one/untracked +check_added with_untracked2 untracked two/untracked + test_done diff --git a/t/t5004-archive-corner-cases.sh b/t/t5004-archive-corner-cases.sh index 3e7b23cb32..2d32d0ed12 100755 --- a/t/t5004-archive-corner-cases.sh +++ b/t/t5004-archive-corner-cases.sh @@ -153,7 +153,8 @@ test_expect_success ZIPINFO 'zip archive with many entries' ' # check the number of entries in the ZIP file directory expr 65536 + 256 >expect && - "$ZIPINFO" many.zip | head -2 | sed -n "2s/.* //p" >actual && + "$ZIPINFO" -h many.zip >zipinfo && + sed -n "2s/.* //p" <zipinfo >actual && test_cmp expect actual ' diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index 147e616533..141b29f031 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -228,4 +228,44 @@ test_expect_success 'mailinfo handles unusual header whitespace' ' test_cmp expect actual ' +check_quoted_cr_mail () { + mail="$1" && shift && + git mailinfo -u "$@" "$mail.msg" "$mail.patch" \ + <"$mail" >"$mail.info" 2>"$mail.err" && + test_cmp "$mail-expected.msg" "$mail.msg" && + test_cmp "$mail-expected.patch" "$mail.patch" && + test_cmp "$DATA/quoted-cr-info" "$mail.info" +} + +test_expect_success 'split base64 email with quoted-cr' ' + mkdir quoted-cr && + git mailsplit -oquoted-cr "$DATA/quoted-cr.mbox" >quoted-cr/last && + test $(cat quoted-cr/last) = 2 +' + +test_expect_success 'mailinfo warn CR in base64 encoded email' ' + sed -e "s/%%$//" -e "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-msg" \ + >quoted-cr/0001-expected.msg && + sed "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-msg" \ + >quoted-cr/0002-expected.msg && + sed -e "s/%%$//" -e "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-patch" \ + >quoted-cr/0001-expected.patch && + sed "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-patch" \ + >quoted-cr/0002-expected.patch && + check_quoted_cr_mail quoted-cr/0001 && + test_must_be_empty quoted-cr/0001.err && + check_quoted_cr_mail quoted-cr/0002 && + grep "quoted CRLF detected" quoted-cr/0002.err && + check_quoted_cr_mail quoted-cr/0001 --quoted-cr=nowarn && + test_must_be_empty quoted-cr/0001.err && + check_quoted_cr_mail quoted-cr/0002 --quoted-cr=nowarn && + test_must_be_empty quoted-cr/0002.err && + cp quoted-cr/0001-expected.msg quoted-cr/0002-expected.msg && + cp quoted-cr/0001-expected.patch quoted-cr/0002-expected.patch && + check_quoted_cr_mail quoted-cr/0001 --quoted-cr=strip && + test_must_be_empty quoted-cr/0001.err && + check_quoted_cr_mail quoted-cr/0002 --quoted-cr=strip && + test_must_be_empty quoted-cr/0002.err +' + test_done diff --git a/t/t5100/quoted-cr-info b/t/t5100/quoted-cr-info new file mode 100644 index 0000000000..dab2228b70 --- /dev/null +++ b/t/t5100/quoted-cr-info @@ -0,0 +1,5 @@ +Author: A U Thor +Email: mail@example.com +Subject: sample +Date: Mon, 3 Aug 2020 22:40:55 +0700 + diff --git a/t/t5100/quoted-cr-msg b/t/t5100/quoted-cr-msg new file mode 100644 index 0000000000..89b05a0784 --- /dev/null +++ b/t/t5100/quoted-cr-msg @@ -0,0 +1,2 @@ +On different distro, %%pytest is suffixed with different patterns.%% +%% diff --git a/t/t5100/quoted-cr-patch b/t/t5100/quoted-cr-patch new file mode 100644 index 0000000000..65b13eeef7 --- /dev/null +++ b/t/t5100/quoted-cr-patch @@ -0,0 +1,22 @@ +---%% + configure | 2 +-%% + 1 file changed, 1 insertion(+), 1 deletion(-)%% +%% +diff --git a/configure b/configure%% +index db3538b3..f7c1c095 100755%% +--- a/configure%% ++++ b/configure%% +@@ -814,7 +814,7 @@ if [ $have_python3 -eq 1 ]; then%% + printf "%%Checking for python3 pytest (>= 3.0)... "%% + conf=$(mktemp)%% + printf "[pytest]\nminversion=3.0\n" > $conf%% +- if pytest-3 -c $conf --version >/dev/null 2>&1; then%% ++ if "$python" -m pytest -c $conf --version >/dev/null 2>&1; then%% + printf "Yes.\n"%% + have_python3_pytest=1%% + else%% +-- %% +2.28.0%% +_______________________________________________ +example mailing list -- list@example.org +To unsubscribe send an email to list-leave@example.org diff --git a/t/t5100/quoted-cr.mbox b/t/t5100/quoted-cr.mbox new file mode 100644 index 0000000000..909021bb7a --- /dev/null +++ b/t/t5100/quoted-cr.mbox @@ -0,0 +1,47 @@ +From nobody Mon Sep 17 00:00:00 2001 +From: A U Thor <mail@example.com> +To: list@example.org +Subject: [PATCH v2] sample +Date: Mon, 3 Aug 2020 22:40:55 +0700 +Message-Id: <msg-id@example.com> +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: base64 + +T24gZGlmZmVyZW50IGRpc3RybywgDXB5dGVzdCBpcyBzdWZmaXhlZCB3aXRoIGRpZmZlcmVudCBw +YXR0ZXJucy4KCi0tLQogY29uZmlndXJlIHwgMiArLQogMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0 +aW9uKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJl +CmluZGV4IGRiMzUzOGIzLi5mN2MxYzA5NSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2Nv +bmZpZ3VyZQpAQCAtODE0LDcgKzgxNCw3IEBAIGlmIFsgJGhhdmVfcHl0aG9uMyAtZXEgMSBdOyB0 +aGVuCiAgICAgcHJpbnRmICINQ2hlY2tpbmcgZm9yIHB5dGhvbjMgcHl0ZXN0ICg+PSAzLjApLi4u +ICIKICAgICBjb25mPSQobWt0ZW1wKQogICAgIHByaW50ZiAiW3B5dGVzdF1cbm1pbnZlcnNpb249 +My4wXG4iID4gJGNvbmYKLSAgICBpZiBweXRlc3QtMyAtYyAkY29uZiAtLXZlcnNpb24gPi9kZXYv +bnVsbCAyPiYxOyB0aGVuCisgICAgaWYgIiRweXRob24iIC1tIHB5dGVzdCAtYyAkY29uZiAtLXZl +cnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIHByaW50ZiAiWWVzLlxuIgogICAg +ICAgICBoYXZlX3B5dGhvbjNfcHl0ZXN0PTEKICAgICBlbHNlCi0tIAoyLjI4LjAKX19fX19fX19f +X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZXhhbXBsZSBtYWlsaW5nIGxp +c3QgLS0gbGlzdEBleGFtcGxlLm9yZwpUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIGxp +c3QtbGVhdmVAZXhhbXBsZS5vcmcK + +From nobody Mon Sep 17 00:00:00 2001 +From: A U Thor <mail@example.com> +To: list@example.org +Subject: [PATCH v2] sample +Date: Mon, 3 Aug 2020 22:40:55 +0700 +Message-Id: <msg-id2@example.com> +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: base64 + +T24gZGlmZmVyZW50IGRpc3RybywgDXB5dGVzdCBpcyBzdWZmaXhlZCB3aXRoIGRpZmZlcmVudCBw +YXR0ZXJucy4NCg0KLS0tDQogY29uZmlndXJlIHwgMiArLQ0KIDEgZmlsZSBjaGFuZ2VkLCAxIGlu +c2VydGlvbigrKSwgMSBkZWxldGlvbigtKQ0KDQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29u +ZmlndXJlDQppbmRleCBkYjM1MzhiMy4uZjdjMWMwOTUgMTAwNzU1DQotLS0gYS9jb25maWd1cmUN +CisrKyBiL2NvbmZpZ3VyZQ0KQEAgLTgxNCw3ICs4MTQsNyBAQCBpZiBbICRoYXZlX3B5dGhvbjMg +LWVxIDEgXTsgdGhlbg0KICAgICBwcmludGYgIg1DaGVja2luZyBmb3IgcHl0aG9uMyBweXRlc3Qg +KD49IDMuMCkuLi4gIg0KICAgICBjb25mPSQobWt0ZW1wKQ0KICAgICBwcmludGYgIltweXRlc3Rd +XG5taW52ZXJzaW9uPTMuMFxuIiA+ICRjb25mDQotICAgIGlmIHB5dGVzdC0zIC1jICRjb25mIC0t +dmVyc2lvbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4NCisgICAgaWYgIiRweXRob24iIC1tIHB5dGVz +dCAtYyAkY29uZiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuDQogICAgICAgICBwcmlu +dGYgIlllcy5cbiINCiAgICAgICAgIGhhdmVfcHl0aG9uM19weXRlc3Q9MQ0KICAgICBlbHNlDQot +LSANCjIuMjguMA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f +X18KZXhhbXBsZSBtYWlsaW5nIGxpc3QgLS0gbGlzdEBleGFtcGxlLm9yZwpUbyB1bnN1YnNjcmli +ZSBzZW5kIGFuIGVtYWlsIHRvIGxpc3QtbGVhdmVAZXhhbXBsZS5vcmcK diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh index c1811ea0f4..cb67bac1c4 100755 --- a/t/t5150-request-pull.sh +++ b/t/t5150-request-pull.sh @@ -2,6 +2,9 @@ test_description='Test workflows involving pull request.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq PERL @@ -31,13 +34,13 @@ test_expect_success 'setup' ' test_tick && git commit -m "\"Thirty days\", a reminder of month lengths" && git tag -m "version 1" -a initial && - git push --tags origin master + git push --tags origin main ) && ( cd local && git remote add upstream "$trash_url/upstream.git" && git fetch upstream && - git pull upstream master && + git pull upstream main && cat <<-\EOT >>mnemonic.txt && Of twyecescore-eightt is but eine, And all the remnante be thrycescore-eine. @@ -59,7 +62,7 @@ test_expect_success 'setup' ' git commit -a -m "Adapt to use modern, simpler English But keep the old version, too, in case some people prefer it." && - git checkout master + git checkout main ) ' @@ -129,7 +132,7 @@ test_expect_success 'pull request when forgot to push' ' ( cd local && git checkout initial && - git merge --ff-only master && + git merge --ff-only main && test_must_fail git request-pull initial "$downstream_url" \ 2>../err ) && @@ -145,9 +148,9 @@ test_expect_success 'pull request after push' ' ( cd local && git checkout initial && - git merge --ff-only master && - git push origin master:for-upstream && - git request-pull initial origin master:for-upstream >../request + git merge --ff-only main && + git push origin main:for-upstream && + git request-pull initial origin main:for-upstream >../request ) && sed -nf read-request.sed <request >digest && { @@ -172,9 +175,9 @@ test_expect_success 'request asks HEAD to be pulled' ' ( cd local && git checkout initial && - git merge --ff-only master && - git push --tags origin master simplify && - git push origin master:for-upstream && + git merge --ff-only main && + git push --tags origin main simplify && + git push origin main:for-upstream && git request-pull initial "$downstream_url" >../request ) && sed -nf read-request.sed <request >digest && @@ -215,19 +218,19 @@ test_expect_success 'pull request format' ' ( cd local && git checkout initial && - git merge --ff-only master && + git merge --ff-only main && git push origin tags/full && git request-pull initial "$downstream_url" tags/full >../request ) && <request sed -nf fuzz.sed >request.fuzzy && - test_i18ncmp expect request.fuzzy && + test_cmp expect request.fuzzy && ( cd local && git request-pull initial "$downstream_url" tags/full:refs/tags/full ) >request && sed -nf fuzz.sed <request >request.fuzzy && - test_i18ncmp expect request.fuzzy && + test_cmp expect request.fuzzy && ( cd local && @@ -243,9 +246,9 @@ test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' ' OPTIONS_KEEPDASHDASH=Yes && export OPTIONS_KEEPDASHDASH && git checkout initial && - git merge --ff-only master && - git push origin master:for-upstream && - git request-pull -- initial "$downstream_url" master:for-upstream >../request + git merge --ff-only main && + git push origin main:for-upstream && + git request-pull -- initial "$downstream_url" main:for-upstream >../request ) ' @@ -257,7 +260,7 @@ test_expect_success 'request-pull quotes regex metacharacters properly' ' ( cd local && git checkout initial && - git merge --ff-only master && + git merge --ff-only main && git tag -mrelease v2.0 && git push origin refs/tags/v2.0:refs/tags/v2-0 && test_must_fail git request-pull initial "$downstream_url" tags/v2.0 \ @@ -275,7 +278,7 @@ test_expect_success 'pull request with mismatched object' ' ( cd local && git checkout initial && - git merge --ff-only master && + git merge --ff-only main && git push origin HEAD:refs/tags/full && test_must_fail git request-pull initial "$downstream_url" tags/full \ 2>../err @@ -292,7 +295,7 @@ test_expect_success 'pull request with stale object' ' ( cd local && git checkout initial && - git merge --ff-only master && + git merge --ff-only main && git push origin refs/tags/full && git tag -f -m"Thirty-one days" full && test_must_fail git request-pull initial "$downstream_url" tags/full \ diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 392201cabd..5c5e53f0be 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -8,125 +8,91 @@ test_description='git pack-object ' . ./test-lib.sh -TRASH=$(pwd) - -test_expect_success \ - 'setup' \ - 'rm -f .git/index* && - perl -e "print \"a\" x 4096;" > a && - perl -e "print \"b\" x 4096;" > b && - perl -e "print \"c\" x 4096;" > c && - test-tool genrandom "seed a" 2097152 > a_big && - test-tool genrandom "seed b" 2097152 > b_big && - git update-index --add a a_big b b_big c && - cat c >d && echo foo >>d && git update-index --add d && - tree=$(git write-tree) && - commit=$(git commit-tree $tree </dev/null) && { - echo $tree && - echo $commit && - git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/" - } >obj-list && { - git diff-tree --root -p $commit && - while read object - do - t=$(git cat-file -t $object) && - git cat-file $t $object || return 1 - done <obj-list - } >expect' - -test_expect_success \ - 'pack without delta' \ - 'packname_1=$(git pack-objects --window=0 test-1 <obj-list)' - -test_expect_success \ - 'pack-objects with bogus arguments' \ - 'test_must_fail git pack-objects --window=0 test-1 blah blah <obj-list' - -rm -fr .git2 -mkdir .git2 - -test_expect_success \ - 'unpack without delta' \ - "GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - git init && - git unpack-objects -n <test-1-${packname_1}.pack && - git unpack-objects <test-1-${packname_1}.pack" - -unset GIT_OBJECT_DIRECTORY -cd "$TRASH/.git2" +test_expect_success 'setup' ' + rm -f .git/index* && + perl -e "print \"a\" x 4096;" >a && + perl -e "print \"b\" x 4096;" >b && + perl -e "print \"c\" x 4096;" >c && + test-tool genrandom "seed a" 2097152 >a_big && + test-tool genrandom "seed b" 2097152 >b_big && + git update-index --add a a_big b b_big c && + cat c >d && echo foo >>d && git update-index --add d && + tree=$(git write-tree) && + commit=$(git commit-tree $tree </dev/null) && + { + echo $tree && + echo $commit && + git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/" + } >obj-list && + { + git diff-tree --root -p $commit && + while read object + do + t=$(git cat-file -t $object) && + git cat-file $t $object || return 1 + done <obj-list + } >expect +' -test_expect_success \ - 'check unpack without delta' \ - '(cd ../.git && find objects -type f -print) | - while read path - do - cmp $path ../.git/$path || { - echo $path differs. - return 1 - } - done' -cd "$TRASH" +# usage: check_deltas <stderr_from_pack_objects> <cmp_op> <nr_deltas> +# e.g.: check_deltas stderr -gt 0 +check_deltas() { + deltas=$(perl -lne '/delta (\d+)/ and print $1' "$1") && + shift && + if ! test "$deltas" "$@" + then + echo >&2 "unexpected number of deltas (compared $delta $*)" + return 1 + fi +} + +test_expect_success 'pack without delta' ' + packname_1=$(git pack-objects --progress --window=0 test-1 \ + <obj-list 2>stderr) && + check_deltas stderr = 0 +' -test_expect_success \ - 'pack with REF_DELTA' \ - 'pwd && - packname_2=$(git pack-objects test-2 <obj-list)' +test_expect_success 'pack-objects with bogus arguments' ' + test_must_fail git pack-objects --window=0 test-1 blah blah <obj-list +' -rm -fr .git2 -mkdir .git2 +check_unpack () { + test_when_finished "rm -rf git2" && + git init --bare git2 && + git -C git2 unpack-objects -n <"$1".pack && + git -C git2 unpack-objects <"$1".pack && + (cd .git && find objects -type f -print) | + while read path + do + cmp git2/$path .git/$path || { + echo $path differs. + return 1 + } + done +} + +test_expect_success 'unpack without delta' ' + check_unpack test-1-${packname_1} +' -test_expect_success \ - 'unpack with REF_DELTA' \ - 'GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - git init && - git unpack-objects -n <test-2-${packname_2}.pack && - git unpack-objects <test-2-${packname_2}.pack' - -unset GIT_OBJECT_DIRECTORY -cd "$TRASH/.git2" -test_expect_success \ - 'check unpack with REF_DELTA' \ - '(cd ../.git && find objects -type f -print) | - while read path - do - cmp $path ../.git/$path || { - echo $path differs. - return 1 - } - done' -cd "$TRASH" +test_expect_success 'pack with REF_DELTA' ' + packname_2=$(git pack-objects --progress test-2 <obj-list 2>stderr) && + check_deltas stderr -gt 0 +' -test_expect_success \ - 'pack with OFS_DELTA' \ - 'pwd && - packname_3=$(git pack-objects --delta-base-offset test-3 <obj-list)' +test_expect_success 'unpack with REF_DELTA' ' + check_unpack test-2-${packname_2} +' -rm -fr .git2 -mkdir .git2 +test_expect_success 'pack with OFS_DELTA' ' + packname_3=$(git pack-objects --progress --delta-base-offset test-3 \ + <obj-list 2>stderr) && + check_deltas stderr -gt 0 +' -test_expect_success \ - 'unpack with OFS_DELTA' \ - 'GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - git init && - git unpack-objects -n <test-3-${packname_3}.pack && - git unpack-objects <test-3-${packname_3}.pack' - -unset GIT_OBJECT_DIRECTORY -cd "$TRASH/.git2" -test_expect_success \ - 'check unpack with OFS_DELTA' \ - '(cd ../.git && find objects -type f -print) | - while read path - do - cmp $path ../.git/$path || { - echo $path differs. - return 1 - } - done' -cd "$TRASH" +test_expect_success 'unpack with OFS_DELTA' ' + check_unpack test-3-${packname_3} +' test_expect_success 'compare delta flavors' ' perl -e '\'' @@ -135,55 +101,33 @@ test_expect_success 'compare delta flavors' ' '\'' test-2-$packname_2.pack test-3-$packname_3.pack ' -rm -fr .git2 -mkdir .git2 +check_use_objects () { + test_when_finished "rm -rf git2" && + git init --bare git2 && + cp "$1".pack "$1".idx git2/objects/pack && + ( + cd git2 && + git diff-tree --root -p $commit && + while read object + do + t=$(git cat-file -t $object) && + git cat-file $t $object || exit 1 + done + ) <obj-list >current && + cmp expect current +} -test_expect_success \ - 'use packed objects' \ - 'GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - git init && - cp test-1-${packname_1}.pack test-1-${packname_1}.idx .git2/objects/pack && { - git diff-tree --root -p $commit && - while read object - do - t=$(git cat-file -t $object) && - git cat-file $t $object || return 1 - done <obj-list - } >current && - cmp expect current' +test_expect_success 'use packed objects' ' + check_use_objects test-1-${packname_1} +' -test_expect_success \ - 'use packed deltified (REF_DELTA) objects' \ - 'GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - rm -f .git2/objects/pack/test-* && - cp test-2-${packname_2}.pack test-2-${packname_2}.idx .git2/objects/pack && { - git diff-tree --root -p $commit && - while read object - do - t=$(git cat-file -t $object) && - git cat-file $t $object || return 1 - done <obj-list - } >current && - cmp expect current' +test_expect_success 'use packed deltified (REF_DELTA) objects' ' + check_use_objects test-2-${packname_2} +' -test_expect_success \ - 'use packed deltified (OFS_DELTA) objects' \ - 'GIT_OBJECT_DIRECTORY=.git2/objects && - export GIT_OBJECT_DIRECTORY && - rm -f .git2/objects/pack/test-* && - cp test-3-${packname_3}.pack test-3-${packname_3}.idx .git2/objects/pack && { - git diff-tree --root -p $commit && - while read object - do - t=$(git cat-file -t $object) && - git cat-file $t $object || return 1 - done <obj-list - } >current && - cmp expect current' - -unset GIT_OBJECT_DIRECTORY +test_expect_success 'use packed deltified (OFS_DELTA) objects' ' + check_use_objects test-3-${packname_3} +' test_expect_success 'survive missing objects/pack directory' ' ( @@ -427,7 +371,8 @@ test_expect_success 'index-pack --strict <pack> works in non-repo' ' test_path_is_file foo.idx ' -test_expect_success !PTHREADS,C_LOCALE_OUTPUT 'index-pack --threads=N or pack.threads=N warns when no pthreads' ' +test_expect_success !PTHREADS,!FAIL_PREREQS \ + 'index-pack --threads=N or pack.threads=N warns when no pthreads' ' test_must_fail git index-pack --threads=2 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && @@ -445,7 +390,8 @@ test_expect_success !PTHREADS,C_LOCALE_OUTPUT 'index-pack --threads=N or pack.th grep -F "no threads support, ignoring pack.threads" err ' -test_expect_success !PTHREADS,C_LOCALE_OUTPUT 'pack-objects --threads=N or pack.threads=N warns when no pthreads' ' +test_expect_success !PTHREADS,!FAIL_PREREQS \ + 'pack-objects --threads=N or pack.threads=N warns when no pthreads' ' git pack-objects --threads=2 --stdout --all </dev/null >/dev/null 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && @@ -532,4 +478,144 @@ test_expect_success 'prefetch objects' ' test_line_count = 1 donelines ' +test_expect_success 'setup for --stdin-packs tests' ' + git init stdin-packs && + ( + cd stdin-packs && + + test_commit A && + test_commit B && + test_commit C && + + for id in A B C + do + git pack-objects .git/objects/pack/pack-$id \ + --incremental --revs <<-EOF + refs/tags/$id + EOF + done && + + ls -la .git/objects/pack + ) +' + +test_expect_success '--stdin-packs with excluded packs' ' + ( + cd stdin-packs && + + PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" && + PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" && + PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" && + + git pack-objects test --stdin-packs <<-EOF && + $PACK_A + ^$PACK_B + $PACK_C + EOF + + ( + git show-index <$(ls .git/objects/pack/pack-A-*.idx) && + git show-index <$(ls .git/objects/pack/pack-C-*.idx) + ) >expect.raw && + git show-index <$(ls test-*.idx) >actual.raw && + + cut -d" " -f2 <expect.raw | sort >expect && + cut -d" " -f2 <actual.raw | sort >actual && + test_cmp expect actual + ) +' + +test_expect_success '--stdin-packs is incompatible with --filter' ' + ( + cd stdin-packs && + test_must_fail git pack-objects --stdin-packs --stdout \ + --filter=blob:none </dev/null 2>err && + test_i18ngrep "cannot use --filter with --stdin-packs" err + ) +' + +test_expect_success '--stdin-packs is incompatible with --revs' ' + ( + cd stdin-packs && + test_must_fail git pack-objects --stdin-packs --revs out \ + </dev/null 2>err && + test_i18ngrep "cannot use internal rev list with --stdin-packs" err + ) +' + +test_expect_success '--stdin-packs with loose objects' ' + ( + cd stdin-packs && + + PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" && + PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" && + PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" && + + test_commit D && # loose + + git pack-objects test2 --stdin-packs --unpacked <<-EOF && + $PACK_A + ^$PACK_B + $PACK_C + EOF + + ( + git show-index <$(ls .git/objects/pack/pack-A-*.idx) && + git show-index <$(ls .git/objects/pack/pack-C-*.idx) && + git rev-list --objects --no-object-names \ + refs/tags/C..refs/tags/D + + ) >expect.raw && + ls -la . && + git show-index <$(ls test2-*.idx) >actual.raw && + + cut -d" " -f2 <expect.raw | sort >expect && + cut -d" " -f2 <actual.raw | sort >actual && + test_cmp expect actual + ) +' + +test_expect_success '--stdin-packs with broken links' ' + ( + cd stdin-packs && + + # make an unreachable object with a bogus parent + git cat-file -p HEAD >commit && + sed "s/$(git rev-parse HEAD^)/$(test_oid zero)/" <commit | + git hash-object -w -t commit --stdin >in && + + git pack-objects .git/objects/pack/pack-D <in && + + PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" && + PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" && + PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" && + PACK_D="$(basename .git/objects/pack/pack-D-*.pack)" && + + git pack-objects test3 --stdin-packs --unpacked <<-EOF && + $PACK_A + ^$PACK_B + $PACK_C + $PACK_D + EOF + + ( + git show-index <$(ls .git/objects/pack/pack-A-*.idx) && + git show-index <$(ls .git/objects/pack/pack-C-*.idx) && + git show-index <$(ls .git/objects/pack/pack-D-*.idx) && + git rev-list --objects --no-object-names \ + refs/tags/C..refs/tags/D + ) >expect.raw && + git show-index <$(ls test3-*.idx) >actual.raw && + + cut -d" " -f2 <expect.raw | sort >expect && + cut -d" " -f2 <actual.raw | sort >actual && + test_cmp expect actual + ) +' + +test_expect_success 'negative window clamps to 0' ' + git pack-objects --progress --window=-1 neg-window <obj-list 2>stderr && + check_deltas stderr = 0 +' + test_done diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh index c92e553a2f..7c9d687367 100755 --- a/t/t5302-pack-index.sh +++ b/t/t5302-pack-index.sh @@ -277,4 +277,11 @@ test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in grep "^warning:.* expected .tagger. line" err ' +test_expect_success 'index-pack -v --stdin produces progress for both phases' ' + pack=$(git pack-objects --all pack </dev/null) && + GIT_PROGRESS_DELAY=0 git index-pack -v --stdin <pack-$pack.pack 2>err && + test_i18ngrep "Receiving objects" err && + test_i18ngrep "Resolving deltas" err +' + test_done diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index df60f18fb8..7cabb85ca6 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -4,6 +4,9 @@ # test_description='prune' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh day=$((60*60*24)) @@ -19,30 +22,25 @@ add_blob() { } test_expect_success setup ' - - : > file && + >file && git add file && test_tick && git commit -m initial && git gc - ' test_expect_success 'prune stale packs' ' - orig_pack=$(echo .git/objects/pack/*.pack) && - : > .git/objects/tmp_1.pack && - : > .git/objects/tmp_2.pack && + >.git/objects/tmp_1.pack && + >.git/objects/tmp_2.pack && test-tool chmtime =-86501 .git/objects/tmp_1.pack && git prune --expire 1.day && test_path_is_file $orig_pack && test_path_is_file .git/objects/tmp_2.pack && test_path_is_missing .git/objects/tmp_1.pack - ' test_expect_success 'prune --expire' ' - add_blob && git prune --expire=1.hour.ago && verbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") && @@ -51,11 +49,9 @@ test_expect_success 'prune --expire' ' git prune --expire 1.day && verbose test $before = $(git count-objects | sed "s/ .*//") && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc: implicit prune --expire' ' - add_blob && test-tool chmtime =-$((2*$week-30)) $BLOB_FILE && git gc && @@ -65,123 +61,98 @@ test_expect_success 'gc: implicit prune --expire' ' git gc && verbose test $before = $(git count-objects | sed "s/ .*//") && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc: refuse to start with invalid gc.pruneExpire' ' - git config gc.pruneExpire invalid && test_must_fail git gc - ' test_expect_success 'gc: start with ok gc.pruneExpire' ' - git config gc.pruneExpire 2.days.ago && git gc - ' test_expect_success 'prune: prune nonsense parameters' ' - test_must_fail git prune garbage && test_must_fail git prune --- && test_must_fail git prune --no-such-option - ' test_expect_success 'prune: prune unreachable heads' ' - git config core.logAllRefUpdates false && - mv .git/logs .git/logs.old && - : > file2 && + >file2 && git add file2 && git commit -m temporary && tmp_head=$(git rev-list -1 HEAD) && git reset HEAD^ && + git reflog expire --all && git prune && test_must_fail git reset $tmp_head -- - ' test_expect_success 'prune: do not prune detached HEAD with no reflog' ' - git checkout --detach --quiet && git commit --allow-empty -m "detached commit" && - # verify that there is no reflogs - # (should be removed and disabled by previous test) - test_path_is_missing .git/logs && + git reflog expire --all && git prune -n >prune_actual && test_must_be_empty prune_actual - ' test_expect_success 'prune: prune former HEAD after checking out branch' ' - head_oid=$(git rev-parse HEAD) && - git checkout --quiet master && + git checkout --quiet main && + git reflog expire --all && git prune -v >prune_actual && grep "$head_oid" prune_actual - ' test_expect_success 'prune: do not prune heads listed as an argument' ' - - : > file2 && + >file2 && git add file2 && git commit -m temporary && tmp_head=$(git rev-list -1 HEAD) && git reset HEAD^ && git prune -- $tmp_head && git reset $tmp_head -- - ' test_expect_success 'gc --no-prune' ' - add_blob && test-tool chmtime =-$((5001*$day)) $BLOB_FILE && git config gc.pruneExpire 2.days.ago && git gc --no-prune && verbose test 1 = $(git count-objects | sed "s/ .*//") && test_path_is_file $BLOB_FILE - ' test_expect_success 'gc respects gc.pruneExpire' ' - git config gc.pruneExpire 5002.days.ago && git gc && test_path_is_file $BLOB_FILE && git config gc.pruneExpire 5000.days.ago && git gc && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc --prune=<date>' ' - add_blob && test-tool chmtime =-$((5001*$day)) $BLOB_FILE && git gc --prune=5002.days.ago && test_path_is_file $BLOB_FILE && git gc --prune=5000.days.ago && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc --prune=never' ' - add_blob && git gc --prune=never && test_path_is_file $BLOB_FILE && git gc --prune=now && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc respects gc.pruneExpire=never' ' - git config gc.pruneExpire never && add_blob && git gc && @@ -189,17 +160,14 @@ test_expect_success 'gc respects gc.pruneExpire=never' ' git config gc.pruneExpire now && git gc && test_path_is_missing $BLOB_FILE - ' test_expect_success 'prune --expire=never' ' - add_blob && git prune --expire=never && test_path_is_file $BLOB_FILE && git prune && test_path_is_missing $BLOB_FILE - ' test_expect_success 'gc: prune old objects after local clone' ' @@ -219,16 +187,16 @@ test_expect_success 'gc: prune old objects after local clone' ' test_expect_success 'garbage report in count-objects -v' ' test_when_finished "rm -f .git/objects/pack/fake*" && test_when_finished "rm -f .git/objects/pack/foo*" && - : >.git/objects/pack/foo && - : >.git/objects/pack/foo.bar && - : >.git/objects/pack/foo.keep && - : >.git/objects/pack/foo.pack && - : >.git/objects/pack/fake.bar && - : >.git/objects/pack/fake.keep && - : >.git/objects/pack/fake.pack && - : >.git/objects/pack/fake.idx && - : >.git/objects/pack/fake2.keep && - : >.git/objects/pack/fake3.idx && + >.git/objects/pack/foo && + >.git/objects/pack/foo.bar && + >.git/objects/pack/foo.keep && + >.git/objects/pack/foo.pack && + >.git/objects/pack/fake.bar && + >.git/objects/pack/fake.keep && + >.git/objects/pack/fake.pack && + >.git/objects/pack/fake.idx && + >.git/objects/pack/fake2.keep && + >.git/objects/pack/fake3.idx && git count-objects -v 2>stderr && grep "index file .git/objects/pack/fake.idx is too small" stderr && grep "^warning:" stderr | sort >actual && @@ -247,12 +215,12 @@ EOF test_expect_success 'clean pack garbage with gc' ' test_when_finished "rm -f .git/objects/pack/fake*" && test_when_finished "rm -f .git/objects/pack/foo*" && - : >.git/objects/pack/foo.keep && - : >.git/objects/pack/foo.pack && - : >.git/objects/pack/fake.idx && - : >.git/objects/pack/fake2.keep && - : >.git/objects/pack/fake2.idx && - : >.git/objects/pack/fake3.keep && + >.git/objects/pack/foo.keep && + >.git/objects/pack/foo.pack && + >.git/objects/pack/fake.idx && + >.git/objects/pack/fake2.keep && + >.git/objects/pack/fake2.idx && + >.git/objects/pack/fake3.keep && git gc && git count-objects -v 2>stderr && grep "^warning:" stderr | sort >actual && @@ -349,4 +317,20 @@ test_expect_success 'trivial prune with bitmaps enabled' ' test_must_fail git cat-file -e $blob ' +test_expect_success 'old reachable-from-recent retained with bitmaps' ' + git repack -adb && + to_drop=$(echo bitmap-from-recent-1 | git hash-object -w --stdin) && + test-tool chmtime -86400 .git/objects/$(test_oid_to_path $to_drop) && + to_save=$(echo bitmap-from-recent-2 | git hash-object -w --stdin) && + test-tool chmtime -86400 .git/objects/$(test_oid_to_path $to_save) && + tree=$(printf "100644 blob $to_save\tfile\n" | git mktree) && + test-tool chmtime -86400 .git/objects/$(test_oid_to_path $tree) && + commit=$(echo foo | git commit-tree $tree) && + git prune --expire=12.hours.ago && + git cat-file -e $commit && + git cat-file -e $tree && + git cat-file -e $to_save && + test_must_fail git cat-file -e $to_drop +' + test_done diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh index a5eca210b8..44bd9ef45f 100755 --- a/t/t5305-include-tag.sh +++ b/t/t5305-include-tag.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git pack-object --include-tag' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh TRASH=$(pwd) @@ -111,7 +114,7 @@ test_expect_success 'check unpacked result (have all objects)' ' test_expect_success 'single-branch clone can transfer tag' ' rm -rf clone.git && - git clone --no-local --single-branch -b master . clone.git && + git clone --no-local --single-branch -b main . clone.git && git -C clone.git fsck ' diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh index 8318781d2b..b02838750e 100755 --- a/t/t5310-pack-bitmaps.sh +++ b/t/t5310-pack-bitmaps.sh @@ -1,7 +1,12 @@ #!/bin/sh test_description='exercise basic bitmap functionality' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-bundle.sh +. "$TEST_DIRECTORY"/lib-bitmap.sh objpath () { echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')" @@ -20,84 +25,172 @@ has_any () { grep -Ff "$1" "$2" } +# To ensure the logic for "maximal commits" is exercised, make +# the repository a bit more complicated. +# +# other second +# * * +# (99 commits) (99 commits) +# * * +# |\ /| +# | * octo-other octo-second * | +# |/|\_________ ____________/|\| +# | \ \/ __________/ | +# | | ________/\ / | +# * |/ * merge-right * +# | _|__________/ \____________ | +# |/ | \| +# (l1) * * merge-left * (r1) +# | / \________________________ | +# |/ \| +# (l2) * * (r2) +# \___________________________ | +# \| +# * (base) +# +# We only push bits down the first-parent history, which +# makes some of these commits unimportant! +# +# The important part for the maximal commit algorithm is how +# the bitmasks are extended. Assuming starting bit positions +# for second (bit 0) and other (bit 1), the bitmasks at the +# end should be: +# +# second: 1 (maximal, selected) +# other: 01 (maximal, selected) +# (base): 11 (maximal) +# +# This complicated history was important for a previous +# version of the walk that guarantees never walking a +# commit multiple times. That goal might be important +# again, so preserve this complicated case. For now, this +# test will guarantee that the bitmaps are computed +# correctly, even with the repeat calculations. + test_expect_success 'setup repo with moderate-sized history' ' - test_commit_bulk --id=file 100 && + test_commit_bulk --id=file 10 && + git branch -M second && git checkout -b other HEAD~5 && test_commit_bulk --id=side 10 && - git checkout master && - bitmaptip=$(git rev-parse master) && + + # add complicated history setup, including merges and + # ambiguous merge-bases + + git checkout -b merge-left other~2 && + git merge second~2 -m "merge-left" && + + git checkout -b merge-right second~1 && + git merge other~1 -m "merge-right" && + + git checkout -b octo-second second && + git merge merge-left merge-right -m "octopus-second" && + + git checkout -b octo-other other && + git merge merge-left merge-right -m "octopus-other" && + + git checkout other && + git merge octo-other -m "pull octopus" && + + git checkout second && + git merge octo-second -m "pull octopus" && + + # Remove these branches so they are not selected + # as bitmap tips + git branch -D merge-left && + git branch -D merge-right && + git branch -D octo-other && + git branch -D octo-second && + + # add padding to make these merges less interesting + # and avoid having them selected for bitmaps + test_commit_bulk --id=file 100 && + git checkout other && + test_commit_bulk --id=side 100 && + git checkout second && + + bitmaptip=$(git rev-parse second) && blob=$(echo tagged-blob | git hash-object -w --stdin) && git tag tagged-blob $blob && git config repack.writebitmaps true ' test_expect_success 'full repack creates bitmaps' ' - git repack -ad && + GIT_TRACE2_EVENT_NESTING=4 GIT_TRACE2_EVENT="$(pwd)/trace" \ + git repack -ad && ls .git/objects/pack/ | grep bitmap >output && - test_line_count = 1 output + test_line_count = 1 output && + grep "\"key\":\"num_selected_commits\",\"value\":\"106\"" trace && + grep "\"key\":\"num_maximal_commits\",\"value\":\"107\"" trace ' test_expect_success 'rev-list --test-bitmap verifies bitmaps' ' git rev-list --test-bitmap HEAD ' -rev_list_tests() { - state=$1 - - test_expect_success "counting commits via bitmap ($state)" ' - git rev-list --count HEAD >expect && - git rev-list --use-bitmap-index --count HEAD >actual && +rev_list_tests_head () { + test_expect_success "counting commits via bitmap ($state, $branch)" ' + git rev-list --count $branch >expect && + git rev-list --use-bitmap-index --count $branch >actual && test_cmp expect actual ' - test_expect_success "counting partial commits via bitmap ($state)" ' - git rev-list --count HEAD~5..HEAD >expect && - git rev-list --use-bitmap-index --count HEAD~5..HEAD >actual && + test_expect_success "counting partial commits via bitmap ($state, $branch)" ' + git rev-list --count $branch~5..$branch >expect && + git rev-list --use-bitmap-index --count $branch~5..$branch >actual && test_cmp expect actual ' - test_expect_success "counting commits with limit ($state)" ' - git rev-list --count -n 1 HEAD >expect && - git rev-list --use-bitmap-index --count -n 1 HEAD >actual && + test_expect_success "counting commits with limit ($state, $branch)" ' + git rev-list --count -n 1 $branch >expect && + git rev-list --use-bitmap-index --count -n 1 $branch >actual && test_cmp expect actual ' - test_expect_success "counting non-linear history ($state)" ' - git rev-list --count other...master >expect && - git rev-list --use-bitmap-index --count other...master >actual && + test_expect_success "counting non-linear history ($state, $branch)" ' + git rev-list --count other...second >expect && + git rev-list --use-bitmap-index --count other...second >actual && test_cmp expect actual ' - test_expect_success "counting commits with limiting ($state)" ' - git rev-list --count HEAD -- 1.t >expect && - git rev-list --use-bitmap-index --count HEAD -- 1.t >actual && + test_expect_success "counting commits with limiting ($state, $branch)" ' + git rev-list --count $branch -- 1.t >expect && + git rev-list --use-bitmap-index --count $branch -- 1.t >actual && test_cmp expect actual ' - test_expect_success "counting objects via bitmap ($state)" ' - git rev-list --count --objects HEAD >expect && - git rev-list --use-bitmap-index --count --objects HEAD >actual && + test_expect_success "counting objects via bitmap ($state, $branch)" ' + git rev-list --count --objects $branch >expect && + git rev-list --use-bitmap-index --count --objects $branch >actual && test_cmp expect actual ' - test_expect_success "enumerate commits ($state)" ' - git rev-list --use-bitmap-index HEAD >actual && - git rev-list HEAD >expect && + test_expect_success "enumerate commits ($state, $branch)" ' + git rev-list --use-bitmap-index $branch >actual && + git rev-list $branch >expect && test_bitmap_traversal --no-confirm-bitmaps expect actual ' - test_expect_success "enumerate --objects ($state)" ' - git rev-list --objects --use-bitmap-index HEAD >actual && - git rev-list --objects HEAD >expect && + test_expect_success "enumerate --objects ($state, $branch)" ' + git rev-list --objects --use-bitmap-index $branch >actual && + git rev-list --objects $branch >expect && test_bitmap_traversal expect actual ' - test_expect_success "bitmap --objects handles non-commit objects ($state)" ' - git rev-list --objects --use-bitmap-index HEAD tagged-blob >actual && + test_expect_success "bitmap --objects handles non-commit objects ($state, $branch)" ' + git rev-list --objects --use-bitmap-index $branch tagged-blob >actual && grep $blob actual ' } +rev_list_tests () { + state=$1 + + for branch in "second" "other" + do + rev_list_tests_head + done +} + rev_list_tests 'full bitmap' test_expect_success 'clone from bitmapped repository' ' @@ -128,7 +221,7 @@ test_expect_success 'setup further non-bitmapped commits' ' rev_list_tests 'partial bitmap' test_expect_success 'fetch (partial bitmap)' ' - git --git-dir=clone.git fetch origin master:master && + git --git-dir=clone.git fetch origin second:second && git rev-parse HEAD >expect && git --git-dir=clone.git rev-parse HEAD >actual && test_cmp expect actual @@ -230,7 +323,7 @@ test_expect_success 'full repack, reusing previous bitmaps' ' ' test_expect_success 'fetch (full bitmap)' ' - git --git-dir=clone.git fetch origin master:master && + git --git-dir=clone.git fetch origin second:second && git rev-parse HEAD >expect && git --git-dir=clone.git rev-parse HEAD >actual && test_cmp expect actual @@ -277,7 +370,7 @@ test_expect_success 'pack with missing parent' ' git pack-objects --stdout --revs <revs >/dev/null ' -test_expect_success JGIT 'we can read jgit bitmaps' ' +test_expect_success JGIT,SHA1 'we can read jgit bitmaps' ' git clone --bare . compat-jgit.git && ( cd compat-jgit.git && @@ -287,7 +380,7 @@ test_expect_success JGIT 'we can read jgit bitmaps' ' ) ' -test_expect_success JGIT 'jgit can read our bitmaps' ' +test_expect_success JGIT,SHA1 'jgit can read our bitmaps' ' git clone --bare . compat-us.git && ( cd compat-us.git && @@ -343,7 +436,20 @@ test_expect_success 'pack reuse respects --incremental' ' test_must_be_empty actual ' -test_expect_success 'truncated bitmap fails gracefully' ' +test_expect_success 'truncated bitmap fails gracefully (ewah)' ' + test_config pack.writebitmaphashcache false && + git repack -ad && + git rev-list --use-bitmap-index --count --all >expect && + bitmap=$(ls .git/objects/pack/*.bitmap) && + test_when_finished "rm -f $bitmap" && + test_copy_bytes 256 <$bitmap >$bitmap.tmp && + mv -f $bitmap.tmp $bitmap && + git rev-list --use-bitmap-index --count --all >actual 2>stderr && + test_cmp expect actual && + test_i18ngrep corrupt.ewah.bitmap stderr +' + +test_expect_success 'truncated bitmap fails gracefully (cache)' ' git repack -ad && git rev-list --use-bitmap-index --count --all >expect && bitmap=$(ls .git/objects/pack/*.bitmap) && @@ -352,7 +458,30 @@ test_expect_success 'truncated bitmap fails gracefully' ' mv -f $bitmap.tmp $bitmap && git rev-list --use-bitmap-index --count --all >actual 2>stderr && test_cmp expect actual && - test_i18ngrep corrupt stderr + test_i18ngrep corrupted.bitmap.index stderr +' + +test_expect_success 'enumerating progress counts pack-reused objects' ' + count=$(git rev-list --objects --all --count) && + git repack -adb && + + # check first with only reused objects; confirm that our progress + # showed the right number, and also that we did pack-reuse as expected. + # Check only the final "done" line of the meter (there may be an + # arbitrary number of intermediate lines ending with CR). + GIT_PROGRESS_DELAY=0 \ + git pack-objects --all --stdout --progress \ + </dev/null >/dev/null 2>stderr && + grep "Enumerating objects: $count, done" stderr && + grep "pack-reused $count" stderr && + + # now the same but with one non-reused object + git commit --allow-empty -m "an extra commit object" && + GIT_PROGRESS_DELAY=0 \ + git pack-objects --all --stdout --progress \ + </dev/null >/dev/null 2>stderr && + grep "Enumerating objects: $((count+1)), done" stderr && + grep "pack-reused $count" stderr ' # have_delta <obj> <expected_base> @@ -448,4 +577,42 @@ test_expect_success 'fetch with bitmaps can reuse old base' ' ) ' +test_expect_success 'pack.preferBitmapTips' ' + git init repo && + test_when_finished "rm -fr repo" && + ( + cd repo && + + # create enough commits that not all are receive bitmap + # coverage even if they are all at the tip of some reference. + test_commit_bulk --message="%s" 103 && + + git rev-list HEAD >commits.raw && + sort <commits.raw >commits && + + git log --format="create refs/tags/%s %H" HEAD >refs && + git update-ref --stdin <refs && + + git repack -adb && + test-tool bitmap list-commits | sort >bitmaps && + + # remember which commits did not receive bitmaps + comm -13 bitmaps commits >before && + test_file_not_empty before && + + # mark the commits which did not receive bitmaps as preferred, + # and generate the bitmap again + perl -pe "s{^}{create refs/tags/include/$. }" <before | + git update-ref --stdin && + git -c pack.preferBitmapTips=refs/tags/include repack -adb && + + # finally, check that the commit(s) without bitmap coverage + # are not the same ones as before + test-tool bitmap list-commits | sort >bitmaps && + comm -13 bitmaps commits >after && + + ! test_cmp before after + ) +' + test_done diff --git a/t/t5312-prune-corruption.sh b/t/t5312-prune-corruption.sh index da9d59940d..11423b3cb2 100755 --- a/t/t5312-prune-corruption.sh +++ b/t/t5312-prune-corruption.sh @@ -8,6 +8,9 @@ bail out or to proceed using it as a reachable tip, but it is _not_ OK to proceed as if it did not exist. Otherwise we might silently delete objects that cannot be recovered. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'disable reflogs' ' @@ -16,7 +19,7 @@ test_expect_success 'disable reflogs' ' ' test_expect_success 'create history reachable only from a bogus-named ref' ' - test_tick && git commit --allow-empty -m master && + test_tick && git commit --allow-empty -m main && base=$(git rev-parse HEAD) && test_tick && git commit --allow-empty -m bogus && bogus=$(git rev-parse HEAD) && @@ -51,7 +54,7 @@ test_expect_success 'clean up bogus ref' ' ' # We create two new objects here, "one" and "two". Our -# master branch points to "two", which is deleted, +# main branch points to "two", which is deleted, # corrupting the repository. But we'd like to make sure # that the otherwise unreachable "one" is not pruned # (since it is the user's best bet for recovering @@ -81,7 +84,7 @@ test_expect_success 'pruning with a corrupted tip does not drop history' ' test_expect_success 'pack-refs does not silently delete broken loose ref' ' git pack-refs --all --prune && echo $missing >expect && - git rev-parse refs/heads/master >actual && + git rev-parse refs/heads/main >actual && test_cmp expect actual ' @@ -89,25 +92,25 @@ test_expect_success 'pack-refs does not silently delete broken loose ref' ' # actually pack it, as it is perfectly reasonable to # skip processing a broken ref test_expect_success 'create packed-refs file with broken ref' ' - rm -f .git/refs/heads/master && + rm -f .git/refs/heads/main && cat >.git/packed-refs <<-EOF && - $missing refs/heads/master + $missing refs/heads/main $recoverable refs/heads/other EOF echo $missing >expect && - git rev-parse refs/heads/master >actual && + git rev-parse refs/heads/main >actual && test_cmp expect actual ' test_expect_success 'pack-refs does not silently delete broken packed ref' ' git pack-refs --all --prune && - git rev-parse refs/heads/master >actual && + git rev-parse refs/heads/main >actual && test_cmp expect actual ' test_expect_success 'pack-refs does not drop broken refs during deletion' ' git update-ref -d refs/heads/other && - git rev-parse refs/heads/master >actual && + git rev-parse refs/heads/main >actual && test_cmp expect actual ' diff --git a/t/t5315-pack-objects-compression.sh b/t/t5315-pack-objects-compression.sh index df970d7584..8bacd96275 100755 --- a/t/t5315-pack-objects-compression.sh +++ b/t/t5315-pack-objects-compression.sh @@ -4,12 +4,6 @@ test_description='pack-object compression configuration' . ./test-lib.sh -# This should be moved to test-lib.sh together with the -# copy in t0021 after both topics have graduated to 'master'. -file_size () { - test-tool path-utils file-size "$1" -} - test_expect_success setup ' printf "%2000000s" X | git hash-object -w --stdin >object-name && @@ -24,7 +18,7 @@ do test_expect_success "pack-objects with $config" ' test_when_finished "rm -f pack-*.*" && git $config pack-objects pack <object-name && - sz=$(file_size pack-*.pack) && + sz=$(test_file_size pack-*.pack) && case "$expect" in small) test "$sz" -le 100000 ;; large) test "$sz" -ge 100000 ;; diff --git a/t/t5316-pack-delta-depth.sh b/t/t5316-pack-delta-depth.sh index 0f06c40eb1..759169d074 100755 --- a/t/t5316-pack-delta-depth.sh +++ b/t/t5316-pack-delta-depth.sh @@ -69,6 +69,7 @@ test_expect_success 'create series of packs' ' max_chain() { git index-pack --verify-stat-only "$1" >output && perl -lne ' + BEGIN { $len = 0 } /chain length = (\d+)/ and $len = $1; END { print $len } ' output @@ -84,14 +85,28 @@ test_expect_success 'packing produces a long delta' ' pack=$(git pack-objects --all --window=0 </dev/null pack) && echo 9 >expect && max_chain pack-$pack.pack >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success '--depth limits depth' ' pack=$(git pack-objects --all --depth=5 </dev/null pack) && echo 5 >expect && max_chain pack-$pack.pack >actual && - test_i18ncmp expect actual + test_cmp expect actual +' + +test_expect_success '--depth=0 disables deltas' ' + pack=$(git pack-objects --all --depth=0 </dev/null pack) && + echo 0 >expect && + max_chain pack-$pack.pack >actual && + test_cmp expect actual +' + +test_expect_success 'negative depth disables deltas' ' + pack=$(git pack-objects --all --depth=-1 </dev/null pack) && + echo 0 >expect && + max_chain pack-$pack.pack >actual && + test_cmp expect actual ' test_done diff --git a/t/t5317-pack-objects-filter-objects.sh b/t/t5317-pack-objects-filter-objects.sh index dc0446574b..13ed3eb136 100755 --- a/t/t5317-pack-objects-filter-objects.sh +++ b/t/t5317-pack-objects-filter-objects.sh @@ -2,6 +2,9 @@ test_description='git pack-objects using object filtering' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Test blob:none filter. @@ -382,7 +385,7 @@ test_expect_success 'verify sparse:oid=oid-ish' ' awk -f print_2.awk ls_files_result | sort >expected && - git -C r4 pack-objects --revs --stdout --filter=sparse:oid=master:pattern >filter.pack <<-EOF && + git -C r4 pack-objects --revs --stdout --filter=sparse:oid=main:pattern >filter.pack <<-EOF && HEAD EOF git -C r4 index-pack ../filter.pack && diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh index 2ed0c1544d..af88f805aa 100755 --- a/t/t5318-commit-graph.sh +++ b/t/t5318-commit-graph.sh @@ -76,7 +76,7 @@ graph_git_behavior 'no graph' full commits/3 commits/1 graph_read_expect() { OPTIONAL="" NUM_CHUNKS=3 - if test ! -z $2 + if test ! -z "$2" then OPTIONAL=" $2" NUM_CHUNKS=$((3 + $(echo "$2" | wc -w))) @@ -103,14 +103,14 @@ test_expect_success 'exit with correct error on bad input to --stdin-commits' ' # valid commit and tree OID git rev-parse HEAD HEAD^{tree} >in && git commit-graph write --stdin-commits <in && - graph_read_expect 3 + graph_read_expect 3 generation_data ' test_expect_success 'write graph' ' cd "$TRASH_DIRECTORY/full" && git commit-graph write && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "3" + graph_read_expect "3" generation_data ' test_expect_success POSIXPERM 'write graph has correct permissions' ' @@ -219,7 +219,7 @@ test_expect_success 'write graph with merges' ' cd "$TRASH_DIRECTORY/full" && git commit-graph write && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "10" "extra_edges" + graph_read_expect "10" "generation_data extra_edges" ' graph_git_behavior 'merge 1 vs 2' full merge/1 merge/2 @@ -254,7 +254,7 @@ test_expect_success 'write graph with new commit' ' cd "$TRASH_DIRECTORY/full" && git commit-graph write && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "11" "extra_edges" + graph_read_expect "11" "generation_data extra_edges" ' graph_git_behavior 'full graph, commit 8 vs merge 1' full commits/8 merge/1 @@ -264,7 +264,7 @@ test_expect_success 'write graph with nothing new' ' cd "$TRASH_DIRECTORY/full" && git commit-graph write && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "11" "extra_edges" + graph_read_expect "11" "generation_data extra_edges" ' graph_git_behavior 'cleared graph, commit 8 vs merge 1' full commits/8 merge/1 @@ -274,7 +274,7 @@ test_expect_success 'build graph from latest pack with closure' ' cd "$TRASH_DIRECTORY/full" && cat new-idx | git commit-graph write --stdin-packs && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "9" "extra_edges" + graph_read_expect "9" "generation_data extra_edges" ' graph_git_behavior 'graph from pack, commit 8 vs merge 1' full commits/8 merge/1 @@ -287,7 +287,7 @@ test_expect_success 'build graph from commits with closure' ' git rev-parse merge/1 >>commits-in && cat commits-in | git commit-graph write --stdin-commits && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "6" + graph_read_expect "6" "generation_data" ' graph_git_behavior 'graph from commits, commit 8 vs merge 1' full commits/8 merge/1 @@ -297,7 +297,7 @@ test_expect_success 'build graph from commits with append' ' cd "$TRASH_DIRECTORY/full" && git rev-parse merge/3 | git commit-graph write --stdin-commits --append && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "10" "extra_edges" + graph_read_expect "10" "generation_data extra_edges" ' graph_git_behavior 'append graph, commit 8 vs merge 1' full commits/8 merge/1 @@ -307,7 +307,7 @@ test_expect_success 'build graph using --reachable' ' cd "$TRASH_DIRECTORY/full" && git commit-graph write --reachable && test_path_is_file $objdir/info/commit-graph && - graph_read_expect "11" "extra_edges" + graph_read_expect "11" "generation_data extra_edges" ' graph_git_behavior 'append graph, commit 8 vs merge 1' full commits/8 merge/1 @@ -328,7 +328,7 @@ test_expect_success 'write graph in bare repo' ' cd "$TRASH_DIRECTORY/bare" && git commit-graph write && test_path_is_file $baredir/info/commit-graph && - graph_read_expect "11" "extra_edges" + graph_read_expect "11" "generation_data extra_edges" ' graph_git_behavior 'bare repo with graph, commit 8 vs merge 1' bare commits/8 merge/1 @@ -446,6 +446,27 @@ test_expect_success 'warn on improper hash version' ' ) ' +test_expect_success 'lower layers have overflow chunk' ' + cd "$TRASH_DIRECTORY/full" && + UNIX_EPOCH_ZERO="@0 +0000" && + FUTURE_DATE="@2147483646 +0000" && + rm -f .git/objects/info/commit-graph && + test_commit --date "$FUTURE_DATE" future-1 && + test_commit --date "$UNIX_EPOCH_ZERO" old-1 && + git commit-graph write --reachable && + test_commit --date "$FUTURE_DATE" future-2 && + test_commit --date "$UNIX_EPOCH_ZERO" old-2 && + git commit-graph write --reachable --split=no-merge && + test_commit extra && + git commit-graph write --reachable --split=no-merge && + git commit-graph write --reachable && + graph_read_expect 16 "generation_data generation_data_overflow extra_edges" && + mv .git/objects/info/commit-graph commit-graph-upgraded && + git commit-graph write --reachable && + graph_read_expect 16 "generation_data generation_data_overflow extra_edges" && + test_cmp .git/objects/info/commit-graph commit-graph-upgraded +' + # the verify tests below expect the commit-graph to contain # exactly the commits reachable from the commits/8 branch. # If the file changes the set of commits in the list, then the @@ -454,8 +475,9 @@ test_expect_success 'warn on improper hash version' ' test_expect_success 'git commit-graph verify' ' cd "$TRASH_DIRECTORY/full" && - git rev-parse commits/8 | git commit-graph write --stdin-commits && - git commit-graph verify >output + git rev-parse commits/8 | git -c commitGraph.generationVersion=1 commit-graph write --stdin-commits && + git commit-graph verify >output && + graph_read_expect 9 extra_edges ' NUM_COMMITS=9 @@ -529,7 +551,7 @@ corrupt_graph_and_verify() { zero_pos=${4:-${orig_size}} && printf "$data" | dd of="$objdir/info/commit-graph" bs=1 seek="$pos" conv=notrunc && dd of="$objdir/info/commit-graph" bs=1 seek="$zero_pos" if=/dev/null && - generate_zero_bytes $(($orig_size - $zero_pos)) >>"$objdir/info/commit-graph" && + test-tool genzeros $(($orig_size - $zero_pos)) >>"$objdir/info/commit-graph" && corrupt_graph_verify "$grepstr" } @@ -563,7 +585,7 @@ test_expect_success 'detect bad hash version' ' test_expect_success 'detect low chunk count' ' corrupt_graph_and_verify $GRAPH_BYTE_CHUNK_COUNT "\01" \ - "missing the .* chunk" + "final chunk has non-zero id" ' test_expect_success 'detect missing OID fanout chunk' ' @@ -741,4 +763,56 @@ test_expect_success 'corrupt commit-graph write (missing tree)' ' ) ' +# We test the overflow-related code with the following repo history: +# +# 4:F - 5:N - 6:U +# / \ +# 1:U - 2:N - 3:U M:N +# \ / +# 7:N - 8:F - 9:N +# +# Here the commits denoted by U have committer date of zero seconds +# since Unix epoch, the commits denoted by N have committer date +# starting from 1112354055 seconds since Unix epoch (default committer +# date for the test suite), and the commits denoted by F have committer +# date of (2 ^ 31 - 2) seconds since Unix epoch. +# +# The largest offset observed is 2 ^ 31, just large enough to overflow. +# + +test_expect_success 'set up and verify repo with generation data overflow chunk' ' + objdir=".git/objects" && + UNIX_EPOCH_ZERO="@0 +0000" && + FUTURE_DATE="@2147483646 +0000" && + test_oid_cache <<-EOF && + oid_version sha1:1 + oid_version sha256:2 + EOF + cd "$TRASH_DIRECTORY" && + mkdir repo && + cd repo && + git init && + test_commit --date "$UNIX_EPOCH_ZERO" 1 && + test_commit 2 && + test_commit --date "$UNIX_EPOCH_ZERO" 3 && + git commit-graph write --reachable && + graph_read_expect 3 generation_data && + test_commit --date "$FUTURE_DATE" 4 && + test_commit 5 && + test_commit --date "$UNIX_EPOCH_ZERO" 6 && + git branch left && + git reset --hard 3 && + test_commit 7 && + test_commit --date "$FUTURE_DATE" 8 && + test_commit 9 && + git branch right && + git reset --hard 3 && + test_merge M left right && + git commit-graph write --reachable && + graph_read_expect 10 "generation_data generation_data_overflow" && + git commit-graph verify +' + +graph_git_behavior 'generation data overflow chunk repo' repo left right + test_done diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh index f340b376bc..7609f1ea64 100755 --- a/t/t5319-multi-pack-index.sh +++ b/t/t5319-multi-pack-index.sh @@ -3,6 +3,7 @@ test_description='multi-pack-indexes' . ./test-lib.sh +GIT_TEST_MULTI_PACK_INDEX=0 objdir=.git/objects HASH_LEN=$(test_oid rawsz) @@ -137,7 +138,7 @@ test_expect_success 'write midx with one v2 pack' ' compare_results_with_midx "one v2 pack" -test_expect_success 'corrupt idx not opened' ' +test_expect_success 'corrupt idx reports errors' ' idx=$(test-tool read-midx $objdir | grep "\.idx\$") && mv $objdir/pack/$idx backup-$idx && test_when_finished "mv backup-\$idx \$objdir/pack/\$idx" && @@ -148,7 +149,7 @@ test_expect_success 'corrupt idx not opened' ' test_copy_bytes 1064 <backup-$idx >$objdir/pack/$idx && git -c core.multiPackIndex=true rev-list --objects --all 2>err && - test_must_be_empty err + grep "index unavailable" err ' test_expect_success 'add more objects' ' @@ -173,12 +174,12 @@ test_expect_success 'write progress off for redirected stderr' ' ' test_expect_success 'write force progress on for stderr' ' - git multi-pack-index --object-dir=$objdir --progress write 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --object-dir=$objdir --progress write 2>err && test_file_not_empty err ' test_expect_success 'write with the --no-progress option' ' - git multi-pack-index --object-dir=$objdir --no-progress write 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --object-dir=$objdir --no-progress write 2>err && test_line_count = 0 err ' @@ -233,6 +234,48 @@ test_expect_success 'warn on improper hash version' ' ) ' +test_expect_success 'midx picks objects from preferred pack' ' + test_when_finished rm -rf preferred.git && + git init --bare preferred.git && + ( + cd preferred.git && + + a=$(echo "a" | git hash-object -w --stdin) && + b=$(echo "b" | git hash-object -w --stdin) && + c=$(echo "c" | git hash-object -w --stdin) && + + # Set up two packs, duplicating the object "B" at different + # offsets. + # + # Note that the "BC" pack (the one we choose as preferred) sorts + # lexically after the "AB" pack, meaning that omitting the + # --preferred-pack argument would cause this test to fail (since + # the MIDX code would select the copy of "b" in the "AB" pack). + git pack-objects objects/pack/test-AB <<-EOF && + $a + $b + EOF + bc=$(git pack-objects objects/pack/test-BC <<-EOF + $b + $c + EOF + ) && + + git multi-pack-index --object-dir=objects \ + write --preferred-pack=test-BC-$bc.idx 2>err && + test_must_be_empty err && + + test-tool read-midx --show-objects objects >out && + + ofs=$(git show-index <objects/pack/test-BC-$bc.idx | grep $b | + cut -d" " -f1) && + printf "%s %s\tobjects/pack/test-BC-%s.pack\n" \ + "$b" "$ofs" "$bc" >expect && + grep ^$b out >actual && + + test_cmp expect actual + ) +' test_expect_success 'verify multi-pack-index success' ' git multi-pack-index verify --object-dir=$objdir @@ -313,12 +356,12 @@ test_expect_success 'verify bad OID version' ' test_expect_success 'verify truncated chunk count' ' corrupt_midx_and_verify $MIDX_BYTE_CHUNK_COUNT "\01" $objdir \ - "missing required" + "final chunk has non-zero id" ' test_expect_success 'verify extended chunk count' ' corrupt_midx_and_verify $MIDX_BYTE_CHUNK_COUNT "\07" $objdir \ - "terminating multi-pack-index chunk id appears earlier than expected" + "terminating chunk id appears earlier than expected" ' test_expect_success 'verify missing required chunk' ' @@ -328,7 +371,7 @@ test_expect_success 'verify missing required chunk' ' test_expect_success 'verify invalid chunk offset' ' corrupt_midx_and_verify $MIDX_BYTE_CHUNK_OFFSET "\01" $objdir \ - "invalid chunk offset (too large)" + "improper chunk offset(s)" ' test_expect_success 'verify packnames out of order' ' @@ -367,18 +410,31 @@ test_expect_success 'git-fsck incorrect offset' ' "git -c core.multipackindex=true fsck" ' +test_expect_success 'corrupt MIDX is not reused' ' + corrupt_midx_and_verify $MIDX_BYTE_OFFSET "\377" $objdir \ + "incorrect object offset" && + git multi-pack-index write 2>err && + test_i18ngrep checksum.mismatch err && + git multi-pack-index verify +' + +test_expect_success 'verify incorrect checksum' ' + pos=$(($(wc -c <$objdir/pack/multi-pack-index) - 1)) && + corrupt_midx_and_verify $pos "\377" $objdir "incorrect checksum" +' + test_expect_success 'repack progress off for redirected stderr' ' - git multi-pack-index --object-dir=$objdir repack 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --object-dir=$objdir repack 2>err && test_line_count = 0 err ' test_expect_success 'repack force progress on for stderr' ' - git multi-pack-index --object-dir=$objdir --progress repack 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --object-dir=$objdir --progress repack 2>err && test_file_not_empty err ' test_expect_success 'repack with the --no-progress option' ' - git multi-pack-index --object-dir=$objdir --no-progress repack 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --object-dir=$objdir --no-progress repack 2>err && test_line_count = 0 err ' @@ -562,7 +618,7 @@ test_expect_success 'expire progress off for redirected stderr' ' test_expect_success 'expire force progress on for stderr' ' ( cd dup && - git multi-pack-index --progress expire 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --progress expire 2>err && test_file_not_empty err ) ' @@ -570,7 +626,7 @@ test_expect_success 'expire force progress on for stderr' ' test_expect_success 'expire with the --no-progress option' ' ( cd dup && - git multi-pack-index --no-progress expire 2>err && + GIT_PROGRESS_DELAY=0 git multi-pack-index --no-progress expire 2>err && test_line_count = 0 err ) ' @@ -709,8 +765,9 @@ test_expect_success 'expire respects .keep files' ' PACKA=$(ls .git/objects/pack/a-pack*\.pack | sed s/\.pack\$//) && touch $PACKA.keep && git multi-pack-index expire && - ls -S .git/objects/pack/a-pack* | grep $PACKA >a-pack-files && - test_line_count = 3 a-pack-files && + test_path_is_file $PACKA.idx && + test_path_is_file $PACKA.keep && + test_path_is_file $PACKA.pack && test-tool read-midx .git/objects | grep idx >midx-list && test_line_count = 2 midx-list ) @@ -754,4 +811,30 @@ test_expect_success 'repack --batch-size=<large> repacks everything' ' ) ' +test_expect_success 'load reverse index when missing .idx, .pack' ' + git init repo && + test_when_finished "rm -fr repo" && + ( + cd repo && + + git config core.multiPackIndex true && + + test_commit base && + git repack -ad && + git multi-pack-index write && + + git rev-parse HEAD >tip && + pack=$(ls .git/objects/pack/pack-*.pack) && + idx=$(ls .git/objects/pack/pack-*.idx) && + + mv $idx $idx.bak && + git cat-file --batch-check="%(objectsize:disk)" <tip && + + mv $idx.bak $idx && + + mv $pack $pack.bak && + git cat-file --batch-check="%(objectsize:disk)" <tip + ) +' + test_done diff --git a/t/t5322-pack-objects-sparse.sh b/t/t5322-pack-objects-sparse.sh index a581eaf529..61cb907a90 100755 --- a/t/t5322-pack-objects-sparse.sh +++ b/t/t5322-pack-objects-sparse.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='pack-objects object selection using sparse algorithm' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup repo' ' @@ -18,7 +21,7 @@ test_expect_success 'setup repo' ' git commit -m "Initialized trees" && for i in $(test_seq 1 3) do - git checkout -b topic$i master && + git checkout -b topic$i main && echo change-$i >f$i/f$i/data.txt && git commit -a -m "Changed f$i/f$i/data.txt" done && diff --git a/t/t5323-pack-redundant.sh b/t/t5323-pack-redundant.sh index 6b4d1ca353..8b01793845 100755 --- a/t/t5323-pack-redundant.sh +++ b/t/t5323-pack-redundant.sh @@ -6,7 +6,7 @@ test_description='Test git pack-redundant In order to test git-pack-redundant, we will create a number of objects and -packs in the repository `master.git`. The relationship between packs (P1-P8) +packs in the repository `main.git`. The relationship between packs (P1-P8) and objects (T, A-R) is showed in the following chart. Objects of a pack will be marked with letter x, while objects of redundant packs will be marked with exclamation point, and redundant pack itself will be marked with asterisk. @@ -25,7 +25,7 @@ exclamation point, and redundant pack itself will be marked with asterisk. ALL | x x x x x x x x x x x x x x x x x x x Another repository `shared.git` has unique objects (X-Z), while other objects -(marked with letter s) are shared through alt-odb (of `master.git`). The +(marked with letter s) are shared through alt-odb (of `main.git`). The relationship between packs and objects is as follows: | T A B C D E F G H I J K L M N O P Q R X Y Z @@ -36,9 +36,11 @@ relationship between packs and objects is as follows: . ./test-lib.sh -master_repo=master.git +main_repo=main.git shared_repo=shared.git +git_pack_redundant='git pack-redundant --i-still-use-this' + # Create commits in <repo> and assign each commit's oid to shell variables # given in the arguments (A, B, and C). E.g.: # @@ -69,7 +71,7 @@ create_commits_in () { shift || return 1 done && - git -C "$repo" update-ref refs/heads/master $oid + git -C "$repo" update-ref refs/heads/main $oid } # Create pack in <repo> and assign pack id to variable given in the 2nd argument @@ -107,9 +109,20 @@ format_packfiles () { sort } -test_expect_success 'setup master repo' ' - git init --bare "$master_repo" && - create_commits_in "$master_repo" A B C D E F G H I J K L M N O P Q R +test_expect_success 'setup main repo' ' + git init --bare "$main_repo" && + create_commits_in "$main_repo" A B C D E F G H I J K L M N O P Q R +' + +test_expect_success 'master: pack-redundant works with no packfile' ' + ( + cd "$master_repo" && + cat >expect <<-EOF && + fatal: Zero packs found! + EOF + test_must_fail $git_pack_redundant --all >actual 2>&1 && + test_cmp expect actual + ) ' ############################################################################# @@ -118,14 +131,12 @@ test_expect_success 'setup master repo' ' # | T A B C D E F G H I J K L M N O P Q R # ----+-------------------------------------- # P1 | x x x x x x x x -# P2 | x x x x x x x -# P3 | x x x x x x # ----+-------------------------------------- -# ALL | x x x x x x x x x x x x x x x +# ALL | x x x x x x x x # ############################################################################# -test_expect_success 'master: no redundant for pack 1, 2, 3' ' - create_pack_in "$master_repo" P1 <<-EOF && +test_expect_success 'main: pack-redundant works with one packfile' ' + create_pack_in "$main_repo" P1 <<-EOF && $T $A $B @@ -135,7 +146,27 @@ test_expect_success 'master: no redundant for pack 1, 2, 3' ' $F $R EOF - create_pack_in "$master_repo" P2 <<-EOF && + ( + cd "$main_repo" && + $git_pack_redundant --all >out && + test_must_be_empty out + ) +' + +############################################################################# +# Chart of packs and objects for this test case +# +# | T A B C D E F G H I J K L M N O P Q R +# ----+-------------------------------------- +# P1 | x x x x x x x x +# P2 | x x x x x x x +# P3 | x x x x x x +# ----+-------------------------------------- +# ALL | x x x x x x x x x x x x x x x +# +############################################################################# +test_expect_success 'main: no redundant for pack 1, 2, 3' ' + create_pack_in "$main_repo" P2 <<-EOF && $B $C $D @@ -144,7 +175,7 @@ test_expect_success 'master: no redundant for pack 1, 2, 3' ' $H $I EOF - create_pack_in "$master_repo" P3 <<-EOF && + create_pack_in "$main_repo" P3 <<-EOF && $F $I $J @@ -153,8 +184,8 @@ test_expect_success 'master: no redundant for pack 1, 2, 3' ' $M EOF ( - cd "$master_repo" && - git pack-redundant --all >out && + cd "$main_repo" && + $git_pack_redundant --all >out && test_must_be_empty out ) ' @@ -173,26 +204,26 @@ test_expect_success 'master: no redundant for pack 1, 2, 3' ' # ALL | x x x x x x x x x x x x x x x x x x # ############################################################################# -test_expect_success 'master: one of pack-2/pack-3 is redundant' ' - create_pack_in "$master_repo" P4 <<-EOF && +test_expect_success 'main: one of pack-2/pack-3 is redundant' ' + create_pack_in "$main_repo" P4 <<-EOF && $J $K $L $M $P EOF - create_pack_in "$master_repo" P5 <<-EOF && + create_pack_in "$main_repo" P5 <<-EOF && $G $H $N $O EOF ( - cd "$master_repo" && + cd "$main_repo" && cat >expect <<-EOF && P3:$P3 EOF - git pack-redundant --all >out && + $git_pack_redundant --all >out && format_packfiles <out >actual && test_cmp expect actual ) @@ -214,24 +245,24 @@ test_expect_success 'master: one of pack-2/pack-3 is redundant' ' # ALL | x x x x x x x x x x x x x x x x x x x # ############################################################################# -test_expect_success 'master: pack 2, 4, and 6 are redundant' ' - create_pack_in "$master_repo" P6 <<-EOF && +test_expect_success 'main: pack 2, 4, and 6 are redundant' ' + create_pack_in "$main_repo" P6 <<-EOF && $N $O $Q EOF - create_pack_in "$master_repo" P7 <<-EOF && + create_pack_in "$main_repo" P7 <<-EOF && $P $Q EOF ( - cd "$master_repo" && + cd "$main_repo" && cat >expect <<-EOF && P2:$P2 P4:$P4 P6:$P6 EOF - git pack-redundant --all >out && + $git_pack_redundant --all >out && format_packfiles <out >actual && test_cmp expect actual ) @@ -254,57 +285,57 @@ test_expect_success 'master: pack 2, 4, and 6 are redundant' ' # ALL | x x x x x x x x x x x x x x x x x x x # ############################################################################# -test_expect_success 'master: pack-8 (subset of pack-1) is also redundant' ' - create_pack_in "$master_repo" P8 <<-EOF && +test_expect_success 'main: pack-8 (subset of pack-1) is also redundant' ' + create_pack_in "$main_repo" P8 <<-EOF && $A EOF ( - cd "$master_repo" && + cd "$main_repo" && cat >expect <<-EOF && P2:$P2 P4:$P4 P6:$P6 P8:$P8 EOF - git pack-redundant --all >out && + $git_pack_redundant --all >out && format_packfiles <out >actual && test_cmp expect actual ) ' -test_expect_success 'master: clean loose objects' ' +test_expect_success 'main: clean loose objects' ' ( - cd "$master_repo" && + cd "$main_repo" && git prune-packed && find objects -type f | sed -e "/objects\/pack\//d" >out && test_must_be_empty out ) ' -test_expect_success 'master: remove redundant packs and pass fsck' ' +test_expect_success 'main: remove redundant packs and pass fsck' ' ( - cd "$master_repo" && - git pack-redundant --all | xargs rm && + cd "$main_repo" && + $git_pack_redundant --all | xargs rm && git fsck && - git pack-redundant --all >out && + $git_pack_redundant --all >out && test_must_be_empty out ) ' # The following test cases will execute inside `shared.git`, instead of -# inside `master.git`. +# inside `main.git`. test_expect_success 'setup shared.git' ' - git clone --mirror "$master_repo" "$shared_repo" && + git clone --mirror "$main_repo" "$shared_repo" && ( cd "$shared_repo" && - printf "../../$master_repo/objects\n" >objects/info/alternates + printf "../../$main_repo/objects\n" >objects/info/alternates ) ' test_expect_success 'shared: all packs are redundant, but no output without --alt-odb' ' ( cd "$shared_repo" && - git pack-redundant --all >out && + $git_pack_redundant --all >out && test_must_be_empty out ) ' @@ -312,7 +343,7 @@ test_expect_success 'shared: all packs are redundant, but no output without --al ############################################################################# # Chart of packs and objects for this test case # -# ================ master.git =============== +# ================= main.git ================ # | T A B C D E F G H I J K L M N O P Q R <----------+ # ----+-------------------------------------- | # P1 | x x x x x x x x | @@ -343,7 +374,7 @@ test_expect_success 'shared: show redundant packs in stderr for verbose mode' ' P5:$P5 P7:$P7 EOF - git pack-redundant --all --verbose >out 2>out.err && + $git_pack_redundant --all --verbose >out 2>out.err && test_must_be_empty out && grep "pack$" out.err | format_packfiles >actual && test_cmp expect actual @@ -356,9 +387,9 @@ test_expect_success 'shared: remove redundant packs, no packs left' ' cat >expect <<-EOF && fatal: Zero packs found! EOF - git pack-redundant --all --alt-odb | xargs rm && + $git_pack_redundant --all --alt-odb | xargs rm && git fsck && - test_must_fail git pack-redundant --all --alt-odb >actual 2>&1 && + test_must_fail $git_pack_redundant --all --alt-odb >actual 2>&1 && test_cmp expect actual ) ' @@ -386,7 +417,7 @@ test_expect_success 'shared: create new objects and packs' ' test_expect_success 'shared: no redundant without --alt-odb' ' ( cd "$shared_repo" && - git pack-redundant --all >out && + $git_pack_redundant --all >out && test_must_be_empty out ) ' @@ -394,7 +425,7 @@ test_expect_success 'shared: no redundant without --alt-odb' ' ############################################################################# # Chart of packs and objects for this test case # -# ================ master.git =============== +# ================= main.git ================ # | T A B C D E F G H I J K L M N O P Q R <----------------+ # ----+-------------------------------------- | # P1 | x x x x x x x x | @@ -417,7 +448,7 @@ test_expect_success 'shared: no redundant without --alt-odb' ' test_expect_success 'shared: one pack is redundant with --alt-odb' ' ( cd "$shared_repo" && - git pack-redundant --all --alt-odb >out && + $git_pack_redundant --all --alt-odb >out && format_packfiles <out >actual && test_line_count = 1 actual ) @@ -426,7 +457,7 @@ test_expect_success 'shared: one pack is redundant with --alt-odb' ' ############################################################################# # Chart of packs and objects for this test case # -# ================ master.git =============== +# ================= main.git ================ # | T A B C D E F G H I J K L M N O P Q R <----------------+ # ----+-------------------------------------- | # P1 | x x x x x x x x | @@ -454,7 +485,7 @@ test_expect_success 'shared: ignore unique objects and all two packs are redunda Px1:$Px1 Px2:$Px2 EOF - git pack-redundant --all --alt-odb >out <<-EOF && + $git_pack_redundant --all --alt-odb >out <<-EOF && $X $Y $Z diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh index 18216463c7..587226ed10 100755 --- a/t/t5324-split-commit-graph.sh +++ b/t/t5324-split-commit-graph.sh @@ -13,11 +13,11 @@ test_expect_success 'setup repo' ' infodir=".git/objects/info" && graphdir="$infodir/commit-graphs" && test_oid_cache <<-EOM - shallow sha1:1760 - shallow sha256:2064 + shallow sha1:2132 + shallow sha256:2436 - base sha1:1376 - base sha256:1496 + base sha1:1408 + base sha256:1528 oid_version sha1:1 oid_version sha256:2 @@ -31,9 +31,9 @@ graph_read_expect() { NUM_BASE=$2 fi cat >expect <<- EOF - header: 43475048 1 $(test_oid oid_version) 3 $NUM_BASE + header: 43475048 1 $(test_oid oid_version) 4 $NUM_BASE num_commits: $1 - chunks: oid_fanout oid_lookup commit_metadata + chunks: oid_fanout oid_lookup commit_metadata generation_data EOF test-tool read-graph >output && test_cmp expect output @@ -427,4 +427,211 @@ done <<\EOF 0600 -r-------- EOF +test_expect_success '--split=replace with partial Bloom data' ' + rm -rf $graphdir $infodir/commit-graph && + git reset --hard commits/3 && + git rev-list -1 HEAD~2 >a && + git rev-list -1 HEAD~1 >b && + git commit-graph write --split=no-merge --stdin-commits --changed-paths <a && + git commit-graph write --split=no-merge --stdin-commits <b && + git commit-graph write --split=replace --stdin-commits --changed-paths <c && + ls $graphdir/graph-*.graph >graph-files && + test_line_count = 1 graph-files && + verify_chain_files_exist $graphdir +' + +test_expect_success 'prevent regression for duplicate commits across layers' ' + git init dup && + git -C dup commit --allow-empty -m one && + git -C dup -c core.commitGraph=false commit-graph write --split=no-merge --reachable 2>err && + test_i18ngrep "attempting to write a commit-graph" err && + git -C dup commit-graph write --split=no-merge --reachable && + git -C dup commit --allow-empty -m two && + git -C dup commit-graph write --split=no-merge --reachable && + git -C dup commit --allow-empty -m three && + git -C dup commit-graph write --split --reachable && + git -C dup commit-graph verify +' + +NUM_FIRST_LAYER_COMMITS=64 +NUM_SECOND_LAYER_COMMITS=16 +NUM_THIRD_LAYER_COMMITS=7 +NUM_FOURTH_LAYER_COMMITS=8 +NUM_FIFTH_LAYER_COMMITS=16 +SECOND_LAYER_SEQUENCE_START=$(($NUM_FIRST_LAYER_COMMITS + 1)) +SECOND_LAYER_SEQUENCE_END=$(($SECOND_LAYER_SEQUENCE_START + $NUM_SECOND_LAYER_COMMITS - 1)) +THIRD_LAYER_SEQUENCE_START=$(($SECOND_LAYER_SEQUENCE_END + 1)) +THIRD_LAYER_SEQUENCE_END=$(($THIRD_LAYER_SEQUENCE_START + $NUM_THIRD_LAYER_COMMITS - 1)) +FOURTH_LAYER_SEQUENCE_START=$(($THIRD_LAYER_SEQUENCE_END + 1)) +FOURTH_LAYER_SEQUENCE_END=$(($FOURTH_LAYER_SEQUENCE_START + $NUM_FOURTH_LAYER_COMMITS - 1)) +FIFTH_LAYER_SEQUENCE_START=$(($FOURTH_LAYER_SEQUENCE_END + 1)) +FIFTH_LAYER_SEQUENCE_END=$(($FIFTH_LAYER_SEQUENCE_START + $NUM_FIFTH_LAYER_COMMITS - 1)) + +# Current split graph chain: +# +# 16 commits (No GDAT) +# ------------------------ +# 64 commits (GDAT) +# +test_expect_success 'setup repo for mixed generation commit-graph-chain' ' + graphdir=".git/objects/info/commit-graphs" && + test_oid_cache <<-EOF && + oid_version sha1:1 + oid_version sha256:2 + EOF + git init mixed && + ( + cd mixed && + git config core.commitGraph true && + git config gc.writeCommitGraph false && + for i in $(test_seq $NUM_FIRST_LAYER_COMMITS) + do + test_commit $i && + git branch commits/$i || return 1 + done && + git -c commitGraph.generationVersion=2 commit-graph write --reachable --split && + graph_read_expect $NUM_FIRST_LAYER_COMMITS && + test_line_count = 1 $graphdir/commit-graph-chain && + for i in $(test_seq $SECOND_LAYER_SEQUENCE_START $SECOND_LAYER_SEQUENCE_END) + do + test_commit $i && + git branch commits/$i || return 1 + done && + git -c commitGraph.generationVersion=1 commit-graph write --reachable --split=no-merge && + test_line_count = 2 $graphdir/commit-graph-chain && + test-tool read-graph >output && + cat >expect <<-EOF && + header: 43475048 1 $(test_oid oid_version) 4 1 + num_commits: $NUM_SECOND_LAYER_COMMITS + chunks: oid_fanout oid_lookup commit_metadata + EOF + test_cmp expect output && + git commit-graph verify && + cat $graphdir/commit-graph-chain + ) +' + +# The new layer will be added without generation data chunk as it was not +# present on the layer underneath it. +# +# 7 commits (No GDAT) +# ------------------------ +# 16 commits (No GDAT) +# ------------------------ +# 64 commits (GDAT) +# +test_expect_success 'do not write generation data chunk if not present on existing tip' ' + git clone mixed mixed-no-gdat && + ( + cd mixed-no-gdat && + for i in $(test_seq $THIRD_LAYER_SEQUENCE_START $THIRD_LAYER_SEQUENCE_END) + do + test_commit $i && + git branch commits/$i || return 1 + done && + git commit-graph write --reachable --split=no-merge && + test_line_count = 3 $graphdir/commit-graph-chain && + test-tool read-graph >output && + cat >expect <<-EOF && + header: 43475048 1 $(test_oid oid_version) 4 2 + num_commits: $NUM_THIRD_LAYER_COMMITS + chunks: oid_fanout oid_lookup commit_metadata + EOF + test_cmp expect output && + git commit-graph verify + ) +' + +# Number of commits in each layer of the split-commit graph before merge: +# +# 8 commits (No GDAT) +# ------------------------ +# 7 commits (No GDAT) +# ------------------------ +# 16 commits (No GDAT) +# ------------------------ +# 64 commits (GDAT) +# +# The top two layers are merged and do not have generation data chunk as layer below them does +# not have generation data chunk. +# +# 15 commits (No GDAT) +# ------------------------ +# 16 commits (No GDAT) +# ------------------------ +# 64 commits (GDAT) +# +test_expect_success 'do not write generation data chunk if the topmost remaining layer does not have generation data chunk' ' + git clone mixed-no-gdat mixed-merge-no-gdat && + ( + cd mixed-merge-no-gdat && + for i in $(test_seq $FOURTH_LAYER_SEQUENCE_START $FOURTH_LAYER_SEQUENCE_END) + do + test_commit $i && + git branch commits/$i || return 1 + done && + git commit-graph write --reachable --split --size-multiple 1 && + test_line_count = 3 $graphdir/commit-graph-chain && + test-tool read-graph >output && + cat >expect <<-EOF && + header: 43475048 1 $(test_oid oid_version) 4 2 + num_commits: $(($NUM_THIRD_LAYER_COMMITS + $NUM_FOURTH_LAYER_COMMITS)) + chunks: oid_fanout oid_lookup commit_metadata + EOF + test_cmp expect output && + git commit-graph verify + ) +' + +# Number of commits in each layer of the split-commit graph before merge: +# +# 16 commits (No GDAT) +# ------------------------ +# 15 commits (No GDAT) +# ------------------------ +# 16 commits (No GDAT) +# ------------------------ +# 64 commits (GDAT) +# +# The top three layers are merged and has generation data chunk as the topmost remaining layer +# has generation data chunk. +# +# 47 commits (GDAT) +# ------------------------ +# 64 commits (GDAT) +# +test_expect_success 'write generation data chunk if topmost remaining layer has generation data chunk' ' + git clone mixed-merge-no-gdat mixed-merge-gdat && + ( + cd mixed-merge-gdat && + for i in $(test_seq $FIFTH_LAYER_SEQUENCE_START $FIFTH_LAYER_SEQUENCE_END) + do + test_commit $i && + git branch commits/$i || return 1 + done && + git commit-graph write --reachable --split --size-multiple 1 && + test_line_count = 2 $graphdir/commit-graph-chain && + test-tool read-graph >output && + cat >expect <<-EOF && + header: 43475048 1 $(test_oid oid_version) 5 1 + num_commits: $(($NUM_SECOND_LAYER_COMMITS + $NUM_THIRD_LAYER_COMMITS + $NUM_FOURTH_LAYER_COMMITS + $NUM_FIFTH_LAYER_COMMITS)) + chunks: oid_fanout oid_lookup commit_metadata generation_data + EOF + test_cmp expect output + ) +' + +test_expect_success 'write generation data chunk when commit-graph chain is replaced' ' + git clone mixed mixed-replace && + ( + cd mixed-replace && + git commit-graph write --reachable --split=replace && + test_path_is_file $graphdir/commit-graph-chain && + test_line_count = 1 $graphdir/commit-graph-chain && + verify_chain_files_exist $graphdir && + graph_read_expect $(($NUM_FIRST_LAYER_COMMITS + $NUM_SECOND_LAYER_COMMITS)) && + git commit-graph verify + ) +' + test_done diff --git a/t/t5325-reverse-index.sh b/t/t5325-reverse-index.sh new file mode 100755 index 0000000000..da453f68d6 --- /dev/null +++ b/t/t5325-reverse-index.sh @@ -0,0 +1,120 @@ +#!/bin/sh + +test_description='on-disk reverse index' +. ./test-lib.sh + +# The below tests want control over the 'pack.writeReverseIndex' setting +# themselves to assert various combinations of it with other options. +sane_unset GIT_TEST_WRITE_REV_INDEX + +packdir=.git/objects/pack + +test_expect_success 'setup' ' + test_commit base && + + pack=$(git pack-objects --all $packdir/pack) && + rev=$packdir/pack-$pack.rev && + + test_path_is_missing $rev +' + +test_index_pack () { + rm -f $rev && + conf=$1 && + shift && + # remove the index since Windows won't overwrite an existing file + rm $packdir/pack-$pack.idx && + git -c pack.writeReverseIndex=$conf index-pack "$@" \ + $packdir/pack-$pack.pack +} + +test_expect_success 'index-pack with pack.writeReverseIndex' ' + test_index_pack "" && + test_path_is_missing $rev && + + test_index_pack false && + test_path_is_missing $rev && + + test_index_pack true && + test_path_is_file $rev +' + +test_expect_success 'index-pack with --[no-]rev-index' ' + for conf in "" true false + do + test_index_pack "$conf" --rev-index && + test_path_exists $rev && + + test_index_pack "$conf" --no-rev-index && + test_path_is_missing $rev + done +' + +test_expect_success 'index-pack can verify reverse indexes' ' + test_when_finished "rm -f $rev" && + test_index_pack true && + + test_path_is_file $rev && + git index-pack --rev-index --verify $packdir/pack-$pack.pack && + + # Intentionally corrupt the reverse index. + chmod u+w $rev && + printf "xxxx" | dd of=$rev bs=1 count=4 conv=notrunc && + + test_must_fail git index-pack --rev-index --verify \ + $packdir/pack-$pack.pack 2>err && + grep "validation error" err +' + +test_expect_success 'index-pack infers reverse index name with -o' ' + git index-pack --rev-index -o other.idx $packdir/pack-$pack.pack && + test_path_is_file other.idx && + test_path_is_file other.rev +' + +test_expect_success 'pack-objects respects pack.writeReverseIndex' ' + test_when_finished "rm -fr pack-1-*" && + + git -c pack.writeReverseIndex= pack-objects --all pack-1 && + test_path_is_missing pack-1-*.rev && + + git -c pack.writeReverseIndex=false pack-objects --all pack-1 && + test_path_is_missing pack-1-*.rev && + + git -c pack.writeReverseIndex=true pack-objects --all pack-1 && + test_path_is_file pack-1-*.rev +' + +test_expect_success 'reverse index is not generated when available on disk' ' + test_index_pack true && + test_path_is_file $rev && + + git rev-parse HEAD >tip && + GIT_TEST_REV_INDEX_DIE_IN_MEMORY=1 git cat-file \ + --batch-check="%(objectsize:disk)" <tip +' + +test_expect_success 'revindex in-memory vs on-disk' ' + git init repo && + test_when_finished "rm -fr repo" && + ( + cd repo && + + test_commit commit && + + git rev-list --objects --no-object-names --all >objects && + + git -c pack.writeReverseIndex=false repack -ad && + test_path_is_missing $packdir/pack-*.rev && + git cat-file --batch-check="%(objectsize:disk) %(objectname)" \ + <objects >in-core && + + git -c pack.writeReverseIndex=true repack -ad && + test_path_is_file $packdir/pack-*.rev && + git cat-file --batch-check="%(objectsize:disk) %(objectname)" \ + <objects >on-disk && + + test_cmp on-disk in-core + ) +' +test_done diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index b84618c925..3f81f16e13 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -6,6 +6,9 @@ test_description='See why rewinding head breaks send-pack ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh cnt=64 @@ -21,14 +24,15 @@ test_expect_success setup ' i=0 && while test $i -le $cnt do - i=$(($i+1)) && - test_tick && - echo "Commit #$i" >mozart/is/pink && - git update-index --add mozart/is/pink && - tree=$(git write-tree) && - commit=$(echo "Commit #$i" | git commit-tree $tree -p $parent) && - git update-ref refs/tags/commit$i $commit && - parent=$commit || return 1 + i=$(($i+1)) && + test_tick && + echo "Commit #$i" >mozart/is/pink && + git update-index --add mozart/is/pink && + tree=$(git write-tree) && + commit=$(echo "Commit #$i" | + git commit-tree $tree -p $parent) && + git update-ref refs/tags/commit$i $commit && + parent=$commit || return 1 done && git update-ref HEAD "$commit" && git clone ./. victim && @@ -38,14 +42,14 @@ test_expect_success setup ' i=0 && while test $i -le $cnt do - i=$(($i+1)) && - test_tick && - echo "Rebase #$i" >mozart/is/pink && - git update-index --add mozart/is/pink && - tree=$(git write-tree) && - commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) && - git update-ref refs/tags/rebase$i $commit && - parent=$commit || return 1 + i=$(($i+1)) && + test_tick && + echo "Rebase #$i" >mozart/is/pink && + git update-index --add mozart/is/pink && + tree=$(git write-tree) && + commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) && + git update-ref refs/tags/rebase$i $commit && + parent=$commit || return 1 done && git update-ref HEAD "$commit" && echo Rebase && @@ -57,40 +61,40 @@ test_expect_success 'pack the source repository' ' ' test_expect_success 'pack the destination repository' ' - ( - cd victim && - git repack -a -d && - git prune - ) + ( + cd victim && + git repack -a -d && + git prune + ) ' test_expect_success 'refuse pushing rewound head without --force' ' - pushed_head=$(git rev-parse --verify master) && - victim_orig=$(cd victim && git rev-parse --verify master) && - test_must_fail git send-pack ./victim master && - victim_head=$(cd victim && git rev-parse --verify master) && + pushed_head=$(git rev-parse --verify main) && + victim_orig=$(cd victim && git rev-parse --verify main) && + test_must_fail git send-pack ./victim main && + victim_head=$(cd victim && git rev-parse --verify main) && test "$victim_head" = "$victim_orig" && # this should update - git send-pack --force ./victim master && - victim_head=$(cd victim && git rev-parse --verify master) && + git send-pack --force ./victim main && + victim_head=$(cd victim && git rev-parse --verify main) && test "$victim_head" = "$pushed_head" ' test_expect_success 'push can be used to delete a ref' ' - ( cd victim && git branch extra master ) && - git send-pack ./victim :extra master && + ( cd victim && git branch extra main ) && + git send-pack ./victim :extra main && ( cd victim && test_must_fail git rev-parse --verify extra ) ' test_expect_success 'refuse deleting push with denyDeletes' ' ( - cd victim && - test_might_fail git branch -D extra && - git config receive.denyDeletes true && - git branch extra master + cd victim && + test_might_fail git branch -D extra && + git config receive.denyDeletes true && + git branch extra main ) && - test_must_fail git send-pack ./victim :extra master + test_must_fail git send-pack ./victim :extra main ' test_expect_success 'cannot override denyDeletes with git -c send-pack' ' @@ -98,10 +102,10 @@ test_expect_success 'cannot override denyDeletes with git -c send-pack' ' cd victim && test_might_fail git branch -D extra && git config receive.denyDeletes true && - git branch extra master + git branch extra main ) && test_must_fail git -c receive.denyDeletes=false \ - send-pack ./victim :extra master + send-pack ./victim :extra main ' test_expect_success 'override denyDeletes with git -c receive-pack' ' @@ -109,22 +113,22 @@ test_expect_success 'override denyDeletes with git -c receive-pack' ' cd victim && test_might_fail git branch -D extra && git config receive.denyDeletes true && - git branch extra master + git branch extra main ) && git send-pack \ --receive-pack="git -c receive.denyDeletes=false receive-pack" \ - ./victim :extra master + ./victim :extra main ' test_expect_success 'denyNonFastforwards trumps --force' ' ( - cd victim && - test_might_fail git branch -D extra && - git config receive.denyNonFastforwards true + cd victim && + test_might_fail git branch -D extra && + git config receive.denyNonFastforwards true ) && - victim_orig=$(cd victim && git rev-parse --verify master) && - test_must_fail git send-pack --force ./victim master^:master && - victim_head=$(cd victim && git rev-parse --verify master) && + victim_orig=$(cd victim && git rev-parse --verify main) && + test_must_fail git send-pack --force ./victim main^:main && + victim_head=$(cd victim && git rev-parse --verify main) && test "$victim_orig" = "$victim_head" ' @@ -143,16 +147,16 @@ test_expect_success 'send-pack --all sends all branches' ' test_expect_success 'push --all excludes remote-tracking hierarchy' ' mkdir parent && ( - cd parent && - git init && : >file && git add file && git commit -m add + cd parent && + git init && : >file && git add file && git commit -m add ) && git clone parent child && ( - cd child && git push --all + cd child && git push --all ) && ( - cd parent && - test -z "$(git for-each-ref refs/remotes/origin)" + cd parent && + test -z "$(git for-each-ref refs/remotes/origin)" ) ' @@ -160,33 +164,33 @@ test_expect_success 'receive-pack runs auto-gc in remote repo' ' rm -rf parent child && git init parent && ( - # Setup a repo with 2 packs - cd parent && - echo "Some text" >file.txt && - git add . && - git commit -m "Initial commit" && - git repack -adl && - echo "Some more text" >>file.txt && - git commit -a -m "Second commit" && - git repack + # Setup a repo with 2 packs + cd parent && + echo "Some text" >file.txt && + git add . && + git commit -m "Initial commit" && + git repack -adl && + echo "Some more text" >>file.txt && + git commit -a -m "Second commit" && + git repack ) && cp -R parent child && ( - # Set the child to auto-pack if more than one pack exists - cd child && - git config gc.autopacklimit 1 && - git config gc.autodetach false && - git branch test_auto_gc && - # And create a file that follows the temporary object naming - # convention for the auto-gc to remove - : >.git/objects/tmp_test_object && - test-tool chmtime =-1209601 .git/objects/tmp_test_object + # Set the child to auto-pack if more than one pack exists + cd child && + git config gc.autopacklimit 1 && + git config gc.autodetach false && + git branch test_auto_gc && + # And create a file that follows the temporary object naming + # convention for the auto-gc to remove + : >.git/objects/tmp_test_object && + test-tool chmtime =-1209601 .git/objects/tmp_test_object ) && ( - cd parent && - echo "Even more text" >>file.txt && - git commit -a -m "Third commit" && - git send-pack ../child HEAD:refs/heads/test_auto_gc + cd parent && + echo "Even more text" >>file.txt && + git commit -a -m "Third commit" && + git send-pack ../child HEAD:refs/heads/test_auto_gc ) && test ! -e child/.git/objects/tmp_test_object ' @@ -195,63 +199,63 @@ rewound_push_setup() { rm -rf parent child && mkdir parent && ( - cd parent && - git init && - echo one >file && git add file && git commit -m one && - git config receive.denyCurrentBranch warn && - echo two >file && git commit -a -m two + cd parent && + git init && + echo one >file && git add file && git commit -m one && + git config receive.denyCurrentBranch warn && + echo two >file && git commit -a -m two ) && git clone parent child && ( - cd child && git reset --hard HEAD^ + cd child && git reset --hard HEAD^ ) } test_expect_success 'pushing explicit refspecs respects forcing' ' rewound_push_setup && - parent_orig=$(cd parent && git rev-parse --verify master) && + parent_orig=$(cd parent && git rev-parse --verify main) && ( - cd child && - test_must_fail git send-pack ../parent \ - refs/heads/master:refs/heads/master + cd child && + test_must_fail git send-pack ../parent \ + refs/heads/main:refs/heads/main ) && - parent_head=$(cd parent && git rev-parse --verify master) && + parent_head=$(cd parent && git rev-parse --verify main) && test "$parent_orig" = "$parent_head" && ( - cd child && - git send-pack ../parent \ - +refs/heads/master:refs/heads/master + cd child && + git send-pack ../parent \ + +refs/heads/main:refs/heads/main ) && - parent_head=$(cd parent && git rev-parse --verify master) && - child_head=$(cd child && git rev-parse --verify master) && + parent_head=$(cd parent && git rev-parse --verify main) && + child_head=$(cd child && git rev-parse --verify main) && test "$parent_head" = "$child_head" ' test_expect_success 'pushing wildcard refspecs respects forcing' ' rewound_push_setup && - parent_orig=$(cd parent && git rev-parse --verify master) && + parent_orig=$(cd parent && git rev-parse --verify main) && ( - cd child && - test_must_fail git send-pack ../parent \ - "refs/heads/*:refs/heads/*" + cd child && + test_must_fail git send-pack ../parent \ + "refs/heads/*:refs/heads/*" ) && - parent_head=$(cd parent && git rev-parse --verify master) && + parent_head=$(cd parent && git rev-parse --verify main) && test "$parent_orig" = "$parent_head" && ( - cd child && - git send-pack ../parent \ - "+refs/heads/*:refs/heads/*" + cd child && + git send-pack ../parent \ + "+refs/heads/*:refs/heads/*" ) && - parent_head=$(cd parent && git rev-parse --verify master) && - child_head=$(cd child && git rev-parse --verify master) && + parent_head=$(cd parent && git rev-parse --verify main) && + child_head=$(cd child && git rev-parse --verify main) && test "$parent_head" = "$child_head" ' test_expect_success 'deny pushing to delete current branch' ' rewound_push_setup && ( - cd child && - test_must_fail git send-pack ../parent :refs/heads/master 2>errs + cd child && + test_must_fail git send-pack ../parent :refs/heads/main 2>errs ) ' @@ -282,14 +286,14 @@ test_expect_success 'receive-pack de-dupes .have lines' ' local=$(git -C fork rev-parse HEAD) && shared=$(git -C shared rev-parse only-shared) && cat >expect <<-EOF && - $local refs/heads/master + $local refs/heads/main $local refs/remotes/origin/HEAD - $local refs/remotes/origin/master + $local refs/remotes/origin/main $shared .have EOF GIT_TRACE_PACKET=$(pwd)/trace GIT_TEST_PROTOCOL_VERSION=0 \ - git push \ + git push \ --receive-pack="unset GIT_TRACE_PACKET; git-receive-pack" \ fork HEAD:foo && extract_ref_advertisement <trace >refs && diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh index 956d69f5b1..6012cc8172 100755 --- a/t/t5401-update-hooks.sh +++ b/t/t5401-update-hooks.sh @@ -15,11 +15,11 @@ test_expect_success setup ' git update-index a && tree1=$(git write-tree) && commit1=$(echo modify | git commit-tree $tree1 -p $commit0) && - git update-ref refs/heads/master $commit0 && + git update-ref refs/heads/main $commit0 && git update-ref refs/heads/tofail $commit1 && git clone --bare ./. victim.git && GIT_DIR=victim.git git update-ref refs/heads/tofail $commit1 && - git update-ref refs/heads/master $commit1 && + git update-ref refs/heads/main $commit1 && git update-ref refs/heads/tofail $commit0 ' @@ -38,7 +38,7 @@ echo "$@" >>$GIT_DIR/update.args read x; printf %s "$x" >$GIT_DIR/update.stdin echo STDOUT update $1 echo STDERR update $1 >&2 -test "$1" = refs/heads/master || exit +test "$1" = refs/heads/main || exit EOF chmod u+x victim.git/hooks/update @@ -62,11 +62,11 @@ chmod u+x victim.git/hooks/post-update test_expect_success push ' test_must_fail git send-pack --force ./victim.git \ - master tofail >send.out 2>send.err + main tofail >send.out 2>send.err ' test_expect_success 'updated as expected' ' - test $(GIT_DIR=victim.git git rev-parse master) = $commit1 && + test $(GIT_DIR=victim.git git rev-parse main) = $commit1 && test $(GIT_DIR=victim.git git rev-parse tofail) = $commit1 ' @@ -82,24 +82,24 @@ test_expect_success 'hooks ran' ' ' test_expect_success 'pre-receive hook input' ' - (echo $commit0 $commit1 refs/heads/master && + (echo $commit0 $commit1 refs/heads/main && echo $commit1 $commit0 refs/heads/tofail ) | test_cmp - victim.git/pre-receive.stdin ' test_expect_success 'update hook arguments' ' - (echo refs/heads/master $commit0 $commit1 && + (echo refs/heads/main $commit0 $commit1 && echo refs/heads/tofail $commit1 $commit0 ) | test_cmp - victim.git/update.args ' test_expect_success 'post-receive hook input' ' - echo $commit0 $commit1 refs/heads/master | + echo $commit0 $commit1 refs/heads/main | test_cmp - victim.git/post-receive.stdin ' test_expect_success 'post-update hook arguments' ' - echo refs/heads/master | + echo refs/heads/main | test_cmp - victim.git/post-update.args ' @@ -120,8 +120,8 @@ test_expect_success 'send-pack produced no output' ' cat <<EOF >expect remote: STDOUT pre-receive remote: STDERR pre-receive -remote: STDOUT update refs/heads/master -remote: STDERR update refs/heads/master +remote: STDOUT update refs/heads/main +remote: STDERR update refs/heads/main remote: STDOUT update refs/heads/tofail remote: STDERR update refs/heads/tofail remote: error: hook declined to update refs/heads/tofail @@ -143,7 +143,7 @@ test_expect_success 'pre-receive hook that forgets to read its input' ' for v in $(test_seq 100 999) do - git branch branch_$v master || return + git branch branch_$v main || return done && git push ./victim.git "+refs/heads/*:refs/heads/*" ' diff --git a/t/t5402-post-merge-hook.sh b/t/t5402-post-merge-hook.sh index 6eb2ffd6ec..3e5e19c719 100755 --- a/t/t5402-post-merge-hook.sh +++ b/t/t5402-post-merge-hook.sh @@ -4,6 +4,9 @@ # test_description='Test the post-merge hook.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -15,7 +18,7 @@ test_expect_success setup ' git update-index a && tree1=$(git write-tree) && commit1=$(echo modify | git commit-tree $tree1 -p $commit0) && - git update-ref refs/heads/master $commit0 && + git update-ref refs/heads/main $commit0 && git clone ./. clone1 && GIT_DIR=clone1/.git git update-index --add a && git clone ./. clone2 && @@ -23,34 +26,34 @@ test_expect_success setup ' ' for clone in 1 2; do - cat >clone${clone}/.git/hooks/post-merge <<'EOF' + cat >clone${clone}/.git/hooks/post-merge <<'EOF' #!/bin/sh echo $@ >> $GIT_DIR/post-merge.args EOF - chmod u+x clone${clone}/.git/hooks/post-merge + chmod u+x clone${clone}/.git/hooks/post-merge done test_expect_success 'post-merge does not run for up-to-date ' ' - GIT_DIR=clone1/.git git merge $commit0 && + GIT_DIR=clone1/.git git merge $commit0 && ! test -f clone1/.git/post-merge.args ' test_expect_success 'post-merge runs as expected ' ' - GIT_DIR=clone1/.git git merge $commit1 && + GIT_DIR=clone1/.git git merge $commit1 && test -e clone1/.git/post-merge.args ' test_expect_success 'post-merge from normal merge receives the right argument ' ' - grep 0 clone1/.git/post-merge.args + grep 0 clone1/.git/post-merge.args ' test_expect_success 'post-merge from squash merge runs as expected ' ' - GIT_DIR=clone2/.git git merge --squash $commit1 && + GIT_DIR=clone2/.git git merge --squash $commit1 && test -e clone2/.git/post-merge.args ' test_expect_success 'post-merge from squash merge receives the right argument ' ' - grep 1 clone2/.git/post-merge.args + grep 1 clone2/.git/post-merge.args ' test_done diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index a39b3b5c78..1ec9e23be7 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -4,6 +4,9 @@ # test_description='Test the post-checkout hook.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -20,7 +23,7 @@ test_expect_success setup ' test_expect_success 'post-checkout receives the right arguments with HEAD unchanged ' ' test_when_finished "rm -f .git/post-checkout.args" && - git checkout master && + git checkout main && read old new flag <.git/post-checkout.args && test $old = $new && test $flag = 1 ' @@ -41,14 +44,14 @@ test_expect_success 'post-checkout receives the right args with HEAD changed ' ' test_expect_success 'post-checkout receives the right args when not switching branches ' ' test_when_finished "rm -f .git/post-checkout.args" && - git checkout master -- three.t && + git checkout main -- three.t && read old new flag <.git/post-checkout.args && test $old = $new && test $flag = 0 ' test_expect_success 'post-checkout is triggered on rebase' ' test_when_finished "rm -f .git/post-checkout.args" && - git checkout -b rebase-test master && + git checkout -b rebase-test main && rm -f .git/post-checkout.args && git rebase rebase-on-me && read old new flag <.git/post-checkout.args && diff --git a/t/t5404-tracking-branches.sh b/t/t5404-tracking-branches.sh index 2762f420bc..cc07889667 100755 --- a/t/t5404-tracking-branches.sh +++ b/t/t5404-tracking-branches.sh @@ -2,6 +2,9 @@ test_description='tracking branch update checks for git push' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -30,9 +33,9 @@ test_expect_success 'prepare pushable branches' ' git checkout -b b2 origin/b2 && echo aa-b2 >>file && git commit -a -m aa-b2 && - git checkout master && - echo aa-master >>file && - git commit -a -m aa-master + git checkout main && + echo aa-main >>file && + git commit -a -m aa-main ' test_expect_success 'mixed-success push returns error' ' @@ -40,7 +43,7 @@ test_expect_success 'mixed-success push returns error' ' ' test_expect_success 'check tracking branches updated correctly after push' ' - test "$(git rev-parse origin/master)" = "$(git rev-parse master)" + test "$(git rev-parse origin/main)" = "$(git rev-parse main)" ' test_expect_success 'check tracking branches not updated for failed refs' ' diff --git a/t/t5405-send-pack-rewind.sh b/t/t5405-send-pack-rewind.sh index 235fb7686a..11f03239a0 100755 --- a/t/t5405-send-pack-rewind.sh +++ b/t/t5405-send-pack-rewind.sh @@ -2,6 +2,9 @@ test_description='forced push to replace commit we do not have' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -13,7 +16,7 @@ test_expect_success setup ' mkdir another && ( cd another && git init && - git fetch --update-head-ok .. master:master + git fetch --update-head-ok .. main:main ) && >file2 && git add file2 && test_tick && @@ -25,7 +28,7 @@ test_expect_success 'non forced push should die not segfault' ' ( cd another && - test_must_fail git push .. master:master + test_must_fail git push .. main:main ) ' @@ -34,7 +37,7 @@ test_expect_success 'forced push should succeed' ' ( cd another && - git push .. +master:master + git push .. +main:main ) ' diff --git a/t/t5406-remote-rejects.sh b/t/t5406-remote-rejects.sh index ff06f99649..5c509db6fc 100755 --- a/t/t5406-remote-rejects.sh +++ b/t/t5406-remote-rejects.sh @@ -5,7 +5,6 @@ test_description='remote push rejects are reported by client' . ./test-lib.sh test_expect_success 'setup' ' - mkdir .git/hooks && write_script .git/hooks/update <<-\EOF && exit 1 EOF diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh index 80750a817e..6da8d760e2 100755 --- a/t/t5407-post-rewrite-hook.sh +++ b/t/t5407-post-rewrite-hook.sh @@ -4,6 +4,9 @@ # test_description='Test the post-rewrite hook.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -14,11 +17,9 @@ test_expect_success 'setup' ' git checkout A^0 && test_commit E bar E && test_commit F foo F && - git checkout master + git checkout main ' -mkdir .git/hooks - cat >.git/hooks/post-rewrite <<EOF #!/bin/sh echo \$@ > "$TRASH_DIRECTORY"/post-rewrite.args diff --git a/t/t5409-colorize-remote-messages.sh b/t/t5409-colorize-remote-messages.sh index 5d8f401d8e..9f1a483f42 100755 --- a/t/t5409-colorize-remote-messages.sh +++ b/t/t5409-colorize-remote-messages.sh @@ -5,7 +5,6 @@ test_description='remote messages are colorized on the client' . ./test-lib.sh test_expect_success 'setup' ' - mkdir .git/hooks && write_script .git/hooks/update <<-\EOF && echo error: error echo ERROR: also highlighted diff --git a/t/t5410-receive-pack-alternates.sh b/t/t5410-receive-pack-alternates.sh index f00d0da860..0b28e4e452 100755 --- a/t/t5410-receive-pack-alternates.sh +++ b/t/t5410-receive-pack-alternates.sh @@ -2,14 +2,17 @@ test_description='git receive-pack with alternate ref filtering' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' test_commit base && git clone -s --bare . fork && - git checkout -b public/branch master && + git checkout -b public/branch main && test_commit public && - git checkout -b private/branch master && + git checkout -b private/branch main && test_commit private ' diff --git a/t/t5411-proc-receive-hook.sh b/t/t5411-proc-receive-hook.sh new file mode 100755 index 0000000000..98b0e81208 --- /dev/null +++ b/t/t5411-proc-receive-hook.sh @@ -0,0 +1,120 @@ +#!/bin/sh +# +# Copyright (c) 2020 Jiang Xin +# + +test_description='Test proc-receive hook' + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh + +. "$TEST_DIRECTORY"/t5411/common-functions.sh + +setup_upstream_and_workbench () { + # Refs of upstream : main(A) + # Refs of workbench: main(A) tags/v123 + test_expect_success "setup upstream and workbench" ' + rm -rf upstream.git && + rm -rf workbench && + git init --bare upstream.git && + git init workbench && + create_commits_in workbench A B && + ( + cd workbench && + # Try to make a stable fixed width for abbreviated commit ID, + # this fixed-width oid will be replaced with "<OID>". + git config core.abbrev 7 && + git tag -m "v123" v123 $A && + git remote add origin ../upstream.git && + git push origin main && + git update-ref refs/heads/main $A $B && + git -C ../upstream.git update-ref \ + refs/heads/main $A $B + ) && + TAG=$(git -C workbench rev-parse v123) && + + # setup pre-receive hook + write_script upstream.git/hooks/pre-receive <<-\EOF && + exec >&2 + echo "# pre-receive hook" + while read old new ref + do + echo "pre-receive< $old $new $ref" + done + EOF + + # setup post-receive hook + write_script upstream.git/hooks/post-receive <<-\EOF && + exec >&2 + echo "# post-receive hook" + while read old new ref + do + echo "post-receive< $old $new $ref" + done + EOF + + upstream=upstream.git + ' +} + +run_proc_receive_hook_test() { + case $1 in + http) + PROTOCOL="HTTP protocol" + URL_PREFIX="http://.*" + ;; + local) + PROTOCOL="builtin protocol" + URL_PREFIX="\.\." + ;; + esac + + # Include test cases for both file and HTTP protocol + for t in "$TEST_DIRECTORY"/t5411/test-*.sh + do + . "$t" + done +} + +# Initialize the upstream repository and local workbench. +setup_upstream_and_workbench + +# Load test cases that only need to be executed once. +for t in "$TEST_DIRECTORY"/t5411/once-*.sh +do + . "$t" +done + +# Initialize the upstream repository and local workbench. +setup_upstream_and_workbench + +# Run test cases for 'proc-receive' hook on local file protocol. +run_proc_receive_hook_test local + +ROOT_PATH="$PWD" +. "$TEST_DIRECTORY"/lib-gpg.sh +. "$TEST_DIRECTORY"/lib-httpd.sh +. "$TEST_DIRECTORY"/lib-terminal.sh +start_httpd + +# Re-initialize the upstream repository and local workbench. +setup_upstream_and_workbench + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "setup for HTTP protocol" ' + git -C upstream.git config http.receivepack true && + upstream="$HTTPD_DOCUMENT_ROOT_PATH/upstream.git" && + mv upstream.git "$upstream" && + git -C workbench remote set-url origin "$HTTPD_URL/auth-push/smart/upstream.git" && + set_askpass user@host pass@host +' + +setup_askpass_helper + +# Run test cases for 'proc-receive' hook on HTTP protocol. +run_proc_receive_hook_test http + +test_done diff --git a/t/t5411/common-functions.sh b/t/t5411/common-functions.sh new file mode 100644 index 0000000000..3c747782c1 --- /dev/null +++ b/t/t5411/common-functions.sh @@ -0,0 +1,73 @@ +# Create commits in <repo> and assign each commit's oid to shell variables +# given in the arguments (A, B, and C). E.g.: +# +# create_commits_in <repo> A B C +# +# NOTE: Never calling this function from a subshell since variable +# assignments will disappear when subshell exits. +create_commits_in () { + repo="$1" && test -d "$repo" || + error "Repository $repo does not exist." + shift && + while test $# -gt 0 + do + name=$1 && + shift && + test_commit -C "$repo" --no-tag "$name" && + eval $name=$(git -C "$repo" rev-parse HEAD) + done +} + +get_abbrev_oid () { + oid=$1 && + suffix=${oid#???????} && + oid=${oid%$suffix} && + if test -n "$oid" + then + echo "$oid" + else + echo "undefined-oid" + fi +} + +# Format the output of git-push, git-show-ref and other commands to make a +# user-friendly and stable text. We can easily prepare the expect text +# without having to worry about changes of the commit ID (full or abbrev.) +# of the output. Single quotes are replaced with double quotes, because +# it is boring to prepare unquoted single quotes in expect text. We also +# remove some locale error messages. The emitted human-readable errors are +# redundant to the more machine-readable output the tests already assert. +make_user_friendly_and_stable_output () { + sed \ + -e "s/'/\"/g" \ + -e "s/$(get_abbrev_oid $A)[0-9a-f]*/<COMMIT-A>/g" \ + -e "s/$(get_abbrev_oid $B)[0-9a-f]*/<COMMIT-B>/g" \ + -e "s/$(get_abbrev_oid $TAG)[0-9a-f]*/<TAG-v123>/g" \ + -e "s/$ZERO_OID/<ZERO-OID>/g" \ + -e "s#To $URL_PREFIX/upstream.git#To <URL/of/upstream.git>#" \ + -e "/^error: / d" +} + +filter_out_user_friendly_and_stable_output () { + make_user_friendly_and_stable_output | + sed -n ${1+"$@"} +} + +format_and_save_expect () { + sed -e 's/^> //' -e 's/Z$//' >expect +} + +test_cmp_refs () { + indir= + if test "$1" = "-C" + then + shift + indir="$1" + shift + fi + indir=${indir:+"$indir"/} + cat >show-ref.expect && + git ${indir:+ -C "$indir"} show-ref >show-ref.pristine && + make_user_friendly_and_stable_output <show-ref.pristine >show-ref.filtered && + test_cmp show-ref.expect show-ref.filtered +} diff --git a/t/t5411/once-0010-report-status-v1.sh b/t/t5411/once-0010-report-status-v1.sh new file mode 100644 index 0000000000..1233a46eac --- /dev/null +++ b/t/t5411/once-0010-report-status-v1.sh @@ -0,0 +1,91 @@ +test_expect_success "setup receive.procReceiveRefs" ' + git -C "$upstream" config --add receive.procReceiveRefs refs/for +' + +test_expect_success "setup proc-receive hook" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic1" \ + -r "option fall-through" \ + -r "ok refs/for/main/topic2" \ + -r "option refname refs/for/changes/23/123/1" \ + -r "option new-oid $A" \ + -r "ok refs/for/main/topic2" \ + -r "option refname refs/for/changes/24/124/2" \ + -r "option old-oid $B" \ + -r "option new-oid $A" \ + -r "option forced-update" \ + -r "ng refs/for/next/topic target branch not exist" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : (B) refs/for/main/topic1(A) foo(A) refs/for/next/topic(A) refs/for/main/topic2(A) +test_expect_success "proc-receive: report status v1" ' + { + if test -z "$GIT_DEFAULT_HASH" || test "$GIT_DEFAULT_HASH" = "sha1" + then + printf "%s %s refs/heads/main\0report-status\n" \ + $A $B | packetize + else + printf "%s %s refs/heads/main\0report-status object-format=$GIT_DEFAULT_HASH\n" \ + $A $B | packetize + fi && + printf "%s %s refs/for/main/topic1\n" \ + $ZERO_OID $A | packetize && + printf "%s %s refs/heads/foo\n" \ + $ZERO_OID $A | packetize && + printf "%s %s refs/for/next/topic\n" \ + $ZERO_OID $A | packetize && + printf "%s %s refs/for/main/topic2\n" \ + $ZERO_OID $A | packetize && + printf 0000 && + printf "" | git -C "$upstream" pack-objects --stdout + } | git receive-pack "$upstream" --stateless-rpc \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + cat >expect <<-EOF && + # pre-receive hook + pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main + pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic1 + pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo + pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic + pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic2 + # proc-receive hook + proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic1 + proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic + proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic2 + proc-receive> ok refs/for/main/topic1 + proc-receive> option fall-through + proc-receive> ok refs/for/main/topic2 + proc-receive> option refname refs/for/changes/23/123/1 + proc-receive> option new-oid <COMMIT-A> + proc-receive> ok refs/for/main/topic2 + proc-receive> option refname refs/for/changes/24/124/2 + proc-receive> option old-oid <COMMIT-B> + proc-receive> option new-oid <COMMIT-A> + proc-receive> option forced-update + proc-receive> ng refs/for/next/topic target branch not exist + 000eunpack ok + 0017ok refs/heads/main + 001cok refs/for/main/topic1 + 0016ok refs/heads/foo + 0033ng refs/for/next/topic target branch not exist + 001cok refs/for/main/topic2 + 0000# post-receive hook + post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main + post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic1 + post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo + post-receive< <ZERO-OID> <COMMIT-A> refs/for/changes/23/123/1 + post-receive< <COMMIT-B> <COMMIT-A> refs/for/changes/24/124/2 + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/for/main/topic1 + <COMMIT-A> refs/heads/foo + <COMMIT-B> refs/heads/main + EOF +' diff --git a/t/t5411/test-0000-standard-git-push.sh b/t/t5411/test-0000-standard-git-push.sh new file mode 100644 index 0000000000..ce64bb660b --- /dev/null +++ b/t/t5411/test-0000-standard-git-push.sh @@ -0,0 +1,134 @@ +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(B) next(A) +test_expect_success "git-push ($PROTOCOL)" ' + git -C workbench push origin \ + $B:refs/heads/main \ + HEAD:refs/heads/next \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> main + > * [new branch] HEAD -> next + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(A) +# Refs of workbench: main(A) tags/v123 +# git-push --atomic: main(A) next(B) +test_expect_success "git-push --atomic ($PROTOCOL)" ' + test_must_fail git -C workbench push --atomic origin \ + main \ + $B:refs/heads/next \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + format_and_save_expect <<-EOF && + > To <URL/of/upstream.git> + > ! [rejected] main -> main (non-fast-forward) + > ! [rejected] <COMMIT-B> -> next (atomic push failed) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(A) next(B) +test_expect_success "non-fast-forward git-push ($PROTOCOL)" ' + test_must_fail git \ + -C workbench \ + -c advice.pushUpdateRejected=false \ + push origin \ + main \ + $B:refs/heads/next \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/next Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/next Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> next + > ! [rejected] main -> main (non-fast-forward) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-B> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(B) +# Refs of workbench: main(A) tags/v123 +# git-push -f : main(A) NULL tags/v123 refs/review/main/topic(A) a/b/c(A) +test_expect_success "git-push -f ($PROTOCOL)" ' + git -C workbench push -f origin \ + refs/tags/v123 \ + :refs/heads/next \ + main \ + main:refs/review/main/topic \ + HEAD:refs/heads/a/b/c \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: pre-receive< <COMMIT-B> <ZERO-OID> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: post-receive< <COMMIT-B> <ZERO-OID> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c Z + > To <URL/of/upstream.git> + > + <COMMIT-B>...<COMMIT-A> main -> main (forced update) + > - [deleted] next + > * [new tag] v123 -> v123 + > * [new reference] main -> refs/review/main/topic + > * [new branch] HEAD -> a/b/c + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/a/b/c + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/review/main/topic + <TAG-v123> refs/tags/v123 + EOF +' + +# Refs of upstream : main(A) tags/v123 refs/review/main/topic(A) a/b/c(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + ( + cd "$upstream" && + git update-ref -d refs/review/main/topic && + git update-ref -d refs/tags/v123 && + git update-ref -d refs/heads/a/b/c + ) +' diff --git a/t/t5411/test-0001-standard-git-push--porcelain.sh b/t/t5411/test-0001-standard-git-push--porcelain.sh new file mode 100644 index 0000000000..373ec3d865 --- /dev/null +++ b/t/t5411/test-0001-standard-git-push--porcelain.sh @@ -0,0 +1,138 @@ +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(B) next(A) +test_expect_success "git-push ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + $B:refs/heads/main \ + HEAD:refs/heads/next \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > <COMMIT-B>:refs/heads/main <COMMIT-A>..<COMMIT-B> + > * HEAD:refs/heads/next [new branch] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(A) +# Refs of workbench: main(A) tags/v123 +# git-push --atomic: main(A) next(B) +test_expect_success "git-push --atomic ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --atomic --porcelain origin \ + main \ + $B:refs/heads/next \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "s/^# GETTEXT POISON #//" \ + -e "/^To / { p; }" \ + -e "/^!/ { p; }" \ + <out-$test_count >actual && + format_and_save_expect <<-EOF && + > To <URL/of/upstream.git> + > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward) + > ! <COMMIT-B>:refs/heads/next [rejected] (atomic push failed) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(A) next(B) +test_expect_success "non-fast-forward git-push ($PROTOCOL/porcelain)" ' + test_must_fail git \ + -C workbench \ + -c advice.pushUpdateRejected=false \ + push --porcelain origin \ + main \ + $B:refs/heads/next \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/next Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/next Z + > To <URL/of/upstream.git> + > <COMMIT-B>:refs/heads/next <COMMIT-A>..<COMMIT-B> + > ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + <COMMIT-B> refs/heads/next + EOF +' + +# Refs of upstream : main(B) next(B) +# Refs of workbench: main(A) tags/v123 +# git-push -f : main(A) NULL tags/v123 refs/review/main/topic(A) a/b/c(A) +test_expect_success "git-push -f ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain -f origin \ + refs/tags/v123 \ + :refs/heads/next \ + main \ + main:refs/review/main/topic \ + HEAD:refs/heads/a/b/c \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: pre-receive< <COMMIT-B> <ZERO-OID> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: post-receive< <COMMIT-B> <ZERO-OID> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c Z + > To <URL/of/upstream.git> + > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update) + > - :refs/heads/next [deleted] + > * refs/tags/v123:refs/tags/v123 [new tag] + > * refs/heads/main:refs/review/main/topic [new reference] + > * HEAD:refs/heads/a/b/c [new branch] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/a/b/c + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/review/main/topic + <TAG-v123> refs/tags/v123 + EOF +' + +# Refs of upstream : main(A) tags/v123 refs/review/main/topic(A) a/b/c(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + ( + cd "$upstream" && + git update-ref -d refs/review/main/topic && + git update-ref -d refs/tags/v123 && + git update-ref -d refs/heads/a/b/c + ) +' diff --git a/t/t5411/test-0002-pre-receive-declined.sh b/t/t5411/test-0002-pre-receive-declined.sh new file mode 100644 index 0000000000..0c3490c9b1 --- /dev/null +++ b/t/t5411/test-0002-pre-receive-declined.sh @@ -0,0 +1,31 @@ +test_expect_success "setup pre-receive hook ($PROTOCOL)" ' + mv "$upstream/hooks/pre-receive" "$upstream/hooks/pre-receive.ok" && + write_script "$upstream/hooks/pre-receive" <<-EOF + exit 1 + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(B) next(A) +test_expect_success "git-push is declined ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + $B:refs/heads/main \ + HEAD:refs/heads/next \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] <COMMIT-B> -> main (pre-receive hook declined) + ! [remote rejected] HEAD -> next (pre-receive hook declined) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "cleanup ($PROTOCOL)" ' + mv "$upstream/hooks/pre-receive.ok" "$upstream/hooks/pre-receive" +' diff --git a/t/t5411/test-0003-pre-receive-declined--porcelain.sh b/t/t5411/test-0003-pre-receive-declined--porcelain.sh new file mode 100644 index 0000000000..2393b04ad9 --- /dev/null +++ b/t/t5411/test-0003-pre-receive-declined--porcelain.sh @@ -0,0 +1,32 @@ +test_expect_success "setup pre-receive hook ($PROTOCOL/porcelain)" ' + mv "$upstream/hooks/pre-receive" "$upstream/hooks/pre-receive.ok" && + write_script "$upstream/hooks/pre-receive" <<-EOF + exit 1 + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git-push : main(B) next(A) +test_expect_success "git-push is declined ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + $B:refs/heads/main \ + HEAD:refs/heads/next \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > To <URL/of/upstream.git> + > ! <COMMIT-B>:refs/heads/main [remote rejected] (pre-receive hook declined) + > ! HEAD:refs/heads/next [remote rejected] (pre-receive hook declined) + Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + mv "$upstream/hooks/pre-receive.ok" "$upstream/hooks/pre-receive" +' diff --git a/t/t5411/test-0010-proc-receive-settings.sh b/t/t5411/test-0010-proc-receive-settings.sh new file mode 100644 index 0000000000..a36809927b --- /dev/null +++ b/t/t5411/test-0010-proc-receive-settings.sh @@ -0,0 +1,7 @@ +test_expect_success "add two receive.procReceiveRefs settings" ' + ( + cd "$upstream" && + git config --add receive.procReceiveRefs refs/for && + git config --add receive.procReceiveRefs refs/review/ + ) +' diff --git a/t/t5411/test-0011-no-hook-error.sh b/t/t5411/test-0011-no-hook-error.sh new file mode 100644 index 0000000000..d35002b1f0 --- /dev/null +++ b/t/t5411/test-0011-no-hook-error.sh @@ -0,0 +1,60 @@ +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: no hook, fail to push special ref ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:next \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: error: cannot find hook "proc-receive" Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > * [new branch] HEAD -> next + > ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref -d refs/heads/next +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push --atomic: (B) next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: no hook, all failed for atomic push ($PROTOCOL)" ' + test_must_fail git -C workbench push --atomic origin \ + $B:main \ + HEAD:next \ + HEAD:refs/for/main/topic >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: error: cannot find hook "proc-receive" Z + > To <URL/of/upstream.git> + > ! [remote rejected] <COMMIT-B> -> main (fail to run proc-receive hook) + > ! [remote rejected] HEAD -> next (fail to run proc-receive hook) + > ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0012-no-hook-error--porcelain.sh b/t/t5411/test-0012-no-hook-error--porcelain.sh new file mode 100644 index 0000000000..04468b5018 --- /dev/null +++ b/t/t5411/test-0012-no-hook-error--porcelain.sh @@ -0,0 +1,62 @@ +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: no hook, fail to push special ref ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:next \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: error: cannot find hook "proc-receive" Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > * HEAD:refs/heads/next [new branch] + > ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref -d refs/heads/next +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push --atomic: (B) next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: no hook, all failed for atomic push ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain --atomic origin \ + $B:main \ + HEAD:next \ + HEAD:refs/for/main/topic >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: error: cannot find hook "proc-receive" Z + > To <URL/of/upstream.git> + > ! <COMMIT-B>:refs/heads/main [remote rejected] (fail to run proc-receive hook) + > ! HEAD:refs/heads/next [remote rejected] (fail to run proc-receive hook) + > ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0013-bad-protocol.sh b/t/t5411/test-0013-bad-protocol.sh new file mode 100644 index 0000000000..c08a00ded2 --- /dev/null +++ b/t/t5411/test-0013-bad-protocol.sh @@ -0,0 +1,302 @@ +test_expect_success "setup proc-receive hook (unknown version, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --version 2 + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (unknown version, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + + # Check status report for git-push + sed -n \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <actual >actual-report && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual-report && + + # Check error message from "receive-pack", but ignore unstable fatal error + # message ("remote: fatal: the remote end hung up unexpectedly") which + # is different from the remote HTTP server with different locale settings. + grep "^remote: error:" <actual >actual-error && + format_and_save_expect <<-EOF && + > remote: error: proc-receive version "2" is not supported Z + EOF + test_cmp expect actual-error && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-version, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-version + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-version option" out-$test_count && + grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-write-version, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-write-version + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-write-version option" out-$test_count && + grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-commands, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-commands + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-commands option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-push-options, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-push-options + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $PROTOCOL)" ' + git -C "$upstream" config receive.advertisePushOptions true && + test_must_fail git -C workbench push origin \ + -o reviewers=user1,user2 \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-write-report, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-write-report + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; }" \ + -e "/^ ! / { p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-write-report option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (no report, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (no report, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > * [new branch] HEAD -> next + > ! [remote rejected] HEAD -> refs/for/main/topic (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref -d refs/heads/next + +' + +test_expect_success "setup proc-receive hook (no ref, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: bad protocol (no ref, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic\ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok Z + > remote: error: proc-receive reported incomplete status line: "ok" Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/main/topic (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (unknown status, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "xx refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: bad protocol (unknown status, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> xx refs/for/main/topic Z + > remote: error: proc-receive reported bad status "xx" on ref "refs/for/main/topic" Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/main/topic (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0014-bad-protocol--porcelain.sh b/t/t5411/test-0014-bad-protocol--porcelain.sh new file mode 100644 index 0000000000..3eaa597e0f --- /dev/null +++ b/t/t5411/test-0014-bad-protocol--porcelain.sh @@ -0,0 +1,304 @@ +test_expect_success "setup proc-receive hook (unknown version, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --version 2 + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (unknown version, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + + # Check status report for git-push + sed -n \ + -e "/^To / { p; n; p; n; p; }" \ + <actual >actual-report && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual-report && + + # Check error message from "receive-pack", but ignore unstable fatal error + # message ("remote: fatal: the remote end hung up unexpectedly") which + # is different from the remote HTTP server with different locale settings. + grep "^remote: error:" <actual >actual-error && + format_and_save_expect <<-EOF && + > remote: error: proc-receive version "2" is not supported Z + EOF + test_cmp expect actual-error && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-version, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-version + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; n; p; n; p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-version option" out-$test_count && + grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-write-version, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-write-version + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; n; p; n; p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-write-version option" out-$test_count && + grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-commands, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-commands + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; n; p; n; p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-commands option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-read-push-options, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-read-push-options + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $PROTOCOL/porcelain)" ' + git -C "$upstream" config receive.advertisePushOptions true && + test_must_fail git -C workbench push --porcelain origin \ + -o reviewers=user1,user2 \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; n; p; n; p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (hook --die-write-report, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v --die-write-report + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + filter_out_user_friendly_and_stable_output \ + -e "/^To / { p; n; p; n; p; }" \ + <out-$test_count >actual && + cat >expect <<-EOF && + To <URL/of/upstream.git> + ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) + Done + EOF + test_cmp expect actual && + grep "remote: fatal: die with the --die-write-report option" out-$test_count && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (no report, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : next(A) refs/for/main/topic(A) +test_expect_success "proc-receive: bad protocol (no report, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > To <URL/of/upstream.git> + > * HEAD:refs/heads/next [new branch] + > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref -d refs/heads/next +' + +test_expect_success "setup proc-receive hook (no ref, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: bad protocol (no ref, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic\ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok Z + > remote: error: proc-receive reported incomplete status line: "ok" Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (unknown status, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "xx refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: bad protocol (unknown status, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> xx refs/for/main/topic Z + > remote: error: proc-receive reported bad status "xx" on ref "refs/for/main/topic" Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0020-report-ng.sh b/t/t5411/test-0020-report-ng.sh new file mode 100644 index 0000000000..e915dbc28d --- /dev/null +++ b/t/t5411/test-0020-report-ng.sh @@ -0,0 +1,63 @@ +test_expect_success "setup proc-receive hook (ng, no message, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ng refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: fail to update (ng, no message, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ng refs/for/main/topic Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/main/topic (failed) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (ng message, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ng refs/for/main/topic error msg" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: fail to update (ng, with message, $PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ng refs/for/main/topic error msg Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/main/topic (error msg) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0021-report-ng--porcelain.sh b/t/t5411/test-0021-report-ng--porcelain.sh new file mode 100644 index 0000000000..2a392e099b --- /dev/null +++ b/t/t5411/test-0021-report-ng--porcelain.sh @@ -0,0 +1,65 @@ +test_expect_success "setup proc-receive hook (ng, no message, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ng refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: fail to update (ng, no message, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ng refs/for/main/topic Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/main/topic [remote rejected] (failed) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (ng message, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ng refs/for/main/topic error msg" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: fail to update (ng, with message, $PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ng refs/for/main/topic error msg Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/main/topic [remote rejected] (error msg) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0022-report-unexpect-ref.sh b/t/t5411/test-0022-report-unexpect-ref.sh new file mode 100644 index 0000000000..f7a494bdb9 --- /dev/null +++ b/t/t5411/test-0022-report-unexpect-ref.sh @@ -0,0 +1,43 @@ +test_expect_success "setup proc-receive hook (unexpected ref, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : (B) refs/for/main/topic +test_expect_success "proc-receive: report unexpected ref ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + $B:refs/heads/main \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/heads/main Z + > remote: error: proc-receive reported status on unexpected ref: refs/heads/main Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> main + > ! [remote rejected] HEAD -> refs/for/main/topic (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + EOF +' + +# Refs of upstream : main(B) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref refs/heads/main $A +' diff --git a/t/t5411/test-0023-report-unexpect-ref--porcelain.sh b/t/t5411/test-0023-report-unexpect-ref--porcelain.sh new file mode 100644 index 0000000000..63c479e975 --- /dev/null +++ b/t/t5411/test-0023-report-unexpect-ref--porcelain.sh @@ -0,0 +1,44 @@ +test_expect_success "setup proc-receive hook (unexpected ref, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : (B) refs/for/main/topic +test_expect_success "proc-receive: report unexpected ref ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + $B:refs/heads/main \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/heads/main Z + > remote: error: proc-receive reported status on unexpected ref: refs/heads/main Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > To <URL/of/upstream.git> + > <COMMIT-B>:refs/heads/main <COMMIT-A>..<COMMIT-B> + > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/main + EOF +' + +# Refs of upstream : main(B) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref refs/heads/main $A +' diff --git a/t/t5411/test-0024-report-unknown-ref.sh b/t/t5411/test-0024-report-unknown-ref.sh new file mode 100644 index 0000000000..af055aa086 --- /dev/null +++ b/t/t5411/test-0024-report-unknown-ref.sh @@ -0,0 +1,32 @@ +test_expect_success "setup proc-receive hook (unexpected ref, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/a/b/c/my/topic +test_expect_success "proc-receive: report unknown reference ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/a/b/c/my/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: error: proc-receive reported status on unknown ref: refs/for/main/topic Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/a/b/c/my/topic (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0025-report-unknown-ref--porcelain.sh b/t/t5411/test-0025-report-unknown-ref--porcelain.sh new file mode 100644 index 0000000000..99601ca321 --- /dev/null +++ b/t/t5411/test-0025-report-unknown-ref--porcelain.sh @@ -0,0 +1,33 @@ +test_expect_success "setup proc-receive hook (unexpected ref, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/a/b/c/my/topic +test_expect_success "proc-receive: report unknown reference ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/a/b/c/my/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: error: proc-receive reported status on unknown ref: refs/for/main/topic Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/a/b/c/my/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0026-push-options.sh b/t/t5411/test-0026-push-options.sh new file mode 100644 index 0000000000..fec5f95793 --- /dev/null +++ b/t/t5411/test-0026-push-options.sh @@ -0,0 +1,133 @@ +test_expect_success "setup proc-receive hook and disable push-options ($PROTOCOL)" ' + git -C "$upstream" config receive.advertisePushOptions false && + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : refs/for/main/topic +test_expect_success "proc-receive: not support push options ($PROTOCOL)" ' + test_must_fail git -C workbench push \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + test_i18ngrep "fatal: the receiving end does not support push options" \ + actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "enable push options ($PROTOCOL)" ' + git -C "$upstream" config receive.advertisePushOptions true +' + +test_expect_success "setup version=0 for proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + --version 0 \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : next(A) refs/for/main/topic +test_expect_success "proc-receive: ignore push-options for version 0 ($PROTOCOL)" ' + git -C workbench push \ + --atomic \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * [new branch] HEAD -> next + > * [new reference] HEAD -> refs/for/main/topic + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +test_expect_success "restore proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref -d refs/heads/next +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : next(A) refs/for/main/topic +test_expect_success "proc-receive: push with options ($PROTOCOL)" ' + git -C workbench push \ + --atomic \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive: atomic push_options Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< issue=123 Z + > remote: proc-receive< reviewer=user1 Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * [new branch] HEAD -> next + > * [new reference] HEAD -> refs/for/main/topic + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref -d refs/heads/next +' diff --git a/t/t5411/test-0027-push-options--porcelain.sh b/t/t5411/test-0027-push-options--porcelain.sh new file mode 100644 index 0000000000..8fb75a8789 --- /dev/null +++ b/t/t5411/test-0027-push-options--porcelain.sh @@ -0,0 +1,138 @@ +test_expect_success "setup proc-receive hook and disable push-options ($PROTOCOL/porcelain)" ' + git -C "$upstream" config receive.advertisePushOptions false && + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : refs/for/main/topic +test_expect_success "proc-receive: not support push options ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push \ + --porcelain \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + test_i18ngrep "fatal: the receiving end does not support push options" \ + actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "enable push options ($PROTOCOL/porcelain)" ' + git -C "$upstream" config receive.advertisePushOptions true +' + +test_expect_success "setup version=0 for proc-receive hook ($PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + --version 0 \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : next(A) refs/for/main/topic +test_expect_success "proc-receive: ignore push-options for version 0 ($PROTOCOL/porcelain)" ' + git -C workbench push \ + --porcelain \ + --atomic \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * HEAD:refs/heads/next [new branch] + > * HEAD:refs/for/main/topic [new reference] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +test_expect_success "restore proc-receive hook ($PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref -d refs/heads/next +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push -o ... : next(A) refs/for/main/topic +test_expect_success "proc-receive: push with options ($PROTOCOL/porcelain)" ' + git -C workbench push \ + --porcelain \ + --atomic \ + -o issue=123 \ + -o reviewer=user1 \ + origin \ + HEAD:refs/heads/next \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive: atomic push_options Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< issue=123 Z + > remote: proc-receive< reviewer=user1 Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * HEAD:refs/heads/next [new branch] + > * HEAD:refs/for/main/topic [new reference] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/next + EOF +' + +# Refs of upstream : main(A) next(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref -d refs/heads/next +' diff --git a/t/t5411/test-0030-report-ok.sh b/t/t5411/test-0030-report-ok.sh new file mode 100644 index 0000000000..a3a6278213 --- /dev/null +++ b/t/t5411/test-0030-report-ok.sh @@ -0,0 +1,33 @@ +test_expect_success "setup proc-receive hook (ok, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: ok ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/for/main/topic + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0031-report-ok--porcelain.sh b/t/t5411/test-0031-report-ok--porcelain.sh new file mode 100644 index 0000000000..0e175388b6 --- /dev/null +++ b/t/t5411/test-0031-report-ok--porcelain.sh @@ -0,0 +1,34 @@ +test_expect_success "setup proc-receive hook (ok, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic +test_expect_success "proc-receive: ok ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * HEAD:refs/for/main/topic [new reference] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0032-report-with-options.sh b/t/t5411/test-0032-report-with-options.sh new file mode 100644 index 0000000000..988a4302a6 --- /dev/null +++ b/t/t5411/test-0032-report-with-options.sh @@ -0,0 +1,253 @@ +test_expect_success "setup proc-receive hook (option without matching ok, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option without matching ok ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: error: proc-receive reported "option" without a matching "ok/ng" directive Z + > To <URL/of/upstream.git> + > ! [remote rejected] HEAD -> refs/for/main/topic (proc-receive failed to report status) + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/pull/123/head + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname and forced-update, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option forced-update" + EOF +' +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname and forced-update ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/pull/123/head + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname and old-oid, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname and old-oid ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > <COMMIT-B>..<COMMIT-A> HEAD -> refs/pull/123/head + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option old-oid, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option old-oid ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > <COMMIT-B>..<COMMIT-A> HEAD -> refs/for/main/topic + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option old-oid and new-oid, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option old-oid and new-oid ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/for/main/topic + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (report with multiple rewrites, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/a/b/c/topic" \ + -r "ok refs/for/next/topic" \ + -r "option refname refs/pull/123/head" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/124/head" \ + -r "option old-oid $B" \ + -r "option forced-update" \ + -r "option new-oid $A" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report with multiple rewrites ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/next/topic \ + HEAD:refs/for/a/b/c/topic \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/a/b/c/topic Z + > remote: proc-receive> ok refs/for/next/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option forced-update Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/pull/123/head + > * [new reference] HEAD -> refs/for/a/b/c/topic + > + <COMMIT-B>...<COMMIT-A> HEAD -> refs/pull/124/head (forced update) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0033-report-with-options--porcelain.sh b/t/t5411/test-0033-report-with-options--porcelain.sh new file mode 100644 index 0000000000..daacb3d69d --- /dev/null +++ b/t/t5411/test-0033-report-with-options--porcelain.sh @@ -0,0 +1,262 @@ +test_expect_success "setup proc-receive hook (option without matching ok, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option without matching ok ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: error: proc-receive reported "option" without a matching "ok/ng" directive Z + > To <URL/of/upstream.git> + > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > * HEAD:refs/pull/123/head [new reference] + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname and forced-update, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option forced-update" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname and forced-update ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > * HEAD:refs/pull/123/head [new reference] + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option refname and old-oid, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option refname and old-oid ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/123/head Z + > To <URL/of/upstream.git> + > HEAD:refs/pull/123/head <COMMIT-B>..<COMMIT-A> + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option old-oid, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option old-oid ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/for/main/topic Z + > To <URL/of/upstream.git> + > HEAD:refs/for/main/topic <COMMIT-B>..<COMMIT-A> + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (option old-oid and new-oid, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report option old-oid and new-oid ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > HEAD:refs/for/main/topic <COMMIT-A>..<COMMIT-B> + > Done + EOF + test_cmp expect actual +' + +test_expect_success "setup proc-receive hook (report with multiple rewrites, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/a/b/c/topic" \ + -r "ok refs/for/next/topic" \ + -r "option refname refs/pull/123/head" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/124/head" \ + -r "option old-oid $B" \ + -r "option forced-update" \ + -r "option new-oid $A" + + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/next/topic(A) refs/for/a/b/c/topic(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report with multiple rewrites ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/next/topic \ + HEAD:refs/for/a/b/c/topic \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/a/b/c/topic Z + > remote: proc-receive> ok refs/for/next/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option forced-update Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head Z + > To <URL/of/upstream.git> + > * HEAD:refs/pull/123/head [new reference] + > * HEAD:refs/for/a/b/c/topic [new reference] + > + HEAD:refs/pull/124/head <COMMIT-B>...<COMMIT-A> (forced update) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0034-report-ft.sh b/t/t5411/test-0034-report-ft.sh new file mode 100644 index 0000000000..73a47d1ffd --- /dev/null +++ b/t/t5411/test-0034-report-ft.sh @@ -0,0 +1,42 @@ +test_expect_success "setup proc-receive hook (ft, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option fall-through" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(B) +test_expect_success "proc-receive: fall throught, let receive-pack to execute ($PROTOCOL)" ' + git -C workbench push origin \ + $B:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option fall-through Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * [new reference] <COMMIT-B> -> refs/for/main/topic + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/for/main/topic + <COMMIT-A> refs/heads/main + EOF +' + +# Refs of upstream : main(A) refs/for/main/topic(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + git -C "$upstream" update-ref -d refs/for/main/topic +' diff --git a/t/t5411/test-0035-report-ft--porcelain.sh b/t/t5411/test-0035-report-ft--porcelain.sh new file mode 100644 index 0000000000..c350201107 --- /dev/null +++ b/t/t5411/test-0035-report-ft--porcelain.sh @@ -0,0 +1,43 @@ +test_expect_success "setup proc-receive hook (fall-through, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option fall-through" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(B) +test_expect_success "proc-receive: fall throught, let receive-pack to execute ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + $B:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option fall-through Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > * <COMMIT-B>:refs/for/main/topic [new reference] + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/for/main/topic + <COMMIT-A> refs/heads/main + EOF +' + +# Refs of upstream : main(A) refs/for/main/topic(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + git -C "$upstream" update-ref -d refs/for/main/topic +' diff --git a/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh b/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh new file mode 100644 index 0000000000..8c8a6c16e1 --- /dev/null +++ b/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh @@ -0,0 +1,221 @@ +test_expect_success "setup git config for remote-tracking of special refs" ' + ( + cd workbench && + if ! git config --get-all remote.origin.fetch | grep refs/for/ + then + git config --add remote.origin.fetch \ + "+refs/for/*:refs/t/for/*" && + git config --add remote.origin.fetch \ + "+refs/pull/*:refs/t/pull/*" && + git config --add remote.origin.fetch \ + "+refs/changes/*:refs/t/changes/*" + fi + ) +' + +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, no refname for the 1st rewrite, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/1" \ + -r "option old-oid $ZERO_OID" \ + -r "option new-oid $A" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/25/125/1" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrite for one ref, no refname for the 1st rewrite ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/1 Z + > remote: proc-receive> option old-oid <ZERO-OID> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/25/125/1 Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/25/125/1 Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/for/main/topic + > * [new reference] HEAD -> refs/changes/24/124/1 + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/changes/25/125/1 + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "proc-receive: check remote-tracking #1 ($PROTOCOL)" ' + git -C workbench show-ref | + grep -v -e refs/remotes -e refs/heads -e refs/tags >out && + make_user_friendly_and_stable_output <out >actual && + cat >expect <<-EOF && + <COMMIT-A> refs/t/changes/24/124/1 + <COMMIT-B> refs/t/changes/25/125/1 + <COMMIT-B> refs/t/for/main/topic + EOF + test_cmp expect actual && + git -C workbench update-ref -d refs/t/for/main/topic && + git -C workbench update-ref -d refs/t/changes/24/124/1 && + git -C workbench update-ref -d refs/t/changes/25/125/1 +' + +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, no refname for the 2nd rewrite, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/1" \ + -r "option old-oid $ZERO_OID" \ + -r "option new-oid $A" \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/25/125/1" \ + -r "option old-oid $B" \ + -r "option new-oid $A" \ + -r "option forced-update" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrites for one ref, no refname for the 2nd rewrite ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/1 Z + > remote: proc-receive> option old-oid <ZERO-OID> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/25/125/1 Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/changes/25/125/1 Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/changes/24/124/1 + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/for/main/topic + > + <COMMIT-B>...<COMMIT-A> HEAD -> refs/changes/25/125/1 (forced update) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "proc-receive: check remote-tracking #2 ($PROTOCOL)" ' + git -C workbench show-ref | + grep -v -e refs/remotes -e refs/heads -e refs/tags >out && + make_user_friendly_and_stable_output <out >actual && + cat >expect <<-EOF && + <COMMIT-A> refs/t/changes/24/124/1 + <COMMIT-A> refs/t/changes/25/125/1 + <COMMIT-B> refs/t/for/main/topic + EOF + test_cmp expect actual && + git -C workbench update-ref -d refs/t/for/main/topic && + git -C workbench update-ref -d refs/t/changes/24/124/1 && + git -C workbench update-ref -d refs/t/changes/25/125/1 +' + +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, $PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/23/123/1" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/2" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrites for one ref ($PROTOCOL)" ' + git -C workbench push origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/23/123/1 Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/2 Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/23/123/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/24/124/2 Z + > To <URL/of/upstream.git> + > * [new reference] HEAD -> refs/changes/23/123/1 + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/changes/24/124/2 + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "proc-receive: check remote-tracking #3 ($PROTOCOL)" ' + git -C workbench show-ref | + grep -v -e refs/remotes -e refs/heads -e refs/tags >out && + make_user_friendly_and_stable_output <out >actual && + cat >expect <<-EOF && + <COMMIT-A> refs/t/changes/23/123/1 + <COMMIT-B> refs/t/changes/24/124/2 + EOF + test_cmp expect actual && + git -C workbench update-ref -d refs/t/changes/24/124/1 && + git -C workbench update-ref -d refs/t/changes/25/125/2 +' diff --git a/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh b/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh new file mode 100644 index 0000000000..bc44810f33 --- /dev/null +++ b/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh @@ -0,0 +1,166 @@ +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, no refname for the 1st rewrite, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/1" \ + -r "option old-oid $ZERO_OID" \ + -r "option new-oid $A" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/25/125/1" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrite for one ref, no refname for the 1st rewrite ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/1 Z + > remote: proc-receive> option old-oid <ZERO-OID> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/25/125/1 Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/25/125/1 Z + > To <URL/of/upstream.git> + > HEAD:refs/for/main/topic <COMMIT-A>..<COMMIT-B> + > * HEAD:refs/changes/24/124/1 [new reference] + > HEAD:refs/changes/25/125/1 <COMMIT-A>..<COMMIT-B> + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, no refname for the 2nd rewrite, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/1" \ + -r "option old-oid $ZERO_OID" \ + -r "option new-oid $A" \ + -r "ok refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/25/125/1" \ + -r "option old-oid $B" \ + -r "option new-oid $A" \ + -r "option forced-update" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrites for one ref, no refname for the 2nd rewrite ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/1 Z + > remote: proc-receive> option old-oid <ZERO-OID> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/25/125/1 Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/changes/25/125/1 Z + > To <URL/of/upstream.git> + > * HEAD:refs/changes/24/124/1 [new reference] + > HEAD:refs/for/main/topic <COMMIT-A>..<COMMIT-B> + > + HEAD:refs/changes/25/125/1 <COMMIT-B>...<COMMIT-A> (forced update) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +test_expect_success "setup proc-receive hook (multiple rewrites for one ref, $PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/23/123/1" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/changes/24/124/2" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : refs/for/main/topic(A) +test_expect_success "proc-receive: multiple rewrites for one ref ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain origin \ + HEAD:refs/for/main/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/23/123/1 Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/changes/24/124/2 Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/23/123/1 Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/24/124/2 Z + > To <URL/of/upstream.git> + > * HEAD:refs/changes/23/123/1 [new reference] + > HEAD:refs/changes/24/124/2 <COMMIT-A>..<COMMIT-B> + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' diff --git a/t/t5411/test-0038-report-mixed-refs.sh b/t/t5411/test-0038-report-mixed-refs.sh new file mode 100644 index 0000000000..e63fe7ba11 --- /dev/null +++ b/t/t5411/test-0038-report-mixed-refs.sh @@ -0,0 +1,87 @@ +test_expect_success "setup proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/next/topic2" \ + -r "ng refs/for/next/topic1 fail to call Web API" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : (B) bar(A) baz(A) refs/for/next/topic(A) foo(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL)" ' + test_must_fail git -C workbench push origin \ + $B:refs/heads/main \ + HEAD:refs/heads/bar \ + HEAD:refs/heads/baz \ + HEAD:refs/for/next/topic2 \ + HEAD:refs/for/next/topic1 \ + HEAD:refs/heads/foo \ + HEAD:refs/for/main/topic \ + HEAD:refs/for/next/topic3 \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/bar Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic1 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic3 Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic1 Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic3 Z + > remote: proc-receive> ok refs/for/next/topic2 Z + > remote: proc-receive> ng refs/for/next/topic1 fail to call Web API Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/bar Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> main + > * [new branch] HEAD -> bar + > * [new branch] HEAD -> baz + > * [new reference] HEAD -> refs/for/next/topic2 + > * [new branch] HEAD -> foo + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/for/main/topic + > ! [remote rejected] HEAD -> refs/for/next/topic1 (fail to call Web API) + > ! [remote rejected] HEAD -> refs/for/next/topic3 (proc-receive failed to report status) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/bar + <COMMIT-A> refs/heads/baz + <COMMIT-A> refs/heads/foo + <COMMIT-B> refs/heads/main + EOF +' + +# Refs of upstream : main(B) foo(A) bar(A)) baz(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + ( + cd "$upstream" && + git update-ref refs/heads/main $A && + git update-ref -d refs/heads/foo && + git update-ref -d refs/heads/bar && + git update-ref -d refs/heads/baz + ) +' diff --git a/t/t5411/test-0039-report-mixed-refs--porcelain.sh b/t/t5411/test-0039-report-mixed-refs--porcelain.sh new file mode 100644 index 0000000000..99d17b73af --- /dev/null +++ b/t/t5411/test-0039-report-mixed-refs--porcelain.sh @@ -0,0 +1,89 @@ +test_expect_success "setup proc-receive hook ($PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/for/next/topic2" \ + -r "ng refs/for/next/topic1 fail to call Web API" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/for/main/topic" \ + -r "option old-oid $A" \ + -r "option new-oid $B" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : (B) bar(A) baz(A) refs/for/next/topic(A) foo(A) refs/for/main/topic(A) +test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL/porcelain)" ' + test_must_fail git -C workbench push --porcelain origin \ + $B:refs/heads/main \ + HEAD:refs/heads/bar \ + HEAD:refs/heads/baz \ + HEAD:refs/for/next/topic2 \ + HEAD:refs/for/next/topic1 \ + HEAD:refs/heads/foo \ + HEAD:refs/for/main/topic \ + HEAD:refs/for/next/topic3 \ + >out-$test_count 2>&1 && + make_user_friendly_and_stable_output <out-$test_count >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/bar Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic1 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic3 Z + > remote: # proc-receive hook Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic1 Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic3 Z + > remote: proc-receive> ok refs/for/next/topic2 Z + > remote: proc-receive> ng refs/for/next/topic1 fail to call Web API Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/for/main/topic Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/bar Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/main/topic Z + > To <URL/of/upstream.git> + > <COMMIT-B>:refs/heads/main <COMMIT-A>..<COMMIT-B> + > * HEAD:refs/heads/bar [new branch] + > * HEAD:refs/heads/baz [new branch] + > * HEAD:refs/for/next/topic2 [new reference] + > * HEAD:refs/heads/foo [new branch] + > HEAD:refs/for/main/topic <COMMIT-A>..<COMMIT-B> + > ! HEAD:refs/for/next/topic1 [remote rejected] (fail to call Web API) + > ! HEAD:refs/for/next/topic3 [remote rejected] (proc-receive failed to report status) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/bar + <COMMIT-A> refs/heads/baz + <COMMIT-A> refs/heads/foo + <COMMIT-B> refs/heads/main + EOF +' + +# Refs of upstream : main(B) foo(A) bar(A)) baz(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + ( + cd "$upstream" && + git update-ref refs/heads/main $A && + git update-ref -d refs/heads/foo && + git update-ref -d refs/heads/bar && + git update-ref -d refs/heads/baz + ) + +' diff --git a/t/t5411/test-0040-process-all-refs.sh b/t/t5411/test-0040-process-all-refs.sh new file mode 100644 index 0000000000..2f405adefa --- /dev/null +++ b/t/t5411/test-0040-process-all-refs.sh @@ -0,0 +1,111 @@ +test_expect_success "config receive.procReceiveRefs = refs ($PROTOCOL)" ' + git -C "$upstream" config --unset-all receive.procReceiveRefs && + git -C "$upstream" config --add receive.procReceiveRefs refs +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "setup upstream branches ($PROTOCOL)" ' + ( + cd "$upstream" && + git update-ref refs/heads/main $B && + git update-ref refs/heads/foo $A && + git update-ref refs/heads/bar $A && + git update-ref refs/heads/baz $A + ) + +' + +test_expect_success "setup proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" \ + -r "option fall-through" \ + -r "ok refs/heads/foo" \ + -r "option fall-through" \ + -r "ok refs/heads/bar" \ + -r "option fall-through" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/next/topic" \ + -r "option refname refs/pull/124/head" \ + -r "option old-oid $B" \ + -r "option new-oid $A" \ + -r "option forced-update" + EOF +' + +# Refs of upstream : main(B) foo(A) bar(A)) baz(A) +# Refs of workbench: main(A) tags/v123 +# git push -f : main(A) (NULL) (B) refs/for/main/topic(A) refs/for/next/topic(A) +test_expect_success "proc-receive: process all refs ($PROTOCOL)" ' + git -C workbench push -f origin \ + HEAD:refs/heads/main \ + :refs/heads/foo \ + $B:refs/heads/bar \ + HEAD:refs/for/main/topic \ + HEAD:refs/for/next/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: proc-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: proc-receive> ok refs/heads/main Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/heads/foo Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/heads/bar Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/next/topic Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: post-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> bar + > - [deleted] foo + > + <COMMIT-B>...<COMMIT-A> HEAD -> main (forced update) + > <COMMIT-A>..<COMMIT-B> HEAD -> refs/pull/123/head + > + <COMMIT-B>...<COMMIT-A> HEAD -> refs/pull/124/head (forced update) + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/bar + <COMMIT-A> refs/heads/baz + <COMMIT-A> refs/heads/main + EOF +' + +# Refs of upstream : main(A) bar(A) baz(B) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL)" ' + ( + cd "$upstream" && + git update-ref -d refs/heads/bar && + git update-ref -d refs/heads/baz + ) +' diff --git a/t/t5411/test-0041-process-all-refs--porcelain.sh b/t/t5411/test-0041-process-all-refs--porcelain.sh new file mode 100644 index 0000000000..c88405792e --- /dev/null +++ b/t/t5411/test-0041-process-all-refs--porcelain.sh @@ -0,0 +1,112 @@ +test_expect_success "config receive.procReceiveRefs = refs ($PROTOCOL/porcelain)" ' + git -C "$upstream" config --unset-all receive.procReceiveRefs && + git -C "$upstream" config --add receive.procReceiveRefs refs +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "setup upstream branches ($PROTOCOL/porcelain)" ' + ( + cd "$upstream" && + git update-ref refs/heads/main $B && + git update-ref refs/heads/foo $A && + git update-ref refs/heads/bar $A && + git update-ref refs/heads/baz $A + ) + +' + +test_expect_success "setup proc-receive hook ($PROTOCOL/porcelain)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" \ + -r "option fall-through" \ + -r "ok refs/heads/foo" \ + -r "option fall-through" \ + -r "ok refs/heads/bar" \ + -r "option fall-through" \ + -r "ok refs/for/main/topic" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/for/next/topic" \ + -r "option refname refs/pull/124/head" \ + -r "option old-oid $B" \ + -r "option new-oid $A" \ + -r "option forced-update" + EOF +' + +# Refs of upstream : main(B) foo(A) bar(A)) baz(A) +# Refs of workbench: main(A) tags/v123 +# git push -f : main(A) (NULL) (B) refs/for/main/topic(A) refs/for/next/topic(A) +test_expect_success "proc-receive: process all refs ($PROTOCOL/porcelain)" ' + git -C workbench push --porcelain -f origin \ + HEAD:refs/heads/main \ + :refs/heads/foo \ + $B:refs/heads/bar \ + HEAD:refs/for/main/topic \ + HEAD:refs/for/next/topic \ + >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: # proc-receive hook Z + > remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: proc-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic Z + > remote: proc-receive> ok refs/heads/main Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/heads/foo Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/heads/bar Z + > remote: proc-receive> option fall-through Z + > remote: proc-receive> ok refs/for/main/topic Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/for/next/topic Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: proc-receive> option old-oid <COMMIT-B> Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: proc-receive> option forced-update Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar Z + > remote: post-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/main Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head Z + > remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head Z + > To <URL/of/upstream.git> + > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B> + > - :refs/heads/foo [deleted] + > + HEAD:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update) + > HEAD:refs/pull/123/head <COMMIT-A>..<COMMIT-B> + > + HEAD:refs/pull/124/head <COMMIT-B>...<COMMIT-A> (forced update) + > Done + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-B> refs/heads/bar + <COMMIT-A> refs/heads/baz + <COMMIT-A> refs/heads/main + EOF +' + +# Refs of upstream : main(A) bar(A) baz(B) +# Refs of workbench: main(A) tags/v123 +test_expect_success "cleanup ($PROTOCOL/porcelain)" ' + ( + cd "$upstream" && + git update-ref -d refs/heads/bar && + git update-ref -d refs/heads/baz + ) +' diff --git a/t/t5411/test-0050-proc-receive-refs-with-modifiers.sh b/t/t5411/test-0050-proc-receive-refs-with-modifiers.sh new file mode 100644 index 0000000000..31989f0185 --- /dev/null +++ b/t/t5411/test-0050-proc-receive-refs-with-modifiers.sh @@ -0,0 +1,129 @@ +test_expect_success "config receive.procReceiveRefs with modifiers ($PROTOCOL)" ' + ( + cd "$upstream" && + git config --unset-all receive.procReceiveRefs && + git config --add receive.procReceiveRefs m:refs/heads/main && + git config --add receive.procReceiveRefs ad:refs/heads && + git config --add receive.procReceiveRefs "a!:refs/heads" + ) +' + +test_expect_success "setup proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $A" \ + -r "option new-oid $B" \ + -r "ok refs/tags/v123 " \ + -r "option refname refs/pull/124/head" + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +# git push : main(B) tags/v123 +test_expect_success "proc-receive: update branch and new tag ($PROTOCOL)" ' + git -C workbench push origin \ + $B:refs/heads/main \ + v123 >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: # proc-receive hook Z + > remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/main Z + > remote: proc-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 Z + > remote: proc-receive> ok refs/heads/main Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <COMMIT-B> Z + > remote: proc-receive> ok refs/tags/v123 Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head Z + > remote: post-receive< <ZERO-OID> <TAG-v123> refs/pull/124/head Z + > To <URL/of/upstream.git> + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> refs/pull/123/head + > * [new reference] v123 -> refs/pull/124/head + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + EOF +' + +# Refs of upstream : main(A) +# Refs of workbench: main(A) tags/v123 +test_expect_success "setup upstream: create tags/v123 ($PROTOCOL)" ' + git -C "$upstream" update-ref refs/heads/topic $A && + git -C "$upstream" update-ref refs/tags/v123 $TAG && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-A> refs/heads/topic + <TAG-v123> refs/tags/v123 + EOF +' + +test_expect_success "setup proc-receive hook ($PROTOCOL)" ' + write_script "$upstream/hooks/proc-receive" <<-EOF + printf >&2 "# proc-receive hook\n" + test-tool proc-receive -v \ + -r "ok refs/heads/main" \ + -r "option refname refs/pull/123/head" \ + -r "option old-oid $A" \ + -r "option new-oid $ZERO_OID" \ + -r "ok refs/heads/next" \ + -r "option refname refs/pull/124/head" \ + -r "option new-oid $A" + EOF +' + +# Refs of upstream : main(A) topic(A) tags/v123 +# Refs of workbench: main(A) tags/v123 +# git push : NULL topic(B) NULL next(A) +test_expect_success "proc-receive: create/delete branch, and delete tag ($PROTOCOL)" ' + git -C workbench push origin \ + :refs/heads/main \ + $B:refs/heads/topic \ + $A:refs/heads/next \ + :refs/tags/v123 >out 2>&1 && + make_user_friendly_and_stable_output <out >actual && + format_and_save_expect <<-EOF && + > remote: # pre-receive hook Z + > remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/main Z + > remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/topic Z + > remote: pre-receive< <TAG-v123> <ZERO-OID> refs/tags/v123 Z + > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: # proc-receive hook Z + > remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/main Z + > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z + > remote: proc-receive> ok refs/heads/main Z + > remote: proc-receive> option refname refs/pull/123/head Z + > remote: proc-receive> option old-oid <COMMIT-A> Z + > remote: proc-receive> option new-oid <ZERO-OID> Z + > remote: proc-receive> ok refs/heads/next Z + > remote: proc-receive> option refname refs/pull/124/head Z + > remote: proc-receive> option new-oid <COMMIT-A> Z + > remote: # post-receive hook Z + > remote: post-receive< <COMMIT-A> <ZERO-OID> refs/pull/123/head Z + > remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/topic Z + > remote: post-receive< <TAG-v123> <ZERO-OID> refs/tags/v123 Z + > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/124/head Z + > To <URL/of/upstream.git> + > - [deleted] refs/pull/123/head + > <COMMIT-A>..<COMMIT-B> <COMMIT-B> -> topic + > - [deleted] v123 + > * [new reference] <COMMIT-A> -> refs/pull/124/head + EOF + test_cmp expect actual && + + test_cmp_refs -C "$upstream" <<-EOF + <COMMIT-A> refs/heads/main + <COMMIT-B> refs/heads/topic + EOF +' diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index 3557374312..8a5d3492c7 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -5,6 +5,9 @@ test_description='Testing multi_ack pack fetching' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Test fetch-pack/upload-pack pair. @@ -407,14 +410,14 @@ test_expect_success 'in_vain resetted upon ACK' ' rm -rf myserver myclient && git init myserver && - # Linked list of commits on master. The first is common; the rest are + # Linked list of commits on main. The first is common; the rest are # not. - test_commit -C myserver first_master_commit && + test_commit -C myserver first_main_commit && git clone "file://$(pwd)/myserver" myclient && test_commit_bulk -C myclient 255 && # Another linked list of commits on anotherbranch with no connection to - # master. The first is common; the rest are not. + # main. The first is common; the rest are not. git -C myserver checkout --orphan anotherbranch && test_commit -C myserver first_anotherbranch_commit && git -C myclient fetch origin anotherbranch:refs/heads/anotherbranch && @@ -422,14 +425,14 @@ test_expect_success 'in_vain resetted upon ACK' ' test_commit_bulk -C myclient 255 && # The new commit that the client wants to fetch. - git -C myserver checkout master && + git -C myserver checkout main && test_commit -C myserver to_fetch && # The client will send (as "have"s) all 256 commits in anotherbranch # first. The 256th commit is common between the client and the server, # and should reset in_vain. This allows negotiation to continue until # the client reports that first_anotherbranch_commit is common. - git -C myclient fetch --progress origin master 2>log && + git -C myclient fetch --progress origin main 2>log && test_i18ngrep "Total 3 " log ' @@ -544,7 +547,7 @@ test_expect_success 'test lonely missing ref' ' cd client && test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy 2>../error-m ) && - test_i18ncmp expect-error error-m + test_cmp expect-error error-m ' test_expect_success 'test missing ref after existing' ' @@ -552,7 +555,7 @@ test_expect_success 'test missing ref after existing' ' cd client && test_must_fail git fetch-pack --no-progress .. refs/heads/A refs/heads/xyzzy 2>../error-em ) && - test_i18ncmp expect-error error-em + test_cmp expect-error error-em ' test_expect_success 'test missing ref before existing' ' @@ -560,7 +563,7 @@ test_expect_success 'test missing ref before existing' ' cd client && test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy refs/heads/A 2>../error-me ) && - test_i18ncmp expect-error error-me + test_cmp expect-error error-me ' test_expect_success 'test --all, --depth, and explicit head' ' @@ -637,7 +640,7 @@ test_expect_success 'shallow fetch with tags does not break the repository' ' mkdir repo2 && cd repo2 && git init && - git fetch --depth=2 ../.git master:branch && + git fetch --depth=2 ../.git main:branch && git fsck ) ' @@ -662,7 +665,7 @@ test_expect_success 'fetch-pack can fetch a raw sha1 that is advertised as a ref git init client && git -C client fetch-pack ../server \ - $(git -C server rev-parse refs/heads/master) + $(git -C server rev-parse refs/heads/main) ' test_expect_success 'fetch-pack can fetch a raw sha1 overlapping a named ref' ' @@ -688,7 +691,7 @@ test_expect_success 'fetch-pack cannot fetch a raw sha1 that is not advertised a # Some protocol versions (e.g. 2) support fetching # unadvertised objects, so restrict this test to v0. test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C client fetch-pack ../server \ - $(git -C server rev-parse refs/heads/master^) 2>err && + $(git -C server rev-parse refs/heads/main^) 2>err && test_i18ngrep "Server does not allow request for unadvertised object" err ' @@ -822,7 +825,7 @@ test_expect_success 'clone shallow since ...' ' test_expect_success 'fetch shallow since ...' ' git -C shallow11 fetch --shallow-since "200000000 +0700" origin && - git -C shallow11 log --pretty=tformat:%s origin/master >actual && + git -C shallow11 log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && three two @@ -863,7 +866,7 @@ test_expect_success 'shallow since with commit graph and already-seen commit' ' ( cd shallow-since-graph && test_commit base && - test_commit master && + test_commit main && git checkout -b other HEAD^ && test_commit other && git commit-graph write --reachable && @@ -874,7 +877,7 @@ test_expect_success 'shallow since with commit graph and already-seen commit' ' $(echo "object-format=$(test_oid algo)" | packetize) 00010013deepen-since 1 $(echo "want $(git rev-parse other)" | packetize) - $(echo "have $(git rev-parse master)" | packetize) + $(echo "have $(git rev-parse main)" | packetize) 0000 EOF ) @@ -896,7 +899,7 @@ test_expect_success 'shallow clone exclude tag two' ' test_expect_success 'fetch exclude tag one' ' git -C shallow12 fetch --shallow-exclude one origin && - git -C shallow12 log --pretty=tformat:%s origin/master >actual && + git -C shallow12 log --pretty=tformat:%s origin/main >actual && test_write_lines three two >expected && test_cmp expected actual ' @@ -910,11 +913,11 @@ test_expect_success 'fetching deepen' ' test_commit three && git clone --depth 1 "file://$(pwd)/." deepen && test_commit four && - git -C deepen log --pretty=tformat:%s master >actual && + git -C deepen log --pretty=tformat:%s main >actual && echo three >expected && test_cmp expected actual && git -C deepen fetch --deepen=1 && - git -C deepen log --pretty=tformat:%s origin/master >actual && + git -C deepen log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && four three diff --git a/t/t5501-fetch-push-alternates.sh b/t/t5501-fetch-push-alternates.sh index 1bc57ac03f..66f19a4ef2 100755 --- a/t/t5501-fetch-push-alternates.sh +++ b/t/t5501-fetch-push-alternates.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='fetch/push involving alternates' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh count_objects () { @@ -45,7 +48,7 @@ test_expect_success setup ' test_expect_success 'pushing into a repository with the same alternate' ' ( cd one && - git push ../receiver master:refs/heads/it + git push ../receiver main:refs/heads/it ) && ( cd receiver && @@ -57,7 +60,7 @@ test_expect_success 'pushing into a repository with the same alternate' ' test_expect_success 'fetching from a repository with the same alternate' ' ( cd fetcher && - git fetch ../one master:refs/heads/it && + git fetch ../one main:refs/heads/it && count_objects >../fetcher.count ) && test_cmp one.count fetcher.count diff --git a/t/t5502-quickfetch.sh b/t/t5502-quickfetch.sh index 7a46cbdbe6..8c05c7715b 100755 --- a/t/t5502-quickfetch.sh +++ b/t/t5502-quickfetch.sh @@ -2,6 +2,9 @@ test_description='test quickfetch from local' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -108,14 +111,14 @@ test_expect_success 'quickfetch should not copy from alternate' ' q }" ) ) && - origin_master=$( ( + origin_main=$( ( cd quickclone && - git rev-parse origin/master + git rev-parse origin/main ) ) && echo "loose objects: $obj_cnt, packfiles: $pck_cnt" && test $obj_cnt -eq 0 && test $pck_cnt -eq 0 && - test z$origin_master = z$(git rev-parse master) + test z$origin_main = z$(git rev-parse main) ' diff --git a/t/t5503-tagfollow.sh b/t/t5503-tagfollow.sh index 6041a4dd32..195fc64dd4 100755 --- a/t/t5503-tagfollow.sh +++ b/t/t5503-tagfollow.sh @@ -2,6 +2,9 @@ test_description='test automatic tag following' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # End state of the repository: @@ -11,7 +14,7 @@ test_description='test automatic tag following' # L - A ------ O ------ B # \ \ \ # \ C - origin/cat \ -# origin/master master +# origin/main main test_expect_success setup ' test_tick && @@ -57,7 +60,7 @@ test_expect_success 'fetch A (new commit : 1 connection)' ' ( cd cloned && GIT_TRACE_PACKET=$UPATH git fetch && - test $A = $(git rev-parse --verify origin/master) + test $A = $(git rev-parse --verify origin/main) ) && get_needs $U >actual && test_cmp expect actual @@ -72,7 +75,7 @@ test_expect_success "create tag T on A, create C on branch cat" ' git add file && git commit -m C && C=$(git rev-parse --verify HEAD) && - git checkout master + git checkout main ' test_expect_success 'setup expect' ' @@ -123,7 +126,7 @@ test_expect_success 'fetch B, S (commit and tag : 1 connection)' ' ( cd cloned && GIT_TRACE_PACKET=$UPATH git fetch && - test $B = $(git rev-parse --verify origin/master) && + test $B = $(git rev-parse --verify origin/main) && test $B = $(git rev-parse --verify tag2^0) && test $S = $(git rev-parse --verify tag2) ) && @@ -138,7 +141,7 @@ want $S EOF ' -test_expect_success 'new clone fetch master and tags' ' +test_expect_success 'new clone fetch main and tags' ' test_might_fail git branch -D cat && rm -f $U && ( @@ -147,7 +150,7 @@ test_expect_success 'new clone fetch master and tags' ' git init && git remote add origin .. && GIT_TRACE_PACKET=$UPATH git fetch && - test $B = $(git rev-parse --verify origin/master) && + test $B = $(git rev-parse --verify origin/main) && test $S = $(git rev-parse --verify tag2) && test $B = $(git rev-parse --verify tag2^0) && test $T = $(git rev-parse --verify tag1) && diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 1a16ac4c0d..6e5a9c20e7 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='fetch/receive strict mode' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup and inject "corrupt or missing" object' ' @@ -25,7 +28,7 @@ test_expect_success 'fetch without strict' ' cd dst && git config fetch.fsckobjects false && git config transfer.fsckobjects false && - test_must_fail git fetch ../.git master + test_must_fail git fetch ../.git main ) ' @@ -36,7 +39,7 @@ test_expect_success 'fetch with !fetch.fsckobjects' ' cd dst && git config fetch.fsckobjects false && git config transfer.fsckobjects true && - test_must_fail git fetch ../.git master + test_must_fail git fetch ../.git main ) ' @@ -47,7 +50,7 @@ test_expect_success 'fetch with fetch.fsckobjects' ' cd dst && git config fetch.fsckobjects true && git config transfer.fsckobjects false && - test_must_fail git fetch ../.git master + test_must_fail git fetch ../.git main ) ' @@ -57,13 +60,13 @@ test_expect_success 'fetch with transfer.fsckobjects' ' ( cd dst && git config transfer.fsckobjects true && - test_must_fail git fetch ../.git master + test_must_fail git fetch ../.git main ) ' cat >exp <<EOF To dst -! refs/heads/master:refs/heads/test [remote rejected] (missing necessary objects) +! refs/heads/main:refs/heads/test [remote rejected] (missing necessary objects) Done EOF @@ -75,7 +78,7 @@ test_expect_success 'push without strict' ' git config fetch.fsckobjects false && git config transfer.fsckobjects false ) && - test_must_fail git push --porcelain dst master:refs/heads/test >act && + test_must_fail git push --porcelain dst main:refs/heads/test >act && test_cmp exp act ' @@ -87,13 +90,13 @@ test_expect_success 'push with !receive.fsckobjects' ' git config receive.fsckobjects false && git config transfer.fsckobjects true ) && - test_must_fail git push --porcelain dst master:refs/heads/test >act && + test_must_fail git push --porcelain dst main:refs/heads/test >act && test_cmp exp act ' cat >exp <<EOF To dst -! refs/heads/master:refs/heads/test [remote rejected] (unpacker error) +! refs/heads/main:refs/heads/test [remote rejected] (unpacker error) EOF test_expect_success 'push with receive.fsckobjects' ' @@ -104,7 +107,7 @@ test_expect_success 'push with receive.fsckobjects' ' git config receive.fsckobjects true && git config transfer.fsckobjects false ) && - test_must_fail git push --porcelain dst master:refs/heads/test >act && + test_must_fail git push --porcelain dst main:refs/heads/test >act && test_cmp exp act ' @@ -115,7 +118,7 @@ test_expect_success 'push with transfer.fsckobjects' ' cd dst && git config transfer.fsckobjects true ) && - test_must_fail git push --porcelain dst master:refs/heads/test >act && + test_must_fail git push --porcelain dst main:refs/heads/test >act && test_cmp exp act ' diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 8d62edd98b..e6e3c8f552 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -2,12 +2,15 @@ test_description='git remote porcelain-ish' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh setup_repository () { mkdir "$1" && ( cd "$1" && - git init && + git init -b main && >file && git add file && test_tick && @@ -17,7 +20,7 @@ setup_repository () { git add elif && test_tick && git commit -m "Second" && - git checkout master + git checkout main ) } @@ -56,12 +59,12 @@ test_expect_success 'add remote whose URL agrees with url.<...>.insteadOf' ' git remote add myremote git@host.com:team/repo.git ' -test_expect_success C_LOCALE_OUTPUT 'remote information for the origin' ' +test_expect_success 'remote information for the origin' ' ( cd test && tokens_match origin "$(git remote)" && - check_remote_track origin master side && - check_tracking_branch origin HEAD master side + check_remote_track origin main side && + check_tracking_branch origin HEAD main side ) ' @@ -70,7 +73,7 @@ test_expect_success 'add another remote' ' cd test && git remote add -f second ../two && tokens_match "origin second" "$(git remote)" && - check_tracking_branch second master side another && + check_tracking_branch second main side another && git for-each-ref "--format=%(refname)" refs/remotes | sed -e "/^refs\/remotes\/origin\//d" \ -e "/^refs\/remotes\/second\//d" >actual && @@ -78,11 +81,11 @@ test_expect_success 'add another remote' ' ) ' -test_expect_success C_LOCALE_OUTPUT 'check remote-tracking' ' +test_expect_success 'check remote-tracking' ' ( cd test && - check_remote_track origin master side && - check_remote_track second master side another + check_remote_track origin main side && + check_remote_track second main side another ) ' @@ -99,16 +102,16 @@ test_expect_success 'remote forces tracking branches' ' test_expect_success 'remove remote' ' ( cd test && - git symbolic-ref refs/remotes/second/HEAD refs/remotes/second/master && + git symbolic-ref refs/remotes/second/HEAD refs/remotes/second/main && git remote rm second ) ' -test_expect_success C_LOCALE_OUTPUT 'remove remote' ' +test_expect_success 'remove remote' ' ( cd test && tokens_match origin "$(git remote)" && - check_remote_track origin master side && + check_remote_track origin main side && git for-each-ref "--format=%(refname)" refs/remotes | sed -e "/^refs\/remotes\/origin\//d" >actual && test_must_be_empty actual @@ -121,13 +124,13 @@ test_expect_success 'remove remote protects local branches' ' cat >expect1 <<-\EOF && Note: A branch outside the refs/remotes/ hierarchy was not removed; to delete it, use: - git branch -d master + git branch -d main EOF cat >expect2 <<-\EOF && Note: Some branches outside the refs/remotes/ hierarchy were not removed; to delete them, use: git branch -d foobranch - git branch -d master + git branch -d main EOF git tag footag && git config --add remote.oops.fetch "+refs/*:refs/*" && @@ -137,23 +140,23 @@ test_expect_success 'remove remote protects local branches' ' git remote rm oops 2>actual2 && git branch -d foobranch && git tag -d footag && - test_i18ncmp expect1 actual1 && - test_i18ncmp expect2 actual2 + test_cmp expect1 actual1 && + test_cmp expect2 actual2 ) ' test_expect_success 'remove errors out early when deleting non-existent branch' ' ( cd test && - echo "fatal: No such remote: '\''foo'\''" >expect && - test_must_fail git remote rm foo 2>actual && - test_i18ncmp expect actual + echo "error: No such remote: '\''foo'\''" >expect && + test_expect_code 2 git remote rm foo 2>actual && + test_cmp expect actual ) ' test_expect_success 'remove remote with a branch without configured merge' ' test_when_finished "( - git -C test checkout master; + git -C test checkout main; git -C test branch -D two; git -C test config --remove-section remote.two; git -C test config --remove-section branch.second; @@ -163,9 +166,9 @@ test_expect_success 'remove remote with a branch without configured merge' ' cd test && git remote add two ../two && git fetch two && - git checkout -b second two/master^0 && + git checkout -b second two/main^0 && git config branch.second.remote two && - git checkout master && + git checkout main && git remote rm two ) ' @@ -173,67 +176,80 @@ test_expect_success 'remove remote with a branch without configured merge' ' test_expect_success 'rename errors out early when deleting non-existent branch' ' ( cd test && - echo "fatal: No such remote: '\''foo'\''" >expect && - test_must_fail git remote rename foo bar 2>actual && - test_i18ncmp expect actual + echo "error: No such remote: '\''foo'\''" >expect && + test_expect_code 2 git remote rename foo bar 2>actual && + test_cmp expect actual ) ' +test_expect_success 'rename errors out early when new name is invalid' ' + test_config remote.foo.vcs bar && + echo "fatal: '\''invalid...name'\'' is not a valid remote name" >expect && + test_must_fail git remote rename foo invalid...name 2>actual && + test_cmp expect actual +' + test_expect_success 'add existing foreign_vcs remote' ' test_config remote.foo.vcs bar && - echo "fatal: remote foo already exists." >expect && - test_must_fail git remote add foo bar 2>actual && - test_i18ncmp expect actual + echo "error: remote foo already exists." >expect && + test_expect_code 3 git remote add foo bar 2>actual && + test_cmp expect actual ' test_expect_success 'add existing foreign_vcs remote' ' test_config remote.foo.vcs bar && test_config remote.bar.vcs bar && - echo "fatal: remote bar already exists." >expect && - test_must_fail git remote rename foo bar 2>actual && - test_i18ncmp expect actual + echo "error: remote bar already exists." >expect && + test_expect_code 3 git remote rename foo bar 2>actual && + test_cmp expect actual +' + +test_expect_success 'add invalid foreign_vcs remote' ' + echo "fatal: '\''invalid...name'\'' is not a valid remote name" >expect && + test_must_fail git remote add invalid...name bar 2>actual && + test_cmp expect actual ' cat >test/expect <<EOF * remote origin Fetch URL: $(pwd)/one Push URL: $(pwd)/one - HEAD branch: master + HEAD branch: main Remote branches: - master new (next fetch will store in remotes/origin) - side tracked + main new (next fetch will store in remotes/origin) + side tracked Local branches configured for 'git pull': - ahead merges with remote master - master merges with remote master + ahead merges with remote main + main merges with remote main octopus merges with remote topic-a and with remote topic-b and with remote topic-c - rebase rebases onto remote master + rebase rebases onto remote main Local refs configured for 'git push': - master pushes to master (local out of date) - master pushes to upstream (create) + main pushes to main (local out of date) + main pushes to upstream (create) * remote two Fetch URL: ../two Push URL: ../three - HEAD branch: master + HEAD branch: main Local refs configured for 'git push': - ahead forces to master (fast-forwardable) - master pushes to another (up to date) + ahead forces to main (fast-forwardable) + main pushes to another (up to date) EOF test_expect_success 'show' ' ( cd test && - git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream && + git config --add remote.origin.fetch refs/heads/main:refs/heads/upstream && git fetch && - git checkout -b ahead origin/master && + git checkout -b ahead origin/main && echo 1 >>file && test_tick && git commit -m update file && - git checkout master && - git branch --track octopus origin/master && - git branch --track rebase origin/master && - git branch -d -r origin/master && + git checkout main && + git branch --track octopus origin/main && + git branch --track rebase origin/main && + git branch -d -r origin/main && git config --add remote.two.url ../two && git config --add remote.two.pushurl ../three && git config branch.rebase.rebase true && @@ -245,13 +261,13 @@ test_expect_success 'show' ' git commit -m update file ) && git config --add remote.origin.push : && - git config --add remote.origin.push refs/heads/master:refs/heads/upstream && + git config --add remote.origin.push refs/heads/main:refs/heads/upstream && git config --add remote.origin.push +refs/tags/lastbackup && - git config --add remote.two.push +refs/heads/ahead:refs/heads/master && - git config --add remote.two.push refs/heads/master:refs/heads/another && + git config --add remote.two.push +refs/heads/ahead:refs/heads/main && + git config --add remote.two.push refs/heads/main:refs/heads/another && git remote show origin two >output && git branch -d rebase octopus && - test_i18ncmp expect output + test_cmp expect output ) ' @@ -261,14 +277,14 @@ cat >test/expect <<EOF Push URL: $(pwd)/one HEAD branch: (not queried) Remote branches: (status not queried) - master + main side Local branches configured for 'git pull': - ahead merges with remote master - master merges with remote master + ahead merges with remote main + main merges with remote main Local refs configured for 'git push' (status not queried): (matching) pushes to (matching) - refs/heads/master pushes to refs/heads/upstream + refs/heads/main pushes to refs/heads/upstream refs/tags/lastbackup forces to refs/tags/lastbackup EOF @@ -278,7 +294,7 @@ test_expect_success 'show -n' ' cd test && git remote show -n origin >output && mv ../one.unreachable ../one && - test_i18ncmp expect output + test_cmp expect output ) ' @@ -309,7 +325,7 @@ test_expect_success 'set-head --auto' ' ( cd test && git remote set-head --auto origin && - echo refs/remotes/origin/master >expect && + echo refs/remotes/origin/main >expect && git symbolic-ref refs/remotes/origin/HEAD >output && test_cmp expect output ) @@ -320,8 +336,8 @@ test_expect_success 'set-head --auto has no problem w/multiple HEADs' ' cd test && git fetch two "refs/heads/*:refs/remotes/two/*" && git remote set-head --auto two >output 2>&1 && - echo "two/HEAD set to master" >expect && - test_i18ncmp expect output + echo "two/HEAD set to main" >expect && + test_cmp expect output ) ' @@ -334,7 +350,7 @@ test_expect_success 'set-head explicit' ' cd test && git remote set-head origin side2 && git symbolic-ref refs/remotes/origin/HEAD >output && - git remote set-head origin master && + git remote set-head origin main && test_cmp expect output ) ' @@ -353,7 +369,7 @@ test_expect_success 'prune --dry-run' ' git remote prune --dry-run origin >output && git rev-parse refs/remotes/origin/side2 && test_must_fail git rev-parse refs/remotes/origin/side && - test_i18ncmp expect output + test_cmp expect output ) ' @@ -381,7 +397,7 @@ test_expect_success 'add --mirror && prune' ' test_expect_success 'add --mirror=fetch' ' mkdir mirror-fetch && - git init mirror-fetch/parent && + git init -b main mirror-fetch/parent && ( cd mirror-fetch/parent && test_commit one @@ -397,7 +413,7 @@ test_expect_success 'fetch mirrors act as mirrors during fetch' ' ( cd mirror-fetch/parent && git branch new && - git branch -m master renamed + git branch -m main renamed ) && ( cd mirror-fetch/child && @@ -411,7 +427,7 @@ test_expect_success 'fetch mirrors can prune' ' ( cd mirror-fetch/child && git remote prune parent && - test_must_fail git rev-parse --verify refs/heads/master + test_must_fail git rev-parse --verify refs/heads/main ) ' @@ -452,7 +468,7 @@ test_expect_success 'fetch mirror respects specific branches' ' test_expect_success 'add --mirror=push' ' mkdir mirror-push && git init --bare mirror-push/public && - git init mirror-push/private && + git init -b main mirror-push/private && ( cd mirror-push/private && test_commit one && @@ -464,14 +480,14 @@ test_expect_success 'push mirrors act as mirrors during push' ' ( cd mirror-push/private && git branch new && - git branch -m master renamed && + git branch -m main renamed && git push public ) && ( cd mirror-push/private && git rev-parse --verify refs/heads/new && git rev-parse --verify refs/heads/renamed && - test_must_fail git rev-parse --verify refs/heads/master + test_must_fail git rev-parse --verify refs/heads/main ) ' @@ -578,6 +594,7 @@ test_expect_success 'add --no-tags' ' cd add-no-tags && git init && git remote add -f --no-tags origin ../one && + grep tagOpt .git/config && git tag -l some-tag >../test/output && git tag -l foobar-tag >../test/output && git config remote.origin.tagopt >>../test/output @@ -597,10 +614,10 @@ test_expect_success 'reject --no-no-tags' ' ' cat >one/expect <<\EOF - apis/master + apis/main apis/side drosophila/another - drosophila/master + drosophila/main drosophila/side EOF @@ -617,11 +634,11 @@ test_expect_success 'update' ' cat >one/expect <<\EOF drosophila/another - drosophila/master + drosophila/main drosophila/side - manduca/master + manduca/main manduca/side - megaloprepus/master + megaloprepus/main megaloprepus/side EOF @@ -660,11 +677,11 @@ test_expect_success 'update --prune' ' ' cat >one/expect <<-\EOF - apis/master + apis/main apis/side - manduca/master + manduca/main manduca/side - megaloprepus/master + megaloprepus/main megaloprepus/side EOF @@ -684,7 +701,7 @@ test_expect_success 'update default' ' cat >one/expect <<\EOF drosophila/another - drosophila/master + drosophila/main drosophila/side EOF @@ -738,14 +755,15 @@ test_expect_success 'rename a remote' ' git clone one four && ( cd four && - git config branch.master.pushRemote origin && + git config branch.main.pushRemote origin && git remote rename origin upstream && + grep "pushRemote" .git/config && test -z "$(git for-each-ref refs/remotes/origin)" && - test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" && - test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" && + test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/main" && + test "$(git rev-parse upstream/main)" = "$(git rev-parse main)" && test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" && - test "$(git config branch.master.remote)" = "upstream" && - test "$(git config branch.master.pushRemote)" = "upstream" && + test "$(git config branch.main.remote)" = "upstream" && + test "$(git config branch.main.pushRemote)" = "upstream" && test "$(git config --global remote.pushDefault)" = "origin" ) ' @@ -756,6 +774,7 @@ test_expect_success 'rename a remote renames repo remote.pushDefault' ' cd four.1 && git config remote.pushDefault origin && git remote rename origin upstream && + grep pushDefault .git/config && test "$(git config --local remote.pushDefault)" = "upstream" ) ' @@ -791,7 +810,7 @@ test_expect_success 'rename does not update a non-default fetch refspec' ' git config remote.origin.fetch +refs/heads/*:refs/heads/origin/* && git remote rename origin upstream && test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/heads/origin/*" && - git rev-parse -q origin/master + git rev-parse -q origin/main ) ' @@ -811,7 +830,7 @@ test_expect_success 'rename a remote with name prefix of other remote' ' cd four.three && git remote add o git://example.com/repo.git && git remote rename o upstream && - test "$(git rev-parse origin/master)" = "$(git rev-parse master)" + test "$(git rev-parse origin/main)" = "$(git rev-parse main)" ) ' @@ -827,11 +846,11 @@ test_expect_success 'remove a remote' ' git clone one four.five && ( cd four.five && - git config branch.master.pushRemote origin && + git config branch.main.pushRemote origin && git remote remove origin && test -z "$(git for-each-ref refs/remotes/origin)" && - test_must_fail git config branch.master.remote && - test_must_fail git config branch.master.pushRemote && + test_must_fail git config branch.main.remote && + test_must_fail git config branch.main.pushRemote && test "$(git config --global remote.pushDefault)" = "origin" ) ' @@ -872,9 +891,9 @@ test_expect_success 'remove a remote removes repo remote.pushDefault but keeps g cat >remotes_origin <<EOF URL: $(pwd)/one -Push: refs/heads/master:refs/heads/upstream +Push: refs/heads/main:refs/heads/upstream Push: refs/heads/next:refs/heads/upstream2 -Pull: refs/heads/master:refs/heads/origin +Pull: refs/heads/main:refs/heads/origin Pull: refs/heads/next:refs/heads/origin2 EOF @@ -890,11 +909,11 @@ test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' ' test_path_is_missing .git/remotes/origin && test "$(git config remote.origin.url)" = "$origin_url" && cat >push_expected <<-\EOF && - refs/heads/master:refs/heads/upstream + refs/heads/main:refs/heads/upstream refs/heads/next:refs/heads/upstream2 EOF cat >fetch_expected <<-\EOF && - refs/heads/master:refs/heads/origin + refs/heads/main:refs/heads/origin refs/heads/next:refs/heads/origin2 EOF git config --get-all remote.origin.push >push_actual && @@ -910,12 +929,12 @@ test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' ' ( cd six && git remote rm origin && - echo "$origin_url" >.git/branches/origin && + echo "$origin_url#main" >.git/branches/origin && git remote rename origin origin && test_path_is_missing .git/branches/origin && test "$(git config remote.origin.url)" = "$origin_url" && - test "$(git config remote.origin.fetch)" = "refs/heads/master:refs/heads/origin" && - test "$(git config remote.origin.push)" = "HEAD:refs/heads/master" + test "$(git config remote.origin.fetch)" = "refs/heads/main:refs/heads/origin" && + test "$(git config remote.origin.push)" = "HEAD:refs/heads/main" ) ' @@ -938,7 +957,7 @@ test_expect_success 'remote prune to cause a dangling symref' ' ( cd one && git checkout side2 && - git branch -D master + git branch -D main ) && ( cd eight && @@ -981,22 +1000,22 @@ test_expect_success 'remote set-branches' ' EOF sort <<-\EOF >expect.replace && +refs/heads/maint:refs/remotes/scratch/maint - +refs/heads/master:refs/remotes/scratch/master + +refs/heads/main:refs/remotes/scratch/main +refs/heads/next:refs/remotes/scratch/next EOF sort <<-\EOF >expect.add-two && +refs/heads/maint:refs/remotes/scratch/maint - +refs/heads/master:refs/remotes/scratch/master + +refs/heads/main:refs/remotes/scratch/main +refs/heads/next:refs/remotes/scratch/next +refs/heads/seen:refs/remotes/scratch/seen +refs/heads/t/topic:refs/remotes/scratch/t/topic EOF sort <<-\EOF >expect.setup-ffonly && - refs/heads/master:refs/remotes/scratch/master + refs/heads/main:refs/remotes/scratch/main +refs/heads/next:refs/remotes/scratch/next EOF sort <<-\EOF >expect.respect-ffonly && - refs/heads/master:refs/remotes/scratch/master + refs/heads/main:refs/remotes/scratch/main +refs/heads/next:refs/remotes/scratch/next +refs/heads/seen:refs/remotes/scratch/seen EOF @@ -1012,7 +1031,7 @@ test_expect_success 'remote set-branches' ' git config --get-all remote.scratch.fetch >config-result && sort <config-result >../actual.add && - git remote set-branches scratch maint master next && + git remote set-branches scratch maint main next && git config --get-all remote.scratch.fetch >config-result && sort <config-result >../actual.replace && @@ -1022,7 +1041,7 @@ test_expect_success 'remote set-branches' ' git config --unset-all remote.scratch.fetch && git config remote.scratch.fetch \ - refs/heads/master:refs/remotes/scratch/master && + refs/heads/main:refs/remotes/scratch/main && git config --add remote.scratch.fetch \ +refs/heads/next:refs/remotes/scratch/next && git config --get-all remote.scratch.fetch >config-result && @@ -1042,14 +1061,14 @@ test_expect_success 'remote set-branches' ' test_expect_success 'remote set-branches with --mirror' ' echo "+refs/*:refs/*" >expect.initial && - echo "+refs/heads/master:refs/heads/master" >expect.replace && + echo "+refs/heads/main:refs/heads/main" >expect.replace && git clone --mirror .git/ setbranches-mirror && ( cd setbranches-mirror && git remote rename origin scratch && git config --get-all remote.scratch.fetch >../actual.initial && - git remote set-branches scratch heads/master && + git remote set-branches scratch heads/main && git config --get-all remote.scratch.fetch >../actual.replace ) && test_cmp expect.initial actual.initial && @@ -1295,7 +1314,7 @@ test_extra_arg () { test_extra_arg add nick url test_extra_arg rename origin newname test_extra_arg remove origin -test_extra_arg set-head origin master +test_extra_arg set-head origin main # set-branches takes any number of args test_extra_arg get-url origin newurl test_extra_arg set-url origin newurl oldurl @@ -1312,7 +1331,7 @@ test_expect_success 'unqualified <dst> refspec DWIM and advice' ' test_when_finished "(cd test && git tag -d some-tag)" && ( cd test && - git tag -a -m "Some tag" some-tag master && + git tag -a -m "Some tag" some-tag main && exit_with=true && for type in commit tag tree blob do @@ -1338,7 +1357,7 @@ test_expect_success 'unqualified <dst> refspec DWIM and advice' ' test_expect_success 'refs/remotes/* <src> refspec and unqualified <dst> DWIM and advice' ' ( cd two && - git tag -a -m "Some tag" my-tag master && + git tag -a -m "Some tag" my-tag main && git update-ref refs/trees/my-head-tree HEAD^{tree} && git update-ref refs/blobs/my-file-blob HEAD:file ) && diff --git a/t/t5506-remote-groups.sh b/t/t5506-remote-groups.sh index 83d5558c0e..8f150c0793 100755 --- a/t/t5506-remote-groups.sh +++ b/t/t5506-remote-groups.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git remote group handling' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh mark() { @@ -31,8 +34,8 @@ repo_fetched() { test_expect_success 'setup' ' mkdir one && (cd one && git init) && mkdir two && (cd two && git init) && - git remote add -m master one one && - git remote add -m master two two + git remote add -m main one one && + git remote add -m main two two ' test_expect_success 'no group updates all' ' diff --git a/t/t5509-fetch-push-namespaces.sh b/t/t5509-fetch-push-namespaces.sh index a67f792adf..31553b48df 100755 --- a/t/t5509-fetch-push-namespaces.sh +++ b/t/t5509-fetch-push-namespaces.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='fetch/push involving ref namespaces' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -27,9 +30,9 @@ test_expect_success setup ' test_expect_success 'pushing into a repository using a ref namespace' ' ( cd original && - git push pushee-namespaced master && + git push pushee-namespaced main && git ls-remote pushee-namespaced >actual && - printf "$commit1\trefs/heads/master\n" >expected && + printf "$commit1\trefs/heads/main\n" >expected && test_cmp expected actual && git push pushee-namespaced --tags && git ls-remote pushee-namespaced >actual && @@ -56,7 +59,7 @@ test_expect_success 'pulling from a repository using a ref namespace' ' cd puller && git remote add -f pushee-namespaced "ext::git --namespace=namespace %s ../pushee" && git for-each-ref refs/ >actual && - printf "$commit1 commit\trefs/remotes/pushee-namespaced/master\n" >expected && + printf "$commit1 commit\trefs/remotes/pushee-namespaced/main\n" >expected && printf "$commit0 commit\trefs/tags/0\n" >>expected && printf "$commit1 commit\trefs/tags/1\n" >>expected && test_cmp expected actual @@ -76,7 +79,7 @@ test_expect_success 'mirroring a repository using a ref namespace' ' ( cd mirror && git for-each-ref refs/ >actual && - printf "$commit1 commit\trefs/namespaces/namespace/refs/heads/master\n" >expected && + printf "$commit1 commit\trefs/namespaces/namespace/refs/heads/main\n" >expected && printf "$commit0 commit\trefs/namespaces/namespace/refs/tags/0\n" >>expected && printf "$commit1 commit\trefs/namespaces/namespace/refs/tags/1\n" >>expected && test_cmp expected actual @@ -87,7 +90,7 @@ test_expect_success 'hide namespaced refs with transfer.hideRefs' ' GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs=refs/tags \ ls-remote "ext::git %s ." >actual && - printf "$commit1\trefs/heads/master\n" >expected && + printf "$commit1\trefs/heads/main\n" >expected && test_cmp expected actual ' @@ -95,7 +98,7 @@ test_expect_success 'check that transfer.hideRefs does not match unstripped refs GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs=refs/namespaces/namespace/refs/tags \ ls-remote "ext::git %s ." >actual && - printf "$commit1\trefs/heads/master\n" >expected && + printf "$commit1\trefs/heads/main\n" >expected && printf "$commit0\trefs/tags/0\n" >>expected && printf "$commit1\trefs/tags/1\n" >>expected && test_cmp expected actual @@ -105,23 +108,23 @@ test_expect_success 'hide full refs with transfer.hideRefs' ' GIT_NAMESPACE=namespace \ git -C pushee -c transfer.hideRefs="^refs/namespaces/namespace/refs/tags" \ ls-remote "ext::git %s ." >actual && - printf "$commit1\trefs/heads/master\n" >expected && + printf "$commit1\trefs/heads/main\n" >expected && test_cmp expected actual ' test_expect_success 'try to update a hidden ref' ' - test_config -C pushee transfer.hideRefs refs/heads/master && - test_must_fail git -C original push pushee-namespaced master + test_config -C pushee transfer.hideRefs refs/heads/main && + test_must_fail git -C original push pushee-namespaced main ' test_expect_success 'try to update a ref that is not hidden' ' - test_config -C pushee transfer.hideRefs refs/namespaces/namespace/refs/heads/master && - git -C original push pushee-namespaced master + test_config -C pushee transfer.hideRefs refs/namespaces/namespace/refs/heads/main && + git -C original push pushee-namespaced main ' test_expect_success 'try to update a hidden full ref' ' - test_config -C pushee transfer.hideRefs "^refs/namespaces/namespace/refs/heads/master" && - test_must_fail git -C original push pushee-namespaced master + test_config -C pushee transfer.hideRefs "^refs/namespaces/namespace/refs/heads/main" && + test_must_fail git -C original push pushee-namespaced main ' test_expect_success 'set up ambiguous HEAD' ' @@ -157,9 +160,9 @@ test_expect_success 'denyCurrentBranch and unborn branch with ref namespace' ' cd original && git init unborn && git remote add unborn-namespaced "ext::git --namespace=namespace %s unborn" && - test_must_fail git push unborn-namespaced HEAD:master && + test_must_fail git push unborn-namespaced HEAD:main && git -C unborn config receive.denyCurrentBranch updateInstead && - git push unborn-namespaced HEAD:master + git push unborn-namespaced HEAD:main ) ' diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 759aec9305..e83b2a6506 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -5,27 +5,20 @@ test_description='Per branch config variables affects "git fetch". ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-bundle.sh D=$(pwd) -test_bundle_object_count () { - git verify-pack -v "$1" >verify.out && - test "$2" = $(grep "^$OID_REGEX " verify.out | wc -l) -} - -convert_bundle_to_pack () { - while read x && test -n "$x" - do - :; - done - cat -} - test_expect_success setup ' echo >file original && git add file && - git commit -a -m original' + git commit -a -m original && + git branch -M main +' test_expect_success "clone and setup child repos" ' git clone . one && @@ -37,19 +30,19 @@ test_expect_success "clone and setup child repos" ' git clone . two && ( cd two && - git config branch.master.remote one && + git config branch.main.remote one && git config remote.one.url ../one/.git/ && - git config remote.one.fetch refs/heads/master:refs/heads/one + git config remote.one.fetch refs/heads/main:refs/heads/one ) && git clone . three && ( cd three && - git config branch.master.remote two && - git config branch.master.merge refs/heads/one && + git config branch.main.remote two && + git config branch.main.merge refs/heads/one && mkdir -p .git/remotes && { echo "URL: ../two/.git/" - echo "Pull: refs/heads/master:refs/heads/two" + echo "Pull: refs/heads/main:refs/heads/two" echo "Pull: refs/heads/one:refs/heads/one" } >.git/remotes/two ) && @@ -65,7 +58,7 @@ test_expect_success "fetch test" ' git fetch && git rev-parse --verify refs/heads/one && mine=$(git rev-parse refs/heads/one) && - his=$(cd ../one && git rev-parse refs/heads/master) && + his=$(cd ../one && git rev-parse refs/heads/main) && test "z$mine" = "z$his" ' @@ -75,11 +68,11 @@ test_expect_success "fetch test for-merge" ' git fetch && git rev-parse --verify refs/heads/two && git rev-parse --verify refs/heads/one && - master_in_two=$(cd ../two && git rev-parse master) && + main_in_two=$(cd ../two && git rev-parse main) && one_in_two=$(cd ../two && git rev-parse one) && { echo "$one_in_two " - echo "$master_in_two not-for-merge" + echo "$main_in_two not-for-merge" } >expected && cut -f -2 .git/FETCH_HEAD >actual && test_cmp expected actual' @@ -88,7 +81,7 @@ test_expect_success 'fetch --prune on its own works as expected' ' cd "$D" && git clone . prune && cd prune && - git update-ref refs/remotes/origin/extrabranch master && + git update-ref refs/remotes/origin/extrabranch main && git fetch --prune origin && test_must_fail git rev-parse origin/extrabranch @@ -98,9 +91,9 @@ test_expect_success 'fetch --prune with a branch name keeps branches' ' cd "$D" && git clone . prune-branch && cd prune-branch && - git update-ref refs/remotes/origin/extrabranch master && + git update-ref refs/remotes/origin/extrabranch main && - git fetch --prune origin master && + git fetch --prune origin main && git rev-parse origin/extrabranch ' @@ -110,18 +103,18 @@ test_expect_success 'fetch --prune with a namespace keeps other namespaces' ' cd prune-namespace && git fetch --prune origin refs/heads/a/*:refs/remotes/origin/a/* && - git rev-parse origin/master + git rev-parse origin/main ' test_expect_success 'fetch --prune handles overlapping refspecs' ' cd "$D" && - git update-ref refs/pull/42/head master && + git update-ref refs/pull/42/head main && git clone . prune-overlapping && cd prune-overlapping && git config --add remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* && git fetch --prune origin && - git rev-parse origin/master && + git rev-parse origin/main && git rev-parse origin/pr/42 && git config --unset-all remote.origin.fetch && @@ -129,7 +122,7 @@ test_expect_success 'fetch --prune handles overlapping refspecs' ' git config --add remote.origin.fetch refs/heads/*:refs/remotes/origin/* && git fetch --prune origin && - git rev-parse origin/master && + git rev-parse origin/main && git rev-parse origin/pr/42 ' @@ -137,13 +130,13 @@ test_expect_success 'fetch --prune --tags prunes branches but not tags' ' cd "$D" && git clone . prune-tags && cd prune-tags && - git tag sometag master && + git tag sometag main && # Create what looks like a remote-tracking branch from an earlier # fetch that has since been deleted from the remote: - git update-ref refs/remotes/origin/fake-remote master && + git update-ref refs/remotes/origin/fake-remote main && git fetch --prune --tags origin && - git rev-parse origin/master && + git rev-parse origin/main && test_must_fail git rev-parse origin/fake-remote && git rev-parse sometag ' @@ -152,10 +145,10 @@ test_expect_success 'fetch --prune --tags with branch does not prune other thing cd "$D" && git clone . prune-tags-branch && cd prune-tags-branch && - git tag sometag master && - git update-ref refs/remotes/origin/extrabranch master && + git tag sometag main && + git update-ref refs/remotes/origin/extrabranch main && - git fetch --prune --tags origin master && + git fetch --prune --tags origin main && git rev-parse origin/extrabranch && git rev-parse sometag ' @@ -164,9 +157,9 @@ test_expect_success 'fetch --prune --tags with refspec prunes based on refspec' cd "$D" && git clone . prune-tags-refspec && cd prune-tags-refspec && - git tag sometag master && - git update-ref refs/remotes/origin/foo/otherbranch master && - git update-ref refs/remotes/origin/extrabranch master && + git tag sometag main && + git update-ref refs/remotes/origin/foo/otherbranch main && + git update-ref refs/remotes/origin/extrabranch main && git fetch --prune --tags origin refs/heads/foo/*:refs/remotes/origin/foo/* && test_must_fail git rev-parse refs/remotes/origin/foo/otherbranch && @@ -174,23 +167,191 @@ test_expect_success 'fetch --prune --tags with refspec prunes based on refspec' git rev-parse sometag ' +test_expect_success 'fetch --atomic works with a single branch' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + git branch atomic-branch && + oid=$(git rev-parse atomic-branch) && + echo "$oid" >expected && + + git -C atomic fetch --atomic origin && + git -C atomic rev-parse origin/atomic-branch >actual && + test_cmp expected actual && + test $oid = "$(git -C atomic rev-parse --verify FETCH_HEAD)" +' + +test_expect_success 'fetch --atomic works with multiple branches' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + git branch atomic-branch-1 && + git branch atomic-branch-2 && + git branch atomic-branch-3 && + git rev-parse refs/heads/atomic-branch-1 refs/heads/atomic-branch-2 refs/heads/atomic-branch-3 >actual && + + git -C atomic fetch --atomic origin && + git -C atomic rev-parse refs/remotes/origin/atomic-branch-1 refs/remotes/origin/atomic-branch-2 refs/remotes/origin/atomic-branch-3 >expected && + test_cmp expected actual +' + +test_expect_success 'fetch --atomic works with mixed branches and tags' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + git branch atomic-mixed-branch && + git tag atomic-mixed-tag && + git rev-parse refs/heads/atomic-mixed-branch refs/tags/atomic-mixed-tag >actual && + + git -C atomic fetch --tags --atomic origin && + git -C atomic rev-parse refs/remotes/origin/atomic-mixed-branch refs/tags/atomic-mixed-tag >expected && + test_cmp expected actual +' + +test_expect_success 'fetch --atomic prunes references' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git branch atomic-prune-delete && + git clone . atomic && + git branch --delete atomic-prune-delete && + git branch atomic-prune-create && + git rev-parse refs/heads/atomic-prune-create >actual && + + git -C atomic fetch --prune --atomic origin && + test_must_fail git -C atomic rev-parse refs/remotes/origin/atomic-prune-delete && + git -C atomic rev-parse refs/remotes/origin/atomic-prune-create >expected && + test_cmp expected actual +' + +test_expect_success 'fetch --atomic aborts with non-fast-forward update' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git branch atomic-non-ff && + git clone . atomic && + git rev-parse HEAD >actual && + + git branch atomic-new-branch && + parent_commit=$(git rev-parse atomic-non-ff~) && + git update-ref refs/heads/atomic-non-ff $parent_commit && + + test_must_fail git -C atomic fetch --atomic origin refs/heads/*:refs/remotes/origin/* && + test_must_fail git -C atomic rev-parse refs/remotes/origin/atomic-new-branch && + git -C atomic rev-parse refs/remotes/origin/atomic-non-ff >expected && + test_cmp expected actual && + test_must_be_empty atomic/.git/FETCH_HEAD +' + +test_expect_success 'fetch --atomic executes a single reference transaction only' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + git branch atomic-hooks-1 && + git branch atomic-hooks-2 && + head_oid=$(git rev-parse HEAD) && + + cat >expected <<-EOF && + prepared + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-1 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-2 + committed + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-1 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-2 + EOF + + rm -f atomic/actual && + write_script atomic/.git/hooks/reference-transaction <<-\EOF && + ( echo "$*" && cat ) >>actual + EOF + + git -C atomic fetch --atomic origin && + test_cmp expected atomic/actual +' + +test_expect_success 'fetch --atomic aborts all reference updates if hook aborts' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + git branch atomic-hooks-abort-1 && + git branch atomic-hooks-abort-2 && + git branch atomic-hooks-abort-3 && + git tag atomic-hooks-abort && + head_oid=$(git rev-parse HEAD) && + + cat >expected <<-EOF && + prepared + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-1 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-2 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-3 + $ZERO_OID $head_oid refs/tags/atomic-hooks-abort + aborted + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-1 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-2 + $ZERO_OID $head_oid refs/remotes/origin/atomic-hooks-abort-3 + $ZERO_OID $head_oid refs/tags/atomic-hooks-abort + EOF + + rm -f atomic/actual && + write_script atomic/.git/hooks/reference-transaction <<-\EOF && + ( echo "$*" && cat ) >>actual + exit 1 + EOF + + git -C atomic for-each-ref >expected-refs && + test_must_fail git -C atomic fetch --tags --atomic origin && + git -C atomic for-each-ref >actual-refs && + test_cmp expected-refs actual-refs && + test_must_be_empty atomic/.git/FETCH_HEAD +' + +test_expect_success 'fetch --atomic --append appends to FETCH_HEAD' ' + test_when_finished "rm -rf \"$D\"/atomic" && + + cd "$D" && + git clone . atomic && + oid=$(git rev-parse HEAD) && + + git branch atomic-fetch-head-1 && + git -C atomic fetch --atomic origin atomic-fetch-head-1 && + test_line_count = 1 atomic/.git/FETCH_HEAD && + + git branch atomic-fetch-head-2 && + git -C atomic fetch --atomic --append origin atomic-fetch-head-2 && + test_line_count = 2 atomic/.git/FETCH_HEAD && + cp atomic/.git/FETCH_HEAD expected && + + write_script atomic/.git/hooks/reference-transaction <<-\EOF && + exit 1 + EOF + + git branch atomic-fetch-head-3 && + test_must_fail git -C atomic fetch --atomic --append origin atomic-fetch-head-3 && + test_cmp expected atomic/.git/FETCH_HEAD +' + test_expect_success '--refmap="" ignores configured refspec' ' cd "$TRASH_DIRECTORY" && git clone "$D" remote-refs && - git -C remote-refs rev-parse remotes/origin/master >old && - git -C remote-refs update-ref refs/remotes/origin/master master~1 && - git -C remote-refs rev-parse remotes/origin/master >new && + git -C remote-refs rev-parse remotes/origin/main >old && + git -C remote-refs update-ref refs/remotes/origin/main main~1 && + git -C remote-refs rev-parse remotes/origin/main >new && git -C remote-refs fetch --refmap= origin "+refs/heads/*:refs/hidden/origin/*" && - git -C remote-refs rev-parse remotes/origin/master >actual && + git -C remote-refs rev-parse remotes/origin/main >actual && test_cmp new actual && git -C remote-refs fetch origin && - git -C remote-refs rev-parse remotes/origin/master >actual && + git -C remote-refs rev-parse remotes/origin/main >actual && test_cmp old actual ' test_expect_success '--refmap="" and --prune' ' - git -C remote-refs update-ref refs/remotes/origin/foo/otherbranch master && - git -C remote-refs update-ref refs/hidden/foo/otherbranch master && + git -C remote-refs update-ref refs/remotes/origin/foo/otherbranch main && + git -C remote-refs update-ref refs/hidden/foo/otherbranch main && git -C remote-refs fetch --prune --refmap="" origin +refs/heads/*:refs/hidden/* && git -C remote-refs rev-parse remotes/origin/foo/otherbranch && test_must_fail git -C remote-refs rev-parse refs/hidden/foo/otherbranch && @@ -250,7 +411,7 @@ test_expect_success 'fetch uses remote ref names to describe new refs' ' test_i18ngrep "new tag.* -> descriptive-tag$" actual && test_i18ngrep "new ref.* -> crazy$" actual ) && - git checkout master + git checkout main ' test_expect_success 'fetch must not resolve short tag name' ' @@ -281,7 +442,7 @@ test_expect_success 'create bundle 1' ' cd "$D" && echo >file updated again by origin && git commit -a -m "tip" && - git bundle create --version=3 bundle1 master^..master + git bundle create --version=3 bundle1 main^..main ' test_expect_success 'header of bundle looks right' ' @@ -289,7 +450,7 @@ test_expect_success 'header of bundle looks right' ' # v3 git bundle @object-format=$(test_oid algo) -OID updated by origin - OID refs/heads/master + OID refs/heads/main EOF sed -e "s/$OID_REGEX/OID/g" -e "5q" "$D"/bundle1 >actual && @@ -298,27 +459,25 @@ test_expect_success 'header of bundle looks right' ' test_expect_success 'create bundle 2' ' cd "$D" && - git bundle create bundle2 master~2..master + git bundle create bundle2 main~2..main ' test_expect_success 'unbundle 1' ' cd "$D/bundle" && git checkout -b some-branch && - test_must_fail git fetch "$D/bundle1" master:master + test_must_fail git fetch "$D/bundle1" main:main ' test_expect_success 'bundle 1 has only 3 files ' ' cd "$D" && - convert_bundle_to_pack <bundle1 >bundle.pack && - git index-pack bundle.pack && - test_bundle_object_count bundle.pack 3 + test_bundle_object_count bundle1 3 ' test_expect_success 'unbundle 2' ' cd "$D/bundle" && - git fetch ../bundle2 master:master && - test "tip" = "$(git log -1 --pretty=oneline master | cut -d" " -f2)" + git fetch ../bundle2 main:main && + test "tip" = "$(git log -1 --pretty=oneline main | cut -d" " -f2)" ' test_expect_success 'bundle does not prerequisite objects' ' @@ -327,22 +486,20 @@ test_expect_success 'bundle does not prerequisite objects' ' git add file2 && git commit -m add.file2 file2 && git bundle create bundle3 -1 HEAD && - convert_bundle_to_pack <bundle3 >bundle.pack && - git index-pack bundle.pack && - test_bundle_object_count bundle.pack 3 + test_bundle_object_count bundle3 3 ' test_expect_success 'bundle should be able to create a full history' ' cd "$D" && - git tag -a -m "1.0" v1.0 master && + git tag -a -m "1.0" v1.0 main && git bundle create bundle4 v1.0 ' test_expect_success 'fetch with a non-applying branch.<name>.merge' ' - git config branch.master.remote yeti && - git config branch.master.merge refs/heads/bigfoot && + git config branch.main.remote yeti && + git config branch.main.merge refs/heads/bigfoot && git config remote.blub.url one && git config remote.blub.fetch "refs/heads/*:refs/remotes/one/*" && git fetch blub @@ -362,8 +519,8 @@ test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge # the merge spec matches the branch the remote HEAD points to test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [2]' ' one_ref=$(cd one && git symbolic-ref HEAD) && - git config branch.master.remote blub && - git config branch.master.merge "$one_ref" && + git config branch.main.remote blub && + git config branch.main.merge "$one_ref" && git update-ref -d FETCH_HEAD && git fetch one && test $one_head = "$(git rev-parse --verify FETCH_HEAD)" && @@ -373,7 +530,7 @@ test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge # URL supplied to fetch matches the url of the configured branch's remote, but # the merge spec does not match the branch the remote HEAD points to test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [3]' ' - git config branch.master.merge "${one_ref}_not" && + git config branch.main.merge "${one_ref}_not" && git update-ref -d FETCH_HEAD && git fetch one && test $one_head = "$(git rev-parse --verify FETCH_HEAD)" && @@ -389,9 +546,9 @@ test_expect_success 'quoting of a strangely named repo' ' test_expect_success 'bundle should record HEAD correctly' ' cd "$D" && - git bundle create bundle5 HEAD master && + git bundle create bundle5 HEAD main && git bundle list-heads bundle5 >actual && - for h in HEAD refs/heads/master + for h in HEAD refs/heads/main do echo "$(git rev-parse --verify $h) $h" done >expect && @@ -399,10 +556,10 @@ test_expect_success 'bundle should record HEAD correctly' ' ' -test_expect_success 'mark initial state of origin/master' ' +test_expect_success 'mark initial state of origin/main' ' ( cd three && - git tag base-origin-master refs/remotes/origin/master + git tag base-origin-main refs/remotes/origin/main ) ' @@ -412,10 +569,10 @@ test_expect_success 'explicit fetch should update tracking' ' git branch -f side && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && - o=$(git rev-parse --verify refs/remotes/origin/master) && - git fetch origin master && - n=$(git rev-parse --verify refs/remotes/origin/master) && + git update-ref refs/remotes/origin/main base-origin-main && + o=$(git rev-parse --verify refs/remotes/origin/main) && + git fetch origin main && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" != "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side ) @@ -427,10 +584,10 @@ test_expect_success 'explicit pull should update tracking' ' git branch -f side && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && - o=$(git rev-parse --verify refs/remotes/origin/master) && - git pull origin master && - n=$(git rev-parse --verify refs/remotes/origin/master) && + git update-ref refs/remotes/origin/main base-origin-main && + o=$(git rev-parse --verify refs/remotes/origin/main) && + git pull origin main && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" != "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side ) @@ -449,13 +606,13 @@ test_expect_success 'explicit --refmap option overrides remote.*.fetch' ' git branch -f side && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && - o=$(git rev-parse --verify refs/remotes/origin/master) && - git fetch --refmap="refs/heads/*:refs/remotes/other/*" origin master && - n=$(git rev-parse --verify refs/remotes/origin/master) && + git update-ref refs/remotes/origin/main base-origin-main && + o=$(git rev-parse --verify refs/remotes/origin/main) && + git fetch --refmap="refs/heads/*:refs/remotes/other/*" origin main && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" = "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side && - git rev-parse --verify refs/remotes/other/master + git rev-parse --verify refs/remotes/other/main ) ' @@ -464,10 +621,10 @@ test_expect_success 'explicitly empty --refmap option disables remote.*.fetch' ' git branch -f side && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && - o=$(git rev-parse --verify refs/remotes/origin/master) && - git fetch --refmap="" origin master && - n=$(git rev-parse --verify refs/remotes/origin/master) && + git update-ref refs/remotes/origin/main base-origin-main && + o=$(git rev-parse --verify refs/remotes/origin/main) && + git fetch --refmap="" origin main && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" = "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side ) @@ -479,10 +636,10 @@ test_expect_success 'configured fetch updates tracking' ' git branch -f side && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && - o=$(git rev-parse --verify refs/remotes/origin/master) && + git update-ref refs/remotes/origin/main base-origin-main && + o=$(git rev-parse --verify refs/remotes/origin/main) && git fetch origin && - n=$(git rev-parse --verify refs/remotes/origin/master) && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" != "$n" && git rev-parse --verify refs/remotes/origin/side ) @@ -493,12 +650,12 @@ test_expect_success 'non-matching refspecs do not confuse tracking update' ' git update-ref refs/odd/location HEAD && ( cd three && - git update-ref refs/remotes/origin/master base-origin-master && + git update-ref refs/remotes/origin/main base-origin-main && git config --add remote.origin.fetch \ refs/odd/location:refs/remotes/origin/odd && - o=$(git rev-parse --verify refs/remotes/origin/master) && - git fetch origin master && - n=$(git rev-parse --verify refs/remotes/origin/master) && + o=$(git rev-parse --verify refs/remotes/origin/main) && + git fetch origin main && + n=$(git rev-parse --verify refs/remotes/origin/main) && test "$o" != "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/odd ) @@ -524,7 +681,7 @@ test_expect_success 'auto tag following fetches minimum' ' git tag -a -m $i excess-$i || exit 1 done ) && - git checkout master && + git checkout main && ( cd follow && git fetch @@ -533,13 +690,13 @@ test_expect_success 'auto tag following fetches minimum' ' test_expect_success 'refuse to fetch into the current branch' ' - test_must_fail git fetch . side:master + test_must_fail git fetch . side:main ' test_expect_success 'fetch into the current branch with --update-head-ok' ' - git fetch --update-head-ok . side:master + git fetch --update-head-ok . side:main ' @@ -568,7 +725,7 @@ test_expect_success "should be able to fetch with duplicate refspecs" ' ( cd dups && git init && - git config branch.master.remote three && + git config branch.main.remote three && git config remote.three.url ../three/.git && git config remote.three.fetch +refs/heads/*:refs/remotes/origin/* && git config --add remote.three.fetch +refs/heads/*:refs/remotes/origin/* && @@ -877,14 +1034,12 @@ test_expect_success 'all boundary commits are excluded' ' test_commit oneside && git checkout HEAD^ && test_commit otherside && - git checkout master && + git checkout main && test_tick && git merge otherside && ad=$(git log --no-walk --format=%ad HEAD) && - git bundle create twoside-boundary.bdl master --since="$ad" && - convert_bundle_to_pack <twoside-boundary.bdl >twoside-boundary.pack && - pack=$(git index-pack --fix-thin --stdin <twoside-boundary.pack) && - test_bundle_object_count .git/objects/pack/pack-${pack##pack }.pack 3 + git bundle create twoside-boundary.bdl main --since="$ad" && + test_bundle_object_count --thin twoside-boundary.bdl 3 ' test_expect_success 'fetch --prune prints the remotes url' ' @@ -896,7 +1051,7 @@ test_expect_success 'fetch --prune prints the remotes url' ' git fetch --prune origin 2>&1 | head -n1 >../actual ) && echo "From ${D}/." >expect && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'branchname D/F conflict resolved by --prune' ' @@ -936,13 +1091,13 @@ test_expect_success 'fetching with auto-gc does not lock up' ' git config fetch.unpackLimit 1 && git config gc.autoPackLimit 1 && git config gc.autoDetach false && - GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 && + GIT_ASK_YESNO="$D/askyesno" git fetch --verbose >fetch.out 2>&1 && test_i18ngrep "Auto packing the repository" fetch.out && ! grep "Should I try again" fetch.out ) ' -test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' ' +test_expect_success 'fetch aligned output' ' git clone . full-output && test_commit looooooooooooong-tag && ( @@ -951,13 +1106,13 @@ test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' ' grep -e "->" actual | cut -c 22- >../actual ) && cat >expect <<-\EOF && - master -> origin/master + main -> origin/main looooooooooooong-tag -> looooooooooooong-tag EOF test_cmp expect actual ' -test_expect_success C_LOCALE_OUTPUT 'fetch compact output' ' +test_expect_success 'fetch compact output' ' git clone . compact && test_commit extraaa && ( @@ -966,7 +1121,7 @@ test_expect_success C_LOCALE_OUTPUT 'fetch compact output' ' grep -e "->" actual | cut -c 22- >../actual ) && cat >expect <<-\EOF && - master -> origin/* + main -> origin/* extraaa -> * EOF test_cmp expect actual @@ -1001,7 +1156,7 @@ setup_negotiation_tip () { USE_PROTOCOL_V2="$3" rm -rf "$SERVER" client trace && - git init "$SERVER" && + git init -b main "$SERVER" && test_commit -C "$SERVER" alpha_1 && test_commit -C "$SERVER" alpha_2 && git -C "$SERVER" checkout --orphan beta && @@ -1017,7 +1172,7 @@ setup_negotiation_tip () { fi && test_commit -C "$SERVER" beta_s && - git -C "$SERVER" checkout master && + git -C "$SERVER" checkout main && test_commit -C "$SERVER" alpha_s && git -C "$SERVER" tag -d alpha_1 alpha_2 beta_1 beta_2 } diff --git a/t/t5511-refspec.sh b/t/t5511-refspec.sh index f541f30bc2..be025b90f9 100755 --- a/t/t5511-refspec.sh +++ b/t/t5511-refspec.sh @@ -33,7 +33,7 @@ test_refspec fetch '::' invalid test_refspec push 'refs/heads/*:refs/remotes/frotz/*' test_refspec push 'refs/heads/*:refs/remotes/frotz' invalid test_refspec push 'refs/heads:refs/remotes/frotz/*' invalid -test_refspec push 'refs/heads/master:refs/remotes/frotz/xyzzy' +test_refspec push 'refs/heads/main:refs/remotes/frotz/xyzzy' # These have invalid LHS, but we do not have a formal "valid sha-1 @@ -41,23 +41,25 @@ test_refspec push 'refs/heads/master:refs/remotes/frotz/xyzzy' # code. They will be caught downstream anyway, but we may want to # have tighter check later... -: test_refspec push 'refs/heads/master::refs/remotes/frotz/xyzzy' invalid +: test_refspec push 'refs/heads/main::refs/remotes/frotz/xyzzy' invalid : test_refspec push 'refs/heads/maste :refs/remotes/frotz/xyzzy' invalid test_refspec fetch 'refs/heads/*:refs/remotes/frotz/*' test_refspec fetch 'refs/heads/*:refs/remotes/frotz' invalid test_refspec fetch 'refs/heads:refs/remotes/frotz/*' invalid -test_refspec fetch 'refs/heads/master:refs/remotes/frotz/xyzzy' -test_refspec fetch 'refs/heads/master::refs/remotes/frotz/xyzzy' invalid +test_refspec fetch 'refs/heads/main:refs/remotes/frotz/xyzzy' +test_refspec fetch 'refs/heads/main::refs/remotes/frotz/xyzzy' invalid test_refspec fetch 'refs/heads/maste :refs/remotes/frotz/xyzzy' invalid -test_refspec push 'master~1:refs/remotes/frotz/backup' -test_refspec fetch 'master~1:refs/remotes/frotz/backup' invalid +test_refspec push 'main~1:refs/remotes/frotz/backup' +test_refspec fetch 'main~1:refs/remotes/frotz/backup' invalid test_refspec push 'HEAD~4:refs/remotes/frotz/new' test_refspec fetch 'HEAD~4:refs/remotes/frotz/new' invalid test_refspec push 'HEAD' test_refspec fetch 'HEAD' +test_refspec push '@' +test_refspec fetch '@' test_refspec push 'refs/heads/ nitfol' invalid test_refspec fetch 'refs/heads/ nitfol' invalid diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh index e98c3a0174..f53f58895a 100755 --- a/t/t5512-ls-remote.sh +++ b/t/t5512-ls-remote.sh @@ -2,6 +2,9 @@ test_description='git ls-remote' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh generate_references () { @@ -118,7 +121,7 @@ test_expect_success 'use branch.<name>.remote if possible' ' echo "From $URL" >exp_err && git remote add other $URL && - git config branch.master.remote other && + git config branch.main.remote other && git ls-remote 2>actual_err >actual && test_cmp exp_err actual_err && @@ -129,9 +132,9 @@ test_expect_success 'confuses pattern as remote when no remote specified' ' if test_have_prereq MINGW then # Windows does not like asterisks in pathname - does_not_exist=master + does_not_exist=main else - does_not_exist="refs*master" + does_not_exist="refs*main" fi && cat >exp <<-EOF && fatal: '\''$does_not_exist'\'' does not appear to be a git repository @@ -144,10 +147,10 @@ test_expect_success 'confuses pattern as remote when no remote specified' ' # Do not expect "git ls-remote <pattern>" to work; ls-remote needs # <remote> if you want to feed <pattern>, just like you cannot say # fetch <branch>. - # We could just as easily have used "master"; the "*" emphasizes its + # We could just as easily have used "main"; the "*" emphasizes its # role as a pattern. test_must_fail git ls-remote "$does_not_exist" >actual 2>&1 && - test_i18ncmp exp actual + test_cmp exp actual ' test_expect_success 'die with non-2 for wrong repository even with --exit-code' ' @@ -217,14 +220,14 @@ test_expect_success 'protocol v2 supports hiderefs' ' test_expect_success 'ls-remote --symref' ' git fetch origin && - echo "ref: refs/heads/master HEAD" >expect && + echo "ref: refs/heads/main HEAD" >expect && generate_references \ HEAD \ - refs/heads/master >>expect && + refs/heads/main >>expect && oid=$(git rev-parse HEAD) && echo "$oid refs/remotes/origin/HEAD" >>expect && generate_references \ - refs/remotes/origin/master \ + refs/remotes/origin/main \ refs/tags/mark \ refs/tags/mark1.1 \ refs/tags/mark1.10 \ @@ -238,7 +241,7 @@ test_expect_success 'ls-remote --symref' ' test_expect_success 'ls-remote with filtered symref (refname)' ' rev=$(git rev-parse HEAD) && cat >expect <<-EOF && - ref: refs/heads/master HEAD + ref: refs/heads/main HEAD $rev HEAD EOF # Protocol v2 supports sending symrefs for refs other than HEAD, so use @@ -252,7 +255,7 @@ test_expect_failure 'ls-remote with filtered symref (--heads)' ' cat >expect <<-EOF && ref: refs/tags/mark refs/heads/foo $rev refs/heads/foo - $rev refs/heads/master + $rev refs/heads/main EOF # Protocol v2 supports sending symrefs for refs other than HEAD, so use # protocol v0 here. @@ -263,7 +266,7 @@ test_expect_failure 'ls-remote with filtered symref (--heads)' ' test_expect_success 'ls-remote --symref omits filtered-out matches' ' cat >expect <<-EOF && $rev refs/heads/foo - $rev refs/heads/master + $rev refs/heads/main EOF # Protocol v2 supports sending symrefs for refs other than HEAD, so use # protocol v0 here. @@ -330,10 +333,10 @@ test_expect_success 'ls-remote --sort fails gracefully outside repository' ' test_expect_success 'ls-remote patterns work with all protocol versions' ' git for-each-ref --format="%(objectname) %(refname)" \ - refs/heads/master refs/remotes/origin/master >expect && - git -c protocol.version=1 ls-remote . master >actual.v1 && + refs/heads/main refs/remotes/origin/main >expect && + git -c protocol.version=1 ls-remote . main >actual.v1 && test_cmp expect actual.v1 && - git -c protocol.version=2 ls-remote . master >actual.v2 && + git -c protocol.version=2 ls-remote . main >actual.v2 && test_cmp expect actual.v2 ' diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh index de8e2f1531..511ba3bd45 100755 --- a/t/t5514-fetch-multiple.sh +++ b/t/t5514-fetch-multiple.sh @@ -2,6 +2,9 @@ test_description='fetch --all works correctly' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh setup_repository () { @@ -17,7 +20,7 @@ setup_repository () { git add elif && test_tick && git commit -m "Second" && - git checkout master + git checkout main ) } @@ -32,16 +35,16 @@ test_expect_success setup ' ' cat > test/expect << EOF - one/master + one/main one/side - origin/HEAD -> origin/master - origin/master + origin/HEAD -> origin/main + origin/main origin/side three/another - three/master + three/main three/side two/another - two/master + two/main two/side EOF @@ -70,15 +73,15 @@ test_expect_success 'git fetch --all should continue if a remote has errors' ' test_expect_success 'git fetch --all does not allow non-option arguments' ' (cd test && test_must_fail git fetch --all origin && - test_must_fail git fetch --all origin master) + test_must_fail git fetch --all origin main) ' cat > expect << EOF - origin/HEAD -> origin/master - origin/master + origin/HEAD -> origin/main + origin/main origin/side three/another - three/master + three/main three/side EOF @@ -92,10 +95,10 @@ test_expect_success 'git fetch --multiple (but only one remote)' ' ' cat > expect << EOF - one/master + one/main one/side two/another - two/master + two/main two/side EOF @@ -108,7 +111,7 @@ test_expect_success 'git fetch --multiple (two remotes)' ' GIT_TRACE=1 git fetch --multiple one two 2>trace && git branch -r > output && test_cmp ../expect output && - grep "built-in: git gc" trace >gc && + grep "built-in: git maintenance" trace >gc && test_line_count = 1 gc ) ' @@ -133,13 +136,13 @@ test_expect_success 'git fetch --all (skipFetchAll)' ' ' cat > expect << EOF - one/master + one/main one/side three/another - three/master + three/main three/side two/another - two/master + two/main two/side EOF diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh index 9d6a46ff56..50f14101c5 100755 --- a/t/t5515-fetch-merge-logic.sh +++ b/t/t5515-fetch-merge-logic.sh @@ -11,11 +11,14 @@ test_description='Merge logic in fetch' GIT_TEST_PROTOCOL_VERSION=0 export GIT_TEST_PROTOCOL_VERSION +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh build_script () { script="$1" && - for i in one three_file master master2 one_tree three two two2 three2 + for i in one three_file main topic_2 one_tree three two two2 three2 do echo "s/$(test_oid --hash=sha1 "$i")/$(test_oid "$i")/g" >>"$script" done @@ -40,8 +43,8 @@ test_expect_success setup ' three_file sha1:0e3b14047d3ee365f4f2a1b673db059c3972589c three_file sha256:bc4447d50c07497a8bfe6eef817f2364ecca9d471452e43b52756cc1a908bd32 - master sha1:6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 - master sha256:8521c3072461fcfe8f32d67f95cc6e6b832a2db2fa29769ffc788bce85ebcd75 + main sha1:ecf3b3627b498bdcb735cc4343bf165f76964e9a + main sha256:fff666109892bb4b1c80cd1649d2d8762a0663db8b5d46c8be98360b64fbba5f one_tree sha1:22feea448b023a2d864ef94b013735af34d238ba one_tree sha256:6e4743f4ef2356b881dda5e91f5c7cdffe870faf350bf7b312f80a20935f5d83 @@ -52,8 +55,8 @@ test_expect_success setup ' two sha1:525b7fb068d59950d185a8779dc957c77eed73ba two sha256:3b21de3440cd38c2a9e9b464adb923f7054949ed4c918e1a0ac4c95cd52774db - master2 sha1:754b754407bf032e9a2f9d5a9ad05ca79a6b228f - master2 sha256:6c7abaea8a6d8ef4d89877e68462758dc6774690fbbbb0e6d7dd57415c9abde0 + topic_2 sha1:b4ab76b1a01ea602209932134a44f1e6bd610832 + topic_2 sha256:380ebae0113f877ce46fcdf39d5bc33e4dc0928db5c5a4d5fdc78381c4d55ae3 two2 sha1:6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 two2 sha256:87a2d3ee29c83a3dc7afd41c0606b11f67603120b910a7be7840accdc18344d4 @@ -80,9 +83,9 @@ test_expect_success setup ' git tag -a -m "Tag Three file" tag-three-file HEAD^{tree}:file && git branch three && - echo master >> file && - git commit -a -m Master && - git tag -a -m "Tag Master" tag-master && + echo main >> file && + git commit -a -m Main && + git tag -a -m "Tag Main" tag-main && git checkout three && @@ -91,7 +94,7 @@ test_expect_success setup ' git config remote.origin.url ../.git/ && git config remote.config-explicit.url ../.git/ && - git config remote.config-explicit.fetch refs/heads/master:remotes/rem/master && + git config remote.config-explicit.fetch refs/heads/main:remotes/rem/main && git config --add remote.config-explicit.fetch refs/heads/one:remotes/rem/one && git config --add remote.config-explicit.fetch two:remotes/rem/two && git config --add remote.config-explicit.fetch refs/heads/three:remotes/rem/three && @@ -104,7 +107,7 @@ test_expect_success setup ' mkdir -p .git/remotes && { echo "URL: ../.git/" - echo "Pull: refs/heads/master:remotes/rem/master" + echo "Pull: refs/heads/main:remotes/rem/main" echo "Pull: refs/heads/one:remotes/rem/one" echo "Pull: two:remotes/rem/two" echo "Pull: refs/heads/three:remotes/rem/three" @@ -149,7 +152,7 @@ done > tests # but does depend on Pull: or fetch lines. # Use two branches completely unrelated from the arguments, # the clone default and one without branch properties -for branch in master br-unconfig ; do +for branch in main br-unconfig ; do echo $branch for remote in $remotes ; do echo $branch $remote @@ -158,7 +161,7 @@ done >> tests # Merge logic does not depend on branch properties # neither in the Pull: or .fetch config -for branch in master br-unconfig ; do +for branch in main br-unconfig ; do cat <<EOF $branch ../.git $branch ../.git one diff --git a/t/t5515/fetch.br-branches-default b/t/t5515/fetch.br-branches-default index a1bc3d53a6..0bed09cc12 100644 --- a/t/t5515/fetch.br-branches-default +++ b/t/t5515/fetch.br-branches-default @@ -1,6 +1,6 @@ # br-branches-default -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-default-merge b/t/t5515/fetch.br-branches-default-merge index 12ab08e8ac..59eef63527 100644 --- a/t/t5515/fetch.br-branches-default-merge +++ b/t/t5515/fetch.br-branches-default-merge @@ -1,7 +1,7 @@ # br-branches-default-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-default-merge_branches-default b/t/t5515/fetch.br-branches-default-merge_branches-default index 54427522dd..490186c158 100644 --- a/t/t5515/fetch.br-branches-default-merge_branches-default +++ b/t/t5515/fetch.br-branches-default-merge_branches-default @@ -1,7 +1,7 @@ # br-branches-default-merge branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-default-octopus b/t/t5515/fetch.br-branches-default-octopus index 498a761aae..d484138c27 100644 --- a/t/t5515/fetch.br-branches-default-octopus +++ b/t/t5515/fetch.br-branches-default-octopus @@ -1,8 +1,8 @@ # br-branches-default-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-default-octopus_branches-default b/t/t5515/fetch.br-branches-default-octopus_branches-default index 0857f134e1..b79a5fe2c3 100644 --- a/t/t5515/fetch.br-branches-default-octopus_branches-default +++ b/t/t5515/fetch.br-branches-default-octopus_branches-default @@ -1,8 +1,8 @@ # br-branches-default-octopus branches-default 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-default_branches-default b/t/t5515/fetch.br-branches-default_branches-default index 8cbd718936..1c866d85e6 100644 --- a/t/t5515/fetch.br-branches-default_branches-default +++ b/t/t5515/fetch.br-branches-default_branches-default @@ -1,6 +1,6 @@ # br-branches-default branches-default -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one b/t/t5515/fetch.br-branches-one index c98f670526..6925a775b6 100644 --- a/t/t5515/fetch.br-branches-one +++ b/t/t5515/fetch.br-branches-one @@ -1,6 +1,6 @@ # br-branches-one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one-merge b/t/t5515/fetch.br-branches-one-merge index 54a77420d5..85257031ce 100644 --- a/t/t5515/fetch.br-branches-one-merge +++ b/t/t5515/fetch.br-branches-one-merge @@ -1,7 +1,7 @@ # br-branches-one-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one-merge_branches-one b/t/t5515/fetch.br-branches-one-merge_branches-one index b4d1bb0b0b..3a63a7f450 100644 --- a/t/t5515/fetch.br-branches-one-merge_branches-one +++ b/t/t5515/fetch.br-branches-one-merge_branches-one @@ -1,7 +1,7 @@ # br-branches-one-merge branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one-octopus b/t/t5515/fetch.br-branches-one-octopus index 97c4b544b8..46af763fec 100644 --- a/t/t5515/fetch.br-branches-one-octopus +++ b/t/t5515/fetch.br-branches-one-octopus @@ -1,7 +1,7 @@ # br-branches-one-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one-octopus_branches-one b/t/t5515/fetch.br-branches-one-octopus_branches-one index df705f74c7..becfde9ddd 100644 --- a/t/t5515/fetch.br-branches-one-octopus_branches-one +++ b/t/t5515/fetch.br-branches-one-octopus_branches-one @@ -1,7 +1,7 @@ # br-branches-one-octopus branches-one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-branches-one_branches-one b/t/t5515/fetch.br-branches-one_branches-one index 96890e5bd9..9ba34c6754 100644 --- a/t/t5515/fetch.br-branches-one_branches-one +++ b/t/t5515/fetch.br-branches-one_branches-one @@ -1,6 +1,6 @@ # br-branches-one branches-one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit b/t/t5515/fetch.br-config-explicit index 68fc927263..7466a73214 100644 --- a/t/t5515/fetch.br-config-explicit +++ b/t/t5515/fetch.br-config-explicit @@ -1,9 +1,9 @@ # br-config-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit-merge b/t/t5515/fetch.br-config-explicit-merge index 5ce764a06e..9375b7d21d 100644 --- a/t/t5515/fetch.br-config-explicit-merge +++ b/t/t5515/fetch.br-config-explicit-merge @@ -1,9 +1,9 @@ # br-config-explicit-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit-merge_config-explicit b/t/t5515/fetch.br-config-explicit-merge_config-explicit index b1152b76dc..6335e2b113 100644 --- a/t/t5515/fetch.br-config-explicit-merge_config-explicit +++ b/t/t5515/fetch.br-config-explicit-merge_config-explicit @@ -1,9 +1,9 @@ # br-config-explicit-merge config-explicit 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit-octopus b/t/t5515/fetch.br-config-explicit-octopus index 110577bb67..c379aa9b31 100644 --- a/t/t5515/fetch.br-config-explicit-octopus +++ b/t/t5515/fetch.br-config-explicit-octopus @@ -1,9 +1,9 @@ # br-config-explicit-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit-octopus_config-explicit b/t/t5515/fetch.br-config-explicit-octopus_config-explicit index a29dd8baba..7fb3a3eef8 100644 --- a/t/t5515/fetch.br-config-explicit-octopus_config-explicit +++ b/t/t5515/fetch.br-config-explicit-octopus_config-explicit @@ -1,9 +1,9 @@ # br-config-explicit-octopus config-explicit 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-explicit_config-explicit b/t/t5515/fetch.br-config-explicit_config-explicit index b19b0162e1..86045a79d4 100644 --- a/t/t5515/fetch.br-config-explicit_config-explicit +++ b/t/t5515/fetch.br-config-explicit_config-explicit @@ -1,9 +1,9 @@ # br-config-explicit config-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob b/t/t5515/fetch.br-config-glob index 946d70ca07..bfeef2b716 100644 --- a/t/t5515/fetch.br-config-glob +++ b/t/t5515/fetch.br-config-glob @@ -1,9 +1,9 @@ # br-config-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob-merge b/t/t5515/fetch.br-config-glob-merge index 89f2596cb9..5376a4ac1d 100644 --- a/t/t5515/fetch.br-config-glob-merge +++ b/t/t5515/fetch.br-config-glob-merge @@ -1,9 +1,9 @@ # br-config-glob-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob-merge_config-glob b/t/t5515/fetch.br-config-glob-merge_config-glob index 2ba4832160..7dfc2feb35 100644 --- a/t/t5515/fetch.br-config-glob-merge_config-glob +++ b/t/t5515/fetch.br-config-glob-merge_config-glob @@ -1,9 +1,9 @@ # br-config-glob-merge config-glob 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob-octopus b/t/t5515/fetch.br-config-glob-octopus index 64994df7e2..10840309ef 100644 --- a/t/t5515/fetch.br-config-glob-octopus +++ b/t/t5515/fetch.br-config-glob-octopus @@ -1,9 +1,9 @@ # br-config-glob-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob-octopus_config-glob b/t/t5515/fetch.br-config-glob-octopus_config-glob index 681a725adc..839866daf3 100644 --- a/t/t5515/fetch.br-config-glob-octopus_config-glob +++ b/t/t5515/fetch.br-config-glob-octopus_config-glob @@ -1,9 +1,9 @@ # br-config-glob-octopus config-glob 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-config-glob_config-glob b/t/t5515/fetch.br-config-glob_config-glob index 19daf0cb77..7b0cb91e51 100644 --- a/t/t5515/fetch.br-config-glob_config-glob +++ b/t/t5515/fetch.br-config-glob_config-glob @@ -1,9 +1,9 @@ # br-config-glob config-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit b/t/t5515/fetch.br-remote-explicit index ab44bc5519..d6619e7fc0 100644 --- a/t/t5515/fetch.br-remote-explicit +++ b/t/t5515/fetch.br-remote-explicit @@ -1,9 +1,9 @@ # br-remote-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit-merge b/t/t5515/fetch.br-remote-explicit-merge index d018b3515f..5b49b7c4c5 100644 --- a/t/t5515/fetch.br-remote-explicit-merge +++ b/t/t5515/fetch.br-remote-explicit-merge @@ -1,9 +1,9 @@ # br-remote-explicit-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit-merge_remote-explicit b/t/t5515/fetch.br-remote-explicit-merge_remote-explicit index 0d3d780dd0..417261d8eb 100644 --- a/t/t5515/fetch.br-remote-explicit-merge_remote-explicit +++ b/t/t5515/fetch.br-remote-explicit-merge_remote-explicit @@ -1,9 +1,9 @@ # br-remote-explicit-merge remote-explicit 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit-octopus b/t/t5515/fetch.br-remote-explicit-octopus index 6f843044ed..2edef64473 100644 --- a/t/t5515/fetch.br-remote-explicit-octopus +++ b/t/t5515/fetch.br-remote-explicit-octopus @@ -1,9 +1,9 @@ # br-remote-explicit-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit b/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit index 3546a83713..ceb8752e1f 100644 --- a/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit +++ b/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit @@ -1,9 +1,9 @@ # br-remote-explicit-octopus remote-explicit 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-explicit_remote-explicit b/t/t5515/fetch.br-remote-explicit_remote-explicit index 01e014e6a0..b7abbd227c 100644 --- a/t/t5515/fetch.br-remote-explicit_remote-explicit +++ b/t/t5515/fetch.br-remote-explicit_remote-explicit @@ -1,9 +1,9 @@ # br-remote-explicit remote-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob b/t/t5515/fetch.br-remote-glob index 09bfcee00f..645412c73f 100644 --- a/t/t5515/fetch.br-remote-glob +++ b/t/t5515/fetch.br-remote-glob @@ -1,9 +1,9 @@ # br-remote-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob-merge b/t/t5515/fetch.br-remote-glob-merge index 7e1a433a64..8512cfd8d3 100644 --- a/t/t5515/fetch.br-remote-glob-merge +++ b/t/t5515/fetch.br-remote-glob-merge @@ -1,9 +1,9 @@ # br-remote-glob-merge 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob-merge_remote-glob b/t/t5515/fetch.br-remote-glob-merge_remote-glob index 53571bb4ec..7394164d85 100644 --- a/t/t5515/fetch.br-remote-glob-merge_remote-glob +++ b/t/t5515/fetch.br-remote-glob-merge_remote-glob @@ -1,9 +1,9 @@ # br-remote-glob-merge remote-glob 0567da4d5edd2ff4bb292a465ba9e64dcad9536b branch 'three' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob-octopus b/t/t5515/fetch.br-remote-glob-octopus index c7c8b6d7f4..0ca4719ef8 100644 --- a/t/t5515/fetch.br-remote-glob-octopus +++ b/t/t5515/fetch.br-remote-glob-octopus @@ -1,9 +1,9 @@ # br-remote-glob-octopus 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob-octopus_remote-glob b/t/t5515/fetch.br-remote-glob-octopus_remote-glob index 36076fba0c..7e7b0ba5f5 100644 --- a/t/t5515/fetch.br-remote-glob-octopus_remote-glob +++ b/t/t5515/fetch.br-remote-glob-octopus_remote-glob @@ -1,9 +1,9 @@ # br-remote-glob-octopus remote-glob 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-remote-glob_remote-glob b/t/t5515/fetch.br-remote-glob_remote-glob index 20ba5cb172..7bae5ecfb7 100644 --- a/t/t5515/fetch.br-remote-glob_remote-glob +++ b/t/t5515/fetch.br-remote-glob_remote-glob @@ -1,9 +1,9 @@ # br-remote-glob remote-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig b/t/t5515/fetch.br-unconfig index 887ccfc41f..ccaa54fed2 100644 --- a/t/t5515/fetch.br-unconfig +++ b/t/t5515/fetch.br-unconfig @@ -1,9 +1,9 @@ # br-unconfig -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_--tags_.._.git b/t/t5515/fetch.br-unconfig_--tags_.._.git index 0f70f66c70..3afb4f850d 100644 --- a/t/t5515/fetch.br-unconfig_--tags_.._.git +++ b/t/t5515/fetch.br-unconfig_--tags_.._.git @@ -1,6 +1,6 @@ # br-unconfig --tags ../.git 0567da4d5edd2ff4bb292a465ba9e64dcad9536b ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file index 74115361ba..525713a2ab 100644 --- a/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file +++ b/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file @@ -2,7 +2,7 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 tag 'tag-one' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file index 7726983818..18c871f512 100644 --- a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file +++ b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file @@ -1,7 +1,7 @@ # br-unconfig ../.git tag tag-one-tree tag tag-three-file 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three index 7b3750ce5c..7328d30c67 100644 --- a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three +++ b/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three @@ -1,7 +1,7 @@ # br-unconfig ../.git tag tag-one tag tag-three 8e32a6d901327a23ef831511badce7bf3bf46689 tag 'tag-one' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 tag 'tag-three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.br-unconfig_branches-default b/t/t5515/fetch.br-unconfig_branches-default index da30e3c62c..3d82f94376 100644 --- a/t/t5515/fetch.br-unconfig_branches-default +++ b/t/t5515/fetch.br-unconfig_branches-default @@ -1,6 +1,6 @@ # br-unconfig branches-default -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_branches-one b/t/t5515/fetch.br-unconfig_branches-one index e4614314c5..948ed0c3d9 100644 --- a/t/t5515/fetch.br-unconfig_branches-one +++ b/t/t5515/fetch.br-unconfig_branches-one @@ -1,6 +1,6 @@ # br-unconfig branches-one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_config-explicit b/t/t5515/fetch.br-unconfig_config-explicit index ed323c9871..65aaec8a7b 100644 --- a/t/t5515/fetch.br-unconfig_config-explicit +++ b/t/t5515/fetch.br-unconfig_config-explicit @@ -1,9 +1,9 @@ # br-unconfig config-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_config-glob b/t/t5515/fetch.br-unconfig_config-glob index 2372ed03c5..1aa3d4598a 100644 --- a/t/t5515/fetch.br-unconfig_config-glob +++ b/t/t5515/fetch.br-unconfig_config-glob @@ -1,9 +1,9 @@ # br-unconfig config-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_remote-explicit b/t/t5515/fetch.br-unconfig_remote-explicit index 6318dd11b4..16438d2085 100644 --- a/t/t5515/fetch.br-unconfig_remote-explicit +++ b/t/t5515/fetch.br-unconfig_remote-explicit @@ -1,9 +1,9 @@ # br-unconfig remote-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.br-unconfig_remote-glob b/t/t5515/fetch.br-unconfig_remote-glob index 1d9afad7d8..7a01d2e0f6 100644 --- a/t/t5515/fetch.br-unconfig_remote-glob +++ b/t/t5515/fetch.br-unconfig_remote-glob @@ -1,9 +1,9 @@ # br-unconfig remote-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master b/t/t5515/fetch.main index 9b29d67200..819ed33bf5 100644 --- a/t/t5515/fetch.master +++ b/t/t5515/fetch.main @@ -1,9 +1,9 @@ -# master -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +# main +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_--tags_.._.git b/t/t5515/fetch.main_--tags_.._.git index ab473a6e1f..ddf67a613b 100644 --- a/t/t5515/fetch.master_--tags_.._.git +++ b/t/t5515/fetch.main_--tags_.._.git @@ -1,6 +1,6 @@ -# master --tags ../.git +# main --tags ../.git 0567da4d5edd2ff4bb292a465ba9e64dcad9536b ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_.._.git b/t/t5515/fetch.main_.._.git index 66d1aaddae..285e57eaf5 100644 --- a/t/t5515/fetch.master_.._.git +++ b/t/t5515/fetch.main_.._.git @@ -1,2 +1,2 @@ -# master ../.git +# main ../.git 0567da4d5edd2ff4bb292a465ba9e64dcad9536b ../ diff --git a/t/t5515/fetch.master_.._.git_one b/t/t5515/fetch.main_.._.git_one index 35deddbd2c..f9f511efbc 100644 --- a/t/t5515/fetch.master_.._.git_one +++ b/t/t5515/fetch.main_.._.git_one @@ -1,2 +1,2 @@ -# master ../.git one +# main ../.git one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ diff --git a/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/fetch.main_.._.git_one_tag_tag-one_tag_tag-three-file index 0672d1292f..187643e2ce 100644 --- a/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file +++ b/t/t5515/fetch.main_.._.git_one_tag_tag-one_tag_tag-three-file @@ -1,8 +1,8 @@ -# master ../.git one tag tag-one tag tag-three-file +# main ../.git one tag tag-one tag tag-three-file 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 tag 'tag-one' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.master_.._.git_one_two b/t/t5515/fetch.main_.._.git_one_two index 35ec5782c8..048ad97a15 100644 --- a/t/t5515/fetch.master_.._.git_one_two +++ b/t/t5515/fetch.main_.._.git_one_two @@ -1,3 +1,3 @@ -# master ../.git one two +# main ../.git one two 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 branch 'two' of ../ diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/fetch.main_.._.git_tag_tag-one-tree_tag_tag-three-file index 0fd737cf81..df5f2a7d5f 100644 --- a/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file +++ b/t/t5515/fetch.main_.._.git_tag_tag-one-tree_tag_tag-three-file @@ -1,7 +1,7 @@ -# master ../.git tag tag-one-tree tag tag-three-file +# main ../.git tag tag-one-tree tag tag-three-file 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three b/t/t5515/fetch.main_.._.git_tag_tag-one_tag_tag-three index e488986653..a40b72817b 100644 --- a/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three +++ b/t/t5515/fetch.main_.._.git_tag_tag-one_tag_tag-three @@ -1,7 +1,7 @@ -# master ../.git tag tag-one tag tag-three +# main ../.git tag tag-one tag tag-three 8e32a6d901327a23ef831511badce7bf3bf46689 tag 'tag-one' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 tag 'tag-three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ 0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ 525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.master_branches-default b/t/t5515/fetch.main_branches-default index 2eedd3bfa4..e3466e8329 100644 --- a/t/t5515/fetch.master_branches-default +++ b/t/t5515/fetch.main_branches-default @@ -1,6 +1,6 @@ -# master branches-default -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +# main branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_branches-one b/t/t5515/fetch.main_branches-one index 901ce21d33..a94f11af4c 100644 --- a/t/t5515/fetch.master_branches-one +++ b/t/t5515/fetch.main_branches-one @@ -1,6 +1,6 @@ -# master branches-one +# main branches-one 8e32a6d901327a23ef831511badce7bf3bf46689 branch 'one' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_config-explicit b/t/t5515/fetch.main_config-explicit index 251c826aa9..16d04c14d2 100644 --- a/t/t5515/fetch.master_config-explicit +++ b/t/t5515/fetch.main_config-explicit @@ -1,9 +1,9 @@ -# master config-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +# main config-explicit +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_config-glob b/t/t5515/fetch.main_config-glob index 27c158e332..f6a6f56991 100644 --- a/t/t5515/fetch.master_config-glob +++ b/t/t5515/fetch.main_config-glob @@ -1,9 +1,9 @@ -# master config-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ +# main config-glob +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.master_remote-explicit b/t/t5515/fetch.main_remote-explicit index b3cfe6b98b..bf4fd65e00 100644 --- a/t/t5515/fetch.master_remote-explicit +++ b/t/t5515/fetch.main_remote-explicit @@ -1,9 +1,9 @@ -# master remote-explicit -754b754407bf032e9a2f9d5a9ad05ca79a6b228f branch 'master' of ../ +# main remote-explicit +b4ab76b1a01ea602209932134a44f1e6bd610832 branch 'main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ diff --git a/t/t5515/fetch.main_remote-glob b/t/t5515/fetch.main_remote-glob new file mode 100644 index 0000000000..91dc2e26ef --- /dev/null +++ b/t/t5515/fetch.main_remote-glob @@ -0,0 +1,11 @@ +# main remote-glob +b4ab76b1a01ea602209932134a44f1e6bd610832 not-for-merge branch 'main' of ../ +8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ +0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ +6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ +ecf3b3627b498bdcb735cc4343bf165f76964e9a not-for-merge tag 'tag-main' of ../ +8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ +22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ +c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ +0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ +525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/fetch.master_remote-glob b/t/t5515/fetch.master_remote-glob deleted file mode 100644 index 118befd1e4..0000000000 --- a/t/t5515/fetch.master_remote-glob +++ /dev/null @@ -1,11 +0,0 @@ -# master remote-glob -754b754407bf032e9a2f9d5a9ad05ca79a6b228f not-for-merge branch 'master' of ../ -8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge branch 'one' of ../ -0567da4d5edd2ff4bb292a465ba9e64dcad9536b not-for-merge branch 'three' of ../ -6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 not-for-merge branch 'two' of ../ -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ -8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ -22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ -c61a82b60967180544e3c19f819ddbd0c9f89899 not-for-merge tag 'tag-three' of ../ -0e3b14047d3ee365f4f2a1b673db059c3972589c not-for-merge tag 'tag-three-file' of ../ -525b7fb068d59950d185a8779dc957c77eed73ba not-for-merge tag 'tag-two' of ../ diff --git a/t/t5515/refs.br-branches-default b/t/t5515/refs.br-branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default +++ b/t/t5515/refs.br-branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-default-merge b/t/t5515/refs.br-branches-default-merge index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default-merge +++ b/t/t5515/refs.br-branches-default-merge @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-default-merge_branches-default b/t/t5515/refs.br-branches-default-merge_branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default-merge_branches-default +++ b/t/t5515/refs.br-branches-default-merge_branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-default-octopus b/t/t5515/refs.br-branches-default-octopus index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default-octopus +++ b/t/t5515/refs.br-branches-default-octopus @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-default-octopus_branches-default b/t/t5515/refs.br-branches-default-octopus_branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default-octopus_branches-default +++ b/t/t5515/refs.br-branches-default-octopus_branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-default_branches-default b/t/t5515/refs.br-branches-default_branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-branches-default_branches-default +++ b/t/t5515/refs.br-branches-default_branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one b/t/t5515/refs.br-branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one +++ b/t/t5515/refs.br-branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one-merge b/t/t5515/refs.br-branches-one-merge index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one-merge +++ b/t/t5515/refs.br-branches-one-merge @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one-merge_branches-one b/t/t5515/refs.br-branches-one-merge_branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one-merge_branches-one +++ b/t/t5515/refs.br-branches-one-merge_branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one-octopus b/t/t5515/refs.br-branches-one-octopus index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one-octopus +++ b/t/t5515/refs.br-branches-one-octopus @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one-octopus_branches-one b/t/t5515/refs.br-branches-one-octopus_branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one-octopus_branches-one +++ b/t/t5515/refs.br-branches-one-octopus_branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-branches-one_branches-one b/t/t5515/refs.br-branches-one_branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-branches-one_branches-one +++ b/t/t5515/refs.br-branches-one_branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit b/t/t5515/refs.br-config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit +++ b/t/t5515/refs.br-config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit-merge b/t/t5515/refs.br-config-explicit-merge index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit-merge +++ b/t/t5515/refs.br-config-explicit-merge @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit-merge_config-explicit b/t/t5515/refs.br-config-explicit-merge_config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit-merge_config-explicit +++ b/t/t5515/refs.br-config-explicit-merge_config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit-octopus b/t/t5515/refs.br-config-explicit-octopus index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit-octopus +++ b/t/t5515/refs.br-config-explicit-octopus @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit-octopus_config-explicit b/t/t5515/refs.br-config-explicit-octopus_config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit-octopus_config-explicit +++ b/t/t5515/refs.br-config-explicit-octopus_config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-explicit_config-explicit b/t/t5515/refs.br-config-explicit_config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-explicit_config-explicit +++ b/t/t5515/refs.br-config-explicit_config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob b/t/t5515/refs.br-config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob +++ b/t/t5515/refs.br-config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob-merge b/t/t5515/refs.br-config-glob-merge index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob-merge +++ b/t/t5515/refs.br-config-glob-merge @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob-merge_config-glob b/t/t5515/refs.br-config-glob-merge_config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob-merge_config-glob +++ b/t/t5515/refs.br-config-glob-merge_config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob-octopus b/t/t5515/refs.br-config-glob-octopus index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob-octopus +++ b/t/t5515/refs.br-config-glob-octopus @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob-octopus_config-glob b/t/t5515/refs.br-config-glob-octopus_config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob-octopus_config-glob +++ b/t/t5515/refs.br-config-glob-octopus_config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-config-glob_config-glob b/t/t5515/refs.br-config-glob_config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-config-glob_config-glob +++ b/t/t5515/refs.br-config-glob_config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit b/t/t5515/refs.br-remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit +++ b/t/t5515/refs.br-remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit-merge b/t/t5515/refs.br-remote-explicit-merge index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit-merge +++ b/t/t5515/refs.br-remote-explicit-merge @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit-merge_remote-explicit b/t/t5515/refs.br-remote-explicit-merge_remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit-merge_remote-explicit +++ b/t/t5515/refs.br-remote-explicit-merge_remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit-octopus b/t/t5515/refs.br-remote-explicit-octopus index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit-octopus +++ b/t/t5515/refs.br-remote-explicit-octopus @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit-octopus_remote-explicit b/t/t5515/refs.br-remote-explicit-octopus_remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit-octopus_remote-explicit +++ b/t/t5515/refs.br-remote-explicit-octopus_remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-explicit_remote-explicit b/t/t5515/refs.br-remote-explicit_remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-explicit_remote-explicit +++ b/t/t5515/refs.br-remote-explicit_remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob b/t/t5515/refs.br-remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob +++ b/t/t5515/refs.br-remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob-merge b/t/t5515/refs.br-remote-glob-merge index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob-merge +++ b/t/t5515/refs.br-remote-glob-merge @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob-merge_remote-glob b/t/t5515/refs.br-remote-glob-merge_remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob-merge_remote-glob +++ b/t/t5515/refs.br-remote-glob-merge_remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob-octopus b/t/t5515/refs.br-remote-glob-octopus index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob-octopus +++ b/t/t5515/refs.br-remote-glob-octopus @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob-octopus_remote-glob b/t/t5515/refs.br-remote-glob-octopus_remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob-octopus_remote-glob +++ b/t/t5515/refs.br-remote-glob-octopus_remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-remote-glob_remote-glob b/t/t5515/refs.br-remote-glob_remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-remote-glob_remote-glob +++ b/t/t5515/refs.br-remote-glob_remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig b/t/t5515/refs.br-unconfig index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.br-unconfig +++ b/t/t5515/refs.br-unconfig @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_--tags_.._.git b/t/t5515/refs.br-unconfig_--tags_.._.git index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.br-unconfig_--tags_.._.git +++ b/t/t5515/refs.br-unconfig_--tags_.._.git @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_.._.git b/t/t5515/refs.br-unconfig_.._.git index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.br-unconfig_.._.git +++ b/t/t5515/refs.br-unconfig_.._.git @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.br-unconfig_.._.git_one b/t/t5515/refs.br-unconfig_.._.git_one index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.br-unconfig_.._.git_one +++ b/t/t5515/refs.br-unconfig_.._.git_one @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file +++ b/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_.._.git_one_two b/t/t5515/refs.br-unconfig_.._.git_one_two index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.br-unconfig_.._.git_one_two +++ b/t/t5515/refs.br-unconfig_.._.git_one_two @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file +++ b/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three b/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three +++ b/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_branches-default b/t/t5515/refs.br-unconfig_branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.br-unconfig_branches-default +++ b/t/t5515/refs.br-unconfig_branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_branches-one b/t/t5515/refs.br-unconfig_branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.br-unconfig_branches-one +++ b/t/t5515/refs.br-unconfig_branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_config-explicit b/t/t5515/refs.br-unconfig_config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-unconfig_config-explicit +++ b/t/t5515/refs.br-unconfig_config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_config-glob b/t/t5515/refs.br-unconfig_config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-unconfig_config-glob +++ b/t/t5515/refs.br-unconfig_config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_remote-explicit b/t/t5515/refs.br-unconfig_remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-unconfig_remote-explicit +++ b/t/t5515/refs.br-unconfig_remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.br-unconfig_remote-glob b/t/t5515/refs.br-unconfig_remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.br-unconfig_remote-glob +++ b/t/t5515/refs.br-unconfig_remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_--tags_.._.git b/t/t5515/refs.main index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.master_--tags_.._.git +++ b/t/t5515/refs.main @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file b/t/t5515/refs.main_--tags_.._.git index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file +++ b/t/t5515/refs.main_--tags_.._.git @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_.._.git_one_two b/t/t5515/refs.main_.._.git index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.master_.._.git_one_two +++ b/t/t5515/refs.main_.._.git @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.master_.._.git b/t/t5515/refs.main_.._.git_one index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.master_.._.git +++ b/t/t5515/refs.main_.._.git_one @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file b/t/t5515/refs.main_.._.git_one_tag_tag-one_tag_tag-three-file index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file +++ b/t/t5515/refs.main_.._.git_one_tag_tag-one_tag_tag-three-file @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_.._.git_one b/t/t5515/refs.main_.._.git_one_two index 70962eaac1..4a74b68029 100644 --- a/t/t5515/refs.master_.._.git_one +++ b/t/t5515/refs.main_.._.git_one_two @@ -1,5 +1,5 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two diff --git a/t/t5515/refs.master b/t/t5515/refs.main_.._.git_tag_tag-one-tree_tag_tag-three-file index 13e4ad2e46..f2ab01f68b 100644 --- a/t/t5515/refs.master +++ b/t/t5515/refs.main_.._.git_tag_tag-one-tree_tag_tag-three-file @@ -1,9 +1,9 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.main_.._.git_tag_tag-one_tag_tag-three b/t/t5515/refs.main_.._.git_tag_tag-one_tag_tag-three new file mode 100644 index 0000000000..f2ab01f68b --- /dev/null +++ b/t/t5515/refs.main_.._.git_tag_tag-one_tag_tag-three @@ -0,0 +1,11 @@ +0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main +8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one +0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three +6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main +8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one +22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree +c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three +0e3b14047d3ee365f4f2a1b673db059c3972589c refs/tags/tag-three-file +525b7fb068d59950d185a8779dc957c77eed73ba refs/tags/tag-two diff --git a/t/t5515/refs.master_branches-default b/t/t5515/refs.main_branches-default index 21917c1e5d..dc4f2b7a4e 100644 --- a/t/t5515/refs.master_branches-default +++ b/t/t5515/refs.main_branches-default @@ -1,10 +1,10 @@ -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/heads/branches-default +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/heads/branches-default 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_branches-one b/t/t5515/refs.main_branches-one index 8a705a5df2..e8f79bf4b1 100644 --- a/t/t5515/refs.master_branches-one +++ b/t/t5515/refs.main_branches-one @@ -1,10 +1,10 @@ 8e32a6d901327a23ef831511badce7bf3bf46689 refs/heads/branches-one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_config-explicit b/t/t5515/refs.main_config-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.master_config-explicit +++ b/t/t5515/refs.main_config-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_config-glob b/t/t5515/refs.main_config-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.master_config-glob +++ b/t/t5515/refs.main_config-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_remote-explicit b/t/t5515/refs.main_remote-explicit index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.master_remote-explicit +++ b/t/t5515/refs.main_remote-explicit @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_remote-glob b/t/t5515/refs.main_remote-glob index 9bbbfd9fc5..a28fa5f56e 100644 --- a/t/t5515/refs.master_remote-glob +++ b/t/t5515/refs.main_remote-glob @@ -1,13 +1,13 @@ 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/origin/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/rem/master +b4ab76b1a01ea602209932134a44f1e6bd610832 refs/remotes/rem/main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/rem/one 0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/rem/three 6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/rem/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master +ecf3b3627b498bdcb735cc4343bf165f76964e9a refs/tags/tag-main 8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one 22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three diff --git a/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three b/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three deleted file mode 100644 index 13e4ad2e46..0000000000 --- a/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three +++ /dev/null @@ -1,11 +0,0 @@ -0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/HEAD -754b754407bf032e9a2f9d5a9ad05ca79a6b228f refs/remotes/origin/master -8e32a6d901327a23ef831511badce7bf3bf46689 refs/remotes/origin/one -0567da4d5edd2ff4bb292a465ba9e64dcad9536b refs/remotes/origin/three -6134ee8f857693b96ff1cc98d3e2fd62b199e5a8 refs/remotes/origin/two -6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 refs/tags/tag-master -8e32a6d901327a23ef831511badce7bf3bf46689 refs/tags/tag-one -22feea448b023a2d864ef94b013735af34d238ba refs/tags/tag-one-tree -c61a82b60967180544e3c19f819ddbd0c9f89899 refs/tags/tag-three -0e3b14047d3ee365f4f2a1b673db059c3972589c refs/tags/tag-three-file -525b7fb068d59950d185a8779dc957c77eed73ba refs/tags/tag-two diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 36ad20a849..0916f76302 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -14,6 +14,9 @@ This test checks the following functionality: * reflogs ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh D=$(pwd) @@ -120,13 +123,13 @@ test_expect_success setup ' git add path1 && test_tick && git commit -a -m repo && - the_first_commit=$(git show-ref -s --verify refs/heads/master) && + the_first_commit=$(git show-ref -s --verify refs/heads/main) && >path2 && git add path2 && test_tick && git commit -a -m second && - the_commit=$(git show-ref -s --verify refs/heads/master) + the_commit=$(git show-ref -s --verify refs/heads/main) ' @@ -134,9 +137,9 @@ test_expect_success 'fetch without wildcard' ' mk_empty testrepo && ( cd testrepo && - git fetch .. refs/heads/master:refs/remotes/origin/master && + git fetch .. refs/heads/main:refs/remotes/origin/main && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -150,7 +153,7 @@ test_expect_success 'fetch with wildcard' ' git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" && git fetch up && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -166,7 +169,7 @@ test_expect_success 'fetch with insteadOf' ' git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" && git fetch up && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -182,19 +185,54 @@ test_expect_success 'fetch with pushInsteadOf (should not rewrite)' ' git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" && git fetch up && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) ' +grep_wrote () { + object_count=$1 + file_name=$2 + grep 'write_pack_file/wrote.*"value":"'$1'"' $2 +} + +test_expect_success 'push with negotiation' ' + # Without negotiation + mk_empty testrepo && + git push testrepo $the_first_commit:refs/remotes/origin/first_commit && + git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit && + echo now pushing without negotiation && + GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 push testrepo refs/heads/main:refs/remotes/origin/main && + grep_wrote 5 event && # 2 commits, 2 trees, 1 blob + + # Same commands, but with negotiation + rm event && + mk_empty testrepo && + git push testrepo $the_first_commit:refs/remotes/origin/first_commit && + git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit && + GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main && + grep_wrote 2 event # 1 commit, 1 tree +' + +test_expect_success 'push with negotiation proceeds anyway even if negotiation fails' ' + rm event && + mk_empty testrepo && + git push testrepo $the_first_commit:refs/remotes/origin/first_commit && + git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit && + GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" \ + git -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err && + grep_wrote 5 event && # 2 commits, 2 trees, 1 blob + test_i18ngrep "push negotiation failed" err +' + test_expect_success 'push without wildcard' ' mk_empty testrepo && - git push testrepo refs/heads/master:refs/remotes/origin/master && + git push testrepo refs/heads/main:refs/remotes/origin/main && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -206,7 +244,7 @@ test_expect_success 'push with wildcard' ' git push testrepo "refs/heads/*:refs/remotes/origin/*" && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -216,10 +254,10 @@ test_expect_success 'push with insteadOf' ' mk_empty testrepo && TRASH="$(pwd)/" && test_config "url.$TRASH.insteadOf" trash/ && - git push trash/testrepo refs/heads/master:refs/remotes/origin/master && + git push trash/testrepo refs/heads/main:refs/remotes/origin/main && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -229,10 +267,10 @@ test_expect_success 'push with pushInsteadOf' ' mk_empty testrepo && TRASH="$(pwd)/" && test_config "url.$TRASH.pushInsteadOf" trash/ && - git push trash/testrepo refs/heads/master:refs/remotes/origin/master && + git push trash/testrepo refs/heads/main:refs/remotes/origin/main && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -244,10 +282,10 @@ test_expect_success 'push with pushInsteadOf and explicit pushurl (pushInsteadOf test_config "url.trash3/.pushInsteadOf" trash/wrong && test_config remote.r.url trash/wrong && test_config remote.r.pushurl "testrepo/" && - git push r refs/heads/master:refs/remotes/origin/master && + git push r refs/heads/main:refs/remotes/origin/main && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) @@ -255,101 +293,101 @@ test_expect_success 'push with pushInsteadOf and explicit pushurl (pushInsteadOf test_expect_success 'push with matching heads' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && git push testrepo : && - check_push_result testrepo $the_commit heads/master + check_push_result testrepo $the_commit heads/main ' test_expect_success 'push with matching heads on the command line' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && git push testrepo : && - check_push_result testrepo $the_commit heads/master + check_push_result testrepo $the_commit heads/main ' test_expect_success 'failed (non-fast-forward) push with matching heads' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && git push testrepo : && git commit --amend -massaged && test_must_fail git push testrepo && - check_push_result testrepo $the_commit heads/master && + check_push_result testrepo $the_commit heads/main && git reset --hard $the_commit ' test_expect_success 'push --force with matching heads' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && git push testrepo : && git commit --amend -massaged && git push --force testrepo : && - ! check_push_result testrepo $the_commit heads/master && + ! check_push_result testrepo $the_commit heads/main && git reset --hard $the_commit ' test_expect_success 'push with matching heads and forced update' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && git push testrepo : && git commit --amend -massaged && git push testrepo +: && - ! check_push_result testrepo $the_commit heads/master && + ! check_push_result testrepo $the_commit heads/main && git reset --hard $the_commit ' test_expect_success 'push with no ambiguity (1)' ' - mk_test testrepo heads/master && - git push testrepo master:master && - check_push_result testrepo $the_commit heads/master + mk_test testrepo heads/main && + git push testrepo main:main && + check_push_result testrepo $the_commit heads/main ' test_expect_success 'push with no ambiguity (2)' ' - mk_test testrepo remotes/origin/master && - git push testrepo master:origin/master && - check_push_result testrepo $the_commit remotes/origin/master + mk_test testrepo remotes/origin/main && + git push testrepo main:origin/main && + check_push_result testrepo $the_commit remotes/origin/main ' test_expect_success 'push with colon-less refspec, no ambiguity' ' - mk_test testrepo heads/master heads/t/master && - git branch -f t/master master && - git push testrepo master && - check_push_result testrepo $the_commit heads/master && - check_push_result testrepo $the_first_commit heads/t/master + mk_test testrepo heads/main heads/t/main && + git branch -f t/main main && + git push testrepo main && + check_push_result testrepo $the_commit heads/main && + check_push_result testrepo $the_first_commit heads/t/main ' test_expect_success 'push with weak ambiguity (1)' ' - mk_test testrepo heads/master remotes/origin/master && - git push testrepo master:master && - check_push_result testrepo $the_commit heads/master && - check_push_result testrepo $the_first_commit remotes/origin/master + mk_test testrepo heads/main remotes/origin/main && + git push testrepo main:main && + check_push_result testrepo $the_commit heads/main && + check_push_result testrepo $the_first_commit remotes/origin/main ' test_expect_success 'push with weak ambiguity (2)' ' - mk_test testrepo heads/master remotes/origin/master remotes/another/master && - git push testrepo master:master && - check_push_result testrepo $the_commit heads/master && - check_push_result testrepo $the_first_commit remotes/origin/master remotes/another/master + mk_test testrepo heads/main remotes/origin/main remotes/another/main && + git push testrepo main:main && + check_push_result testrepo $the_commit heads/main && + check_push_result testrepo $the_first_commit remotes/origin/main remotes/another/main ' test_expect_success 'push with ambiguity' ' mk_test testrepo heads/frotz tags/frotz && - test_must_fail git push testrepo master:frotz && + test_must_fail git push testrepo main:frotz && check_push_result testrepo $the_first_commit heads/frotz tags/frotz ' @@ -357,7 +395,7 @@ test_expect_success 'push with ambiguity' ' test_expect_success 'push with colon-less refspec (1)' ' mk_test testrepo heads/frotz tags/frotz && - git branch -f frotz master && + git branch -f frotz main && git push testrepo frotz && check_push_result testrepo $the_commit heads/frotz && check_push_result testrepo $the_first_commit tags/frotz @@ -385,7 +423,7 @@ test_expect_success 'push with colon-less refspec (3)' ' then git tag -d frotz fi && - git branch -f frotz master && + git branch -f frotz main && git push testrepo frotz && check_push_result testrepo $the_commit heads/frotz && test 1 = $( cd testrepo && git show-ref | wc -l ) @@ -408,7 +446,7 @@ test_expect_success 'push with colon-less refspec (4)' ' test_expect_success 'push head with non-existent, incomplete dest' ' mk_test testrepo && - git push testrepo master:branch && + git push testrepo main:branch && check_push_result testrepo $the_commit heads/branch ' @@ -425,236 +463,235 @@ test_expect_success 'push tag with non-existent, incomplete dest' ' test_expect_success 'push sha1 with non-existent, incomplete dest' ' mk_test testrepo && - test_must_fail git push testrepo $(git rev-parse master):foo + test_must_fail git push testrepo $(git rev-parse main):foo ' test_expect_success 'push ref expression with non-existent, incomplete dest' ' mk_test testrepo && - test_must_fail git push testrepo master^:branch - -' - -test_expect_success 'push with HEAD' ' - - mk_test testrepo heads/master && - git checkout master && - git push testrepo HEAD && - check_push_result testrepo $the_commit heads/master + test_must_fail git push testrepo main^:branch ' -test_expect_success 'push with HEAD nonexisting at remote' ' - - mk_test testrepo heads/master && - git checkout -b local master && - git push testrepo HEAD && - check_push_result testrepo $the_commit heads/local -' - -test_expect_success 'push with +HEAD' ' - - mk_test testrepo heads/master && - git checkout master && - git branch -D local && - git checkout -b local && - git push testrepo master local && - check_push_result testrepo $the_commit heads/master && - check_push_result testrepo $the_commit heads/local && - - # Without force rewinding should fail - git reset --hard HEAD^ && - test_must_fail git push testrepo HEAD && - check_push_result testrepo $the_commit heads/local && +for head in HEAD @ +do - # With force rewinding should succeed - git push testrepo +HEAD && - check_push_result testrepo $the_first_commit heads/local + test_expect_success "push with $head" ' + mk_test testrepo heads/main && + git checkout main && + git push testrepo $head && + check_push_result testrepo $the_commit heads/main + ' -' + test_expect_success "push with $head nonexisting at remote" ' + mk_test testrepo heads/main && + git checkout -b local main && + test_when_finished "git checkout main; git branch -D local" && + git push testrepo $head && + check_push_result testrepo $the_commit heads/local + ' -test_expect_success 'push HEAD with non-existent, incomplete dest' ' + test_expect_success "push with +$head" ' + mk_test testrepo heads/main && + git checkout -b local main && + test_when_finished "git checkout main; git branch -D local" && + git push testrepo main local && + check_push_result testrepo $the_commit heads/main && + check_push_result testrepo $the_commit heads/local && + + # Without force rewinding should fail + git reset --hard $head^ && + test_must_fail git push testrepo $head && + check_push_result testrepo $the_commit heads/local && + + # With force rewinding should succeed + git push testrepo +$head && + check_push_result testrepo $the_first_commit heads/local + ' - mk_test testrepo && - git checkout master && - git push testrepo HEAD:branch && - check_push_result testrepo $the_commit heads/branch + test_expect_success "push $head with non-existent, incomplete dest" ' + mk_test testrepo && + git checkout main && + git push testrepo $head:branch && + check_push_result testrepo $the_commit heads/branch -' + ' -test_expect_success 'push with config remote.*.push = HEAD' ' + test_expect_success "push with config remote.*.push = $head" ' + mk_test testrepo heads/local && + git checkout main && + git branch -f local $the_commit && + test_when_finished "git branch -D local" && + ( + cd testrepo && + git checkout local && + git reset --hard $the_first_commit + ) && + test_config remote.there.url testrepo && + test_config remote.there.push $head && + test_config branch.main.remote there && + git push && + check_push_result testrepo $the_commit heads/main && + check_push_result testrepo $the_first_commit heads/local + ' - mk_test testrepo heads/local && - git checkout master && - git branch -f local $the_commit && - ( - cd testrepo && - git checkout local && - git reset --hard $the_first_commit - ) && - test_config remote.there.url testrepo && - test_config remote.there.push HEAD && - test_config branch.master.remote there && - git push && - check_push_result testrepo $the_commit heads/master && - check_push_result testrepo $the_first_commit heads/local -' +done test_expect_success 'push with remote.pushdefault' ' - mk_test up_repo heads/master && - mk_test down_repo heads/master && + mk_test up_repo heads/main && + mk_test down_repo heads/main && test_config remote.up.url up_repo && test_config remote.down.url down_repo && - test_config branch.master.remote up && + test_config branch.main.remote up && test_config remote.pushdefault down && test_config push.default matching && git push && - check_push_result up_repo $the_first_commit heads/master && - check_push_result down_repo $the_commit heads/master + check_push_result up_repo $the_first_commit heads/main && + check_push_result down_repo $the_commit heads/main ' test_expect_success 'push with config remote.*.pushurl' ' - mk_test testrepo heads/master && - git checkout master && + mk_test testrepo heads/main && + git checkout main && test_config remote.there.url test2repo && test_config remote.there.pushurl testrepo && git push there : && - check_push_result testrepo $the_commit heads/master + check_push_result testrepo $the_commit heads/main ' test_expect_success 'push with config branch.*.pushremote' ' - mk_test up_repo heads/master && - mk_test side_repo heads/master && - mk_test down_repo heads/master && + mk_test up_repo heads/main && + mk_test side_repo heads/main && + mk_test down_repo heads/main && test_config remote.up.url up_repo && test_config remote.pushdefault side_repo && test_config remote.down.url down_repo && - test_config branch.master.remote up && - test_config branch.master.pushremote down && + test_config branch.main.remote up && + test_config branch.main.pushremote down && test_config push.default matching && git push && - check_push_result up_repo $the_first_commit heads/master && - check_push_result side_repo $the_first_commit heads/master && - check_push_result down_repo $the_commit heads/master + check_push_result up_repo $the_first_commit heads/main && + check_push_result side_repo $the_first_commit heads/main && + check_push_result down_repo $the_commit heads/main ' test_expect_success 'branch.*.pushremote config order is irrelevant' ' - mk_test one_repo heads/master && - mk_test two_repo heads/master && + mk_test one_repo heads/main && + mk_test two_repo heads/main && test_config remote.one.url one_repo && test_config remote.two.url two_repo && - test_config branch.master.pushremote two_repo && + test_config branch.main.pushremote two_repo && test_config remote.pushdefault one_repo && test_config push.default matching && git push && - check_push_result one_repo $the_first_commit heads/master && - check_push_result two_repo $the_commit heads/master + check_push_result one_repo $the_first_commit heads/main && + check_push_result two_repo $the_commit heads/main ' test_expect_success 'push with dry-run' ' - mk_test testrepo heads/master && - old_commit=$(git -C testrepo show-ref -s --verify refs/heads/master) && + mk_test testrepo heads/main && + old_commit=$(git -C testrepo show-ref -s --verify refs/heads/main) && git push --dry-run testrepo : && - check_push_result testrepo $old_commit heads/master + check_push_result testrepo $old_commit heads/main ' test_expect_success 'push updates local refs' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child && ( cd child && - git pull .. master && + git pull .. main && git push && - test $(git rev-parse master) = \ - $(git rev-parse remotes/origin/master) + test $(git rev-parse main) = \ + $(git rev-parse remotes/origin/main) ) ' test_expect_success 'push updates up-to-date local refs' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child1 && mk_child testrepo child2 && - (cd child1 && git pull .. master && git push) && + (cd child1 && git pull .. main && git push) && ( cd child2 && - git pull ../child1 master && + git pull ../child1 main && git push && - test $(git rev-parse master) = \ - $(git rev-parse remotes/origin/master) + test $(git rev-parse main) = \ + $(git rev-parse remotes/origin/main) ) ' test_expect_success 'push preserves up-to-date packed refs' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child && ( cd child && git push && - ! test -f .git/refs/remotes/origin/master + ! test -f .git/refs/remotes/origin/main ) ' test_expect_success 'push does not update local refs on failure' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child && mkdir testrepo/.git/hooks && echo "#!/no/frobnication/today" >testrepo/.git/hooks/pre-receive && chmod +x testrepo/.git/hooks/pre-receive && ( cd child && - git pull .. master && + git pull .. main && test_must_fail git push && - test $(git rev-parse master) != \ - $(git rev-parse remotes/origin/master) + test $(git rev-parse main) != \ + $(git rev-parse remotes/origin/main) ) ' test_expect_success 'allow deleting an invalid remote ref' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -f testrepo/.git/objects/??/* && - git push testrepo :refs/heads/master && - (cd testrepo && test_must_fail git rev-parse --verify refs/heads/master) + git push testrepo :refs/heads/main && + (cd testrepo && test_must_fail git rev-parse --verify refs/heads/main) ' test_expect_success 'pushing valid refs triggers post-receive and post-update hooks' ' - mk_test_with_hooks testrepo heads/master heads/next && - orgmaster=$(cd testrepo && git show-ref -s --verify refs/heads/master) && - newmaster=$(git show-ref -s --verify refs/heads/master) && + mk_test_with_hooks testrepo heads/main heads/next && + orgmain=$(cd testrepo && git show-ref -s --verify refs/heads/main) && + newmain=$(git show-ref -s --verify refs/heads/main) && orgnext=$(cd testrepo && git show-ref -s --verify refs/heads/next) && newnext=$ZERO_OID && - git push testrepo refs/heads/master:refs/heads/master :refs/heads/next && + git push testrepo refs/heads/main:refs/heads/main :refs/heads/next && ( cd testrepo/.git && cat >pre-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main $orgnext $newnext refs/heads/next EOF cat >update.expect <<-EOF && - refs/heads/master $orgmaster $newmaster + refs/heads/main $orgmain $newmain refs/heads/next $orgnext $newnext EOF cat >post-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main $orgnext $newnext refs/heads/next EOF cat >post-update.expect <<-EOF && - refs/heads/master + refs/heads/main refs/heads/next EOF @@ -666,25 +703,25 @@ test_expect_success 'pushing valid refs triggers post-receive and post-update ho ' test_expect_success 'deleting dangling ref triggers hooks with correct args' ' - mk_test_with_hooks testrepo heads/master && + mk_test_with_hooks testrepo heads/main && rm -f testrepo/.git/objects/??/* && - git push testrepo :refs/heads/master && + git push testrepo :refs/heads/main && ( cd testrepo/.git && cat >pre-receive.expect <<-EOF && - $ZERO_OID $ZERO_OID refs/heads/master + $ZERO_OID $ZERO_OID refs/heads/main EOF cat >update.expect <<-EOF && - refs/heads/master $ZERO_OID $ZERO_OID + refs/heads/main $ZERO_OID $ZERO_OID EOF cat >post-receive.expect <<-EOF && - $ZERO_OID $ZERO_OID refs/heads/master + $ZERO_OID $ZERO_OID refs/heads/main EOF cat >post-update.expect <<-EOF && - refs/heads/master + refs/heads/main EOF test_cmp pre-receive.expect pre-receive.actual && @@ -695,28 +732,28 @@ test_expect_success 'deleting dangling ref triggers hooks with correct args' ' ' test_expect_success 'deletion of a non-existent ref is not fed to post-receive and post-update hooks' ' - mk_test_with_hooks testrepo heads/master && - orgmaster=$(cd testrepo && git show-ref -s --verify refs/heads/master) && - newmaster=$(git show-ref -s --verify refs/heads/master) && - git push testrepo master :refs/heads/nonexistent && + mk_test_with_hooks testrepo heads/main && + orgmain=$(cd testrepo && git show-ref -s --verify refs/heads/main) && + newmain=$(git show-ref -s --verify refs/heads/main) && + git push testrepo main :refs/heads/nonexistent && ( cd testrepo/.git && cat >pre-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main $ZERO_OID $ZERO_OID refs/heads/nonexistent EOF cat >update.expect <<-EOF && - refs/heads/master $orgmaster $newmaster + refs/heads/main $orgmain $newmain refs/heads/nonexistent $ZERO_OID $ZERO_OID EOF cat >post-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main EOF cat >post-update.expect <<-EOF && - refs/heads/master + refs/heads/main EOF test_cmp pre-receive.expect pre-receive.actual && @@ -727,7 +764,7 @@ test_expect_success 'deletion of a non-existent ref is not fed to post-receive a ' test_expect_success 'deletion of a non-existent ref alone does trigger post-receive and post-update hooks' ' - mk_test_with_hooks testrepo heads/master && + mk_test_with_hooks testrepo heads/main && git push testrepo :refs/heads/nonexistent && ( cd testrepo/.git && @@ -747,40 +784,40 @@ test_expect_success 'deletion of a non-existent ref alone does trigger post-rece ' test_expect_success 'mixed ref updates, deletes, invalid deletes trigger hooks with correct input' ' - mk_test_with_hooks testrepo heads/master heads/next heads/seen && - orgmaster=$(cd testrepo && git show-ref -s --verify refs/heads/master) && - newmaster=$(git show-ref -s --verify refs/heads/master) && + mk_test_with_hooks testrepo heads/main heads/next heads/seen && + orgmain=$(cd testrepo && git show-ref -s --verify refs/heads/main) && + newmain=$(git show-ref -s --verify refs/heads/main) && orgnext=$(cd testrepo && git show-ref -s --verify refs/heads/next) && newnext=$ZERO_OID && orgseen=$(cd testrepo && git show-ref -s --verify refs/heads/seen) && - newseen=$(git show-ref -s --verify refs/heads/master) && - git push testrepo refs/heads/master:refs/heads/master \ - refs/heads/master:refs/heads/seen :refs/heads/next \ + newseen=$(git show-ref -s --verify refs/heads/main) && + git push testrepo refs/heads/main:refs/heads/main \ + refs/heads/main:refs/heads/seen :refs/heads/next \ :refs/heads/nonexistent && ( cd testrepo/.git && cat >pre-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main $orgnext $newnext refs/heads/next $orgseen $newseen refs/heads/seen $ZERO_OID $ZERO_OID refs/heads/nonexistent EOF cat >update.expect <<-EOF && - refs/heads/master $orgmaster $newmaster + refs/heads/main $orgmain $newmain refs/heads/next $orgnext $newnext refs/heads/seen $orgseen $newseen refs/heads/nonexistent $ZERO_OID $ZERO_OID EOF cat >post-receive.expect <<-EOF && - $orgmaster $newmaster refs/heads/master + $orgmain $newmain refs/heads/main $orgnext $newnext refs/heads/next $orgseen $newseen refs/heads/seen EOF cat >post-update.expect <<-EOF && - refs/heads/master + refs/heads/main refs/heads/next refs/heads/seen EOF @@ -793,15 +830,15 @@ test_expect_success 'mixed ref updates, deletes, invalid deletes trigger hooks w ' test_expect_success 'allow deleting a ref using --delete' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && (cd testrepo && git config receive.denyDeleteCurrent warn) && - git push testrepo --delete master && - (cd testrepo && test_must_fail git rev-parse --verify refs/heads/master) + git push testrepo --delete main && + (cd testrepo && test_must_fail git rev-parse --verify refs/heads/main) ' test_expect_success 'allow deleting a tag using --delete' ' - mk_test testrepo heads/master && - git tag -a -m dummy_message deltag heads/master && + mk_test testrepo heads/main && + git tag -a -m dummy_message deltag heads/main && git push testrepo --tags && (cd testrepo && git rev-parse --verify -q refs/tags/deltag) && git push testrepo --delete tag deltag && @@ -809,56 +846,61 @@ test_expect_success 'allow deleting a tag using --delete' ' ' test_expect_success 'push --delete without args aborts' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && test_must_fail git push testrepo --delete ' test_expect_success 'push --delete refuses src:dest refspecs' ' + mk_test testrepo heads/main && + test_must_fail git push testrepo --delete main:foo +' + +test_expect_success 'push --delete refuses empty string' ' mk_test testrepo heads/master && - test_must_fail git push testrepo --delete master:foo + test_must_fail git push testrepo --delete "" ' test_expect_success 'warn on push to HEAD of non-bare repository' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && ( cd testrepo && - git checkout master && + git checkout main && git config receive.denyCurrentBranch warn ) && - git push testrepo master 2>stderr && + git push testrepo main 2>stderr && grep "warning: updating the current branch" stderr ' test_expect_success 'deny push to HEAD of non-bare repository' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && ( cd testrepo && - git checkout master && + git checkout main && git config receive.denyCurrentBranch true ) && - test_must_fail git push testrepo master + test_must_fail git push testrepo main ' test_expect_success 'allow push to HEAD of bare repository (bare)' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && ( cd testrepo && - git checkout master && + git checkout main && git config receive.denyCurrentBranch true && git config core.bare true ) && - git push testrepo master 2>stderr && + git push testrepo main 2>stderr && ! grep "warning: updating the current branch" stderr ' test_expect_success 'allow push to HEAD of non-bare repository (config)' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && ( cd testrepo && - git checkout master && + git checkout main && git config receive.denyCurrentBranch false ) && - git push testrepo master 2>stderr && + git push testrepo main 2>stderr && ! grep "warning: updating the current branch" stderr ' @@ -874,7 +916,7 @@ test_expect_success 'fetch with branches' ' git for-each-ref refs/heads >actual && test_cmp expect actual ) && - git checkout master + git checkout main ' test_expect_success 'fetch with branches containing #' ' @@ -887,7 +929,7 @@ test_expect_success 'fetch with branches containing #' ' git for-each-ref refs/heads >actual && test_cmp expect actual ) && - git checkout master + git checkout main ' test_expect_success 'push with branches' ' @@ -897,7 +939,7 @@ test_expect_success 'push with branches' ' git push branch1 && ( cd testrepo && - echo "$the_first_commit commit refs/heads/master" >expect && + echo "$the_first_commit commit refs/heads/main" >expect && git for-each-ref refs/heads >actual && test_cmp expect actual ) @@ -913,11 +955,11 @@ test_expect_success 'push with branches containing #' ' git for-each-ref refs/heads >actual && test_cmp expect actual ) && - git checkout master + git checkout main ' test_expect_success 'push into aliased refs (consistent)' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child1 && mk_child testrepo child2 && ( @@ -939,7 +981,7 @@ test_expect_success 'push into aliased refs (consistent)' ' ' test_expect_success 'push into aliased refs (inconsistent)' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child1 && mk_child testrepo child2 && ( @@ -970,7 +1012,7 @@ test_force_push_tag () { tag_args=$2 test_expect_success "force pushing required to update $tag_type_description" " - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child1 && mk_child testrepo child2 && ( @@ -1016,7 +1058,7 @@ test_force_fetch_tag () { tag_args=$2 test_expect_success "fetch will not clobber an existing $tag_type_description without --force" " - mk_test testrepo heads/master && + mk_test testrepo heads/main && mk_child testrepo child1 && mk_child testrepo child2 && ( @@ -1039,12 +1081,12 @@ test_force_fetch_tag "annotated tag" "-f -a -m'tag message'" test_expect_success 'push --porcelain' ' mk_empty testrepo && echo >.git/foo "To testrepo" && - echo >>.git/foo "* refs/heads/master:refs/remotes/origin/master [new branch]" && + echo >>.git/foo "* refs/heads/main:refs/remotes/origin/main [new reference]" && echo >>.git/foo "Done" && - git push >.git/bar --porcelain testrepo refs/heads/master:refs/remotes/origin/master && + git push >.git/bar --porcelain testrepo refs/heads/main:refs/remotes/origin/main && ( cd testrepo && - echo "$the_commit commit refs/remotes/origin/master" >expect && + echo "$the_commit commit refs/remotes/origin/main" >expect && git for-each-ref refs/remotes/origin >actual && test_cmp expect actual ) && @@ -1053,52 +1095,52 @@ test_expect_success 'push --porcelain' ' test_expect_success 'push --porcelain bad url' ' mk_empty testrepo && - test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/master:refs/remotes/origin/master && + test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/main:refs/remotes/origin/main && ! grep -q Done .git/bar ' test_expect_success 'push --porcelain rejected' ' mk_empty testrepo && - git push testrepo refs/heads/master:refs/remotes/origin/master && + git push testrepo refs/heads/main:refs/remotes/origin/main && (cd testrepo && - git reset --hard origin/master^ && + git reset --hard origin/main^ && git config receive.denyCurrentBranch true) && echo >.git/foo "To testrepo" && - echo >>.git/foo "! refs/heads/master:refs/heads/master [remote rejected] (branch is currently checked out)" && + echo >>.git/foo "! refs/heads/main:refs/heads/main [remote rejected] (branch is currently checked out)" && echo >>.git/foo "Done" && - test_must_fail git push >.git/bar --porcelain testrepo refs/heads/master:refs/heads/master && + test_must_fail git push >.git/bar --porcelain testrepo refs/heads/main:refs/heads/main && test_cmp .git/foo .git/bar ' test_expect_success 'push --porcelain --dry-run rejected' ' mk_empty testrepo && - git push testrepo refs/heads/master:refs/remotes/origin/master && + git push testrepo refs/heads/main:refs/remotes/origin/main && (cd testrepo && - git reset --hard origin/master && + git reset --hard origin/main && git config receive.denyCurrentBranch true) && echo >.git/foo "To testrepo" && - echo >>.git/foo "! refs/heads/master^:refs/heads/master [rejected] (non-fast-forward)" && + echo >>.git/foo "! refs/heads/main^:refs/heads/main [rejected] (non-fast-forward)" && echo >>.git/foo "Done" && - test_must_fail git push >.git/bar --porcelain --dry-run testrepo refs/heads/master^:refs/heads/master && + test_must_fail git push >.git/bar --porcelain --dry-run testrepo refs/heads/main^:refs/heads/main && test_cmp .git/foo .git/bar ' test_expect_success 'push --prune' ' - mk_test testrepo heads/master heads/second heads/foo heads/bar && + mk_test testrepo heads/main heads/second heads/foo heads/bar && git push --prune testrepo : && - check_push_result testrepo $the_commit heads/master && + check_push_result testrepo $the_commit heads/main && check_push_result testrepo $the_first_commit heads/second && ! check_push_result testrepo $the_first_commit heads/foo heads/bar ' test_expect_success 'push --prune refspec' ' - mk_test testrepo tmp/master tmp/second tmp/foo tmp/bar && + mk_test testrepo tmp/main tmp/second tmp/foo tmp/bar && git push --prune testrepo "refs/heads/*:refs/tmp/*" && - check_push_result testrepo $the_commit tmp/master && + check_push_result testrepo $the_commit tmp/main && check_push_result testrepo $the_first_commit tmp/second && ! check_push_result testrepo $the_first_commit tmp/foo tmp/bar ' @@ -1106,18 +1148,18 @@ test_expect_success 'push --prune refspec' ' for configsection in transfer receive do test_expect_success "push to update a ref hidden by $configsection.hiderefs" ' - mk_test testrepo heads/master hidden/one hidden/two hidden/three && + mk_test testrepo heads/main hidden/one hidden/two hidden/three && ( cd testrepo && git config $configsection.hiderefs refs/hidden ) && # push to unhidden ref succeeds normally - git push testrepo master:refs/heads/master && - check_push_result testrepo $the_commit heads/master && + git push testrepo main:refs/heads/main && + check_push_result testrepo $the_commit heads/main && # push to update a hidden ref should fail - test_must_fail git push testrepo master:refs/hidden/one && + test_must_fail git push testrepo main:refs/hidden/one && check_push_result testrepo $the_first_commit hidden/one && # push to delete a hidden ref should fail @@ -1131,8 +1173,8 @@ do done test_expect_success 'fetch exact SHA1' ' - mk_test testrepo heads/master hidden/one && - git push testrepo master:refs/hidden/one && + mk_test testrepo heads/main hidden/one && + git push testrepo main:refs/hidden/one && ( cd testrepo && git config transfer.hiderefs refs/hidden @@ -1163,7 +1205,7 @@ test_expect_success 'fetch exact SHA1' ' git config uploadpack.allowtipsha1inwant true ) && - git fetch -v ../testrepo $the_commit:refs/heads/copy master:refs/heads/extra && + git fetch -v ../testrepo $the_commit:refs/heads/copy main:refs/heads/extra && cat >expect <<-EOF && $the_commit $the_first_commit @@ -1177,8 +1219,8 @@ test_expect_success 'fetch exact SHA1' ' ' test_expect_success 'fetch exact SHA1 in protocol v2' ' - mk_test testrepo heads/master hidden/one && - git push testrepo master:refs/hidden/one && + mk_test testrepo heads/main hidden/one && + git push testrepo main:refs/hidden/one && git -C testrepo config transfer.hiderefs refs/hidden && check_push_result testrepo $the_commit hidden/one && @@ -1254,23 +1296,25 @@ do git cat-file commit $SHA1_2 && test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \ git fetch ../testrepo/.git $SHA1_3 2>err && - test_i18ngrep "remote error:.*not our ref.*$SHA1_3\$" err + # ideally we would insist this be on a "remote error:" + # line, but it is racy; see the commit message + test_i18ngrep "not our ref.*$SHA1_3\$" err ) ' done test_expect_success 'fetch follows tags by default' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git tag -m "annotated" tag && git for-each-ref >tmp1 && ( cat tmp1 - sed -n "s|refs/heads/master$|refs/remotes/origin/master|p" tmp1 + sed -n "s|refs/heads/main$|refs/remotes/origin/main|p" tmp1 ) | sort -k 3 >../expect ) && @@ -1278,8 +1322,8 @@ test_expect_success 'fetch follows tags by default' ' ( cd dst && git remote add origin ../src && - git config branch.master.remote origin && - git config branch.master.merge refs/heads/master && + git config branch.main.remote origin && + git config branch.main.merge refs/heads/main && git pull && git for-each-ref >../actual ) && @@ -1298,74 +1342,74 @@ test_expect_success 'peeled advertisements are not considered ref tips' ' ' test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && git init --bare dst && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git branch next && git config remote.dst.url ../dst && git config remote.dst.push "+refs/heads/*:refs/remotes/src/*" && - git push dst master && - git show-ref refs/heads/master | + git push dst main && + git show-ref refs/heads/main | sed -e "s|refs/heads/|refs/remotes/src/|" >../dst/expect ) && ( cd dst && test_must_fail git show-ref refs/heads/next && - test_must_fail git show-ref refs/heads/master && - git show-ref refs/remotes/src/master >actual + test_must_fail git show-ref refs/heads/main && + git show-ref refs/remotes/src/main >actual ) && test_cmp dst/expect dst/actual ' test_expect_success 'with no remote.$name.push, it is not used as refmap' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && git init --bare dst && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git branch next && git config remote.dst.url ../dst && git config push.default matching && - git push dst master && - git show-ref refs/heads/master >../dst/expect + git push dst main && + git show-ref refs/heads/main >../dst/expect ) && ( cd dst && test_must_fail git show-ref refs/heads/next && - git show-ref refs/heads/master >actual + git show-ref refs/heads/main >actual ) && test_cmp dst/expect dst/actual ' test_expect_success 'with no remote.$name.push, upstream mapping is used' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && git init --bare dst && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git branch next && git config remote.dst.url ../dst && git config remote.dst.fetch "+refs/heads/*:refs/remotes/dst/*" && git config push.default upstream && - git config branch.master.merge refs/heads/trunk && - git config branch.master.remote dst && + git config branch.main.merge refs/heads/trunk && + git config branch.main.remote dst && - git push dst master && - git show-ref refs/heads/master | - sed -e "s|refs/heads/master|refs/heads/trunk|" >../dst/expect + git push dst main && + git show-ref refs/heads/main | + sed -e "s|refs/heads/main|refs/heads/trunk|" >../dst/expect ) && ( cd dst && - test_must_fail git show-ref refs/heads/master && + test_must_fail git show-ref refs/heads/main && test_must_fail git show-ref refs/heads/next && git show-ref refs/heads/trunk >actual ) && @@ -1373,20 +1417,20 @@ test_expect_success 'with no remote.$name.push, upstream mapping is used' ' ' test_expect_success 'push does not follow tags by default' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && git init --bare dst && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git tag -m "annotated" tag && git checkout -b another && git commit --allow-empty -m "future commit" && git tag -m "future" future && - git checkout master && - git for-each-ref refs/heads/master >../expect && - git push ../dst master + git checkout main && + git for-each-ref refs/heads/main >../expect && + git push ../dst main ) && ( cd dst && @@ -1396,20 +1440,20 @@ test_expect_success 'push does not follow tags by default' ' ' test_expect_success 'push --follow-tags only pushes relevant tags' ' - mk_test testrepo heads/master && + mk_test testrepo heads/main && rm -fr src dst && git init src && git init --bare dst && ( cd src && - git pull ../testrepo master && + git pull ../testrepo main && git tag -m "annotated" tag && git checkout -b another && git commit --allow-empty -m "future commit" && git tag -m "future" future && - git checkout master && - git for-each-ref refs/heads/master refs/tags/tag >../expect && - git push --follow-tags ../dst master + git checkout main && + git for-each-ref refs/heads/main refs/tags/tag >../expect && + git push --follow-tags ../dst main ) && ( cd dst && @@ -1427,12 +1471,12 @@ EOF git commit -am initial && git init no-thin && git --git-dir=no-thin/.git config receive.unpacklimit 0 && - git push no-thin/.git refs/heads/master:refs/heads/foo && + git push no-thin/.git refs/heads/main:refs/heads/foo && echo modified >> path1 && git commit -am modified && git repack -adf && rcvpck="git receive-pack --reject-thin-pack-for-testing" && - git push --no-thin --receive-pack="$rcvpck" no-thin/.git refs/heads/master:refs/heads/foo + git push --no-thin --receive-pack="$rcvpck" no-thin/.git refs/heads/main:refs/heads/foo ' test_expect_success 'pushing a tag pushes the tagged object' ' @@ -1455,12 +1499,12 @@ test_expect_success 'push into bare respects core.logallrefupdates' ' # double push to test both with and without # the actual pack transfer - git push dst.git master:one && + git push dst.git main:one && echo "one@{0} push" >expect && git -C dst.git log -g --format="%gd %gs" one >actual && test_cmp expect actual && - git push dst.git master:two && + git push dst.git main:two && echo "two@{0} push" >expect && git -C dst.git log -g --format="%gd %gs" two >actual && test_cmp expect actual @@ -1475,20 +1519,20 @@ test_expect_success 'fetch into bare respects core.logallrefupdates' ' # as above, we double-fetch to test both # with and without pack transfer - git fetch .. master:one && - echo "one@{0} fetch .. master:one: storing head" >expect && + git fetch .. main:one && + echo "one@{0} fetch .. main:one: storing head" >expect && git log -g --format="%gd %gs" one >actual && test_cmp expect actual && - git fetch .. master:two && - echo "two@{0} fetch .. master:two: storing head" >expect && + git fetch .. main:two && + echo "two@{0} fetch .. main:two: storing head" >expect && git log -g --format="%gd %gs" two >actual && test_cmp expect actual ) ' test_expect_success 'receive.denyCurrentBranch = updateInstead' ' - git push testrepo master && + git push testrepo main && ( cd testrepo && git reset --hard && @@ -1497,7 +1541,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' test_commit third path2 && # Try pushing into a repository with pristine working tree - git push testrepo master && + git push testrepo main && ( cd testrepo && git update-index -q --refresh && @@ -1514,7 +1558,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) && test-tool chmtime +100 path1 ) && - git push testrepo master && + git push testrepo main && ( cd testrepo && git update-index -q --refresh && @@ -1534,7 +1578,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' cd testrepo && echo changed >path1 ) && - test_must_fail git push testrepo master && + test_must_fail git push testrepo main && ( cd testrepo && test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) && @@ -1548,7 +1592,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' echo changed >path1 && git add path1 ) && - test_must_fail git push testrepo master && + test_must_fail git push testrepo main && ( cd testrepo && test $(git -C .. rev-parse HEAD^) = $(git rev-parse HEAD) && @@ -1565,7 +1609,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' git reset --hard && echo changed >path3 ) && - test_must_fail git push testrepo master && + test_must_fail git push testrepo main && ( cd testrepo && test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) && @@ -1581,7 +1625,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' echo fifth >path3 && git add path3 ) && - test_must_fail git push testrepo master && + test_must_fail git push testrepo main && ( cd testrepo && test $(git -C .. rev-parse HEAD^^) = $(git rev-parse HEAD) && @@ -1596,17 +1640,17 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' cd void && git config receive.denyCurrentBranch updateInstead ) && - git push void master && + git push void main && ( cd void && - test $(git -C .. rev-parse master) = $(git rev-parse HEAD) && + test $(git -C .. rev-parse main) = $(git rev-parse HEAD) && git diff --quiet && git diff --cached --quiet ) && # (6) updateInstead intervened by fast-forward check - test_must_fail git push void master^:master && - test $(git -C void rev-parse HEAD) = $(git rev-parse master) && + test_must_fail git push void main^:main && + test $(git -C void rev-parse HEAD) = $(git rev-parse main) && git -C void diff --quiet && git -C void diff --cached --quiet ' @@ -1616,7 +1660,7 @@ test_expect_success 'updateInstead with push-to-checkout hook' ' git init testrepo && ( cd testrepo && - git pull .. master && + git pull .. main && git reset --hard HEAD^^ && git tag initial && git config receive.denyCurrentBranch updateInstead && @@ -1634,7 +1678,7 @@ test_expect_success 'updateInstead with push-to-checkout hook' ' ) && # Try pushing into a pristine - git push testrepo master && + git push testrepo main && ( cd testrepo && git diff --quiet && @@ -1648,7 +1692,7 @@ test_expect_success 'updateInstead with push-to-checkout hook' ' git reset --hard initial && echo conflicting >path2 ) && - test_must_fail git push testrepo master && + test_must_fail git push testrepo main && ( cd testrepo && test $(git rev-parse initial) = $(git rev-parse HEAD) && @@ -1664,7 +1708,7 @@ test_expect_success 'updateInstead with push-to-checkout hook' ' echo irrelevant >path5 && git add path5 ) && - git push testrepo master && + git push testrepo main && ( cd testrepo && test "$(cat path1)" = unrelated && @@ -1704,7 +1748,7 @@ test_expect_success 'updateInstead with push-to-checkout hook' ' EOF ) && - git push void master && + git push void main && ( cd void && git diff --quiet && diff --git a/t/t5517-push-mirror.sh b/t/t5517-push-mirror.sh index e4edd56404..a448e169bd 100755 --- a/t/t5517-push-mirror.sh +++ b/t/t5517-push-mirror.sh @@ -2,6 +2,9 @@ test_description='pushing to a mirror repository' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh D=$(pwd) @@ -15,16 +18,16 @@ invert () { } mk_repo_pair () { - rm -rf master mirror && + rm -rf main mirror && mkdir mirror && ( cd mirror && git init && git config receive.denyCurrentBranch warn ) && - mkdir master && + mkdir main && ( - cd master && + cd main && git init && git remote add $1 up ../mirror ) @@ -36,13 +39,13 @@ test_expect_success 'push mirror creates new branches' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/heads/master) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/heads/main) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/heads/main) && + test "$main_main" = "$mirror_main" ' @@ -50,15 +53,15 @@ test_expect_success 'push mirror updates existing branches' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && git push --mirror up && echo two >foo && git add foo && git commit -m two && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/heads/master) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/heads/main) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/heads/main) && + test "$main_main" = "$mirror_main" ' @@ -66,7 +69,7 @@ test_expect_success 'push mirror force updates existing branches' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && git push --mirror up && echo two >foo && git add foo && git commit -m two && @@ -74,9 +77,9 @@ test_expect_success 'push mirror force updates existing branches' ' git reset --hard HEAD^ && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/heads/master) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/heads/main) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/heads/main) && + test "$main_main" = "$mirror_main" ' @@ -84,9 +87,9 @@ test_expect_success 'push mirror removes branches' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git branch remove master && + git branch remove main && git push --mirror up && git branch -D remove && git push --mirror up @@ -102,21 +105,21 @@ test_expect_success 'push mirror adds, updates and removes branches together' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git branch remove master && + git branch remove main && git push --mirror up && git branch -D remove && - git branch add master && + git branch add main && echo two >foo && git add foo && git commit -m two && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/heads/master) && - master_add=$(cd master && git show-ref -s --verify refs/heads/add) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && + main_main=$(cd main && git show-ref -s --verify refs/heads/main) && + main_add=$(cd main && git show-ref -s --verify refs/heads/add) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/heads/main) && mirror_add=$(cd mirror && git show-ref -s --verify refs/heads/add) && - test "$master_master" = "$mirror_master" && - test "$master_add" = "$mirror_add" && + test "$main_main" = "$mirror_main" && + test "$main_add" = "$mirror_add" && ( cd mirror && invert git show-ref -s --verify refs/heads/remove @@ -130,14 +133,14 @@ test_expect_success 'push mirror creates new tags' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/tags/tmain) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/tags/tmain) && + test "$main_main" = "$mirror_main" ' @@ -145,17 +148,17 @@ test_expect_success 'push mirror updates existing tags' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up && echo two >foo && git add foo && git commit -m two && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/tags/tmain) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/tags/tmain) && + test "$main_main" = "$mirror_main" ' @@ -163,20 +166,20 @@ test_expect_success 'push mirror force updates existing tags' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up && echo two >foo && git add foo && git commit -m two && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up && git reset --hard HEAD^ && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && - test "$master_master" = "$mirror_master" + main_main=$(cd main && git show-ref -s --verify refs/tags/tmain) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/tags/tmain) && + test "$main_main" = "$mirror_main" ' @@ -184,9 +187,9 @@ test_expect_success 'push mirror removes tags' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git tag -f tremove master && + git tag -f tremove main && git push --mirror up && git tag -d tremove && git push --mirror up @@ -202,23 +205,23 @@ test_expect_success 'push mirror adds, updates and removes tags together' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git tag -f tmaster master && - git tag -f tremove master && + git tag -f tmain main && + git tag -f tremove main && git push --mirror up && git tag -d tremove && - git tag tadd master && + git tag tadd main && echo two >foo && git add foo && git commit -m two && - git tag -f tmaster master && + git tag -f tmain main && git push --mirror up ) && - master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && - master_add=$(cd master && git show-ref -s --verify refs/tags/tadd) && - mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && + main_main=$(cd main && git show-ref -s --verify refs/tags/tmain) && + main_add=$(cd main && git show-ref -s --verify refs/tags/tadd) && + mirror_main=$(cd mirror && git show-ref -s --verify refs/tags/tmain) && mirror_add=$(cd mirror && git show-ref -s --verify refs/tags/tadd) && - test "$master_master" = "$mirror_master" && - test "$master_add" = "$mirror_add" && + test "$main_main" = "$mirror_main" && + test "$main_add" = "$mirror_add" && ( cd mirror && invert git show-ref -s --verify refs/tags/tremove @@ -230,10 +233,10 @@ test_expect_success 'remote.foo.mirror adds and removes branches' ' mk_repo_pair --mirror && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && - git branch keep master && - git branch remove master && + git branch keep main && + git branch remove main && git push up && git branch -D remove && git push up @@ -250,10 +253,10 @@ test_expect_success 'remote.foo.mirror=no has no effect' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && git config --add remote.up.mirror no && - git branch keep master && + git branch keep main && git push --mirror up && git branch -D keep && git push up : @@ -268,10 +271,10 @@ test_expect_success 'remote.foo.mirror=no has no effect' ' test_expect_success 'push to mirrored repository with refspec fails' ' mk_repo_pair && ( - cd master && + cd main && echo one >foo && git add foo && git commit -m one && git config --add remote.up.mirror true && - test_must_fail git push up master + test_must_fail git push up main ) ' diff --git a/t/t5518-fetch-exit-status.sh b/t/t5518-fetch-exit-status.sh index c2060bb870..5c4ac2556e 100755 --- a/t/t5518-fetch-exit-status.sh +++ b/t/t5518-fetch-exit-status.sh @@ -5,6 +5,9 @@ test_description='fetch exit status test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -17,20 +20,20 @@ test_expect_success setup ' echo side >file && git commit -a -m side && - git checkout master && + git checkout main && echo next >file && git commit -a -m next ' test_expect_success 'non-fast-forward fetch' ' - test_must_fail git fetch . master:side + test_must_fail git fetch . main:side ' test_expect_success 'forced update' ' - git fetch . +master:side + git fetch . +main:side ' diff --git a/t/t5519-push-alternates.sh b/t/t5519-push-alternates.sh index 11fcd37700..20ba604dfd 100755 --- a/t/t5519-push-alternates.sh +++ b/t/t5519-push-alternates.sh @@ -2,6 +2,9 @@ test_description='push to a repository that borrows from elsewhere' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -17,7 +20,7 @@ test_expect_success setup ' >file && git add . && git commit -m initial && - git push ../alice-pub master + git push ../alice-pub main ) && # Project Bob is a fork of project Alice @@ -31,7 +34,7 @@ test_expect_success setup ' git clone alice-pub bob-work && ( cd bob-work && - git push ../bob-pub master + git push ../bob-pub main ) ' @@ -54,7 +57,7 @@ test_expect_success 'bob fetches from alice, works and pushes' ' # has at her public repository are available to it # via its alternates. cd bob-work && - git pull ../alice-pub master && + git pull ../alice-pub main && echo more bob >file && git commit -a -m third && git push ../bob-pub : @@ -93,7 +96,7 @@ test_expect_success 'alice works and pushes again' ' test_expect_success 'bob works and pushes' ' ( # This time Bob does not pull from Alice, and - # the master branch at her public repository points + # the main branch at her public repository points # at a commit Bob does not know about. This should # not prevent the push by Bob from succeeding. cd bob-work && @@ -122,11 +125,11 @@ test_expect_success 'alice works and pushes yet again' ' test_expect_success 'bob works and pushes again' ' ( cd alice-pub && - git cat-file commit master >../bob-work/commit + git cat-file commit main >../bob-work/commit ) && ( # This time Bob does not pull from Alice, and - # the master branch at her public repository points + # the main branch at her public repository points # at a commit Bob does not fully know about, but # he happens to have the commit object (but not the # necessary tree) in his repository from Alice. diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index 9fae07cdfa..e2c0c51022 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -2,6 +2,9 @@ test_description='pulling into void' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh modify () { @@ -48,11 +51,11 @@ test_expect_success 'pulling into void' ' test_cmp file cloned/file ' -test_expect_success 'pulling into void using master:master' ' +test_expect_success 'pulling into void using main:main' ' git init cloned-uho && ( cd cloned-uho && - git pull .. master:master + git pull .. main:main ) && test_path_is_file file && test_path_is_file cloned-uho/file && @@ -64,7 +67,7 @@ test_expect_success 'pulling into void does not overwrite untracked files' ' ( cd cloned-untracked && echo untracked >file && - test_must_fail git pull .. master && + test_must_fail git pull .. main && echo untracked >expect && test_cmp expect file ) @@ -76,7 +79,7 @@ test_expect_success 'pulling into void does not overwrite staged files' ' cd cloned-staged-colliding && echo "alternate content" >file && git add file && - test_must_fail git pull .. master && + test_must_fail git pull .. main && echo "alternate content" >expect && test_cmp expect file && git cat-file blob :file >file.index && @@ -90,7 +93,7 @@ test_expect_success 'pulling into void does not remove new staged files' ' cd cloned-staged-new && echo "new tracked file" >newfile && git add newfile && - git pull .. master && + git pull .. main && echo "new tracked file" >expect && test_cmp expect newfile && git cat-file blob :newfile >newfile.index && @@ -102,15 +105,15 @@ test_expect_success 'pulling into void must not create an octopus' ' git init cloned-octopus && ( cd cloned-octopus && - test_must_fail git pull .. master master && + test_must_fail git pull .. main main && test_path_is_missing file ) ' test_expect_success 'test . as a remote' ' - git branch copy master && + git branch copy main && git config branch.copy.remote . && - git config branch.copy.merge refs/heads/master && + git config branch.copy.merge refs/heads/main && echo updated >file && git commit -a -m updated && git checkout copy && @@ -126,7 +129,7 @@ test_expect_success 'test . as a remote' ' ' test_expect_success 'the default remote . should not break explicit pull' ' - git checkout -b second master^ && + git checkout -b second main^ && echo modified >file && git commit -a -m modified && git checkout copy && @@ -361,7 +364,7 @@ test_expect_success 'failed --rebase shows advice' ' test_expect_success '--rebase fails with multiple branches' ' git reset --hard before-rebase && - test_must_fail git pull --rebase . copy master 2>err && + test_must_fail git pull --rebase . copy main 2>err && test_cmp_rev HEAD before-rebase && test_i18ngrep "Cannot rebase onto multiple branches" err && echo modified >expect && @@ -500,7 +503,7 @@ test_expect_success 'pull --rebase does not warn on --no-verify-signatures' ' test_i18ngrep ! "verify-signatures" err ' -# add a feature branch, keep-merge, that is merged into master, so the +# add a feature branch, keep-merge, that is merged into main, so the # test can try preserving the merge commit (or not) with various # --rebase flags/pull.rebase settings. test_expect_success 'preserve merge setup' ' @@ -699,12 +702,12 @@ test_expect_success 'pull --rebase dies early with dirty working directory' ' ' test_expect_success 'pull --rebase works on branch yet to be born' ' - git rev-parse master >expect && + git rev-parse main >expect && mkdir empty_repo && ( cd empty_repo && git init && - git pull --rebase .. master && + git pull --rebase .. main && git rev-parse HEAD >../actual ) && test_cmp expect actual @@ -720,7 +723,7 @@ test_expect_success 'pull --rebase fails on unborn branch with staged changes' ' echo staged-file >expect && git ls-files >actual && test_cmp expect actual && - test_must_fail git pull --rebase .. master 2>err && + test_must_fail git pull --rebase .. main 2>err && git ls-files >actual && test_cmp expect actual && git show :staged-file >actual && @@ -743,14 +746,8 @@ test_expect_success 'pull --rebase fails on corrupt HEAD' ' ' test_expect_success 'setup for detecting upstreamed changes' ' - mkdir src && - ( - cd src && - git init && - printf "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" > stuff && - git add stuff && - git commit -m "Initial revision" - ) && + test_create_repo src && + test_commit -C src --printf one stuff "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" && git clone src dst && ( cd src && @@ -779,7 +776,7 @@ test_expect_success 'setup for avoiding reapplying old patches' ' ( cd dst && test_might_fail git rebase --abort && - git reset --hard origin/master + git reset --hard origin/main ) && git clone --bare src src-replace.git && rm -rf src && diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh index db1a381cd9..63a688bdbf 100755 --- a/t/t5521-pull-options.sh +++ b/t/t5521-pull-options.sh @@ -2,6 +2,9 @@ test_description='pull options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -99,13 +102,13 @@ test_expect_success 'git pull --force' ' cat >>.git/config <<-\EOF && [remote "one"] url = ../parent - fetch = refs/heads/master:refs/heads/mirror + fetch = refs/heads/main:refs/heads/mirror [remote "two"] url = ../parent - fetch = refs/heads/master:refs/heads/origin - [branch "master"] + fetch = refs/heads/main:refs/heads/origin + [branch "main"] remote = two - merge = refs/heads/master + merge = refs/heads/main EOF git pull two && test_commit A && @@ -124,9 +127,9 @@ test_expect_success 'git pull --all' ' [remote "two"] url = ../parent fetch = refs/heads/*:refs/remotes/two/* - [branch "master"] + [branch "main"] remote = one - merge = refs/heads/master + merge = refs/heads/main EOF git pull --all ) @@ -139,7 +142,7 @@ test_expect_success 'git pull --dry-run' ' cd clonedry && git pull --dry-run ../parent && test_path_is_missing .git/FETCH_HEAD && - test_path_is_missing .git/refs/heads/master && + test_path_is_missing .git/refs/heads/main && test_path_is_missing .git/index && test_path_is_missing file ) @@ -153,7 +156,7 @@ test_expect_success 'git pull --all --dry-run' ' git remote add origin ../parent && git pull --all --dry-run && test_path_is_missing .git/FETCH_HEAD && - test_path_is_missing .git/refs/remotes/origin/master && + test_path_is_missing .git/refs/remotes/origin/main && test_path_is_missing .git/index && test_path_is_missing file ) diff --git a/t/t5523-push-upstream.sh b/t/t5523-push-upstream.sh index c0df81a014..fdb4292056 100755 --- a/t/t5523-push-upstream.sh +++ b/t/t5523-push-upstream.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='push with --set-upstream' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -26,35 +29,35 @@ check_config() { test_cmp expect.$1 actual.$1 } -test_expect_success 'push -u master:master' ' - git push -u upstream master:master && - check_config master upstream refs/heads/master +test_expect_success 'push -u main:main' ' + git push -u upstream main:main && + check_config main upstream refs/heads/main ' -test_expect_success 'push -u master:other' ' - git push -u upstream master:other && - check_config master upstream refs/heads/other +test_expect_success 'push -u main:other' ' + git push -u upstream main:other && + check_config main upstream refs/heads/other ' -test_expect_success 'push -u --dry-run master:otherX' ' - git push -u --dry-run upstream master:otherX && - check_config master upstream refs/heads/other +test_expect_success 'push -u --dry-run main:otherX' ' + git push -u --dry-run upstream main:otherX && + check_config main upstream refs/heads/other ' -test_expect_success 'push -u master2:master2' ' - git branch master2 && - git push -u upstream master2:master2 && - check_config master2 upstream refs/heads/master2 +test_expect_success 'push -u topic_2:topic_2' ' + git branch topic_2 && + git push -u upstream topic_2:topic_2 && + check_config topic_2 upstream refs/heads/topic_2 ' -test_expect_success 'push -u master2:other2' ' - git push -u upstream master2:other2 && - check_config master2 upstream refs/heads/other2 +test_expect_success 'push -u topic_2:other2' ' + git push -u upstream topic_2:other2 && + check_config topic_2 upstream refs/heads/other2 ' -test_expect_success 'push -u :master2' ' - git push -u upstream :master2 && - check_config master2 upstream refs/heads/other2 +test_expect_success 'push -u :topic_2' ' + git push -u upstream :topic_2 && + check_config topic_2 upstream refs/heads/other2 ' test_expect_success 'push -u --all' ' @@ -74,7 +77,7 @@ test_expect_success 'push -u HEAD' ' test_expect_success TTY 'progress messages go to tty' ' ensure_fresh_upstream && - test_terminal git push -u upstream master >out 2>err && + test_terminal git push -u upstream main >out 2>err && test_i18ngrep "Writing objects" err ' @@ -82,7 +85,7 @@ test_expect_success 'progress messages do not go to non-tty' ' ensure_fresh_upstream && # skip progress messages, since stderr is non-tty - git push -u upstream master >out 2>err && + git push -u upstream main >out 2>err && test_i18ngrep ! "Writing objects" err ' @@ -90,21 +93,21 @@ test_expect_success 'progress messages go to non-tty (forced)' ' ensure_fresh_upstream && # force progress messages to stderr, even though it is non-tty - git push -u --progress upstream master >out 2>err && + git push -u --progress upstream main >out 2>err && test_i18ngrep "Writing objects" err ' test_expect_success TTY 'push -q suppresses progress' ' ensure_fresh_upstream && - test_terminal git push -u -q upstream master >out 2>err && + test_terminal git push -u -q upstream main >out 2>err && test_i18ngrep ! "Writing objects" err ' test_expect_success TTY 'push --no-progress suppresses progress' ' ensure_fresh_upstream && - test_terminal git push -u --no-progress upstream master >out 2>err && + test_terminal git push -u --no-progress upstream main >out 2>err && test_i18ngrep ! "Unpacking objects" err && test_i18ngrep ! "Writing objects" err ' @@ -112,7 +115,14 @@ test_expect_success TTY 'push --no-progress suppresses progress' ' test_expect_success TTY 'quiet push' ' ensure_fresh_upstream && - test_terminal git push --quiet --no-progress upstream master 2>&1 | tee output && + test_terminal git push --quiet --no-progress upstream main 2>&1 | tee output && + test_must_be_empty output +' + +test_expect_success TTY 'quiet push -u' ' + ensure_fresh_upstream && + + test_terminal git push --quiet -u --no-progress upstream main 2>&1 | tee output && test_must_be_empty output ' diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 63205dfdf9..ed11569d8d 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -3,6 +3,9 @@ test_description='Recursive "git fetch" for submodules' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh pwd=$(pwd) @@ -18,7 +21,7 @@ add_upstream_commit() { head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule" > ../expect.err && echo "From $pwd/submodule" >> ../expect.err && - echo " $head1..$head2 master -> origin/master" >> ../expect.err + echo " $head1..$head2 sub -> origin/sub" >> ../expect.err ) && ( cd deepsubmodule && @@ -30,7 +33,7 @@ add_upstream_commit() { head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule/subdir/deepsubmodule" >> ../expect.err echo "From $pwd/deepsubmodule" >> ../expect.err && - echo " $head1..$head2 master -> origin/master" >> ../expect.err + echo " $head1..$head2 deep -> origin/deep" >> ../expect.err ) } @@ -41,7 +44,8 @@ test_expect_success setup ' git init && echo deepsubcontent > deepsubfile && git add deepsubfile && - git commit -m new deepsubfile + git commit -m new deepsubfile && + git branch -M deep ) && mkdir submodule && ( @@ -50,10 +54,12 @@ test_expect_success setup ' echo subcontent > subfile && git add subfile && git submodule add "$pwd/deepsubmodule" subdir/deepsubmodule && - git commit -a -m new + git commit -a -m new && + git branch -M sub ) && git submodule add "$pwd/submodule" submodule && git commit -am initial && + git branch -M super && git clone . downstream && ( cd downstream && @@ -68,7 +74,7 @@ test_expect_success "fetch --recurse-submodules recurses into submodules" ' git fetch --recurse-submodules >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "submodule.recurse option triggers recursive fetch" ' @@ -78,7 +84,7 @@ test_expect_success "submodule.recurse option triggers recursive fetch" ' git -c submodule.recurse fetch >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "fetch --recurse-submodules -j2 has the same output behaviour" ' @@ -88,7 +94,7 @@ test_expect_success "fetch --recurse-submodules -j2 has the same output behaviou GIT_TRACE="$TRASH_DIRECTORY/trace.out" git fetch --recurse-submodules -j2 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err && + test_cmp expect.err actual.err && grep "2 tasks" trace.out ' @@ -118,7 +124,7 @@ test_expect_success "using fetchRecurseSubmodules=true in .gitmodules recurses i git fetch >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "--no-recurse-submodules overrides .gitmodules config" ' @@ -149,7 +155,7 @@ test_expect_success "--recurse-submodules overrides fetchRecurseSubmodules setti git config --unset submodule.submodule.fetchRecurseSubmodules ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "--quiet propagates to submodules" ' @@ -177,7 +183,7 @@ test_expect_success "--dry-run propagates to submodules" ' git fetch --recurse-submodules --dry-run >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "Without --dry-run propagates to submodules" ' @@ -186,7 +192,7 @@ test_expect_success "Without --dry-run propagates to submodules" ' git fetch --recurse-submodules >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "recurseSubmodules=true propagates into submodules" ' @@ -197,7 +203,7 @@ test_expect_success "recurseSubmodules=true propagates into submodules" ' git fetch >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "--recurse-submodules overrides config in submodule" ' @@ -211,7 +217,7 @@ test_expect_success "--recurse-submodules overrides config in submodule" ' git fetch --recurse-submodules >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "--no-recurse-submodules overrides config setting" ' @@ -245,13 +251,13 @@ test_expect_success "Recursion stops when no new submodule commits are fetched" git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.sub && - echo " $head1..$head2 master -> origin/master" >>expect.err.sub && + echo " $head1..$head2 super -> origin/super" >>expect.err.sub && head -3 expect.err >> expect.err.sub && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && - test_i18ncmp expect.err.sub actual.err && + test_cmp expect.err.sub actual.err && test_must_be_empty actual.out ' @@ -263,13 +269,13 @@ test_expect_success "Recursion doesn't happen when new superproject commits don' git commit -m "new file" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.file && - echo " $head1..$head2 master -> origin/master" >> expect.err.file && + echo " $head1..$head2 super -> origin/super" >> expect.err.file && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err.file actual.err + test_cmp expect.err.file actual.err ' test_expect_success "Recursion picks up config in submodule" ' @@ -287,7 +293,7 @@ test_expect_success "Recursion picks up config in submodule" ' git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> expect.err.sub && + echo " $head1..$head2 super -> origin/super" >> expect.err.sub && cat expect.err >> expect.err.sub && ( cd downstream && @@ -297,7 +303,7 @@ test_expect_success "Recursion picks up config in submodule" ' git config --unset fetch.recurseSubmodules ) ) && - test_i18ncmp expect.err.sub actual.err && + test_cmp expect.err.sub actual.err && test_must_be_empty actual.out ' @@ -316,21 +322,21 @@ test_expect_success "Recursion picks up all submodules when necessary" ' head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule" > ../expect.err.sub && echo "From $pwd/submodule" >> ../expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub + echo " $head1..$head2 sub -> origin/sub" >> ../expect.err.sub ) && head1=$(git rev-parse --short HEAD) && git add submodule && git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >> expect.err.2 && + echo " $head1..$head2 super -> origin/super" >> expect.err.2 && cat expect.err.sub >> expect.err.2 && tail -3 expect.err >> expect.err.2 && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && - test_i18ncmp expect.err.2 actual.err && + test_cmp expect.err.2 actual.err && test_must_be_empty actual.out ' @@ -349,7 +355,7 @@ test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no ne head2=$(git rev-parse --short HEAD) && echo Fetching submodule submodule > ../expect.err.sub && echo "From $pwd/submodule" >> ../expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub + echo " $head1..$head2 sub -> origin/sub" >> ../expect.err.sub ) && ( cd downstream && @@ -368,7 +374,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess head2=$(git rev-parse --short HEAD) && tail -3 expect.err > expect.err.deepsub && echo "From $pwd/." > expect.err && - echo " $head1..$head2 master -> origin/master" >>expect.err && + echo " $head1..$head2 super -> origin/super" >>expect.err && cat expect.err.sub >> expect.err && cat expect.err.deepsub >> expect.err && ( @@ -386,7 +392,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess ) ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err + test_cmp expect.err actual.err ' test_expect_success "'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)" ' @@ -397,13 +403,13 @@ test_expect_success "'--recurse-submodules=on-demand' stops when no new submodul git commit -m "new file" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.file && - echo " $head1..$head2 master -> origin/master" >> expect.err.file && + echo " $head1..$head2 super -> origin/super" >> expect.err.file && ( cd downstream && git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err.file actual.err + test_cmp expect.err.file actual.err ' test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config" ' @@ -418,7 +424,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >>expect.err.2 && + echo " $head1..$head2 super -> origin/super" >>expect.err.2 && head -3 expect.err >> expect.err.2 && ( cd downstream && @@ -431,7 +437,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config git config --unset fetch.recurseSubmodules ) && test_must_be_empty actual.out && - test_i18ncmp expect.err.2 actual.err + test_cmp expect.err.2 actual.err ' test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" ' @@ -446,7 +452,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >>expect.err.2 && + echo " $head1..$head2 super -> origin/super" >>expect.err.2 && head -3 expect.err >> expect.err.2 && ( cd downstream && @@ -459,7 +465,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override git config --unset submodule.submodule.fetchRecurseSubmodules ) && test_must_be_empty actual.out && - test_i18ncmp expect.err.2 actual.err + test_cmp expect.err.2 actual.err ' test_expect_success "don't fetch submodule when newly recorded commits are already present" ' @@ -472,16 +478,16 @@ test_expect_success "don't fetch submodule when newly recorded commits are alrea git commit -m "submodule rewound" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err && - echo " $head1..$head2 master -> origin/master" >> expect.err && + echo " $head1..$head2 super -> origin/super" >> expect.err && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && test_must_be_empty actual.out && - test_i18ncmp expect.err actual.err && + test_cmp expect.err actual.err && ( cd submodule && - git checkout -q master + git checkout -q sub ) ' @@ -497,7 +503,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' works also without .git git commit -m "new submodule without .gitmodules" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." >expect.err.2 && - echo " $head1..$head2 master -> origin/master" >>expect.err.2 && + echo " $head1..$head2 super -> origin/super" >>expect.err.2 && head -3 expect.err >>expect.err.2 && ( cd downstream && @@ -514,7 +520,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' works also without .git git reset --hard ) && test_must_be_empty actual.out && - test_i18ncmp expect.err.2 actual.err && + test_cmp expect.err.2 actual.err && git checkout HEAD^ -- .gitmodules && git add .gitmodules && git commit -m "new submodule restored .gitmodules" @@ -663,9 +669,9 @@ test_expect_success 'fetch new submodule commits on-demand without .gitmodules e git config -f .gitmodules --remove-section submodule.sub1 && git add .gitmodules && git commit -m "delete gitmodules file" && - git checkout -B master && + git checkout -B super && git -C downstream fetch && - git -C downstream checkout origin/master && + git -C downstream checkout origin/super && C=$(git -C submodule commit-tree -m "yet another change outside refs/heads" HEAD^{tree}) && git -C submodule update-ref refs/changes/7 $C && @@ -719,4 +725,121 @@ test_expect_success 'fetch new submodule commit intermittently referenced by sup ) ' +add_commit_push () { + dir="$1" && + msg="$2" && + shift 2 && + git -C "$dir" add "$@" && + git -C "$dir" commit -a -m "$msg" && + git -C "$dir" push +} + +compare_refs_in_dir () { + fail= && + if test "x$1" = 'x!' + then + fail='!' && + shift + fi && + git -C "$1" rev-parse --verify "$2" >expect && + git -C "$3" rev-parse --verify "$4" >actual && + eval $fail test_cmp expect actual +} + + +test_expect_success 'setup nested submodule fetch test' ' + # does not depend on any previous test setups + + for repo in outer middle inner + do + git init --bare $repo && + git clone $repo ${repo}_content && + echo "$repo" >"${repo}_content/file" && + add_commit_push ${repo}_content "initial" file || + return 1 + done && + + git clone outer A && + git -C A submodule add "$pwd/middle" && + git -C A/middle/ submodule add "$pwd/inner" && + add_commit_push A/middle/ "adding inner sub" .gitmodules inner && + add_commit_push A/ "adding middle sub" .gitmodules middle && + + git clone outer B && + git -C B/ submodule update --init middle && + + compare_refs_in_dir A HEAD B HEAD && + compare_refs_in_dir A/middle HEAD B/middle HEAD && + test_path_is_file B/file && + test_path_is_file B/middle/file && + test_path_is_missing B/middle/inner/file && + + echo "change on inner repo of A" >"A/middle/inner/file" && + add_commit_push A/middle/inner "change on inner" file && + add_commit_push A/middle "change on inner" inner && + add_commit_push A "change on inner" middle +' + +test_expect_success 'fetching a superproject containing an uninitialized sub/sub project' ' + # depends on previous test for setup + + git -C B/ fetch && + compare_refs_in_dir A origin/HEAD B origin/HEAD +' + +fetch_with_recursion_abort () { + # In a regression the following git call will run into infinite recursion. + # To handle that, we connect the sed command to the git call by a pipe + # so that sed can kill the infinite recursion when detected. + # The recursion creates git output like: + # Fetching submodule sub + # Fetching submodule sub/sub <-- [1] + # Fetching submodule sub/sub/sub + # ... + # [1] sed will stop reading and cause git to eventually stop and die + + git -C "$1" fetch --recurse-submodules 2>&1 | + sed "/Fetching submodule $2[^$]/q" >out && + ! grep "Fetching submodule $2[^$]" out +} + +test_expect_success 'setup recursive fetch with uninit submodule' ' + # does not depend on any previous test setups + + test_create_repo super && + test_commit -C super initial && + test_create_repo sub && + test_commit -C sub initial && + git -C sub rev-parse HEAD >expect && + + git -C super submodule add ../sub && + git -C super commit -m "add sub" && + + git clone super superclone && + git -C superclone submodule status >out && + sed -e "s/^-//" -e "s/ sub.*$//" out >actual && + test_cmp expect actual +' + +test_expect_success 'recursive fetch with uninit submodule' ' + # depends on previous test for setup + + fetch_with_recursion_abort superclone sub && + git -C superclone submodule status >out && + sed -e "s/^-//" -e "s/ sub$//" out >actual && + test_cmp expect actual +' + +test_expect_success 'recursive fetch after deinit a submodule' ' + # depends on previous test for setup + + git -C superclone submodule update --init sub && + git -C superclone submodule deinit -f sub && + + fetch_with_recursion_abort superclone sub && + git -C superclone submodule status >out && + sed -e "s/^-//" -e "s/ sub$//" out >actual && + test_cmp expect actual +' + test_done diff --git a/t/t5527-fetch-odd-refs.sh b/t/t5527-fetch-odd-refs.sh index 3b0cb98422..e2770e4541 100755 --- a/t/t5527-fetch-odd-refs.sh +++ b/t/t5527-fetch-odd-refs.sh @@ -1,17 +1,20 @@ #!/bin/sh test_description='test fetching of oddly-named refs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # afterwards we will have: # HEAD - two -# refs/for/refs/heads/master - one -# refs/heads/master - three +# refs/for/refs/heads/main - one +# refs/heads/main - three test_expect_success 'setup repo with odd suffix ref' ' echo content >file && git add . && git commit -m one && - git update-ref refs/for/refs/heads/master HEAD && + git update-ref refs/for/refs/heads/main HEAD && echo content >>file && git commit -a -m two && echo content >>file && @@ -22,7 +25,7 @@ test_expect_success 'setup repo with odd suffix ref' ' test_expect_success 'suffix ref is ignored during fetch' ' git clone --bare file://"$PWD" suffix && echo three >expect && - git --git-dir=suffix log -1 --format=%s refs/heads/master >actual && + git --git-dir=suffix log -1 --format=%s refs/heads/main >actual && test_cmp expect actual ' @@ -33,7 +36,7 @@ test_expect_success 'try to create repo with absurdly long refname' ' ( cd long && test_commit long && - test_commit master + test_commit main ) && if git -C long update-ref refs/heads/$ref1440 long; then test_set_prereq LONG_REF @@ -46,7 +49,7 @@ test_expect_success LONG_REF 'fetch handles extremely long refname' ' git fetch long refs/heads/*:refs/remotes/long/* && cat >expect <<-\EOF && long - master + main EOF git for-each-ref --format="%(subject)" refs/remotes/long >actual && test_cmp expect actual @@ -55,7 +58,7 @@ test_expect_success LONG_REF 'fetch handles extremely long refname' ' test_expect_success LONG_REF 'push handles extremely long refname' ' git push long :refs/heads/$ref1440 && git -C long for-each-ref --format="%(subject)" refs/heads >actual && - echo master >expect && + echo main >expect && test_cmp expect actual ' diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh index f0a287d97d..f280e00eb7 100755 --- a/t/t5528-push-default.sh +++ b/t/t5528-push-default.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='check various push.default settings' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup bare remotes' ' @@ -41,7 +44,7 @@ test_push_failure () { # $1 = success or failure # $2 = push.default value -# $3 = branch to check for actual output (master or foo) +# $3 = branch to check for actual output (main or foo) # $4 = [optional] switch to triangular workflow test_pushdefault_workflow () { workflow=central @@ -51,8 +54,8 @@ test_pushdefault_workflow () { pushdefault=parent2 fi test_expect_success "push.default = $2 $1 in $workflow workflows" " - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/foo && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/foo && test_config remote.pushdefault $pushdefault && test_commit commit-for-$2${4+-triangular} && test_push_$1 $2 $3 ${4+repo2} @@ -60,32 +63,32 @@ test_pushdefault_workflow () { } test_expect_success '"upstream" pushes to configured upstream' ' - git checkout master && - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/foo && + git checkout main && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/foo && test_commit two && test_push_success upstream foo ' test_expect_success '"upstream" does not push on unconfigured remote' ' - git checkout master && - test_unconfig branch.master.remote && + git checkout main && + test_unconfig branch.main.remote && test_commit three && test_push_failure upstream ' test_expect_success '"upstream" does not push on unconfigured branch' ' - git checkout master && - test_config branch.master.remote parent1 && - test_unconfig branch.master.merge && + git checkout main && + test_config branch.main.remote parent1 && + test_unconfig branch.main.merge && test_commit four && test_push_failure upstream ' test_expect_success '"upstream" does not push when remotes do not match' ' - git checkout master && - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/foo && + git checkout main && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/foo && test_config push.default upstream && test_commit five && test_must_fail git push parent2 @@ -121,99 +124,99 @@ test_expect_success 'push from/to new branch with current creates remote branch' ' test_expect_success 'push to existing branch, with no upstream configured' ' - test_config branch.master.remote repo1 && - git checkout master && + test_config branch.main.remote repo1 && + git checkout main && test_push_failure simple && test_push_failure upstream ' test_expect_success 'push to existing branch, upstream configured with same name' ' - test_config branch.master.remote repo1 && - test_config branch.master.merge refs/heads/master && - git checkout master && + test_config branch.main.remote repo1 && + test_config branch.main.merge refs/heads/main && + git checkout main && test_commit six && - test_push_success upstream master && + test_push_success upstream main && test_commit seven && - test_push_success simple master + test_push_success simple main ' test_expect_success 'push to existing branch, upstream configured with different name' ' - test_config branch.master.remote repo1 && - test_config branch.master.merge refs/heads/other-name && - git checkout master && + test_config branch.main.remote repo1 && + test_config branch.main.merge refs/heads/other-name && + git checkout main && test_commit eight && test_push_success upstream other-name && test_commit nine && test_push_failure simple && git --git-dir=repo1 log -1 --format="%h %s" "other-name" >expect-other-name && - test_push_success current master && + test_push_success current main && git --git-dir=repo1 log -1 --format="%h %s" "other-name" >actual-other-name && test_cmp expect-other-name actual-other-name ' -# We are on 'master', which integrates with 'foo' from parent1 +# We are on 'main', which integrates with 'foo' from parent1 # remote (set in test_pushdefault_workflow helper). Push to # parent1 in centralized, and push to parent2 in triangular workflow. -# The parent1 repository has 'master' and 'foo' branches, while -# the parent2 repository has only 'master' branch. +# The parent1 repository has 'main' and 'foo' branches, while +# the parent2 repository has only 'main' branch. # # test_pushdefault_workflow() arguments: # $1 = success or failure # $2 = push.default value -# $3 = branch to check for actual output (master or foo) +# $3 = branch to check for actual output (main or foo) # $4 = [optional] switch to triangular workflow -# update parent1's master (which is not our upstream) -test_pushdefault_workflow success current master +# update parent1's main (which is not our upstream) +test_pushdefault_workflow success current main # update parent1's foo (which is our upstream) test_pushdefault_workflow success upstream foo # upstream is foo which is not the name of the current branch -test_pushdefault_workflow failure simple master +test_pushdefault_workflow failure simple main -# master and foo are updated -test_pushdefault_workflow success matching master +# main and foo are updated +test_pushdefault_workflow success matching main -# master is updated -test_pushdefault_workflow success current master triangular +# main is updated +test_pushdefault_workflow success current main triangular # upstream mode cannot be used in triangular test_pushdefault_workflow failure upstream foo triangular # in triangular, 'simple' works as 'current' and update the branch # with the same name. -test_pushdefault_workflow success simple master triangular +test_pushdefault_workflow success simple main triangular -# master is updated (parent2 does not have foo) -test_pushdefault_workflow success matching master triangular +# main is updated (parent2 does not have foo) +test_pushdefault_workflow success matching main triangular # default tests, when no push-default is specified. This # should behave the same as "simple" in non-triangular # settings, and as "current" otherwise. test_expect_success 'default behavior allows "simple" push' ' - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/master && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/main && test_config remote.pushdefault parent1 && - test_commit default-master-master && - test_push_success "" master + test_commit default-main-main && + test_push_success "" main ' test_expect_success 'default behavior rejects non-simple push' ' - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/foo && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/foo && test_config remote.pushdefault parent1 && - test_commit default-master-foo && + test_commit default-main-foo && test_push_failure "" ' test_expect_success 'default triangular behavior acts like "current"' ' - test_config branch.master.remote parent1 && - test_config branch.master.merge refs/heads/foo && + test_config branch.main.remote parent1 && + test_config branch.main.merge refs/heads/foo && test_config remote.pushdefault parent2 && test_commit default-triangular && - test_push_success "" master repo2 + test_push_success "" main repo2 ' test_done diff --git a/t/t5529-push-errors.sh b/t/t5529-push-errors.sh index 9871307fd4..ce85fd30ad 100755 --- a/t/t5529-push-errors.sh +++ b/t/t5529-push-errors.sh @@ -32,7 +32,7 @@ test_expect_success 'detect missing branches early' ' test_expect_success 'detect missing sha1 expressions early' ' echo no >rp-ran && echo no >expect && - test_must_fail git push origin master~2:master && + test_must_fail git push origin main~2:main && test_cmp expect rp-ran ' diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh index 205a2631e7..7c1460eaa9 100755 --- a/t/t5530-upload-pack-error.sh +++ b/t/t5530-upload-pack-error.sh @@ -88,6 +88,23 @@ test_expect_success 'upload-pack fails due to error in pack-objects enumeration' grep "pack-objects died" output.err ' +test_expect_success 'upload-pack tolerates EOF just after stateless client wants' ' + test_commit initial && + head=$(git rev-parse HEAD) && + + { + packetize "want $head" && + packetize "shallow $head" && + packetize "deepen 1" && + printf "0000" + } >request && + + printf "0000" >expect && + + git upload-pack --stateless-rpc . <request >actual && + test_cmp expect actual +' + test_expect_success 'create empty repository' ' mkdir foo && @@ -98,7 +115,7 @@ test_expect_success 'create empty repository' ' test_expect_success 'fetch fails' ' - test_must_fail git fetch .. master + test_must_fail git fetch .. main ' diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index 4ad059e6be..d573ca496a 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -2,6 +2,9 @@ test_description='test push with submodules' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -30,7 +33,7 @@ test_expect_success setup ' test_expect_success 'push works with recorded gitlink' ' ( cd work && - git push ../pub.git master + git push ../pub.git main ) ' @@ -45,7 +48,7 @@ test_expect_success 'push if submodule has no remote' ' cd work && git add gar/bage && git commit -m "Second commit for gar/bage" && - git push --recurse-submodules=check ../pub.git master + git push --recurse-submodules=check ../pub.git main ) ' @@ -66,21 +69,21 @@ test_expect_success 'push fails if submodule commit not on remote' ' git commit -m "Third commit for gar/bage" && # the push should fail with --recurse-submodules=check # on the command line... - test_must_fail git push --recurse-submodules=check ../pub.git master && + test_must_fail git push --recurse-submodules=check ../pub.git main && # ...or if specified in the configuration.. - test_must_fail git -c push.recurseSubmodules=check push ../pub.git master + test_must_fail git -c push.recurseSubmodules=check push ../pub.git main ) ' test_expect_success 'push succeeds after commit was pushed to remote' ' ( cd work/gar/bage && - git push origin master + git push origin main ) && ( cd work && - git push --recurse-submodules=check ../pub.git master + git push --recurse-submodules=check ../pub.git main ) ' @@ -95,13 +98,13 @@ test_expect_success 'push succeeds if submodule commit not on remote but using o cd work && git add gar/bage && git commit -m "Recurse on-demand on command line for gar/bage" && - git push --recurse-submodules=on-demand ../pub.git master && + git push --recurse-submodules=on-demand ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # Check that the submodule commit got there too cd gar/bage && - git diff --quiet origin/master master + git diff --quiet origin/main main ) ' @@ -116,13 +119,13 @@ test_expect_success 'push succeeds if submodule commit not on remote but using o cd work && git add gar/bage && git commit -m "Recurse on-demand from config for gar/bage" && - git -c push.recurseSubmodules=on-demand push ../pub.git master && + git -c push.recurseSubmodules=on-demand push ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # Check that the submodule commit got there too cd gar/bage && - git diff --quiet origin/master master + git diff --quiet origin/main main ) ' @@ -137,13 +140,13 @@ test_expect_success 'push succeeds if submodule commit not on remote but using a cd work && git add gar/bage && git commit -m "Recurse submodule.recurse from config for gar/bage" && - git -c submodule.recurse push ../pub.git master && + git -c submodule.recurse push ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # Check that the submodule commit got there too cd gar/bage && - git diff --quiet origin/master master + git diff --quiet origin/main main ) ' @@ -161,34 +164,34 @@ test_expect_success 'push recurse-submodules on command line overrides config' ' # Ensure that we can override on-demand in the config # to just check submodules - test_must_fail git -c push.recurseSubmodules=on-demand push --recurse-submodules=check ../pub.git master && + test_must_fail git -c push.recurseSubmodules=on-demand push --recurse-submodules=check ../pub.git main && # Check that the supermodule commit did not get there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master^ && + git diff --quiet FETCH_HEAD main^ && # Check that the submodule commit did not get there - (cd gar/bage && git diff --quiet origin/master master^) && + (cd gar/bage && git diff --quiet origin/main main^) && # Ensure that we can override check in the config to # disable submodule recursion entirely - (cd gar/bage && git diff --quiet origin/master master^) && - git -c push.recurseSubmodules=on-demand push --recurse-submodules=no ../pub.git master && + (cd gar/bage && git diff --quiet origin/main main^) && + git -c push.recurseSubmodules=on-demand push --recurse-submodules=no ../pub.git main && git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && - (cd gar/bage && git diff --quiet origin/master master^) && + git diff --quiet FETCH_HEAD main && + (cd gar/bage && git diff --quiet origin/main main^) && # Ensure that we can override check in the config to # disable submodule recursion entirely (alternative form) - git -c push.recurseSubmodules=on-demand push --no-recurse-submodules ../pub.git master && + git -c push.recurseSubmodules=on-demand push --no-recurse-submodules ../pub.git main && git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && - (cd gar/bage && git diff --quiet origin/master master^) && + git diff --quiet FETCH_HEAD main && + (cd gar/bage && git diff --quiet origin/main main^) && # Ensure that we can override check in the config to # push the submodule too - git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master && + git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git main && git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && - (cd gar/bage && git diff --quiet origin/master master) + git diff --quiet FETCH_HEAD main && + (cd gar/bage && git diff --quiet origin/main main) ) ' @@ -205,31 +208,31 @@ test_expect_success 'push recurse-submodules last one wins on command line' ' git commit -m "Recurse on command-line overriding earlier command-line for gar/bage" && # should result in "check" - test_must_fail git push --recurse-submodules=on-demand --recurse-submodules=check ../pub.git master && + test_must_fail git push --recurse-submodules=on-demand --recurse-submodules=check ../pub.git main && # Check that the supermodule commit did not get there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master^ && + git diff --quiet FETCH_HEAD main^ && # Check that the submodule commit did not get there - (cd gar/bage && git diff --quiet origin/master master^) && + (cd gar/bage && git diff --quiet origin/main main^) && # should result in "no" - git push --recurse-submodules=on-demand --recurse-submodules=no ../pub.git master && + git push --recurse-submodules=on-demand --recurse-submodules=no ../pub.git main && # Check that the supermodule commit did get there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # Check that the submodule commit did not get there - (cd gar/bage && git diff --quiet origin/master master^) && + (cd gar/bage && git diff --quiet origin/main main^) && # should result in "no" - git push --recurse-submodules=on-demand --no-recurse-submodules ../pub.git master && + git push --recurse-submodules=on-demand --no-recurse-submodules ../pub.git main && # Check that the submodule commit did not get there - (cd gar/bage && git diff --quiet origin/master master^) && + (cd gar/bage && git diff --quiet origin/main main^) && # But the options in the other order should push the submodule - git push --recurse-submodules=check --recurse-submodules=on-demand ../pub.git master && + git push --recurse-submodules=check --recurse-submodules=on-demand ../pub.git main && # Check that the submodule commit did get there git fetch ../pub.git && - (cd gar/bage && git diff --quiet origin/master master) + (cd gar/bage && git diff --quiet origin/main main) ) ' @@ -244,13 +247,13 @@ test_expect_success 'push succeeds if submodule commit not on remote using on-de cd work && git add gar/bage && git commit -m "Recurse on-demand on command-line overriding config for gar/bage" && - git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master && + git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # Check that the submodule commit got there cd gar/bage && - git diff --quiet origin/master master + git diff --quiet origin/main main ) ' @@ -265,14 +268,14 @@ test_expect_success 'push succeeds if submodule commit disabling recursion from cd work && git add gar/bage && git commit -m "Recurse disable on command-line overriding config for gar/bage" && - git -c push.recurseSubmodules=check push --recurse-submodules=no ../pub.git master && + git -c push.recurseSubmodules=check push --recurse-submodules=no ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # But that the submodule commit did not - ( cd gar/bage && git diff --quiet origin/master master^ ) && + ( cd gar/bage && git diff --quiet origin/main main^ ) && # Now push it to avoid confusing future tests - git push --recurse-submodules=on-demand ../pub.git master + git push --recurse-submodules=on-demand ../pub.git main ) ' @@ -287,14 +290,14 @@ test_expect_success 'push succeeds if submodule commit disabling recursion from cd work && git add gar/bage && git commit -m "Recurse disable on command-line alternative overriding config for gar/bage" && - git -c push.recurseSubmodules=check push --no-recurse-submodules ../pub.git master && + git -c push.recurseSubmodules=check push --no-recurse-submodules ../pub.git main && # Check that the supermodule commit got there git fetch ../pub.git && - git diff --quiet FETCH_HEAD master && + git diff --quiet FETCH_HEAD main && # But that the submodule commit did not - ( cd gar/bage && git diff --quiet origin/master master^ ) && + ( cd gar/bage && git diff --quiet origin/main main^ ) && # Now push it to avoid confusing future tests - git push --recurse-submodules=on-demand ../pub.git master + git push --recurse-submodules=on-demand ../pub.git main ) ' @@ -304,7 +307,7 @@ test_expect_success 'submodule entry pointing at a tag is error' ' git -C work update-index --cacheinfo 160000 "$tag" gar/bage && git -C work commit -m "bad commit" && test_when_finished "git -C work reset --hard HEAD^" && - test_must_fail git -C work push --recurse-submodules=on-demand ../pub.git master 2>err && + test_must_fail git -C work push --recurse-submodules=on-demand ../pub.git main 2>err && test_i18ngrep "is a tag, not a commit" err ' @@ -319,9 +322,9 @@ test_expect_success 'push fails if recurse submodules option passed as yes' ' cd work && git add gar/bage && git commit -m "Recurse push fails if recurse submodules option passed as yes for gar/bage" && - test_must_fail git push --recurse-submodules=yes ../pub.git master && - test_must_fail git -c push.recurseSubmodules=yes push ../pub.git master && - git push --recurse-submodules=on-demand ../pub.git master + test_must_fail git push --recurse-submodules=yes ../pub.git main && + test_must_fail git -c push.recurseSubmodules=yes push ../pub.git main && + git push --recurse-submodules=on-demand ../pub.git main ) ' @@ -363,7 +366,7 @@ test_expect_success 'push succeeds if submodule has no remote and is on the firs ) && git add b && git commit -m "added submodule" && - git push --recurse-submodules=check origin master + git push --recurse-submodules=check origin main ) ' @@ -372,21 +375,21 @@ test_expect_success 'push unpushed submodules when not needed' ' cd work && ( cd gar/bage && - git checkout master && + git checkout main && >junk5 && git add junk5 && git commit -m "Fifth junk" && git push && - git rev-parse origin/master >../../../expected + git rev-parse origin/main >../../../expected ) && - git checkout master && + git checkout main && git add gar/bage && git commit -m "Fifth commit for gar/bage" && - git push --recurse-submodules=on-demand ../pub.git master + git push --recurse-submodules=on-demand ../pub.git main ) && ( cd submodule.git && - git rev-parse master >../actual + git rev-parse main >../actual ) && test_cmp expected actual ' @@ -394,7 +397,7 @@ test_expect_success 'push unpushed submodules when not needed' ' test_expect_success 'push unpushed submodules when not needed 2' ' ( cd submodule.git && - git rev-parse master >../expected + git rev-parse main >../expected ) && ( cd work && @@ -407,11 +410,11 @@ test_expect_success 'push unpushed submodules when not needed 2' ' >junk2 && git add junk2 && git commit -m "Second junk for work" && - git push --recurse-submodules=on-demand ../pub.git master + git push --recurse-submodules=on-demand ../pub.git main ) && ( cd submodule.git && - git rev-parse master >../actual + git rev-parse main >../actual ) && test_cmp expected actual ' @@ -421,20 +424,20 @@ test_expect_success 'push unpushed submodules recursively' ' cd work && ( cd gar/bage && - git checkout master && + git checkout main && > junk7 && git add junk7 && git commit -m "Seventh junk" && - git rev-parse master >../../../expected + git rev-parse main >../../../expected ) && - git checkout master && + git checkout main && git add gar/bage && git commit -m "Seventh commit for gar/bage" && - git push --recurse-submodules=on-demand ../pub.git master + git push --recurse-submodules=on-demand ../pub.git main ) && ( cd submodule.git && - git rev-parse master >../actual + git rev-parse main >../actual ) && test_cmp expected actual ' @@ -444,64 +447,64 @@ test_expect_success 'push unpushable submodule recursively fails' ' cd work && ( cd gar/bage && - git rev-parse origin/master >../../../expected && - git checkout master~0 && + git rev-parse origin/main >../../../expected && + git checkout main~0 && > junk8 && git add junk8 && git commit -m "Eighth junk" ) && git add gar/bage && git commit -m "Eighth commit for gar/bage" && - test_must_fail git push --recurse-submodules=on-demand ../pub.git master + test_must_fail git push --recurse-submodules=on-demand ../pub.git main ) && ( cd submodule.git && - git rev-parse master >../actual + git rev-parse main >../actual ) && - test_when_finished git -C work reset --hard master^ && + test_when_finished git -C work reset --hard main^ && test_cmp expected actual ' test_expect_success 'push --dry-run does not recursively update submodules' ' ( cd work/gar/bage && - git checkout master && - git rev-parse master >../../../expected_submodule && + git checkout main && + git rev-parse main >../../../expected_submodule && > junk9 && git add junk9 && git commit -m "Ninth junk" && # Go up to 'work' directory cd ../.. && - git checkout master && - git rev-parse master >../expected_pub && + git checkout main && + git rev-parse main >../expected_pub && git add gar/bage && git commit -m "Ninth commit for gar/bage" && - git push --dry-run --recurse-submodules=on-demand ../pub.git master + git push --dry-run --recurse-submodules=on-demand ../pub.git main ) && - git -C submodule.git rev-parse master >actual_submodule && - git -C pub.git rev-parse master >actual_pub && + git -C submodule.git rev-parse main >actual_submodule && + git -C pub.git rev-parse main >actual_pub && test_cmp expected_pub actual_pub && test_cmp expected_submodule actual_submodule ' test_expect_success 'push --dry-run does not recursively update submodules' ' - git -C work push --dry-run --recurse-submodules=only ../pub.git master && + git -C work push --dry-run --recurse-submodules=only ../pub.git main && - git -C submodule.git rev-parse master >actual_submodule && - git -C pub.git rev-parse master >actual_pub && + git -C submodule.git rev-parse main >actual_submodule && + git -C pub.git rev-parse main >actual_pub && test_cmp expected_pub actual_pub && test_cmp expected_submodule actual_submodule ' test_expect_success 'push only unpushed submodules recursively' ' - git -C work/gar/bage rev-parse master >expected_submodule && - git -C pub.git rev-parse master >expected_pub && + git -C work/gar/bage rev-parse main >expected_submodule && + git -C pub.git rev-parse main >expected_pub && - git -C work push --recurse-submodules=only ../pub.git master && + git -C work push --recurse-submodules=only ../pub.git main && - git -C submodule.git rev-parse master >actual_submodule && - git -C pub.git rev-parse master >actual_pub && + git -C submodule.git rev-parse main >actual_submodule && + git -C pub.git rev-parse main >actual_pub && test_cmp expected_submodule actual_submodule && test_cmp expected_pub actual_pub ' @@ -517,14 +520,14 @@ test_expect_success 'push propagating the remotes name to a submodule' ' git -C work commit -m "Tenth junk added to gar/bage" && # Fails when submodule does not have a matching remote - test_must_fail git -C work push --recurse-submodules=on-demand pub master && + test_must_fail git -C work push --recurse-submodules=on-demand pub main && # Succeeds when submodules has matching remote and refspec - git -C work push --recurse-submodules=on-demand origin master && + git -C work push --recurse-submodules=on-demand origin main && - git -C submodule.git rev-parse master >actual_submodule && - git -C pub.git rev-parse master >actual_pub && - git -C work/gar/bage rev-parse master >expected_submodule && - git -C work rev-parse master >expected_pub && + git -C submodule.git rev-parse main >actual_submodule && + git -C pub.git rev-parse main >actual_pub && + git -C work/gar/bage rev-parse main >expected_submodule && + git -C work rev-parse main >expected_pub && test_cmp expected_submodule actual_submodule && test_cmp expected_pub actual_pub ' @@ -548,7 +551,7 @@ test_expect_success 'push propagating refspec to a submodule' ' test_must_fail git -C work push --recurse-submodules=on-demand origin \ HEAD:refs/heads/branch2 && - git -C work/gar/bage branch branch2 master && + git -C work/gar/bage branch branch2 main && git -C work push --recurse-submodules=on-demand origin branch2 && git -C submodule.git rev-parse branch2 >actual_submodule && diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh index 0b0eb1d025..cba26a872d 100755 --- a/t/t5533-push-cas.sh +++ b/t/t5533-push-cas.sh @@ -2,6 +2,9 @@ test_description='compare & swap push force/delete safety' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh setup_srcdst_basic () { @@ -13,6 +16,46 @@ setup_srcdst_basic () { ) } +# For tests with "--force-if-includes". +setup_src_dup_dst () { + rm -fr src dup dst && + git init --bare dst && + git clone --no-local dst src && + git clone --no-local dst dup + ( + cd src && + test_commit A && + test_commit B && + test_commit C && + git push origin + ) && + ( + cd dup && + git fetch && + git merge origin/main && + git switch -c branch main~2 && + test_commit D && + test_commit E && + git push origin --all + ) && + ( + cd src && + git switch main && + git fetch --all && + git branch branch --track origin/branch && + git rebase origin/main + ) && + ( + cd dup && + git switch main && + test_commit F && + test_commit G && + git switch branch && + test_commit H && + git push origin --all + ) +} + test_expect_success setup ' # create template repository test_commit A && @@ -25,11 +68,11 @@ test_expect_success 'push to update (protected)' ' ( cd dst && test_commit D && - test_must_fail git push --force-with-lease=master:master origin master 2>err && + test_must_fail git push --force-with-lease=main:main origin main 2>err && grep "stale info" err ) && - git ls-remote . refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote . refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -38,11 +81,11 @@ test_expect_success 'push to update (protected, forced)' ' ( cd dst && test_commit D && - git push --force --force-with-lease=master:master origin master 2>err && + git push --force --force-with-lease=main:main origin main 2>err && grep "forced update" err ) && - git ls-remote dst refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote dst refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -50,20 +93,20 @@ test_expect_success 'push to update (protected, tracking)' ' setup_srcdst_basic && ( cd src && - git checkout master && + git checkout main && test_commit D && git checkout HEAD^0 ) && - git ls-remote src refs/heads/master >expect && + git ls-remote src refs/heads/main >expect && ( cd dst && test_commit E && - git ls-remote . refs/remotes/origin/master >expect && - test_must_fail git push --force-with-lease=master origin master && - git ls-remote . refs/remotes/origin/master >actual && + git ls-remote . refs/remotes/origin/main >expect && + test_must_fail git push --force-with-lease=main origin main && + git ls-remote . refs/remotes/origin/main >actual && test_cmp expect actual ) && - git ls-remote src refs/heads/master >actual && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -71,18 +114,18 @@ test_expect_success 'push to update (protected, tracking, forced)' ' setup_srcdst_basic && ( cd src && - git checkout master && + git checkout main && test_commit D && git checkout HEAD^0 ) && ( cd dst && test_commit E && - git ls-remote . refs/remotes/origin/master >expect && - git push --force --force-with-lease=master origin master + git ls-remote . refs/remotes/origin/main >expect && + git push --force --force-with-lease=main origin main ) && - git ls-remote dst refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote dst refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -91,10 +134,10 @@ test_expect_success 'push to update (allowed)' ' ( cd dst && test_commit D && - git push --force-with-lease=master:master^ origin master + git push --force-with-lease=main:main^ origin main ) && - git ls-remote dst refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote dst refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -103,11 +146,11 @@ test_expect_success 'push to update (allowed, tracking)' ' ( cd dst && test_commit D && - git push --force-with-lease=master origin master 2>err && + git push --force-with-lease=main origin main 2>err && ! grep "forced update" err ) && - git ls-remote dst refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote dst refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -117,22 +160,22 @@ test_expect_success 'push to update (allowed even though no-ff)' ' cd dst && git reset --hard HEAD^ && test_commit D && - git push --force-with-lease=master origin master 2>err && + git push --force-with-lease=main origin main 2>err && grep "forced update" err ) && - git ls-remote dst refs/heads/master >expect && - git ls-remote src refs/heads/master >actual && + git ls-remote dst refs/heads/main >expect && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' test_expect_success 'push to delete (protected)' ' setup_srcdst_basic && - git ls-remote src refs/heads/master >expect && + git ls-remote src refs/heads/main >expect && ( cd dst && - test_must_fail git push --force-with-lease=master:master^ origin :master + test_must_fail git push --force-with-lease=main:main^ origin :main ) && - git ls-remote src refs/heads/master >actual && + git ls-remote src refs/heads/main >actual && test_cmp expect actual ' @@ -140,9 +183,9 @@ test_expect_success 'push to delete (protected, forced)' ' setup_srcdst_basic && ( cd dst && - git push --force --force-with-lease=master:master^ origin :master + git push --force --force-with-lease=main:main^ origin :main ) && - git ls-remote src refs/heads/master >actual && + git ls-remote src refs/heads/main >actual && test_must_be_empty actual ' @@ -150,10 +193,10 @@ test_expect_success 'push to delete (allowed)' ' setup_srcdst_basic && ( cd dst && - git push --force-with-lease=master origin :master 2>err && + git push --force-with-lease=main origin :main 2>err && grep deleted err ) && - git ls-remote src refs/heads/master >actual && + git ls-remote src refs/heads/main >actual && test_must_be_empty actual ' @@ -161,12 +204,12 @@ test_expect_success 'cover everything with default force-with-lease (protected)' setup_srcdst_basic && ( cd src && - git branch naster master^ + git branch nain main^ ) && git ls-remote src refs/heads/\* >expect && ( cd dst && - test_must_fail git push --force-with-lease origin master master:naster + test_must_fail git push --force-with-lease origin main main:nain ) && git ls-remote src refs/heads/\* >actual && test_cmp expect actual @@ -176,16 +219,16 @@ test_expect_success 'cover everything with default force-with-lease (allowed)' ' setup_srcdst_basic && ( cd src && - git branch naster master^ + git branch nain main^ ) && ( cd dst && git fetch && - git push --force-with-lease origin master master:naster + git push --force-with-lease origin main main:nain ) && - git ls-remote dst refs/heads/master | - sed -e "s/master/naster/" >expect && - git ls-remote src refs/heads/naster >actual && + git ls-remote dst refs/heads/main | + sed -e "s/main/nain/" >expect && + git ls-remote src refs/heads/nain >actual && test_cmp expect actual ' @@ -193,7 +236,7 @@ test_expect_success 'new branch covered by force-with-lease' ' setup_srcdst_basic && ( cd dst && - git branch branch master && + git branch branch main && git push --force-with-lease=branch origin branch ) && git ls-remote dst refs/heads/branch >expect && @@ -205,7 +248,7 @@ test_expect_success 'new branch covered by force-with-lease (explicit)' ' setup_srcdst_basic && ( cd dst && - git branch branch master && + git branch branch main && git push --force-with-lease=branch: origin branch ) && git ls-remote dst refs/heads/branch >expect && @@ -217,12 +260,12 @@ test_expect_success 'new branch already exists' ' setup_srcdst_basic && ( cd src && - git checkout -b branch master && + git checkout -b branch main && test_commit F ) && ( cd dst && - git branch branch master && + git branch branch main && test_must_fail git push --force-with-lease=branch: origin branch ) ' @@ -237,7 +280,7 @@ test_expect_success 'background updates of REMOTE can be mitigated with a non-up cd dst && test_commit G && git remote add origin-push ../src.bare && - git push origin-push master:master + git push origin-push main:main ) && git clone --no-local src.bare dst2 && test_when_finished "rm -rf dst2" && @@ -256,4 +299,101 @@ test_expect_success 'background updates of REMOTE can be mitigated with a non-up ) ' +test_expect_success 'background updates to remote can be mitigated with "--force-if-includes"' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + git ls-remote dst refs/heads/main >expect.main && + git ls-remote dst refs/heads/branch >expect.branch && + ( + cd src && + git switch branch && + test_commit I && + git switch main && + test_commit J && + git fetch --all && + test_must_fail git push --force-with-lease --force-if-includes --all + ) && + git ls-remote dst refs/heads/main >actual.main && + git ls-remote dst refs/heads/branch >actual.branch && + test_cmp expect.main actual.main && + test_cmp expect.branch actual.branch +' + +test_expect_success 'background updates to remote can be mitigated with "push.useForceIfIncludes"' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + git ls-remote dst refs/heads/main >expect.main && + ( + cd src && + git switch branch && + test_commit I && + git switch main && + test_commit J && + git fetch --all && + git config --local push.useForceIfIncludes true && + test_must_fail git push --force-with-lease=main origin main + ) && + git ls-remote dst refs/heads/main >actual.main && + test_cmp expect.main actual.main +' + +test_expect_success '"--force-if-includes" should be disabled for --force-with-lease="<refname>:<expect>"' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + git ls-remote dst refs/heads/main >expect.main && + ( + cd src && + git switch branch && + test_commit I && + git switch main && + test_commit J && + remote_head="$(git rev-parse refs/remotes/origin/main)" && + git fetch --all && + test_must_fail git push --force-if-includes --force-with-lease="main:$remote_head" 2>err && + grep "stale info" err + ) && + git ls-remote dst refs/heads/main >actual.main && + test_cmp expect.main actual.main +' + +test_expect_success '"--force-if-includes" should allow forced update after a rebase ("pull --rebase")' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + ( + cd src && + git switch branch && + test_commit I && + git switch main && + test_commit J && + git pull --rebase origin main && + git push --force-if-includes --force-with-lease="main" + ) +' + +test_expect_success '"--force-if-includes" should allow forced update after a rebase ("pull --rebase", local rebase)' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + ( + cd src && + git switch branch && + test_commit I && + git switch main && + test_commit J && + git pull --rebase origin main && + git rebase --onto HEAD~4 HEAD~1 && + git push --force-if-includes --force-with-lease="main" + ) +' + +test_expect_success '"--force-if-includes" should allow deletes' ' + setup_src_dup_dst && + test_when_finished "rm -fr dst src dup" && + ( + cd src && + git switch branch && + git pull --rebase origin branch && + git push --force-if-includes --force-with-lease="branch" origin :branch + ) +' + test_done diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh index 030331f1c5..bba768f5de 100755 --- a/t/t5534-push-signed.sh +++ b/t/t5534-push-signed.sh @@ -2,6 +2,9 @@ test_description='signed push' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh @@ -9,11 +12,11 @@ prepare_dst () { rm -fr dst && test_create_repo dst && - git push dst master:noop master:ff master:noff + git push dst main:noop main:ff main:noff } test_expect_success setup ' - # master, ff and noff branches pointing at the same commit + # main, ff and noff branches pointing at the same commit test_tick && git commit --allow-empty -m initial && @@ -273,4 +276,26 @@ test_expect_success GPGSM 'fail without key and heed user.signingkey x509' ' test_cmp expect dst/push-cert-status ' +test_expect_success GPG 'failed atomic push does not execute GPG' ' + prepare_dst && + git -C dst config receive.certnonceseed sekrit && + write_script gpg <<-EOF && + # should check atomic push locally before running GPG. + exit 1 + EOF + test_must_fail env PATH="$TRASH_DIRECTORY:$PATH" git push \ + --signed --atomic --porcelain \ + dst noop ff noff >out 2>err && + + test_i18ngrep ! "gpg failed to sign" err && + cat >expect <<-EOF && + To dst + = refs/heads/noop:refs/heads/noop [up to date] + ! refs/heads/ff:refs/heads/ff [rejected] (atomic push failed) + ! refs/heads/noff:refs/heads/noff [rejected] (non-fast-forward) + Done + EOF + test_cmp expect out +' + test_done diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh index a55202d2d3..11d5ea54a9 100755 --- a/t/t5537-fetch-shallow.sh +++ b/t/t5537-fetch-shallow.sh @@ -2,6 +2,9 @@ test_description='fetch/clone from a shallow clone' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh commit() { @@ -49,7 +52,7 @@ test_expect_success 'fetch from shallow clone' ' cd shallow2 && git fetch && git fsck && - git log --format=%s origin/master >actual && + git log --format=%s origin/main >actual && test_write_lines 5 4 3 >expect && test_cmp expect actual ) @@ -64,7 +67,7 @@ test_expect_success 'fetch --depth from shallow clone' ' cd shallow2 && git fetch --depth=2 && git fsck && - git log --format=%s origin/master >actual && + git log --format=%s origin/main >actual && test_write_lines 6 5 >expect && test_cmp expect actual ) @@ -75,7 +78,7 @@ test_expect_success 'fetch --unshallow from shallow clone' ' cd shallow2 && git fetch --unshallow && git fsck && - git log --format=%s origin/master >actual && + git log --format=%s origin/main >actual && test_write_lines 6 5 4 3 >expect && test_cmp expect actual ) @@ -89,7 +92,7 @@ test_expect_success 'fetch --unshallow from a full clone' ' test_write_lines 4 3 >expect && test_cmp expect actual && git -c fetch.writeCommitGraph fetch --unshallow && - git log origin/master --format=%s >actual && + git log origin/main --format=%s >actual && test_write_lines 4 3 2 1 >expect && test_cmp expect actual ) @@ -104,9 +107,9 @@ test_expect_success 'fetch something upstream has but hidden by clients shallow git commit -m add-1-back && ( cd shallow2 && - git fetch ../.git +refs/heads/master:refs/remotes/top/master && + git fetch ../.git +refs/heads/main:refs/remotes/top/main && git fsck && - git log --format=%s top/master >actual && + git log --format=%s top/main >actual && test_write_lines add-1-back 4 3 >expect && test_cmp expect actual ) && @@ -135,7 +138,7 @@ test_expect_success 'fetch that requires changes in .git/shallow is filtered' ' test_expect_success 'fetch --update-shallow' ' ( cd shallow && - git checkout master && + git checkout main && commit 7 && git tag -m foo heavy-tag HEAD^ && git tag light-tag HEAD^:tracked @@ -146,13 +149,13 @@ test_expect_success 'fetch --update-shallow' ' git fsck && git for-each-ref --sort=refname --format="%(refname)" >actual.refs && cat <<-\EOF >expect.refs && - refs/remotes/shallow/master + refs/remotes/shallow/main refs/remotes/shallow/no-shallow refs/tags/heavy-tag refs/tags/light-tag EOF test_cmp expect.refs actual.refs && - git log --format=%s shallow/master >actual && + git log --format=%s shallow/main >actual && test_write_lines 7 6 5 4 3 >expect && test_cmp expect actual ) @@ -161,7 +164,7 @@ test_expect_success 'fetch --update-shallow' ' test_expect_success 'fetch --update-shallow (with fetch.writeCommitGraph)' ' ( cd shallow && - git checkout master && + git checkout main && commit 8 && git tag -m foo heavy-tag-for-graph HEAD^ && git tag light-tag-for-graph HEAD^:tracked @@ -173,7 +176,7 @@ test_expect_success 'fetch --update-shallow (with fetch.writeCommitGraph)' ' git fsck && git for-each-ref --sort=refname --format="%(refname)" >actual.refs && cat <<-EOF >expect.refs && - refs/remotes/shallow/master + refs/remotes/shallow/main refs/remotes/shallow/no-shallow refs/tags/heavy-tag refs/tags/heavy-tag-for-graph @@ -181,7 +184,7 @@ test_expect_success 'fetch --update-shallow (with fetch.writeCommitGraph)' ' refs/tags/light-tag-for-graph EOF test_cmp expect.refs actual.refs && - git log --format=%s shallow/master >actual && + git log --format=%s shallow/main >actual && test_write_lines 8 7 6 5 4 3 >expect && test_cmp expect actual ) @@ -206,7 +209,7 @@ test_expect_success '.git/shallow is edited by repack' ' test_commit -C shallow-server E && test_commit -C shallow-server D && d="$(git -C shallow-server rev-parse --verify D^0)" && - git -C shallow-server checkout master && + git -C shallow-server checkout main && git clone --depth=1 --no-tags --no-single-branch \ "file://$PWD/shallow-server" shallow-client && @@ -244,7 +247,7 @@ test_expect_success 'shallow fetches check connectivity before writing shallow f git -C "$REPO" config protocol.version 2 && git -C client config protocol.version 2 && - git -C client fetch --depth=2 "$HTTPD_URL/one_time_perl/repo" master:a_branch && + git -C client fetch --depth=2 "$HTTPD_URL/one_time_perl/repo" main:a_branch && # Craft a situation in which the server sends back an unshallow request # with an empty packfile. This is done by refetching with a shorter @@ -256,7 +259,7 @@ test_expect_success 'shallow fetches check connectivity before writing shallow f >"$HTTPD_ROOT_PATH/one-time-perl" && test_must_fail env GIT_TEST_SIDEBAND_ALL=0 git -C client \ fetch --depth=1 "$HTTPD_URL/one_time_perl/repo" \ - master:a_branch && + main:a_branch && # Ensure that the one-time-perl script was used. ! test -e "$HTTPD_ROOT_PATH/one-time-perl" && diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh index ecbf84d21c..e91fcc173e 100755 --- a/t/t5538-push-shallow.sh +++ b/t/t5538-push-shallow.sh @@ -2,6 +2,9 @@ test_description='push from/to a shallow clone' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh commit() { @@ -44,9 +47,9 @@ test_expect_success 'push from shallow clone' ' ( cd shallow && commit 5 && - git push ../.git +master:refs/remotes/shallow/master + git push ../.git +main:refs/remotes/shallow/main ) && - git log --format=%s shallow/master >actual && + git log --format=%s shallow/main >actual && git fsck && cat <<EOF >expect && 5 @@ -61,10 +64,10 @@ EOF test_expect_success 'push from shallow clone, with grafted roots' ' ( cd shallow2 && - test_must_fail git push ../.git +master:refs/remotes/shallow2/master 2>err && - grep "shallow2/master.*shallow update not allowed" err + test_must_fail git push ../.git +main:refs/remotes/shallow2/main 2>err && + grep "shallow2/main.*shallow update not allowed" err ) && - test_must_fail git rev-parse shallow2/master && + test_must_fail git rev-parse shallow2/main && git fsck ' @@ -72,9 +75,9 @@ test_expect_success 'add new shallow root with receive.updateshallow on' ' test_config receive.shallowupdate true && ( cd shallow2 && - git push ../.git +master:refs/remotes/shallow2/master + git push ../.git +main:refs/remotes/shallow2/main ) && - git log --format=%s shallow2/master >actual && + git log --format=%s shallow2/main >actual && git fsck && cat <<EOF >expect && c @@ -87,12 +90,12 @@ test_expect_success 'push from shallow to shallow' ' ( cd shallow && git --git-dir=../shallow2/.git config receive.shallowupdate true && - git push ../shallow2/.git +master:refs/remotes/shallow/master && + git push ../shallow2/.git +main:refs/remotes/shallow/main && git --git-dir=../shallow2/.git config receive.shallowupdate false ) && ( cd shallow2 && - git log --format=%s shallow/master >actual && + git log --format=%s shallow/main >actual && git fsck && cat <<EOF >expect && 5 @@ -106,10 +109,10 @@ EOF test_expect_success 'push from full to shallow' ' ! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) && commit 1 && - git push shallow2/.git +master:refs/remotes/top/master && + git push shallow2/.git +main:refs/remotes/top/main && ( cd shallow2 && - git log --format=%s top/master >actual && + git log --format=%s top/main >actual && git fsck && cat <<EOF >expect && 1 diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh index 82aa99ae87..3ea75d34ca 100755 --- a/t/t5539-fetch-http-shallow.sh +++ b/t/t5539-fetch-http-shallow.sh @@ -2,6 +2,9 @@ test_description='fetch/clone from a shallow clone over http' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -32,7 +35,7 @@ test_expect_success 'clone http repository' ' ( cd clone && git fsck && - git log --format=%s origin/master >actual && + git log --format=%s origin/main >actual && cat <<EOF >expect && 7 6 @@ -60,9 +63,9 @@ test_expect_success 'no shallow lines after receiving ACK ready' ' refs/heads/unrelated$i:refs/heads/unrelated$i || exit 1 done && - git checkout master && + git checkout main && test_commit new && - git push "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" master + git push "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" main ) && ( cd clone && @@ -95,7 +98,7 @@ test_expect_success 'clone shallow since ...' ' test_expect_success 'fetch shallow since ...' ' git -C shallow11 fetch --shallow-since "200000000 +0700" origin && - git -C shallow11 log --pretty=tformat:%s origin/master >actual && + git -C shallow11 log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && three two @@ -120,7 +123,7 @@ test_expect_success 'shallow clone exclude tag two' ' test_expect_success 'fetch exclude tag one' ' git -C shallow12 fetch --shallow-exclude one origin && - git -C shallow12 log --pretty=tformat:%s origin/master >actual && + git -C shallow12 log --pretty=tformat:%s origin/main >actual && test_write_lines three two >expected && test_cmp expected actual ' @@ -136,12 +139,12 @@ test_expect_success 'fetching deepen' ' git clone --depth 1 $HTTPD_URL/smart/shallow-deepen.git deepen && mv "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" .git && test_commit four && - git -C deepen log --pretty=tformat:%s master >actual && + git -C deepen log --pretty=tformat:%s main >actual && echo three >expected && test_cmp expected actual && mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" && git -C deepen fetch --deepen=1 && - git -C deepen log --pretty=tformat:%s origin/master >actual && + git -C deepen log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && four three diff --git a/t/t5540-http-push-webdav.sh b/t/t5540-http-push-webdav.sh index 450321fddb..8b68bb38a4 100755 --- a/t/t5540-http-push-webdav.sh +++ b/t/t5540-http-push-webdav.sh @@ -7,6 +7,9 @@ test_description='test WebDAV http-push This test runs various sanity checks on http-push.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if git http-push > /dev/null 2>&1 || [ $? -eq 128 ] @@ -71,7 +74,7 @@ test_expect_success 'push already up-to-date' ' test_expect_success 'push to remote repository with unpacked refs' ' (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && rm packed-refs && - git update-ref refs/heads/master $ORIG_HEAD && + git update-ref refs/heads/main $ORIG_HEAD && git --bare update-server-info) && git push && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && @@ -91,7 +94,7 @@ test_expect_success 'http-push fetches unpacked objects' ' git remote rm origin && git reflog expire --expire=0 --all && git prune && - git push -f -v $HTTPD_URL/dumb/test_repo_unpacked.git master) + git push -f -v $HTTPD_URL/dumb/test_repo_unpacked.git main) ' test_expect_success 'http-push fetches packed objects' ' @@ -111,7 +114,7 @@ test_expect_success 'http-push fetches packed objects' ' git remote remove origin && git reflog expire --expire=0 --all && git prune && - git push -f -v $HTTPD_URL/dumb/test_repo_packed.git master) + git push -f -v $HTTPD_URL/dumb/test_repo_packed.git main) ' test_expect_success 'create and delete remote branch' ' @@ -163,7 +166,7 @@ test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' ' ' test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \ - "$ROOT_PATH"/test_repo_clone master + "$ROOT_PATH"/test_repo_clone main test_expect_success 'push to password-protected repository (user in URL)' ' test_commit pw-user && diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 187454f5dd..c024fa2818 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -4,6 +4,9 @@ # test_description='test smart pushing over http via http-backend' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh ROOT_PATH="$PWD" @@ -115,7 +118,7 @@ test_expect_success 'rejected update prints status' ' git commit -m dev2 && test_must_fail git push origin dev2 2>act && sed -e "/^remote: /s/ *$//" <act >cmp && - test_i18ncmp exp cmp + test_cmp exp cmp ' rm -f "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update" @@ -142,23 +145,23 @@ test_expect_success 'used receive-pack service' ' ' test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \ - "$ROOT_PATH"/test_repo_clone master success + "$ROOT_PATH"/test_repo_clone main success test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper' ' # create a dissimilarly-named remote ref so that git is unable to match the # two refs (viz. local, remote) unless an explicit refspec is provided. - git push origin master:retsam && + git push origin main:niam && echo "change changed" > path2 && git commit -a -m path2 --amend && - # push master too; this ensures there is at least one '"'push'"' command to + # push main too; this ensures there is at least one '"'push'"' command to # the remote helper and triggers interaction with the helper. - test_must_fail git push -v origin +master master:retsam >output 2>&1' + test_must_fail git push -v origin +main main:niam >output 2>&1' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: remote output' ' - grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *master -> master (forced update)$" output && - grep "^ ! \[rejected\] *master -> retsam (non-fast-forward)$" output + grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *main -> main (forced update)$" output && + grep "^ ! \[rejected\] *main -> niam (non-fast-forward)$" output ' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: our output' ' @@ -167,7 +170,7 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he ' test_expect_success 'push (chunked)' ' - git checkout master && + git checkout main && test_commit commit path3 && HEAD=$(git rev-parse --verify HEAD) && test_config http.postbuffer 4 && @@ -177,9 +180,9 @@ test_expect_success 'push (chunked)' ' test $HEAD = $(git rev-parse --verify HEAD)) ' -## References of remote: atomic1(1) master(2) collateral(2) other(2) -## References of local : atomic2(2) master(1) collateral(3) other(2) collateral1(3) atomic(1) -## Atomic push : master(1) collateral(3) atomic(1) +## References of remote: atomic1(1) main(2) collateral(2) other(2) +## References of local : atomic2(2) main(1) collateral(3) other(2) collateral1(3) atomic(1) +## Atomic push : main(1) collateral(3) atomic(1) test_expect_success 'push --atomic also prevents branch creation, reports collateral' ' # Setup upstream repo - empty for now d=$HTTPD_DOCUMENT_ROOT_PATH/atomic-branches.git && @@ -192,15 +195,15 @@ test_expect_success 'push --atomic also prevents branch creation, reports collat test_commit atomic2 && git branch collateral && git branch other && - git push "$up" atomic1 master collateral other && + git push "$up" atomic1 main collateral other && git tag -d atomic1 && # collateral is a valid push, but should be failed by atomic push git checkout collateral && test_commit collateral1 && - # Make master incompatible with upstream to provoke atomic - git checkout master && + # Make main incompatible with upstream to provoke atomic + git checkout main && git reset --hard HEAD^ && # Add a new branch which should be failed by atomic push. This is a @@ -208,7 +211,7 @@ test_expect_success 'push --atomic also prevents branch creation, reports collat git branch atomic && # --atomic should cause entire push to be rejected - test_must_fail git push --atomic "$up" master atomic collateral 2>output && + test_must_fail git push --atomic "$up" main atomic collateral 2>output && # the new branch should not have been created upstream test_must_fail git -C "$d" show-ref --verify refs/heads/atomic && @@ -216,15 +219,15 @@ test_expect_success 'push --atomic also prevents branch creation, reports collat # upstream should still reflect atomic2, the last thing we pushed # successfully git rev-parse atomic2 >expected && - # on master... - git -C "$d" rev-parse refs/heads/master >actual && + # on main... + git -C "$d" rev-parse refs/heads/main >actual && test_cmp expected actual && # ...and collateral. git -C "$d" rev-parse refs/heads/collateral >actual && test_cmp expected actual && # the failed refs should be indicated to the user - grep "^ ! .*rejected.* master -> master" output && + grep "^ ! .*rejected.* main -> main" output && # the collateral failure refs should be indicated to the user grep "^ ! .*rejected.* atomic -> atomic .*atomic push failed" output && @@ -472,9 +475,9 @@ test_expect_success 'clone/fetch scrubs password from reflogs' ' test_commit prepare-for-force-fetch && git switch -c away && git fetch "$HTTPD_URL_USER_PASS/smart/test_repo.git" \ - +master:master && + +main:main && # should have been scrubbed down to vanilla URL - git log -g master >reflog && + git log -g main >reflog && grep "$HTTPD_URL" reflog && ! grep "$HTTPD_URL_USER_PASS" reflog ' @@ -498,7 +501,7 @@ test_expect_success 'colorize errors/hints' ' cd "$ROOT_PATH"/test_repo_clone && test_must_fail git -c color.transport=always -c color.advice=always \ -c color.push=always \ - push origin origin/master^:master 2>act && + push origin origin/main^:main 2>act && test_decode_color <act >decoded && test_i18ngrep "<RED>.*rejected.*<RESET>" decoded && test_i18ngrep "<RED>error: failed to push some refs" decoded && diff --git a/t/t5542-push-http-shallow.sh b/t/t5542-push-http-shallow.sh index ddc1db722d..c2cc83182f 100755 --- a/t/t5542-push-http-shallow.sh +++ b/t/t5542-push-http-shallow.sh @@ -2,6 +2,9 @@ test_description='push from/to a shallow clone over http' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -51,12 +54,12 @@ test_expect_success 'push to shallow repo via http' ' ( cd full && commit 9 && - git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master + git push $HTTPD_URL/smart/repo.git +main:refs/remotes/top/main ) && ( cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && git fsck && - git log --format=%s top/master >actual && + git log --format=%s top/main >actual && cat <<EOF >expect && 9 4 @@ -74,11 +77,11 @@ test_expect_success 'push from shallow repo via http' ' git config http.receivepack true ) && commit 10 && - git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master && + git push $HTTPD_URL/smart/repo.git +main:refs/remotes/top/main && ( cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && git fsck && - git log --format=%s top/master >actual && + git log --format=%s top/main >actual && cat <<EOF >expect && 10 4 diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh index 620c30d58f..bfee461861 100755 --- a/t/t5543-atomic-push.sh +++ b/t/t5543-atomic-push.sh @@ -2,6 +2,9 @@ test_description='pushing to a repository using the atomic push option' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh mk_repo_pair () { @@ -40,9 +43,9 @@ test_expect_success 'atomic push works for a single branch' ' test_commit one && git push --mirror up && test_commit two && - git push --atomic up master + git push --atomic up main ) && - test_refs master master + test_refs main main ' test_expect_success 'atomic push works for two branches' ' @@ -55,9 +58,9 @@ test_expect_success 'atomic push works for two branches' ' test_commit two && git checkout second && test_commit three && - git push --atomic up master second + git push --atomic up main second ) && - test_refs master master && + test_refs main main && test_refs second second ' @@ -70,7 +73,7 @@ test_expect_success 'atomic push works in combination with --mirror' ' test_commit two && git push --atomic --mirror up ) && - test_refs master master && + test_refs main main && test_refs second second ' @@ -79,7 +82,7 @@ test_expect_success 'atomic push works in combination with --force' ' ( cd workbench && test_commit one && - git branch second master && + git branch second main && test_commit two_a && git checkout second && test_commit two_b && @@ -87,36 +90,36 @@ test_expect_success 'atomic push works in combination with --force' ' test_commit four && git push --mirror up && # The actual test is below - git checkout master && + git checkout main && test_commit three_a && git checkout second && git reset --hard HEAD^ && - git push --force --atomic up master second + git push --force --atomic up main second ) && - test_refs master master && + test_refs main main && test_refs second second ' -# set up two branches where master can be pushed but second can not +# set up two branches where main can be pushed but second can not # (non-fast-forward). Since second can not be pushed the whole operation -# will fail and leave master untouched. +# will fail and leave main untouched. test_expect_success 'atomic push fails if one branch fails' ' mk_repo_pair && ( cd workbench && test_commit one && - git checkout -b second master && + git checkout -b second main && test_commit two && test_commit three && test_commit four && git push --mirror up && git reset --hard HEAD~2 && test_commit five && - git checkout master && + git checkout main && test_commit six && test_must_fail git push --atomic --all up ) && - test_refs master HEAD@{7} && + test_refs main HEAD@{7} && test_refs second HEAD@{4} ' @@ -126,7 +129,7 @@ test_expect_success 'atomic push fails if one tag fails remotely' ' ( cd workbench && test_commit one && - git checkout -b second master && + git checkout -b second main && test_commit two && git push --mirror up ) && @@ -139,14 +142,14 @@ test_expect_success 'atomic push fails if one tag fails remotely' ' # see if we can now push both branches. ( cd workbench && - git checkout master && + git checkout main && test_commit three && git checkout second && test_commit four && git tag test_tag && - test_must_fail git push --tags --atomic up master second + test_must_fail git push --tags --atomic up main second ) && - test_refs master HEAD@{3} && + test_refs main HEAD@{3} && test_refs second HEAD@{1} ' @@ -155,7 +158,7 @@ test_expect_success 'atomic push obeys update hook preventing a branch to be pus ( cd workbench && test_commit one && - git checkout -b second master && + git checkout -b second main && test_commit two && git push --mirror up ) && @@ -165,19 +168,19 @@ test_expect_success 'atomic push obeys update hook preventing a branch to be pus HOOK="$HOOKDIR/update" && mkdir -p "$HOOKDIR" && write_script "$HOOK" <<-\EOF - # only allow update to master from now on - test "$1" = "refs/heads/master" + # only allow update to main from now on + test "$1" = "refs/heads/main" EOF ) && ( cd workbench && - git checkout master && + git checkout main && test_commit three && git checkout second && test_commit four && - test_must_fail git push --atomic up master second + test_must_fail git push --atomic up main second ) && - test_refs master HEAD@{3} && + test_refs main HEAD@{3} && test_refs second HEAD@{1} ' @@ -192,21 +195,21 @@ test_expect_success 'atomic push is not advertised if configured' ' test_commit one && git push --mirror up && test_commit two && - test_must_fail git push --atomic up master + test_must_fail git push --atomic up main ) && - test_refs master HEAD@{1} + test_refs main HEAD@{1} ' -# References in upstream : master(1) one(1) foo(1) -# References in workbench: master(2) foo(1) two(2) bar(2) -# Atomic push : master(2) two(2) bar(2) +# References in upstream : main(1) one(1) foo(1) +# References in workbench: main(2) foo(1) two(2) bar(2) +# Atomic push : main(2) two(2) bar(2) test_expect_success 'atomic push reports (reject by update hook)' ' mk_repo_pair && ( cd workbench && test_commit one && git branch foo && - git push up master one foo && + git push up main one foo && git tag -d one ) && ( @@ -228,19 +231,19 @@ test_expect_success 'atomic push reports (reject by update hook)' ' git branch bar ) && test_must_fail git -C workbench \ - push --atomic up master two bar >out 2>&1 && + push --atomic up main two bar >out 2>&1 && fmt_status_report <out >actual && cat >expect <<-EOF && To ../upstream - ! [remote rejected] master -> master (atomic push failure) + ! [remote rejected] main -> main (atomic push failure) ! [remote rejected] two -> two (atomic push failure) ! [remote rejected] bar -> bar (hook declined) EOF test_cmp expect actual ' -# References in upstream : master(1) one(1) foo(1) -# References in workbench: master(2) foo(1) two(2) bar(2) +# References in upstream : main(1) one(1) foo(1) +# References in workbench: main(2) foo(1) two(2) bar(2) test_expect_success 'atomic push reports (mirror, but reject by update hook)' ' ( cd workbench && @@ -252,7 +255,7 @@ test_expect_success 'atomic push reports (mirror, but reject by update hook)' ' fmt_status_report <out >actual && cat >expect <<-EOF && To ../upstream - ! [remote rejected] master -> master (atomic push failure) + ! [remote rejected] main -> main (atomic push failure) ! [remote rejected] one (atomic push failure) ! [remote rejected] bar -> bar (hook declined) ! [remote rejected] two -> two (atomic push failure) @@ -260,21 +263,21 @@ test_expect_success 'atomic push reports (mirror, but reject by update hook)' ' test_cmp expect actual ' -# References in upstream : master(2) one(1) foo(1) -# References in workbench: master(1) foo(1) two(2) bar(2) +# References in upstream : main(2) one(1) foo(1) +# References in workbench: main(1) foo(1) two(2) bar(2) test_expect_success 'atomic push reports (reject by non-ff)' ' rm upstream/.git/hooks/update && ( cd workbench && - git push up master && + git push up main && git reset --hard HEAD^ ) && test_must_fail git -C workbench \ - push --atomic up master foo bar >out 2>&1 && + push --atomic up main foo bar >out 2>&1 && fmt_status_report <out >actual && cat >expect <<-EOF && To ../upstream - ! [rejected] master -> master (non-fast-forward) + ! [rejected] main -> main (non-fast-forward) ! [rejected] bar -> bar (atomic push failed) EOF test_cmp expect actual diff --git a/t/t5544-pack-objects-hook.sh b/t/t5544-pack-objects-hook.sh index 4357af1525..dd5f44d986 100755 --- a/t/t5544-pack-objects-hook.sh +++ b/t/t5544-pack-objects-hook.sh @@ -59,4 +59,14 @@ test_expect_success 'hook does not run from repo config' ' test_path_is_missing .git/hook.stdout ' +test_expect_success 'hook works with partial clone' ' + clear_hook_results && + test_config_global uploadpack.packObjectsHook ./hook && + test_config_global uploadpack.allowFilter true && + git clone --bare --no-local --filter=blob:none . dst.git && + git -C dst.git rev-list --objects --missing=allow-any --no-object-names --all >objects && + git -C dst.git cat-file --batch-check="%(objecttype)" <objects >types && + ! grep blob types +' + test_done diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh index 38e6f7340e..58c7add7ee 100755 --- a/t/t5545-push-options.sh +++ b/t/t5545-push-options.sh @@ -2,6 +2,9 @@ test_description='pushing to a repository using push options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh mk_repo_pair () { @@ -63,9 +66,9 @@ test_expect_success 'one push option works for a single branch' ' test_commit one && git push --mirror up && test_commit two && - git push --push-option=asdf up master + git push --push-option=asdf up main ) && - test_refs master master && + test_refs main main && echo "asdf" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -79,9 +82,9 @@ test_expect_success 'push option denied by remote' ' test_commit one && git push --mirror up && test_commit two && - test_must_fail git push --push-option=asdf up master + test_must_fail git push --push-option=asdf up main ) && - test_refs master HEAD@{1} + test_refs main HEAD@{1} ' test_expect_success 'two push options work' ' @@ -92,9 +95,9 @@ test_expect_success 'two push options work' ' test_commit one && git push --mirror up && test_commit two && - git push --push-option=asdf --push-option="more structured text" up master + git push --push-option=asdf --push-option="more structured text" up main ) && - test_refs master master && + test_refs main main && printf "asdf\nmore structured text\n" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -123,14 +126,14 @@ test_expect_success 'push options and submodules' ' git -C parent push \ --push-option=asdf --push-option="more structured text" \ - --recurse-submodules=on-demand up master && + --recurse-submodules=on-demand up main && - git -C upstream rev-parse --verify master >expect && - git -C parent/workbench rev-parse --verify master >actual && + git -C upstream rev-parse --verify main >expect && + git -C parent/workbench rev-parse --verify main >actual && test_cmp expect actual && - git -C parent_upstream rev-parse --verify master >expect && - git -C parent rev-parse --verify master >actual && + git -C parent_upstream rev-parse --verify main >expect && + git -C parent rev-parse --verify main >actual && test_cmp expect actual && printf "asdf\nmore structured text\n" >expect && @@ -148,9 +151,9 @@ test_expect_success 'default push option' ' test_commit one && git push --mirror up && test_commit two && - git -c push.pushOption=default push up master + git -c push.pushOption=default push up main ) && - test_refs master master && + test_refs main main && echo "default" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -164,9 +167,9 @@ test_expect_success 'two default push options' ' test_commit one && git push --mirror up && test_commit two && - git -c push.pushOption=default1 -c push.pushOption=default2 push up master + git -c push.pushOption=default1 -c push.pushOption=default2 push up main ) && - test_refs master master && + test_refs main main && printf "default1\ndefault2\n" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -180,9 +183,9 @@ test_expect_success 'push option from command line overrides from-config push op test_commit one && git push --mirror up && test_commit two && - git -c push.pushOption=default push --push-option=manual up master + git -c push.pushOption=default push --push-option=manual up main ) && - test_refs master master && + test_refs main main && echo "manual" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -196,9 +199,9 @@ test_expect_success 'empty value of push.pushOption in config clears the list' ' test_commit one && git push --mirror up && test_commit two && - git -c push.pushOption=default1 -c push.pushOption= -c push.pushOption=default2 push up master + git -c push.pushOption=default1 -c push.pushOption= -c push.pushOption=default2 push up main ) && - test_refs master master && + test_refs main main && echo "default2" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options @@ -212,16 +215,16 @@ test_expect_success 'invalid push option in config' ' test_commit one && git push --mirror up && test_commit two && - test_must_fail git -c push.pushOption push up master + test_must_fail git -c push.pushOption push up main ) && - test_refs master HEAD@{1} + test_refs main HEAD@{1} ' test_expect_success 'push options keep quoted characters intact (direct)' ' mk_repo_pair && git -C upstream config receive.advertisePushOptions true && test_commit -C workbench one && - git -C workbench push --push-option="\"embedded quotes\"" up master && + git -C workbench push --push-option="\"embedded quotes\"" up main && echo "\"embedded quotes\"" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options ' @@ -244,28 +247,28 @@ mk_http_pair () { test_expect_success 'push option denied properly by http server' ' mk_http_pair false && test_commit -C test_http_clone one && - test_must_fail git -C test_http_clone push --push-option=asdf origin master 2>actual && + test_must_fail git -C test_http_clone push --push-option=asdf origin main 2>actual && test_i18ngrep "the receiving end does not support push options" actual && - git -C test_http_clone push origin master + git -C test_http_clone push origin main ' test_expect_success 'push options work properly across http' ' mk_http_pair true && test_commit -C test_http_clone one && - git -C test_http_clone push origin master && - git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify master >expect && - git -C test_http_clone rev-parse --verify master >actual && + git -C test_http_clone push origin main && + git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify main >expect && + git -C test_http_clone rev-parse --verify main >actual && test_cmp expect actual && test_commit -C test_http_clone two && - git -C test_http_clone push --push-option=asdf --push-option="more structured text" origin master && + git -C test_http_clone push --push-option=asdf --push-option="more structured text" origin main && printf "asdf\nmore structured text\n" >expect && test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/pre-receive.push_options && test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/post-receive.push_options && - git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify master >expect && - git -C test_http_clone rev-parse --verify master >actual && + git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify main >expect && + git -C test_http_clone rev-parse --verify main >actual && test_cmp expect actual ' @@ -273,7 +276,7 @@ test_expect_success 'push options keep quoted characters intact (http)' ' mk_http_pair true && test_commit -C test_http_clone one && - git -C test_http_clone push --push-option="\"embedded quotes\"" origin master && + git -C test_http_clone push --push-option="\"embedded quotes\"" origin main && echo "\"embedded quotes\"" >expect && test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/pre-receive.push_options ' diff --git a/t/t5548-push-porcelain.sh b/t/t5548-push-porcelain.sh index 1b19b3ef55..f11ff57e54 100755 --- a/t/t5548-push-porcelain.sh +++ b/t/t5548-push-porcelain.sh @@ -14,29 +14,28 @@ test_description='Test git push porcelain output' # NOTE: Never calling this function from a subshell since variable # assignments will disappear when subshell exits. create_commits_in () { - repo="$1" && - if ! parent=$(git -C "$repo" rev-parse HEAD^{} --) - then - parent= - fi && - T=$(git -C "$repo" write-tree) && + repo="$1" && test -d "$repo" || + error "Repository $repo does not exist." shift && while test $# -gt 0 do name=$1 && - test_tick && - if test -z "$parent" - then - oid=$(echo $name | git -C "$repo" commit-tree $T) - else - oid=$(echo $name | git -C "$repo" commit-tree -p $parent $T) - fi && - eval $name=$oid && - parent=$oid && - shift || - return 1 - done && - git -C "$repo" update-ref refs/heads/master $oid + shift && + test_commit -C "$repo" --no-tag "$name" && + eval $name=$(git -C "$repo" rev-parse HEAD) + done +} + +get_abbrev_oid () { + oid=$1 && + suffix=${oid#???????} && + oid=${oid%$suffix} && + if test -n "$oid" + then + echo "$oid" + else + echo "undefined-oid" + fi } # Format the output of git-push, git-show-ref and other commands to make a @@ -45,20 +44,19 @@ create_commits_in () { # of the output. make_user_friendly_and_stable_output () { sed \ - -e "s/ *\$//" \ - -e "s/ */ /g" \ - -e "s/ / /g" \ - -e "s/$A/<COMMIT-A>/g" \ - -e "s/$B/<COMMIT-B>/g" \ + -e "s/$(get_abbrev_oid $A)[0-9a-f]*/<COMMIT-A>/g" \ + -e "s/$(get_abbrev_oid $B)[0-9a-f]*/<COMMIT-B>/g" \ -e "s/$ZERO_OID/<ZERO-OID>/g" \ - -e "s/$(echo $A | cut -c1-7)[0-9a-f]*/<OID-A>/g" \ - -e "s/$(echo $B | cut -c1-7)[0-9a-f]*/<OID-B>/g" \ -e "s#To $URL_PREFIX/upstream.git#To <URL/of/upstream.git>#" } +format_and_save_expect () { + sed -e 's/^> //' -e 's/Z$//' >expect +} + setup_upstream_and_workbench () { - # Upstream after setup : master(B) foo(A) bar(A) baz(A) - # Workbench after setup : master(A) + # Upstream after setup : main(B) foo(A) bar(A) baz(A) + # Workbench after setup : main(A) test_expect_success "setup upstream repository and workbench" ' rm -rf upstream.git workbench && git init --bare upstream.git && @@ -70,9 +68,9 @@ setup_upstream_and_workbench () { # this fixed-width oid will be replaced with "<OID>". git config core.abbrev 7 && git remote add origin ../upstream.git && - git update-ref refs/heads/master $A && + git update-ref refs/heads/main $A && git push origin \ - $B:refs/heads/master \ + $B:refs/heads/main \ $A:refs/heads/foo \ $A:refs/heads/bar \ $A:refs/heads/baz @@ -94,31 +92,31 @@ run_git_push_porcelain_output_test() { ;; esac - # Refs of upstream : master(B) foo(A) bar(A) baz(A) - # Refs of workbench: master(A) baz(A) next(A) - # git-push : master(A) NULL (B) baz(A) next(A) + # Refs of upstream : main(B) foo(A) bar(A) baz(A) + # Refs of workbench: main(A) baz(A) next(A) + # git-push : main(A) NULL (B) baz(A) next(A) test_expect_success "porcelain output of successful git-push ($PROTOCOL)" ' ( cd workbench && - git update-ref refs/heads/master $A && + git update-ref refs/heads/main $A && git update-ref refs/heads/baz $A && git update-ref refs/heads/next $A && git push --porcelain --force origin \ - master \ + main \ :refs/heads/foo \ $B:bar \ baz \ next ) >out && make_user_friendly_and_stable_output <out >actual && - cat >expect <<-EOF && - To <URL/of/upstream.git> - = refs/heads/baz:refs/heads/baz [up to date] - <COMMIT-B>:refs/heads/bar <OID-A>..<OID-B> - - :refs/heads/foo [deleted] - + refs/heads/master:refs/heads/master <OID-B>...<OID-A> (forced update) - * refs/heads/next:refs/heads/next [new branch] - Done + format_and_save_expect <<-EOF && + > To <URL/of/upstream.git> + > = refs/heads/baz:refs/heads/baz [up to date] + > <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B> + > - :refs/heads/foo [deleted] + > + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update) + > * refs/heads/next:refs/heads/next [new branch] + > Done EOF test_cmp expect actual && @@ -127,33 +125,33 @@ run_git_push_porcelain_output_test() { cat >expect <<-EOF && <COMMIT-B> refs/heads/bar <COMMIT-A> refs/heads/baz - <COMMIT-A> refs/heads/master + <COMMIT-A> refs/heads/main <COMMIT-A> refs/heads/next EOF test_cmp expect actual ' - # Refs of upstream : master(A) bar(B) baz(A) next(A) - # Refs of workbench: master(B) bar(A) baz(A) next(A) - # git-push : master(B) bar(A) NULL next(A) + # Refs of upstream : main(A) bar(B) baz(A) next(A) + # Refs of workbench: main(B) bar(A) baz(A) next(A) + # git-push : main(B) bar(A) NULL next(A) test_expect_success "atomic push failed ($PROTOCOL)" ' ( cd workbench && - git update-ref refs/heads/master $B && + git update-ref refs/heads/main $B && git update-ref refs/heads/bar $A && test_must_fail git push --atomic --porcelain origin \ - master \ + main \ bar \ :baz \ next ) >out && make_user_friendly_and_stable_output <out >actual && - cat >expect <<-EOF && + format_and_save_expect <<-EOF && To <URL/of/upstream.git> - = refs/heads/next:refs/heads/next [up to date] - ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) - ! (delete):refs/heads/baz [rejected] (atomic push failed) - ! refs/heads/master:refs/heads/master [rejected] (atomic push failed) + > = refs/heads/next:refs/heads/next [up to date] + > ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) + > ! (delete):refs/heads/baz [rejected] (atomic push failed) + > ! refs/heads/main:refs/heads/main [rejected] (atomic push failed) Done EOF test_cmp expect actual && @@ -163,38 +161,39 @@ run_git_push_porcelain_output_test() { cat >expect <<-EOF && <COMMIT-B> refs/heads/bar <COMMIT-A> refs/heads/baz - <COMMIT-A> refs/heads/master + <COMMIT-A> refs/heads/main <COMMIT-A> refs/heads/next EOF test_cmp expect actual ' + test_expect_success "prepare pre-receive hook ($PROTOCOL)" ' write_script "$upstream/hooks/pre-receive" <<-EOF exit 1 EOF ' - # Refs of upstream : master(A) bar(B) baz(A) next(A) - # Refs of workbench: master(B) bar(A) baz(A) next(A) - # git-push : master(B) bar(A) NULL next(A) + # Refs of upstream : main(A) bar(B) baz(A) next(A) + # Refs of workbench: main(B) bar(A) baz(A) next(A) + # git-push : main(B) bar(A) NULL next(A) test_expect_success "pre-receive hook declined ($PROTOCOL)" ' ( cd workbench && - git update-ref refs/heads/master $B && + git update-ref refs/heads/main $B && git update-ref refs/heads/bar $A && test_must_fail git push --porcelain --force origin \ - master \ + main \ bar \ :baz \ next ) >out && make_user_friendly_and_stable_output <out >actual && - cat >expect <<-EOF && + format_and_save_expect <<-EOF && To <URL/of/upstream.git> - = refs/heads/next:refs/heads/next [up to date] - ! refs/heads/bar:refs/heads/bar [remote rejected] (pre-receive hook declined) - ! :refs/heads/baz [remote rejected] (pre-receive hook declined) - ! refs/heads/master:refs/heads/master [remote rejected] (pre-receive hook declined) + > = refs/heads/next:refs/heads/next [up to date] + > ! refs/heads/bar:refs/heads/bar [remote rejected] (pre-receive hook declined) + > ! :refs/heads/baz [remote rejected] (pre-receive hook declined) + > ! refs/heads/main:refs/heads/main [remote rejected] (pre-receive hook declined) Done EOF test_cmp expect actual && @@ -204,7 +203,7 @@ run_git_push_porcelain_output_test() { cat >expect <<-EOF && <COMMIT-B> refs/heads/bar <COMMIT-A> refs/heads/baz - <COMMIT-A> refs/heads/master + <COMMIT-A> refs/heads/main <COMMIT-A> refs/heads/next EOF test_cmp expect actual @@ -214,25 +213,25 @@ run_git_push_porcelain_output_test() { rm "$upstream/hooks/pre-receive" ' - # Refs of upstream : master(A) bar(B) baz(A) next(A) - # Refs of workbench: master(B) bar(A) baz(A) next(A) - # git-push : master(B) bar(A) NULL next(A) + # Refs of upstream : main(A) bar(B) baz(A) next(A) + # Refs of workbench: main(B) bar(A) baz(A) next(A) + # git-push : main(B) bar(A) NULL next(A) test_expect_success "non-fastforward push ($PROTOCOL)" ' ( cd workbench && test_must_fail git push --porcelain origin \ - master \ + main \ bar \ :baz \ next ) >out && make_user_friendly_and_stable_output <out >actual && - cat >expect <<-EOF && + format_and_save_expect <<-EOF && To <URL/of/upstream.git> - = refs/heads/next:refs/heads/next [up to date] - - :refs/heads/baz [deleted] - refs/heads/master:refs/heads/master <OID-A>..<OID-B> - ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) + > = refs/heads/next:refs/heads/next [up to date] + > - :refs/heads/baz [deleted] + > refs/heads/main:refs/heads/main <COMMIT-A>..<COMMIT-B> + > ! refs/heads/bar:refs/heads/bar [rejected] (non-fast-forward) Done EOF test_cmp expect actual && @@ -241,7 +240,7 @@ run_git_push_porcelain_output_test() { make_user_friendly_and_stable_output <out >actual && cat >expect <<-EOF && <COMMIT-B> refs/heads/bar - <COMMIT-B> refs/heads/master + <COMMIT-B> refs/heads/main <COMMIT-A> refs/heads/next EOF test_cmp expect actual diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index 483578b2d7..6d9142afc3 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test dumb fetching over http via static file' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -26,7 +29,7 @@ test_expect_success 'create http-accessible bare repository with loose objects' hooks/post-update ) && git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - git push public master:master + git push public main:main ' test_expect_success 'clone http repository' ' @@ -37,8 +40,8 @@ test_expect_success 'clone http repository' ' test_expect_success 'list refs from outside any repository' ' cat >expect <<-EOF && - $(git rev-parse master) HEAD - $(git rev-parse master) refs/heads/master + $(git rev-parse main) HEAD + $(git rev-parse main) refs/heads/main EOF nongit git ls-remote "$HTTPD_URL/dumb/repo.git" >actual && test_cmp expect actual @@ -181,8 +184,8 @@ test_expect_success 'fetch changes via manual http-fetch' ' HEAD=$(git rev-parse --verify HEAD) && (cd clone2 && - git http-fetch -a -w heads/master-new $HEAD $(git config remote.origin.url) && - git checkout master-new && + git http-fetch -a -w heads/main-new $HEAD $(git config remote.origin.url) && + git checkout main-new && test $HEAD = $(git rev-parse --verify HEAD)) && test_cmp file clone2/file ' @@ -192,19 +195,19 @@ test_expect_success 'manual http-fetch without -a works just as well' ' HEAD=$(git rev-parse --verify HEAD) && (cd clone3 && - git http-fetch -w heads/master-new $HEAD $(git config remote.origin.url) && - git checkout master-new && + git http-fetch -w heads/main-new $HEAD $(git config remote.origin.url) && + git checkout main-new && test $HEAD = $(git rev-parse --verify HEAD)) && test_cmp file clone3/file ' test_expect_success 'http remote detects correct HEAD' ' - git push public master:other && + git push public main:other && (cd clone && git remote set-head origin -d && git remote set-head origin -a && git symbolic-ref refs/remotes/origin/HEAD > output && - echo refs/remotes/origin/master > expect && + echo refs/remotes/origin/main > expect && test_cmp expect output ) ' @@ -224,7 +227,10 @@ test_expect_success 'http-fetch --packfile' ' git init packfileclient && p=$(cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git && ls objects/pack/pack-*.pack) && - git -C packfileclient http-fetch --packfile=$ARBITRARY "$HTTPD_URL"/dumb/repo_pack.git/$p >out && + git -C packfileclient http-fetch --packfile=$ARBITRARY \ + --index-pack-arg=index-pack --index-pack-arg=--stdin \ + --index-pack-arg=--keep \ + "$HTTPD_URL"/dumb/repo_pack.git/$p >out && grep "^keep.[0-9a-f]\{16,\}$" out && cut -c6- out >packhash && @@ -416,7 +422,7 @@ test_expect_success 'set up evil alternates scheme' ' evil=$HTTPD_DOCUMENT_ROOT_PATH/evil.git && git init --bare "$evil" && # do this by hand to avoid object existence check - printf "%s\\t%s\\n" $sha1 refs/heads/master >"$evil/info/refs" + printf "%s\\t%s\\n" $sha1 refs/heads/main >"$evil/info/refs" ' # Here we'll just redirect via HTTP. In a real-world attack these would be on diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index e40e9ed52f..4f87d90c5b 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test smart fetching over http via http-backend' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -18,7 +21,7 @@ test_expect_success 'create http-accessible bare repository' ' git --bare init ) && git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - git push public master:master + git push public main:main ' setup_askpass_helper @@ -238,9 +241,9 @@ test_expect_success 'invalid Content-Type rejected' ' test_expect_success 'create namespaced refs' ' test_commit namespaced && - git push public HEAD:refs/namespaces/ns/refs/heads/master && + git push public HEAD:refs/namespaces/ns/refs/heads/main && git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ - symbolic-ref refs/namespaces/ns/HEAD refs/namespaces/ns/refs/heads/master + symbolic-ref refs/namespaces/ns/HEAD refs/namespaces/ns/refs/heads/main ' test_expect_success 'smart clone respects namespace' ' @@ -271,7 +274,7 @@ test_expect_success 'cookies stored in http.cookiefile when http.savecookies set EOF git config http.cookiefile cookies.txt && git config http.savecookies true && - git ls-remote $HTTPD_URL/smart_cookies/repo.git master && + git ls-remote $HTTPD_URL/smart_cookies/repo.git main && # NEEDSWORK: If the overspecification of the expected result is reduced, we # might be able to run this test in all protocol versions. @@ -344,12 +347,12 @@ test_expect_success 'large fetch-pack requests can be sent using chunked encodin test_expect_success 'test allowreachablesha1inwant' ' test_when_finished "rm -rf test_reachable.git" && server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - master_sha=$(git -C "$server" rev-parse refs/heads/master) && + main_sha=$(git -C "$server" rev-parse refs/heads/main) && git -C "$server" config uploadpack.allowreachablesha1inwant 1 && git init --bare test_reachable.git && git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" && - git -C test_reachable.git fetch origin "$master_sha" + git -C test_reachable.git fetch origin "$main_sha" ' test_expect_success 'test allowreachablesha1inwant with unreachable' ' @@ -363,7 +366,7 @@ test_expect_success 'test allowreachablesha1inwant with unreachable' ' git push public :refs/heads/doomed && server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - master_sha=$(git -C "$server" rev-parse refs/heads/master) && + main_sha=$(git -C "$server" rev-parse refs/heads/main) && git -C "$server" config uploadpack.allowreachablesha1inwant 1 && git init --bare test_reachable.git && @@ -385,7 +388,7 @@ test_expect_success 'test allowanysha1inwant with unreachable' ' git push public :refs/heads/doomed && server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - master_sha=$(git -C "$server" rev-parse refs/heads/master) && + main_sha=$(git -C "$server" rev-parse refs/heads/main) && git -C "$server" config uploadpack.allowreachablesha1inwant 1 && git init --bare test_reachable.git && @@ -444,8 +447,8 @@ test_expect_success 'using fetch command in remote-curl updates refs' ' test_commit -C "$SERVER" bar && git -C client -c protocol.version=0 fetch && - git -C "$SERVER" rev-parse master >expect && - git -C client rev-parse origin/master >actual && + git -C "$SERVER" rev-parse main >expect && + git -C client rev-parse origin/main >actual && test_cmp expect actual ' @@ -514,4 +517,45 @@ test_expect_success 'server-side error detected' ' test_i18ngrep "server-side error" actual ' +test_expect_success 'http auth remembers successful credentials' ' + rm -f .git-credentials && + test_config credential.helper store && + + # the first request prompts the user... + set_askpass user@host pass@host && + git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null && + expect_askpass both user@host && + + # ...and the second one uses the stored value rather than + # prompting the user. + set_askpass bogus-user bogus-pass && + git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null && + expect_askpass none +' + +test_expect_success 'http auth forgets bogus credentials' ' + # seed credential store with bogus values. In real life, + # this would probably come from a password which worked + # for a previous request. + rm -f .git-credentials && + test_config credential.helper store && + { + echo "url=$HTTPD_URL" && + echo "username=bogus" && + echo "password=bogus" + } | git credential approve && + + # we expect this to use the bogus values and fail, never even + # prompting the user... + set_askpass user@host pass@host && + test_must_fail git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null && + expect_askpass none && + + # ...but now we should have forgotten the bad value, causing + # us to prompt the user again. + set_askpass user@host pass@host && + git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null && + expect_askpass both user@host +' + test_done diff --git a/t/t5552-skipping-fetch-negotiator.sh b/t/t5552-skipping-fetch-negotiator.sh index 156c704040..7b9fb4ff02 100755 --- a/t/t5552-skipping-fetch-negotiator.sh +++ b/t/t5552-skipping-fetch-negotiator.sh @@ -100,7 +100,7 @@ test_expect_success 'use ref advertisement to filter out commits' ' git -C server checkout --orphan anotherbranch && test_commit -C server to_fetch && - # The server advertising "c3" (as "refs/heads/master") means that we do + # The server advertising "c3" (as "refs/heads/main") means that we do # not need to send any ancestors of "c3", but we still need to send "c3" # itself. test_config -C client fetch.negotiationalgorithm skipping && diff --git a/t/t5553-set-upstream.sh b/t/t5553-set-upstream.sh index 7622981cbf..b1d614ce18 100755 --- a/t/t5553-set-upstream.sh +++ b/t/t5553-set-upstream.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='"git fetch/pull --set-upstream" basic tests.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_config () { @@ -32,9 +35,9 @@ test_expect_success 'setup bare parent fetch' ' git remote add upstream parent ' -test_expect_success 'setup commit on master and other fetch' ' +test_expect_success 'setup commit on main and other fetch' ' test_commit one && - git push upstream master && + git push upstream main && git checkout -b other && test_commit two && git push upstream other @@ -43,38 +46,38 @@ test_expect_success 'setup commit on master and other fetch' ' # tests for fetch --set-upstream test_expect_success 'fetch --set-upstream does not set upstream w/o branch' ' - clear_config master other && - git checkout master && + clear_config main other && + git checkout main && git fetch --set-upstream upstream && - check_config_missing master && + check_config_missing main && check_config_missing other ' -test_expect_success 'fetch --set-upstream upstream master sets branch master but not other' ' - clear_config master other && - git fetch --set-upstream upstream master && - check_config master upstream refs/heads/master && +test_expect_success 'fetch --set-upstream upstream main sets branch main but not other' ' + clear_config main other && + git fetch --set-upstream upstream main && + check_config main upstream refs/heads/main && check_config_missing other ' test_expect_success 'fetch --set-upstream upstream other sets branch other' ' - clear_config master other && + clear_config main other && git fetch --set-upstream upstream other && - check_config master upstream refs/heads/other && + check_config main upstream refs/heads/other && check_config_missing other ' -test_expect_success 'fetch --set-upstream master:other does not set the branch other2' ' +test_expect_success 'fetch --set-upstream main:other does not set the branch other2' ' clear_config other2 && - git fetch --set-upstream upstream master:other2 && + git fetch --set-upstream upstream main:other2 && check_config_missing other2 ' test_expect_success 'fetch --set-upstream http://nosuchdomain.example.com fails with invalid url' ' - # master explicitly not cleared, we check that it is not touched from previous value + # main explicitly not cleared, we check that it is not touched from previous value clear_config other other2 && test_must_fail git fetch --set-upstream http://nosuchdomain.example.com && - check_config master upstream refs/heads/other && + check_config main upstream refs/heads/other && check_config_missing other && check_config_missing other2 ' @@ -83,7 +86,7 @@ test_expect_success 'fetch --set-upstream with valid URL sets upstream to URL' ' clear_config other other2 && url="file://$PWD" && git fetch --set-upstream "$url" && - check_config master "$url" HEAD && + check_config main "$url" HEAD && check_config_missing other && check_config_missing other2 ' @@ -96,30 +99,30 @@ test_expect_success 'setup bare parent pull' ' git remote add upstream parent ' -test_expect_success 'setup commit on master and other pull' ' +test_expect_success 'setup commit on main and other pull' ' test_commit three && - git push --tags upstream master && + git push --tags upstream main && test_commit four && git push upstream other ' -test_expect_success 'pull --set-upstream upstream master sets branch master but not other' ' - clear_config master other && - git pull --set-upstream upstream master && - check_config master upstream refs/heads/master && +test_expect_success 'pull --set-upstream upstream main sets branch main but not other' ' + clear_config main other && + git pull --set-upstream upstream main && + check_config main upstream refs/heads/main && check_config_missing other ' -test_expect_success 'pull --set-upstream master:other2 does not set the branch other2' ' +test_expect_success 'pull --set-upstream main:other2 does not set the branch other2' ' clear_config other2 && - git pull --set-upstream upstream master:other2 && + git pull --set-upstream upstream main:other2 && check_config_missing other2 ' -test_expect_success 'pull --set-upstream upstream other sets branch master' ' - clear_config master other && +test_expect_success 'pull --set-upstream upstream other sets branch main' ' + clear_config main other && git pull --set-upstream upstream other && - check_config master upstream refs/heads/other && + check_config main upstream refs/heads/other && check_config_missing other ' @@ -130,47 +133,47 @@ test_expect_success 'pull --set-upstream upstream tag does not set the tag' ' ' test_expect_success 'pull --set-upstream http://nosuchdomain.example.com fails with invalid url' ' - # master explicitly not cleared, we check that it is not touched from previous value + # main explicitly not cleared, we check that it is not touched from previous value clear_config other other2 three && test_must_fail git pull --set-upstream http://nosuchdomain.example.com && - check_config master upstream refs/heads/other && + check_config main upstream refs/heads/other && check_config_missing other && check_config_missing other2 && check_config_missing three ' test_expect_success 'pull --set-upstream upstream HEAD sets branch HEAD' ' - clear_config master other && + clear_config main other && git pull --set-upstream upstream HEAD && - check_config master upstream HEAD && + check_config main upstream HEAD && git checkout other && git pull --set-upstream upstream HEAD && check_config other upstream HEAD ' test_expect_success 'pull --set-upstream upstream with more than one branch does nothing' ' - clear_config master three && - git pull --set-upstream upstream master three && - check_config_missing master && + clear_config main three && + git pull --set-upstream upstream main three && + check_config_missing main && check_config_missing three ' test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' ' - clear_config master other other2 && - git checkout master && + clear_config main other other2 && + git checkout main && url="file://$PWD" && git pull --set-upstream "$url" && - check_config master "$url" HEAD && + check_config main "$url" HEAD && check_config_missing other && check_config_missing other2 ' test_expect_success 'pull --set-upstream with valid URL and branch sets branch' ' - clear_config master other other2 && - git checkout master && + clear_config main other other2 && + git checkout main && url="file://$PWD" && - git pull --set-upstream "$url" master && - check_config master "$url" refs/heads/master && + git pull --set-upstream "$url" main && + check_config main "$url" refs/heads/main && check_config_missing other && check_config_missing other2 ' diff --git a/t/t5560-http-backend-noserver.sh b/t/t5560-http-backend-noserver.sh index 9fafcf1945..d30cf4f5b8 100755 --- a/t/t5560-http-backend-noserver.sh +++ b/t/t5560-http-backend-noserver.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test git-http-backend-noserver' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh HTTPD_DOCUMENT_ROOT_PATH="$TRASH_DIRECTORY" diff --git a/t/t5561-http-backend.sh b/t/t5561-http-backend.sh index 6eb0294978..9c57d84315 100755 --- a/t/t5561-http-backend.sh +++ b/t/t5561-http-backend.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test git-http-backend' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh @@ -39,9 +42,9 @@ POST() { grep '^[^#]' >exp <<EOF -### refs/heads/master +### refs/heads/main ### -GET /smart/repo.git/refs/heads/master HTTP/1.1 404 - +GET /smart/repo.git/refs/heads/main HTTP/1.1 404 - ### getanyfile default ### diff --git a/t/t556x_common b/t/t556x_common index 359fcfe32b..670fb89477 100755 --- a/t/t556x_common +++ b/t/t556x_common @@ -22,7 +22,7 @@ test_expect_success 'setup repository' ' : >objects/info/http-alternates ) && git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - git push public master:master && + git push public main:main && (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && git repack -a -d @@ -31,7 +31,7 @@ test_expect_success 'setup repository' ' echo other >file && git add file && git commit -m two && - git push public master:master && + git push public main:main && LOOSE_URL=$(find_file objects/??) && PACK_URL=$(find_file objects/pack/*.pack) && @@ -51,8 +51,8 @@ get_static_files() { SMART=smart GIT_HTTP_EXPORT_ALL=1 && export GIT_HTTP_EXPORT_ALL -test_expect_success 'direct refs/heads/master not found' ' - GET refs/heads/master "404 Not Found" +test_expect_success 'direct refs/heads/main not found' ' + GET refs/heads/main "404 Not Found" ' test_expect_success 'static file is ok' ' get_static_files "200 OK" diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index 34487bbb8c..82c31ab6cd 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test fetching over git protocol' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-git-daemon.sh @@ -26,7 +29,7 @@ test_expect_success 'create git-accessible bare repository' ' : >git-daemon-export-ok ) && git remote add public "$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo.git" && - git push public master:master + git push public main:main ' test_expect_success 'clone git repository' ' @@ -55,12 +58,12 @@ test_expect_success 'no-op fetch without "-v" is quiet' ' ' test_expect_success 'remote detects correct HEAD' ' - git push public master:other && + git push public main:other && (cd clone && git remote set-head -d origin && git remote set-head -a origin && git symbolic-ref refs/remotes/origin/HEAD > output && - echo refs/remotes/origin/master > expect && + echo refs/remotes/origin/main > expect && test_cmp expect output ) ' @@ -103,6 +106,11 @@ test_expect_success 'fetch notices corrupt idx' ' ) ' +test_expect_success 'client refuses to ask for repo with newline' ' + test_must_fail git clone "$GIT_DAEMON_URL/repo$LF.git" dst 2>stderr && + test_i18ngrep newline.is.forbidden stderr +' + test_remote_error() { do_export=YesPlease @@ -147,18 +155,18 @@ test_remote_error() } msg="access denied or repository not exported" -test_expect_success 'clone non-existent' "test_remote_error '$msg' clone nowhere.git " -test_expect_success 'push disabled' "test_remote_error '$msg' push repo.git master" -test_expect_success 'read access denied' "test_remote_error -x '$msg' fetch repo.git " -test_expect_success 'not exported' "test_remote_error -n '$msg' fetch repo.git " +test_expect_success 'clone non-existent' "test_remote_error '$msg' clone nowhere.git" +test_expect_success 'push disabled' "test_remote_error '$msg' push repo.git main" +test_expect_success 'read access denied' "test_remote_error -x '$msg' fetch repo.git" +test_expect_success 'not exported' "test_remote_error -n '$msg' fetch repo.git" stop_git_daemon start_git_daemon --informative-errors -test_expect_success 'clone non-existent' "test_remote_error 'no such repository' clone nowhere.git " -test_expect_success 'push disabled' "test_remote_error 'service not enabled' push repo.git master" -test_expect_success 'read access denied' "test_remote_error -x 'no such repository' fetch repo.git " -test_expect_success 'not exported' "test_remote_error -n 'repository not exported' fetch repo.git " +test_expect_success 'clone non-existent' "test_remote_error 'no such repository' clone nowhere.git" +test_expect_success 'push disabled' "test_remote_error 'service not enabled' push repo.git main" +test_expect_success 'read access denied' "test_remote_error -x 'no such repository' fetch repo.git" +test_expect_success 'not exported' "test_remote_error -n 'repository not exported' fetch repo.git" stop_git_daemon start_git_daemon --interpolated-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH/%H%D" @@ -192,10 +200,10 @@ test_expect_success FAKENC 'hostname interpolation works after LF-stripping' ' fake_nc "$GIT_DAEMON_HOST_PORT" <input >output && depacketize <output >output.raw && - # just pick out the value of master, which avoids any protocol + # just pick out the value of main, which avoids any protocol # particulars - perl -lne "print \$1 if m{^(\\S+) refs/heads/master}" <output.raw >actual && - git -C "$repo" rev-parse master >expect && + perl -lne "print \$1 if m{^(\\S+) refs/heads/main}" <output.raw >actual && + git -C "$repo" rev-parse main >expect && test_cmp expect actual ' diff --git a/t/t5571-pre-push-hook.sh b/t/t5571-pre-push-hook.sh index ac53d63869..ad8d5804f7 100755 --- a/t/t5571-pre-push-hook.sh +++ b/t/t5571-pre-push-hook.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='check pre-push hooks' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Setup hook that always succeeds @@ -48,11 +51,11 @@ EOF cat >expected <<EOF parent1 repo1 -refs/heads/master $COMMIT2 refs/heads/foreign $COMMIT1 +refs/heads/main $COMMIT2 refs/heads/foreign $COMMIT1 EOF test_expect_success 'push with hook' ' - git push parent1 master:foreign && + git push parent1 main:foreign && diff expected actual ' diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh index 1d75e3b12b..4f92a116e1 100755 --- a/t/t5572-pull-submodule.sh +++ b/t/t5572-pull-submodule.sh @@ -42,8 +42,11 @@ git_pull_noff () { $2 git pull --no-ff } -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" != ort +then + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch_func "git_pull_noff" test_expect_success 'pull --recurse-submodule setup' ' @@ -101,7 +104,12 @@ test_expect_success " --[no-]recurse-submodule and submodule.recurse" ' test_path_is_file super/sub/merge_strategy_4.t ' -test_expect_success 'recursive rebasing pull' ' +test_expect_success 'pull --rebase --recurse-submodules (remote superproject submodule changes, local submodule changes)' ' + # This tests the following scenario : + # - local submodule has new commits + # - local superproject does not have new commits + # - upstream superproject has new commits that change the submodule pointer + # change upstream test_commit -C child rebase_strategy && git -C parent submodule update --remote && @@ -116,7 +124,10 @@ test_expect_success 'recursive rebasing pull' ' test_path_is_file super/sub/local_stuff.t ' -test_expect_success 'pull rebase recursing fails with conflicts' ' +test_expect_success 'pull --rebase --recurse-submodules fails if both sides record submodule changes' ' + # This tests the following scenario : + # - local superproject has new commits that change the submodule pointer + # - upstream superproject has new commits that change the submodule pointer # local changes in submodule recorded in superproject: test_commit -C super/sub local_stuff_2 && @@ -136,6 +147,50 @@ test_expect_success 'pull rebase recursing fails with conflicts' ' test_i18ngrep "locally recorded submodule modifications" err ' +test_expect_success 'pull --rebase --recurse-submodules (no submodule changes, no fork-point)' ' + # This tests the following scenario : + # - local submodule does not have new commits + # - local superproject has new commits that *do not* change the submodule pointer + # - upstream superproject has new commits that *do not* change the submodule pointer + # - local superproject branch has no fork-point with its remote-tracking counter-part + + # create upstream superproject + test_create_repo submodule && + test_commit -C submodule first_in_sub && + + test_create_repo superprojet && + test_commit -C superprojet first_in_super && + git -C superprojet submodule add ../submodule && + git -C superprojet commit -m "add submodule" && + test_commit -C superprojet third_in_super && + + # clone superproject + git clone --recurse-submodules superprojet superclone && + + # add commits upstream + test_commit -C superprojet fourth_in_super && + + # create topic branch in clone, not based on any remote-tracking branch + git -C superclone checkout -b feat HEAD~1 && + test_commit -C superclone first_on_feat && + git -C superclone pull --rebase --recurse-submodules origin HEAD +' + +# NOTE: +# +# This test is particular because there is only a single commit in the upstream superproject +# 'parent' (which adds the submodule 'a-submodule'). The clone of the superproject +# ('child') hard-resets its branch to a new root commit with the same tree as the one +# from the upstream superproject, so that its branch has no merge-base with its +# remote-tracking counterpart, and then calls 'git pull --recurse-submodules --rebase'. +# The result is that the local branch is reset to the remote-tracking branch (as it was +# originally before the hard-reset). + +# The only commit in the range generated by 'submodule.c::submodule_touches_in_range' and +# passed to 'submodule.c::collect_changed_submodules' is the new (regenerated) initial commit, +# which adds the submodule. +# However, 'submodule_touches_in_range' does not error (even though this commit adds the submodule) +# because 'combine-diff.c::diff_tree_combined' returns early, as the initial commit has no parents. test_expect_success 'branch has no merge base with remote-tracking counterpart' ' rm -rf parent child && @@ -148,8 +203,8 @@ test_expect_success 'branch has no merge base with remote-tracking counterpart' git clone parent child && - # Reset master so that it has no merge base with - # refs/remotes/origin/master. + # Reset the current branch so that it has no merge base with + # the remote-tracking branch. OTHER=$(git -C child commit-tree -m bar \ $(git -C child rev-parse HEAD^{tree})) && git -C child reset --hard "$OTHER" && diff --git a/t/t5580-unc-paths.sh b/t/t5580-unc-paths.sh index cf768b3a27..cd803ae8bf 100755 --- a/t/t5580-unc-paths.sh +++ b/t/t5580-unc-paths.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='various Windows-only path tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if test_have_prereq CYGWIN @@ -53,7 +56,7 @@ test_expect_success fetch ' git init to-fetch && ( cd to-fetch && - git fetch "$UNCPATH" master + git fetch "$UNCPATH" main ) ' diff --git a/t/t5581-http-curl-verbose.sh b/t/t5581-http-curl-verbose.sh index 927aad0820..cded79c16b 100755 --- a/t/t5581-http-curl-verbose.sh +++ b/t/t5581-http-curl-verbose.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test GIT_CURL_VERBOSE' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -13,7 +16,7 @@ test_expect_success 'setup repository' ' git add file && git commit -m one && git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - git push public master:master + git push public main:main ' test_expect_success 'failure in git-upload-pack is shown' ' diff --git a/t/t5582-fetch-negative-refspec.sh b/t/t5582-fetch-negative-refspec.sh new file mode 100755 index 0000000000..e5d2e79ad3 --- /dev/null +++ b/t/t5582-fetch-negative-refspec.sh @@ -0,0 +1,286 @@ +#!/bin/sh +# Copyright (c) 2020, Jacob Keller. + +test_description='"git fetch" with negative refspecs. + +' + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh + +test_expect_success setup ' + echo >file original && + git add file && + git commit -a -m original +' + +test_expect_success "clone and setup child repos" ' + git clone . one && + ( + cd one && + echo >file updated by one && + git commit -a -m "updated by one" && + git switch -c alternate && + echo >file updated again by one && + git commit -a -m "updated by one again" && + git switch main + ) && + git clone . two && + ( + cd two && + git config branch.main.remote one && + git config remote.one.url ../one/.git/ && + git config remote.one.fetch +refs/heads/*:refs/remotes/one/* && + git config --add remote.one.fetch ^refs/heads/alternate + ) && + git clone . three +' + +test_expect_success "fetch one" ' + echo >file updated by origin && + git commit -a -m "updated by origin" && + ( + cd two && + test_must_fail git rev-parse --verify refs/remotes/one/alternate && + git fetch one && + test_must_fail git rev-parse --verify refs/remotes/one/alternate && + git rev-parse --verify refs/remotes/one/main && + mine=$(git rev-parse refs/remotes/one/main) && + his=$(cd ../one && git rev-parse refs/heads/main) && + test "z$mine" = "z$his" + ) +' + +test_expect_success "fetch with negative refspec on commandline" ' + echo >file updated by origin again && + git commit -a -m "updated by origin again" && + ( + cd three && + alternate_in_one=$(cd ../one && git rev-parse refs/heads/alternate) && + echo $alternate_in_one >expect && + git fetch ../one/.git refs/heads/*:refs/remotes/one/* ^refs/heads/main && + cut -f -1 .git/FETCH_HEAD >actual && + test_cmp expect actual + ) +' + +test_expect_success "fetch with negative sha1 refspec fails" ' + echo >file updated by origin yet again && + git commit -a -m "updated by origin yet again" && + ( + cd three && + main_in_one=$(cd ../one && git rev-parse refs/heads/main) && + test_must_fail git fetch ../one/.git refs/heads/*:refs/remotes/one/* ^$main_in_one + ) +' + +test_expect_success "fetch with negative pattern refspec" ' + echo >file updated by origin once more && + git commit -a -m "updated by origin once more" && + ( + cd three && + alternate_in_one=$(cd ../one && git rev-parse refs/heads/alternate) && + echo $alternate_in_one >expect && + git fetch ../one/.git refs/heads/*:refs/remotes/one/* ^refs/heads/m* && + cut -f -1 .git/FETCH_HEAD >actual && + test_cmp expect actual + ) +' + +test_expect_success "fetch with negative pattern refspec does not expand prefix" ' + echo >file updated by origin another time && + git commit -a -m "updated by origin another time" && + ( + cd three && + alternate_in_one=$(cd ../one && git rev-parse refs/heads/alternate) && + main_in_one=$(cd ../one && git rev-parse refs/heads/main) && + echo $alternate_in_one >expect && + echo $main_in_one >>expect && + git fetch ../one/.git refs/heads/*:refs/remotes/one/* ^main && + cut -f -1 .git/FETCH_HEAD >actual && + test_cmp expect actual + ) +' + +test_expect_success "fetch with negative refspec avoids duplicate conflict" ' + cd "$D" && + ( + cd one && + git branch dups/a && + git branch dups/b && + git branch dups/c && + git branch other/a && + git rev-parse --verify refs/heads/other/a >../expect && + git rev-parse --verify refs/heads/dups/b >>../expect && + git rev-parse --verify refs/heads/dups/c >>../expect + ) && + ( + cd three && + git fetch ../one/.git ^refs/heads/dups/a refs/heads/dups/*:refs/dups/* refs/heads/other/a:refs/dups/a && + git rev-parse --verify refs/dups/a >../actual && + git rev-parse --verify refs/dups/b >>../actual && + git rev-parse --verify refs/dups/c >>../actual + ) && + test_cmp expect actual +' + +test_expect_success "push --prune with negative refspec" ' + ( + cd two && + git branch prune/a && + git branch prune/b && + git branch prune/c && + git push ../three refs/heads/prune/* && + git branch -d prune/a && + git branch -d prune/b && + git push --prune ../three refs/heads/prune/* ^refs/heads/prune/b + ) && + ( + cd three && + test_write_lines b c >expect && + git for-each-ref --format="%(refname:lstrip=3)" refs/heads/prune/ >actual && + test_cmp expect actual + ) +' + +test_expect_success "push --prune with negative refspec apply to the destination" ' + ( + cd two && + git branch ours/a && + git branch ours/b && + git branch ours/c && + git push ../three refs/heads/ours/*:refs/heads/theirs/* && + git branch -d ours/a && + git branch -d ours/b && + git push --prune ../three refs/heads/ours/*:refs/heads/theirs/* ^refs/heads/theirs/b + ) && + ( + cd three && + test_write_lines b c >expect && + git for-each-ref --format="%(refname:lstrip=3)" refs/heads/theirs/ >actual && + test_cmp expect actual + ) +' + +test_expect_success "fetch --prune with negative refspec" ' + ( + cd two && + git branch fetch/a && + git branch fetch/b && + git branch fetch/c + ) && + ( + cd three && + git fetch ../two/.git refs/heads/fetch/*:refs/heads/copied/* + ) && + ( + cd two && + git branch -d fetch/a && + git branch -d fetch/b + ) && + ( + cd three && + test_write_lines b c >expect && + git fetch -v ../two/.git --prune refs/heads/fetch/*:refs/heads/copied/* ^refs/heads/fetch/b && + git for-each-ref --format="%(refname:lstrip=3)" refs/heads/copied/ >actual && + test_cmp expect actual + ) +' + +test_expect_success "push with matching : and negative refspec" ' + # Manually handle cleanup, since test_config is not + # prepared to take arbitrary options like --add + test_when_finished "test_unconfig -C two remote.one.push" && + + # For convenience, we use "master" to refer to the name of + # the branch created by default in the following. + # + # Repositories two and one have branches other than "master" + # but they have no overlap---"master" is the only one that + # is shared between them. And the master branch at two is + # behind the master branch at one by one commit. + git -C two config --add remote.one.push : && + + # A matching push tries to update master, fails due to non-ff + test_must_fail git -C two push one && + + # "master" may actually not be "master"---find it out. + current=$(git symbolic-ref HEAD) && + + # If master is in negative refspec, then the command will not attempt + # to push and succeed. + git -C two config --add remote.one.push "^$current" && + + # With "master" excluded, this push is a no-op. Nothing gets + # pushed and it succeeds. + git -C two push -v one +' + +test_expect_success "push with matching +: and negative refspec" ' + test_when_finished "test_unconfig -C two remote.one.push" && + + # The same set-up as above, whose side-effect was a no-op. + git -C two config --add remote.one.push +: && + + # The push refuses to update the "master" branch that is checked + # out in the "one" repository, even when it is forced with +: + test_must_fail git -C two push one && + + # "master" may actually not be "master"---find it out. + current=$(git symbolic-ref HEAD) && + + # If master is in negative refspec, then the command will not attempt + # to push and succeed + git -C two config --add remote.one.push "^$current" && + + # With "master" excluded, this push is a no-op. Nothing gets + # pushed and it succeeds. + git -C two push -v one +' + +test_expect_success '--prefetch correctly modifies refspecs' ' + git -C one config --unset-all remote.origin.fetch && + git -C one config --add remote.origin.fetch ^refs/heads/bogus/ignore && + git -C one config --add remote.origin.fetch "refs/tags/*:refs/tags/*" && + git -C one config --add remote.origin.fetch "refs/heads/bogus/*:bogus/*" && + + git tag -a -m never never-fetch-tag HEAD && + + git branch bogus/fetched HEAD~1 && + git branch bogus/ignore HEAD && + + git -C one fetch --prefetch --no-tags && + test_must_fail git -C one rev-parse never-fetch-tag && + git -C one rev-parse refs/prefetch/bogus/fetched && + test_must_fail git -C one rev-parse refs/prefetch/bogus/ignore && + + # correctly handle when refspec set becomes empty + # after removing the refs/tags/* refspec. + git -C one config --unset-all remote.origin.fetch && + git -C one config --add remote.origin.fetch "refs/tags/*:refs/tags/*" && + + git -C one fetch --prefetch --no-tags && + test_must_fail git -C one rev-parse never-fetch-tag && + + # The refspec for refs that are not fully qualified + # are filtered multiple times. + git -C one rev-parse refs/prefetch/bogus/fetched && + test_must_fail git -C one rev-parse refs/prefetch/bogus/ignore +' + +test_expect_success '--prefetch succeeds when refspec becomes empty' ' + git checkout bogus/fetched && + test_commit extra && + + git -C one config --unset-all remote.origin.fetch && + git -C one config --unset branch.main.remote && + git -C one config remote.origin.fetch "+refs/tags/extra" && + git -C one config remote.origin.skipfetchall true && + git -C one config remote.origin.tagopt "--no-tags" && + + git -C one fetch --prefetch +' + +test_done diff --git a/t/t5600-clone-fail-cleanup.sh b/t/t5600-clone-fail-cleanup.sh index 4a1a912e03..5bf10261d3 100755 --- a/t/t5600-clone-fail-cleanup.sh +++ b/t/t5600-clone-fail-cleanup.sh @@ -97,4 +97,11 @@ test_expect_success 'failed clone into empty leaves directory (separate, wt)' ' test_dir_is_empty empty-wt ' +test_expect_success 'transport failure cleans up directory' ' + test_must_fail git clone --no-local \ + -u "f() { git-upload-pack \"\$@\"; return 1; }; f" \ + foo broken-clone && + test_path_is_missing broken-clone +' + test_done diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 15fb64c18d..83c24fc97a 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -2,6 +2,9 @@ test_description=clone +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh X= @@ -37,7 +40,7 @@ test_expect_success 'clone with excess parameters (2)' ' ' -test_expect_success C_LOCALE_OUTPUT 'output from clone' ' +test_expect_success 'output from clone' ' rm -fr dst && git clone -n "file://$(pwd)/src" dst >output 2>&1 && test $(grep Clon output | wc -l) = 1 @@ -217,7 +220,7 @@ test_expect_success 'clone respects global branch.autosetuprebase' ' rm -fr dst && git clone src dst && cd dst && - actual="z$(git config branch.master.rebase)" && + actual="z$(git config branch.main.rebase)" && test ztrue = $actual ) ' @@ -302,7 +305,8 @@ test_expect_success 'clone from original with relative alternate' ' test_expect_success 'clone checking out a tag' ' git clone --branch=some-tag src dst.tag && GIT_DIR=src/.git git rev-parse some-tag >expected && - test_cmp expected dst.tag/.git/HEAD && + GIT_DIR=dst.tag/.git git rev-parse HEAD >actual && + test_cmp expected actual && GIT_DIR=dst.tag/.git git config remote.origin.fetch >fetch.actual && echo "+refs/heads/*:refs/remotes/origin/*" >fetch.expected && test_cmp fetch.expected fetch.actual @@ -591,7 +595,7 @@ test_expect_success 'clone from a repository with two identical branches' ' ( cd src && - git checkout -b another master + git checkout -b another main ) && git clone src target-11 && test "z$( cd target-11 && git symbolic-ref HEAD )" = zrefs/heads/another @@ -631,6 +635,20 @@ test_expect_success CASE_INSENSITIVE_FS 'colliding file detection' ' test_i18ngrep "the following paths have collided" icasefs/warning ' +test_expect_success 'clone with GIT_DEFAULT_HASH' ' + ( + sane_unset GIT_DEFAULT_HASH && + git init --object-format=sha1 test-sha1 && + git init --object-format=sha256 test-sha256 + ) && + test_commit -C test-sha1 foo && + test_commit -C test-sha256 foo && + GIT_DEFAULT_HASH=sha1 git clone test-sha256 test-clone-sha256 && + GIT_DEFAULT_HASH=sha256 git clone test-sha1 test-clone-sha1 && + git -C test-clone-sha1 status && + git -C test-clone-sha256 status +' + partial_clone_server () { SERVER="$1" && @@ -669,7 +687,8 @@ test_expect_success 'partial clone' ' test_expect_success 'partial clone with -o' ' partial_clone_server server && - git clone -o blah --filter=blob:limit=0 "file://$(pwd)/server" client + git clone -o blah --filter=blob:limit=0 "file://$(pwd)/server" client && + test_cmp_config -C client "blob:limit=0" --get-all remote.blah.partialclonefilter ' test_expect_success 'partial clone: warn if server does not support object filtering' ' @@ -741,6 +760,15 @@ test_expect_success 'partial clone using HTTP' ' partial_clone "$HTTPD_DOCUMENT_ROOT_PATH/server" "$HTTPD_URL/smart/server" ' +test_expect_success 'reject cloning shallow repository using HTTP' ' + test_when_finished "rm -rf repo" && + git clone --bare --no-local --depth=1 src "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + test_must_fail git -c protocol.version=2 clone --reject-shallow $HTTPD_URL/smart/repo.git repo 2>err && + test_i18ngrep -e "source repository is shallow, reject to clone." err && + + git clone --no-reject-shallow $HTTPD_URL/smart/repo.git repo +' + # 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. diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index 2f7be23044..e845d621f6 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -4,6 +4,9 @@ # test_description='test clone --reference' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh base_dir=$(pwd) @@ -49,7 +52,7 @@ test_expect_success 'existence of info/alternates' ' ' test_expect_success 'pulling from reference' ' - git -C C pull ../B master + git -C C pull ../B main ' test_expect_success 'that reference gets used' ' @@ -70,7 +73,7 @@ test_expect_success 'existence of info/alternates' ' ' test_expect_success 'pulling from reference' ' - git -C D pull ../B master + git -C D pull ../B main ' test_expect_success 'that reference gets used' ' @@ -136,11 +139,11 @@ test_expect_success 'prepare branched repository' ' git clone A J && ( cd J && - git checkout -b other master^ && + git checkout -b other main^ && echo other >otherfile && git add otherfile && git commit -m other && - git checkout master + git checkout main ) ' @@ -152,9 +155,9 @@ test_expect_success 'fetch with incomplete alternates' ' git remote add J "file://$base_dir/J" && GIT_TRACE_PACKET=$U.K git fetch J ) && - master_object=$(cd A && git for-each-ref --format="%(objectname)" refs/heads/master) && + main_object=$(cd A && git for-each-ref --format="%(objectname)" refs/heads/main) && test -s "$U.K" && - ! grep " want $master_object" "$U.K" && + ! grep " want $main_object" "$U.K" && tag_object=$(cd A && git for-each-ref --format="%(objectname)" refs/tags/HEAD) && ! grep " want $tag_object" "$U.K" ' @@ -326,7 +329,7 @@ test_expect_success SYMLINKS 'clone repo with symlinked or unknown files at obje for raw in $(ls T*.raw) do sed -e "s!/../!/Y/!; s![0-9a-f]\{38,\}!Z!" -e "/commit-graph/d" \ - -e "/multi-pack-index/d" <$raw >$raw.de-sha-1 && + -e "/multi-pack-index/d" -e "/rev/d" <$raw >$raw.de-sha-1 && sort $raw.de-sha-1 >$raw.de-sha || return 1 done && diff --git a/t/t5605-clone-local.sh b/t/t5605-clone-local.sh index af23419ebf..7d63365f93 100755 --- a/t/t5605-clone-local.sh +++ b/t/t5605-clone-local.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test local clone' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh repo_is_hardlinked() { @@ -15,7 +18,7 @@ test_expect_success 'preparing origin repository' ' test "$(cd a.git && git config --bool core.bare)" = true && test "$(cd x && git config --bool core.bare)" = true && git bundle create b1.bundle --all && - git bundle create b2.bundle master && + git bundle create b2.bundle main && mkdir dir && cp b1.bundle dir/b3 && cp b1.bundle b4 @@ -84,7 +87,7 @@ test_expect_success 'bundle clone with nonexistent HEAD' ' git clone b2.bundle b2 && (cd b2 && git fetch && - test_must_fail git rev-parse --verify refs/heads/master) + test_must_fail git rev-parse --verify refs/heads/main) ' test_expect_success 'clone empty repository' ' @@ -98,9 +101,9 @@ test_expect_success 'clone empty repository' ' echo "content" >> foo && git add foo && git commit -m "Initial commit" && - git push origin master && - expected=$(git rev-parse master) && - actual=$(git --git-dir=../empty/.git rev-parse master) && + git push origin main && + expected=$(git rev-parse main) && + actual=$(git --git-dir=../empty/.git rev-parse main) && test $actual = $expected) ' diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index e69427f881..3a595c0f82 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='basic clone options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -8,14 +11,105 @@ test_expect_success 'setup' ' mkdir parent && (cd parent && git init && echo one >file && git add file && - git commit -m one) + git commit -m one) && + git clone --depth=1 --no-local parent shallow-repo ' test_expect_success 'clone -o' ' git clone -o foo parent clone-o && - (cd clone-o && git rev-parse --verify refs/remotes/foo/master) + git -C clone-o rev-parse --verify refs/remotes/foo/main + +' + +test_expect_success 'rejects invalid -o/--origin' ' + + test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err && + test_i18ngrep "'\''bad...name'\'' is not a valid remote name" err + +' + +test_expect_success 'disallows --bare with --origin' ' + + test_must_fail git clone -o foo --bare parent clone-bare-o 2>err && + test_debug "cat err" && + test_i18ngrep -e "--bare and --origin foo options are incompatible" err + +' + +test_expect_success 'disallows --bare with --separate-git-dir' ' + + test_must_fail git clone --bare --separate-git-dir dot-git-destiation parent clone-bare-sgd 2>err && + test_debug "cat err" && + test_i18ngrep -e "--bare and --separate-git-dir are incompatible" err + +' + +test_expect_success 'reject cloning shallow repository' ' + test_when_finished "rm -rf repo" && + test_must_fail git clone --reject-shallow shallow-repo out 2>err && + test_i18ngrep -e "source repository is shallow, reject to clone." err && + + git clone --no-reject-shallow shallow-repo repo +' + +test_expect_success 'reject cloning non-local shallow repository' ' + test_when_finished "rm -rf repo" && + test_must_fail git clone --reject-shallow --no-local shallow-repo out 2>err && + test_i18ngrep -e "source repository is shallow, reject to clone." err && + + git clone --no-reject-shallow --no-local shallow-repo repo +' + +test_expect_success 'succeed cloning normal repository' ' + test_when_finished "rm -rf chilad1 child2 child3 child4 " && + git clone --reject-shallow parent child1 && + git clone --reject-shallow --no-local parent child2 && + git clone --no-reject-shallow parent child3 && + git clone --no-reject-shallow --no-local parent child4 +' + +test_expect_success 'uses "origin" for default remote name' ' + + git clone parent clone-default-origin && + git -C clone-default-origin rev-parse --verify refs/remotes/origin/main + +' + +test_expect_success 'prefers --template config over normal config' ' + + template="$TRASH_DIRECTORY/template-with-config" && + mkdir "$template" && + git config --file "$template/config" foo.bar from_template && + test_config_global foo.bar from_global && + git clone "--template=$template" parent clone-template-config && + test "$(git -C clone-template-config config --local foo.bar)" = "from_template" + +' + +test_expect_success 'prefers -c config over --template config' ' + + template="$TRASH_DIRECTORY/template-with-ignored-config" && + mkdir "$template" && + git config --file "$template/config" foo.bar from_template && + git clone "--template=$template" -c foo.bar=inline parent clone-template-inline-config && + test "$(git -C clone-template-inline-config config --local foo.bar)" = "inline" + +' + +test_expect_success 'prefers config "clone.defaultRemoteName" over default' ' + + test_config_global clone.defaultRemoteName from_config && + git clone parent clone-config-origin && + git -C clone-config-origin rev-parse --verify refs/remotes/from_config/main + +' + +test_expect_success 'prefers --origin over -c config' ' + + git clone -c clone.defaultRemoteName=inline --origin from_option parent clone-o-and-inline-config && + git -C clone-o-and-inline-config rev-parse --verify refs/remotes/from_option/main ' @@ -35,11 +129,22 @@ test_expect_success 'redirected clone -v does show progress' ' ' +test_expect_success 'clone does not segfault with --bare and core.bare=false' ' + test_config_global core.bare false && + git clone --bare parent clone-bare && + echo true >expect && + git -C clone-bare rev-parse --is-bare-repository >actual && + test_cmp expect actual +' + test_expect_success 'chooses correct default initial branch name' ' - git init --bare empty && - git -c init.defaultBranch=up clone empty whats-up && - test refs/heads/up = $(git -C whats-up symbolic-ref HEAD) && - test refs/heads/up = $(git -C whats-up config branch.up.merge) + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=foo init --bare empty && + test_config -C empty lsrefs.unborn advertise && + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=up -c protocol.version=2 clone empty whats-up && + test refs/heads/foo = $(git -C whats-up symbolic-ref HEAD) && + test refs/heads/foo = $(git -C whats-up config branch.foo.merge) ' test_expect_success 'guesses initial branch name correctly' ' @@ -51,9 +156,11 @@ test_expect_success 'guesses initial branch name correctly' ' git -c init.defaultBranch=none init --bare no-head && git -C initial-branch push ../no-head guess abc && + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ git clone no-head is-it2 && test_must_fail git -C is-it2 symbolic-ref refs/remotes/origin/HEAD && git -C no-head update-ref --no-deref HEAD refs/heads/guess && + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ git -c init.defaultBranch=guess clone no-head is-it3 && test refs/remotes/origin/guess = \ $(git -C is-it3 symbolic-ref refs/remotes/origin/HEAD) diff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh index 26985f4b44..f4c383cd5c 100755 --- a/t/t5607-clone-bundle.sh +++ b/t/t5607-clone-bundle.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='some bundle related tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -19,7 +22,7 @@ test_expect_success 'setup' ' ' test_expect_success '"verify" needs a worktree' ' - git bundle create tip.bundle -1 master && + git bundle create tip.bundle -1 main && nongit test_must_fail git bundle verify ../tip.bundle 2>err && test_i18ngrep "need a repository" err ' @@ -38,16 +41,16 @@ test_expect_success 'die if bundle file cannot be created' ' test_must_fail git bundle create adir --all ' -test_expect_failure 'bundle --stdin' ' - echo master | git bundle create stdin-bundle.bdl --stdin && +test_expect_success 'bundle --stdin' ' + echo main | git bundle create stdin-bundle.bdl --stdin && git ls-remote stdin-bundle.bdl >output && - grep master output + grep main output ' -test_expect_failure 'bundle --stdin <rev-list options>' ' - echo master | git bundle create hybrid-bundle.bdl --stdin tag && +test_expect_success 'bundle --stdin <rev-list options>' ' + echo main | git bundle create hybrid-bundle.bdl --stdin tag && git ls-remote hybrid-bundle.bdl >output && - grep master output + grep main output ' test_expect_success 'empty bundle file is rejected' ' @@ -83,14 +86,14 @@ test_expect_success 'prerequisites with an empty commit message' ' test_expect_success 'failed bundle creation does not leave cruft' ' # This fails because the bundle would be empty. - test_must_fail git bundle create fail.bundle master..master && + test_must_fail git bundle create fail.bundle main..main && test_path_is_missing fail.bundle.lock ' test_expect_success 'fetch SHA-1 from bundle' ' test_create_repo foo && test_commit -C foo x && - git -C foo bundle create tip.bundle -1 master && + git -C foo bundle create tip.bundle -1 main && git -C foo rev-parse HEAD >hash && # Exercise to ensure that fetching a SHA-1 from a bundle works with no diff --git a/t/t5608-clone-2gb.sh b/t/t5608-clone-2gb.sh index 4c476d2fa1..87a8cd9f98 100755 --- a/t/t5608-clone-2gb.sh +++ b/t/t5608-clone-2gb.sh @@ -26,7 +26,7 @@ test_expect_success 'setup' ' i=$(($i+1)) || echo $? > exit-status done && - echo "commit refs/heads/master" && + echo "commit refs/heads/main" && echo "author A U Thor <author@email.com> 123456789 +0000" && echo "committer C O Mitter <committer@email.com> 123456789 +0000" && echo "data 5" && diff --git a/t/t5609-clone-branch.sh b/t/t5609-clone-branch.sh index 6e7a7be052..f86a674a03 100755 --- a/t/t5609-clone-branch.sh +++ b/t/t5609-clone-branch.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='clone --branch option' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_HEAD() { @@ -20,7 +23,7 @@ test_expect_success 'setup' ' echo one >file && git add file && git commit -m one && git checkout -b two && echo two >file && git add file && git commit -m two && - git checkout master) && + git checkout main) && mkdir empty && (cd empty && git init) ' @@ -28,7 +31,7 @@ test_expect_success 'setup' ' test_expect_success 'vanilla clone chooses HEAD' ' git clone parent clone && (cd clone && - check_HEAD master && + check_HEAD main && check_file one ) ' @@ -53,7 +56,7 @@ test_expect_success 'clone -b sets up tracking' ' test_expect_success 'clone -b does not munge remotes/origin/HEAD' ' (cd clone-two && - echo refs/remotes/origin/master >expect && + echo refs/remotes/origin/main >expect && git symbolic-ref refs/remotes/origin/HEAD >actual && test_cmp expect actual ) diff --git a/t/t5610-clone-detached.sh b/t/t5610-clone-detached.sh index 8b0d607df1..a7ec21eda5 100755 --- a/t/t5610-clone-detached.sh +++ b/t/t5610-clone-detached.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test cloning a repository with detached HEAD' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh head_is_detached() { @@ -20,7 +23,7 @@ test_expect_success 'setup' ' ' test_expect_success 'clone repo (detached HEAD points to branch)' ' - git checkout master^0 && + git checkout main^0 && git clone "file://$PWD" detached-branch ' test_expect_success 'cloned HEAD matches' ' @@ -59,7 +62,7 @@ test_expect_success 'cloned HEAD is detached' ' ' test_expect_success 'clone repo (orphan detached HEAD)' ' - git checkout master^0 && + git checkout main^0 && echo four >file && git commit -a -m four && git clone "file://$PWD" detached-orphan diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh index 8e0fd39823..f8625f9158 100755 --- a/t/t5611-clone-config.sh +++ b/t/t5611-clone-config.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='tests for git clone -c key=value' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'clone -c sets config in cloned repo' ' @@ -47,16 +50,16 @@ test_expect_success 'clone -c config is available during clone' ' test_expect_success 'clone -c remote.origin.fetch=<refspec> works' ' rm -rf child && - git update-ref refs/grab/it refs/heads/master && - git update-ref refs/leave/out refs/heads/master && + git update-ref refs/grab/it refs/heads/main && + git update-ref refs/leave/out refs/heads/main && git clone -c "remote.origin.fetch=+refs/grab/*:refs/grab/*" . child && git -C child for-each-ref --format="%(refname)" >actual && cat >expect <<-\EOF && refs/grab/it - refs/heads/master + refs/heads/main refs/remotes/origin/HEAD - refs/remotes/origin/master + refs/remotes/origin/main EOF test_cmp expect actual ' @@ -68,9 +71,9 @@ test_expect_success 'git -c remote.origin.fetch=<refspec> clone works' ' cat >expect <<-\EOF && refs/grab/it - refs/heads/master + refs/heads/main refs/remotes/origin/HEAD - refs/remotes/origin/master + refs/remotes/origin/main EOF test_cmp expect actual ' @@ -85,13 +88,38 @@ test_expect_success 'clone -c remote.<remote>.fetch=<refspec> --origin=<name>' ' cat >expect <<-\EOF && refs/grab/it - refs/heads/master + refs/heads/main refs/remotes/upstream/HEAD - refs/remotes/upstream/master + refs/remotes/upstream/main EOF test_cmp expect actual ' +test_expect_success 'set up shallow repository' ' + git clone --depth=1 --no-local . shallow-repo +' + +test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo' ' + test_when_finished "rm -rf out" && + test_must_fail git -c clone.rejectshallow=true clone --no-local shallow-repo out 2>err && + test_i18ngrep -e "source repository is shallow, reject to clone." err && + + git -c clone.rejectshallow=false clone --no-local shallow-repo out +' + +test_expect_success 'option --[no-]reject-shallow override clone.rejectshallow config' ' + test_when_finished "rm -rf out" && + test_must_fail git -c clone.rejectshallow=false clone --reject-shallow --no-local shallow-repo out 2>err && + test_i18ngrep -e "source repository is shallow, reject to clone." err && + + git -c clone.rejectshallow=true clone --no-reject-shallow --no-local shallow-repo out +' + +test_expect_success 'clone.rejectshallow=true should succeed cloning normal repo' ' + test_when_finished "rm -rf out" && + git -c clone.rejectshallow=true clone --no-local . out +' + test_expect_success MINGW 'clone -c core.hideDotFiles' ' test_commit attributes .gitattributes "" && rm -rf child && diff --git a/t/t5612-clone-refspec.sh b/t/t5612-clone-refspec.sh index e3b436d8ae..3126cfd7e9 100755 --- a/t/t5612-clone-refspec.sh +++ b/t/t5612-clone-refspec.sh @@ -1,10 +1,13 @@ #!/bin/sh test_description='test refspec written by clone-command' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' - # Make two branches, "master" and "side" + # Make two branches, "main" and "side" echo one >file && git add file && git commit -m one && @@ -16,7 +19,7 @@ test_expect_success 'setup' ' git checkout -b side && echo four >file && git commit -a -m four && - git checkout master && + git checkout main && git tag five && # default clone @@ -25,18 +28,18 @@ test_expect_success 'setup' ' # default clone --no-tags git clone --no-tags . dir_all_no_tags && - # default --single that follows HEAD=master - git clone --single-branch . dir_master && + # default --single that follows HEAD=main + git clone --single-branch . dir_main && - # default --single that follows HEAD=master with no tags - git clone --single-branch --no-tags . dir_master_no_tags && + # default --single that follows HEAD=main with no tags + git clone --single-branch --no-tags . dir_main_no_tags && # default --single that follows HEAD=side git checkout side && git clone --single-branch . dir_side && # explicit --single that follows side - git checkout master && + git checkout main && git clone --single-branch --branch side . dir_side2 && # default --single with --mirror @@ -55,11 +58,11 @@ test_expect_success 'setup' ' # explicit --single with tag and --no-tags git clone --single-branch --no-tags --branch two . dir_tag_no_tags && - # advance both "master" and "side" branches + # advance both "main" and "side" branches git checkout side && echo five >file && git commit -a -m five && - git checkout master && + git checkout main && echo six >file && git commit -a -m six && @@ -75,7 +78,7 @@ test_expect_success 'by default all branches will be kept updated' ' sed -e "/HEAD$/d" \ -e "s|/remotes/origin/|/heads/|" refs >../actual ) && - # follow both master and side + # follow both main and side git for-each-ref refs/heads >expect && test_cmp expect actual ' @@ -94,26 +97,27 @@ test_expect_success 'by default no tags will be kept updated' ' test_expect_success 'clone with --no-tags' ' ( cd dir_all_no_tags && + grep tagOpt .git/config && git fetch && git for-each-ref refs/tags >../actual ) && test_must_be_empty actual ' -test_expect_success '--single-branch while HEAD pointing at master' ' +test_expect_success '--single-branch while HEAD pointing at main' ' ( - cd dir_master && + cd dir_main && git fetch --force && git for-each-ref refs/remotes/origin >refs && sed -e "/HEAD$/d" \ -e "s|/remotes/origin/|/heads/|" refs >../actual ) && - # only follow master - git for-each-ref refs/heads/master >expect && + # only follow main + git for-each-ref refs/heads/main >expect && # get & check latest tags test_cmp expect actual && ( - cd dir_master && + cd dir_main && git fetch --tags --force && git for-each-ref refs/tags >../actual ) && @@ -122,20 +126,20 @@ test_expect_success '--single-branch while HEAD pointing at master' ' test_line_count = 2 actual ' -test_expect_success '--single-branch while HEAD pointing at master and --no-tags' ' +test_expect_success '--single-branch while HEAD pointing at main and --no-tags' ' ( - cd dir_master_no_tags && + cd dir_main_no_tags && git fetch && git for-each-ref refs/remotes/origin >refs && sed -e "/HEAD$/d" \ -e "s|/remotes/origin/|/heads/|" refs >../actual ) && - # only follow master - git for-each-ref refs/heads/master >expect && + # only follow main + git for-each-ref refs/heads/main >expect && test_cmp expect actual && # get tags (noop) ( - cd dir_master_no_tags && + cd dir_main_no_tags && git fetch && git for-each-ref refs/tags >../actual ) && @@ -143,7 +147,7 @@ test_expect_success '--single-branch while HEAD pointing at master and --no-tags test_line_count = 0 actual && # get tags with --tags overrides tagOpt ( - cd dir_master_no_tags && + cd dir_main_no_tags && git fetch --tags && git for-each-ref refs/tags >../actual ) && diff --git a/t/t5614-clone-submodules-shallow.sh b/t/t5614-clone-submodules-shallow.sh index e4e6ea4d52..5504b519c7 100755 --- a/t/t5614-clone-submodules-shallow.sh +++ b/t/t5614-clone-submodules-shallow.sh @@ -7,7 +7,7 @@ test_description='Test shallow cloning of repos with submodules' pwd=$(pwd) test_expect_success 'setup' ' - git checkout -b master && + git checkout -b main && test_commit commit1 && test_commit commit2 && mkdir sub && diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh index f4d49d8335..cf3e82bdf5 100755 --- a/t/t5616-partial-clone.sh +++ b/t/t5616-partial-clone.sh @@ -2,6 +2,9 @@ test_description='git partial clone' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # create a normal "src" repo where we can later create new commits. @@ -51,14 +54,14 @@ test_expect_success 'verify that .promisor file contains refs fetched' ' test_line_count = 1 promisorlist && git -C srv.bare rev-parse --verify HEAD >headhash && grep "$(cat headhash) HEAD" $(cat promisorlist) && - grep "$(cat headhash) refs/heads/master" $(cat promisorlist) + grep "$(cat headhash) refs/heads/main" $(cat promisorlist) ' -# checkout master to force dynamic object fetch of blobs at HEAD. +# checkout main to force dynamic object fetch of blobs at HEAD. test_expect_success 'verify checkout with dynamic object fetch' ' git -C pc1 rev-list --quiet --objects --missing=print HEAD >observed && test_line_count = 4 observed && - git -C pc1 checkout master && + git -C pc1 checkout main && git -C pc1 rev-list --quiet --objects --missing=print HEAD >observed && test_line_count = 0 observed ' @@ -73,8 +76,8 @@ test_expect_success 'push new commits to server' ' git -C src add file.1.txt git -C src commit -m "mod $x" done && - git -C src blame master -- file.1.txt >expect.blame && - git -C src push -u srv master + git -C src blame main -- file.1.txt >expect.blame && + git -C src push -u srv main ' # (partial) fetch in the partial clone repo from the promisor remote. @@ -83,26 +86,26 @@ test_expect_success 'push new commits to server' ' test_expect_success 'partial fetch inherits filter settings' ' git -C pc1 fetch origin && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >observed && + main..origin/main >observed && test_line_count = 5 observed ' # force dynamic object fetch using diff. -# we should only get 1 new blob (for the file in origin/master). +# we should only get 1 new blob (for the file in origin/main). test_expect_success 'verify diff causes dynamic object fetch' ' - git -C pc1 diff master..origin/master -- file.1.txt && + git -C pc1 diff main..origin/main -- file.1.txt && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >observed && + main..origin/main >observed && test_line_count = 4 observed ' # force full dynamic object fetch of the file's history using blame. # we should get the intermediate blobs for the file. test_expect_success 'verify blame causes dynamic object fetch' ' - git -C pc1 blame origin/master -- file.1.txt >observed.blame && + git -C pc1 blame origin/main -- file.1.txt >observed.blame && test_cmp expect.blame observed.blame && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >observed && + main..origin/main >observed && test_line_count = 0 observed ' @@ -115,7 +118,7 @@ test_expect_success 'push new commits to server for file.2.txt' ' git -C src add file.2.txt git -C src commit -m "mod $x" done && - git -C src push -u srv master + git -C src push -u srv main ' # Do FULL fetch by disabling inherited filter-spec using --no-filter. @@ -123,7 +126,7 @@ test_expect_success 'push new commits to server for file.2.txt' ' test_expect_success 'override inherited filter-spec using --no-filter' ' git -C pc1 fetch --no-filter origin && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >observed && + main..origin/main >observed && test_line_count = 0 observed ' @@ -136,7 +139,7 @@ test_expect_success 'push new commits to server for file.3.txt' ' git -C src add file.3.txt git -C src commit -m "mod $x" done && - git -C src push -u srv master + git -C src push -u srv main ' # Do a partial fetch and then try to manually fetch the missing objects. @@ -146,7 +149,7 @@ test_expect_success 'manual prefetch of missing objects' ' git -C pc1 fetch --filter=blob:none origin && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >revs && + main..origin/main >revs && awk -f print_1.awk revs | sed "s/?//" | sort >observed.oids && @@ -155,7 +158,7 @@ test_expect_success 'manual prefetch of missing objects' ' git -C pc1 fetch-pack --stdin "file://$(pwd)/srv.bare" <observed.oids && git -C pc1 rev-list --quiet --objects --missing=print \ - master..origin/master >revs && + main..origin/main >revs && awk -f print_1.awk revs | sed "s/?//" | sort >observed.oids && @@ -196,7 +199,7 @@ test_expect_success 'use fsck before and after manually fetching a missing subtr echo "in dir" >src/dir/file.txt && git -C src add dir/file.txt && git -C src commit -m "file in dir" && - git -C src push -u srv master && + git -C src push -u srv main && SUBTREE=$(git -C src rev-parse HEAD:dir) && rm -rf dst && @@ -204,7 +207,7 @@ test_expect_success 'use fsck before and after manually fetching a missing subtr git -C dst fsck && # Make sure we only have commits, and all trees and blobs are missing. - git -C dst rev-list --missing=allow-any --objects master \ + git -C dst rev-list --missing=allow-any --objects main \ >fetched_objects && awk -f print_1.awk fetched_objects | xargs -n1 git -C dst cat-file -t >fetched_types && @@ -221,7 +224,7 @@ test_expect_success 'use fsck before and after manually fetching a missing subtr git -C dst fsck && # Auto-fetch all remaining trees and blobs with --missing=error - git -C dst rev-list --missing=error --objects master >fetched_objects && + git -C dst rev-list --missing=error --objects main >fetched_objects && test_line_count = 70 fetched_objects && awk -f print_1.awk fetched_objects | @@ -251,6 +254,14 @@ test_expect_success 'implicitly construct combine: filter with repeated flags' ' test_cmp unique_types.expected unique_types.actual ' +test_expect_success 'upload-pack complains of bogus filter config' ' + printf 0000 | + test_must_fail git \ + -c uploadpackfilter.tree.maxdepth \ + upload-pack . >/dev/null 2>err && + test_i18ngrep "unable to parse.*tree.maxdepth" err +' + test_expect_success 'upload-pack fails banned object filters' ' test_config -C srv.bare uploadpackfilter.blob:none.allow false && test_must_fail ok=sigpipe git clone --no-checkout --filter=blob:none \ @@ -281,7 +292,15 @@ test_expect_success 'upload-pack limits tree depth filters' ' test_config -C srv.bare uploadpackfilter.tree.maxDepth 0 && test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \ "file://$(pwd)/srv.bare" pc3 2>err && - test_i18ngrep "tree filter allows max depth 0, but got 1" err + test_i18ngrep "tree filter allows max depth 0, but got 1" err && + + git clone --no-checkout --filter=tree:0 "file://$(pwd)/srv.bare" pc4 && + + test_config -C srv.bare uploadpackfilter.tree.maxDepth 5 && + git clone --no-checkout --filter=tree:5 "file://$(pwd)/srv.bare" pc5 && + test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:6 \ + "file://$(pwd)/srv.bare" pc6 2>err && + test_i18ngrep "tree filter allows max depth 5, but got 6" err ' test_expect_success 'partial clone fetches blobs pointed to by refs even if normally filtered out' ' @@ -331,7 +350,7 @@ test_expect_success 'setup src repo for sparse filter' ' test_expect_success 'partial clone with sparse filter succeeds' ' rm -rf dst.git && git clone --no-local --bare \ - --filter=sparse:oid=master:only-one \ + --filter=sparse:oid=main:only-one \ sparse-src dst.git && ( cd dst.git && @@ -344,11 +363,11 @@ test_expect_success 'partial clone with sparse filter succeeds' ' test_expect_success 'partial clone with unresolvable sparse filter fails cleanly' ' rm -rf dst.git && test_must_fail git clone --no-local --bare \ - --filter=sparse:oid=master:no-such-name \ + --filter=sparse:oid=main:no-such-name \ sparse-src dst.git 2>err && - test_i18ngrep "unable to access sparse blob in .master:no-such-name" err && + test_i18ngrep "unable to access sparse blob in .main:no-such-name" err && test_must_fail git clone --no-local --bare \ - --filter=sparse:oid=master \ + --filter=sparse:oid=main \ sparse-src dst.git 2>err && test_i18ngrep "unable to parse sparse filter data in" err ' @@ -403,7 +422,7 @@ test_expect_success 'fetch lazy-fetches only to resolve deltas' ' # promisor remote other than for the big tree (because it needs to # resolve the delta). GIT_TRACE_PACKET="$(pwd)/trace" git -C client \ - fetch "file://$(pwd)/server" master && + fetch "file://$(pwd)/server" main && # Verify the assumption that the client needed to fetch the delta base # to resolve the delta. @@ -422,7 +441,7 @@ test_expect_success 'fetch lazy-fetches only to resolve deltas, protocol v2' ' # promisor remote other than for the big blob (because it needs to # resolve the delta). GIT_TRACE_PACKET="$(pwd)/trace" git -C client \ - fetch "file://$(pwd)/server" master && + fetch "file://$(pwd)/server" main && # Verify that protocol version 2 was used. grep "fetch< version 2" trace && @@ -529,6 +548,14 @@ test_expect_success 'fetch from a partial clone, protocol v2' ' grep "version 2" trace ' +test_expect_success 'repack does not loosen promisor objects' ' + rm -rf client trace && + git clone --bare --filter=blob:none "file://$(pwd)/srv.bare" client && + test_when_finished "rm -rf client trace" && + GIT_TRACE2_PERF="$(pwd)/trace" git -C client repack -A -d && + grep "loosen_unused_packed_objects/loosened:0" trace +' + . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd diff --git a/t/t5617-clone-submodules-remote.sh b/t/t5617-clone-submodules-remote.sh index 1a041df10b..e2dbb4eaba 100755 --- a/t/t5617-clone-submodules-remote.sh +++ b/t/t5617-clone-submodules-remote.sh @@ -2,12 +2,15 @@ test_description='Test cloning repos with submodules using remote-tracking branches' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh pwd=$(pwd) test_expect_success 'setup' ' - git checkout -b master && + git checkout -b main && test_commit commit1 && mkdir sub && ( @@ -39,7 +42,7 @@ test_expect_success 'clone with --remote-submodules' ' git clone --recurse-submodules --remote-submodules "file://$pwd/." super_clone && ( cd super_clone/sub && - git diff --exit-code remotes/origin/master + git diff --exit-code remotes/origin/main ) ' @@ -57,7 +60,7 @@ test_expect_success 'clone with --single-branch' ' git clone --recurse-submodules --single-branch "file://$pwd/." super_clone && ( cd super_clone/sub && - git rev-parse --verify origin/master && + git rev-parse --verify origin/main && test_must_fail git rev-parse --verify origin/other ) ' diff --git a/t/t5700-protocol-v1.sh b/t/t5700-protocol-v1.sh index 022901b9eb..468bd3e13e 100755 --- a/t/t5700-protocol-v1.sh +++ b/t/t5700-protocol-v1.sh @@ -8,6 +8,9 @@ TEST_NO_CREATE_REPO=1 GIT_TEST_PROTOCOL_VERSION=0 export GIT_TEST_PROTOCOL_VERSION +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Test protocol v1 with 'git://' transport @@ -41,7 +44,7 @@ test_expect_success 'fetch with git:// using protocol v1' ' GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \ fetch 2>log && - git -C daemon_child log -1 --format=%s origin/master >actual && + git -C daemon_child log -1 --format=%s origin/main >actual && git -C "$daemon_parent" log -1 --format=%s >expect && test_cmp expect actual && @@ -69,7 +72,7 @@ test_expect_success 'push with git:// using protocol v1' ' test_commit -C daemon_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \ push origin HEAD:client_branch 2>log && @@ -110,7 +113,7 @@ test_expect_success 'fetch with file:// using protocol v1' ' GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \ fetch 2>log && - git -C file_child log -1 --format=%s origin/master >actual && + git -C file_child log -1 --format=%s origin/main >actual && git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && @@ -134,7 +137,7 @@ test_expect_success 'push with file:// using protocol v1' ' test_commit -C file_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \ push origin HEAD:client_branch 2>log && @@ -188,7 +191,7 @@ test_expect_success 'fetch with ssh:// using protocol v1' ' fetch 2>log && expect_ssh git-upload-pack && - git -C ssh_child log -1 --format=%s origin/master >actual && + git -C ssh_child log -1 --format=%s origin/main >actual && git -C ssh_parent log -1 --format=%s >expect && test_cmp expect actual && @@ -213,7 +216,7 @@ test_expect_success 'push with ssh:// using protocol v1' ' test_commit -C ssh_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \ push origin HEAD:client_branch 2>log && expect_ssh git-receive-pack && @@ -257,7 +260,7 @@ test_expect_success 'fetch with http:// using protocol v1' ' GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \ fetch 2>log && - git -C http_child log -1 --format=%s origin/master >actual && + git -C http_child log -1 --format=%s origin/main >actual && git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect && test_cmp expect actual && @@ -281,7 +284,7 @@ test_expect_success 'push with http:// using protocol v1' ' test_commit -C http_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \ push origin HEAD:client_branch && #2>log && diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh index a1f5fdc9fd..930721f053 100755 --- a/t/t5701-git-serve.sh +++ b/t/t5701-git-serve.sh @@ -2,6 +2,9 @@ test_description='test protocol v2 server commands' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'test capability advertisement' ' @@ -12,10 +15,11 @@ test_expect_success 'test capability advertisement' ' cat >expect <<-EOF && version 2 agent=git/$(git version | cut -d" " -f3) - ls-refs - fetch=shallow + ls-refs=unborn + fetch=shallow wait-for-done server-option object-format=$(test_oid algo) + object-info 0000 EOF @@ -83,9 +87,9 @@ test_expect_success 'wrong object-format' ' # test_expect_success 'setup some refs and tags' ' test_commit one && - git branch dev master && + git branch dev main && test_commit two && - git symbolic-ref refs/heads/release refs/heads/master && + git symbolic-ref refs/heads/release refs/heads/main && git tag -a -m "annotated tag" annotated-tag ' @@ -99,7 +103,7 @@ test_expect_success 'basics of ls-refs' ' cat >expect <<-EOF && $(git rev-parse HEAD) HEAD $(git rev-parse refs/heads/dev) refs/heads/dev - $(git rev-parse refs/heads/master) refs/heads/master + $(git rev-parse refs/heads/main) refs/heads/main $(git rev-parse refs/heads/release) refs/heads/release $(git rev-parse refs/tags/annotated-tag) refs/tags/annotated-tag $(git rev-parse refs/tags/one) refs/tags/one @@ -117,13 +121,13 @@ test_expect_success 'basic ref-prefixes' ' command=ls-refs object-format=$(test_oid algo) 0001 - ref-prefix refs/heads/master + ref-prefix refs/heads/main ref-prefix refs/tags/one 0000 EOF cat >expect <<-EOF && - $(git rev-parse refs/heads/master) refs/heads/master + $(git rev-parse refs/heads/main) refs/heads/main $(git rev-parse refs/tags/one) refs/tags/one 0000 EOF @@ -144,7 +148,7 @@ test_expect_success 'refs/heads prefix' ' cat >expect <<-EOF && $(git rev-parse refs/heads/dev) refs/heads/dev - $(git rev-parse refs/heads/master) refs/heads/master + $(git rev-parse refs/heads/main) refs/heads/main $(git rev-parse refs/heads/release) refs/heads/release 0000 EOF @@ -188,8 +192,8 @@ test_expect_success 'symrefs parameter' ' cat >expect <<-EOF && $(git rev-parse refs/heads/dev) refs/heads/dev - $(git rev-parse refs/heads/master) refs/heads/master - $(git rev-parse refs/heads/release) refs/heads/release symref-target:refs/heads/master + $(git rev-parse refs/heads/main) refs/heads/main + $(git rev-parse refs/heads/release) refs/heads/release symref-target:refs/heads/main 0000 EOF @@ -237,4 +241,29 @@ test_expect_success 'unexpected lines are not allowed in fetch request' ' grep "unexpected line: .this-is-not-a-command." err ' +# Test the basics of object-info +# +test_expect_success 'basics of object-info' ' + test-tool pkt-line pack >in <<-EOF && + command=object-info + object-format=$(test_oid algo) + 0001 + size + oid $(git rev-parse two:two.t) + oid $(git rev-parse two:two.t) + 0000 + EOF + + cat >expect <<-EOF && + size + $(git rev-parse two:two.t) $(wc -c <two.t | xargs) + $(git rev-parse two:two.t) $(wc -c <two.t | xargs) + 0000 + EOF + + test-tool serve-v2 --stateless-rpc <in >out && + test-tool pkt-line unpack <out >actual && + test_cmp expect actual +' + test_done diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 7d5b17909b..78de1ff2ad 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -4,6 +4,9 @@ test_description='test git wire-protocol version 2' TEST_NO_CREATE_REPO=1 +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Test protocol v2 with 'git://' transport @@ -36,10 +39,10 @@ test_expect_success 'ref advertisement is filtered with ls-remote using protocol test_when_finished "rm -f log" && GIT_TRACE_PACKET="$(pwd)/log" git -c protocol.version=2 \ - ls-remote "$GIT_DAEMON_URL/parent" master >actual && + ls-remote "$GIT_DAEMON_URL/parent" main >actual && cat >expect <<-EOF && - $(git -C "$daemon_parent" rev-parse refs/heads/master)$(printf "\t")refs/heads/master + $(git -C "$daemon_parent" rev-parse refs/heads/main)$(printf "\t")refs/heads/main EOF test_cmp expect actual @@ -69,7 +72,7 @@ test_expect_success 'fetch with git:// using protocol v2' ' GIT_TRACE_PACKET="$(pwd)/log" git -C daemon_child -c protocol.version=2 \ fetch && - git -C daemon_child log -1 --format=%s origin/master >actual && + git -C daemon_child log -1 --format=%s origin/main >actual && git -C "$daemon_parent" log -1 --format=%s >expect && test_cmp expect actual && @@ -118,7 +121,7 @@ test_expect_success 'push with git:// and a config of v2 does not request v2' ' test_commit -C daemon_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET="$(pwd)/log" git -C daemon_child -c protocol.version=2 \ push origin HEAD:client_branch && @@ -158,10 +161,10 @@ test_expect_success 'ref advertisement is filtered with ls-remote using protocol test_when_finished "rm -f log" && GIT_TRACE_PACKET="$(pwd)/log" git -c protocol.version=2 \ - ls-remote "file://$(pwd)/file_parent" master >actual && + ls-remote "file://$(pwd)/file_parent" main >actual && cat >expect <<-EOF && - $(git -C file_parent rev-parse refs/heads/master)$(printf "\t")refs/heads/master + $(git -C file_parent rev-parse refs/heads/main)$(printf "\t")refs/heads/main EOF test_cmp expect actual @@ -171,10 +174,10 @@ test_expect_success 'server-options are sent when using ls-remote' ' test_when_finished "rm -f log" && GIT_TRACE_PACKET="$(pwd)/log" git -c protocol.version=2 \ - ls-remote -o hello -o world "file://$(pwd)/file_parent" master >actual && + ls-remote -o hello -o world "file://$(pwd)/file_parent" main >actual && cat >expect <<-EOF && - $(git -C file_parent rev-parse refs/heads/master)$(printf "\t")refs/heads/master + $(git -C file_parent rev-parse refs/heads/main)$(printf "\t")refs/heads/main EOF test_cmp expect actual && @@ -184,7 +187,7 @@ test_expect_success 'server-options are sent when using ls-remote' ' test_expect_success 'warn if using server-option with ls-remote with legacy protocol' ' test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \ - ls-remote -o hello -o world "file://$(pwd)/file_parent" master 2>err && + ls-remote -o hello -o world "file://$(pwd)/file_parent" main 2>err && test_i18ngrep "see protocol.version in" err && test_i18ngrep "server options require protocol version 2 or later" err @@ -209,6 +212,31 @@ test_expect_success 'clone with file:// using protocol v2' ' grep "ref-prefix refs/tags/" log ' +test_expect_success 'clone of empty repo propagates name of default branch' ' + test_when_finished "rm -rf file_empty_parent file_empty_child" && + + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=mydefaultbranch init file_empty_parent && + + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=main -c protocol.version=2 \ + clone "file://$(pwd)/file_empty_parent" file_empty_child && + grep "refs/heads/mydefaultbranch" file_empty_child/.git/HEAD +' + +test_expect_success '...but not if explicitly forbidden by config' ' + test_when_finished "rm -rf file_empty_parent file_empty_child" && + + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=mydefaultbranch init file_empty_parent && + test_config -C file_empty_parent lsrefs.unborn ignore && + + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \ + git -c init.defaultBranch=main -c protocol.version=2 \ + clone "file://$(pwd)/file_empty_parent" file_empty_child && + ! grep "refs/heads/mydefaultbranch" file_empty_child/.git/HEAD +' + test_expect_success 'fetch with file:// using protocol v2' ' test_when_finished "rm -f log" && @@ -217,7 +245,7 @@ test_expect_success 'fetch with file:// using protocol v2' ' GIT_TRACE_PACKET="$(pwd)/log" git -C file_child -c protocol.version=2 \ fetch origin && - git -C file_child log -1 --format=%s origin/master >actual && + git -C file_child log -1 --format=%s origin/main >actual && git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && @@ -232,13 +260,13 @@ test_expect_success 'ref advertisement is filtered during fetch using protocol v git -C file_parent branch unwanted-branch three && GIT_TRACE_PACKET="$(pwd)/log" git -C file_child -c protocol.version=2 \ - fetch origin master && + fetch origin main && - git -C file_child log -1 --format=%s origin/master >actual && + git -C file_child log -1 --format=%s origin/main >actual && git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && - grep "refs/heads/master" log && + grep "refs/heads/main" log && ! grep "refs/heads/unwanted-branch" log ' @@ -248,9 +276,9 @@ test_expect_success 'server-options are sent when fetching' ' test_commit -C file_parent four && GIT_TRACE_PACKET="$(pwd)/log" git -C file_child -c protocol.version=2 \ - fetch -o hello -o world origin master && + fetch -o hello -o world origin main && - git -C file_child log -1 --format=%s origin/master >actual && + git -C file_child log -1 --format=%s origin/main >actual && git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && @@ -264,7 +292,7 @@ test_expect_success 'warn if using server-option with fetch with legacy protocol git init temp_child && test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C temp_child -c protocol.version=0 \ - fetch -o hello -o world "file://$(pwd)/file_parent" master 2>err && + fetch -o hello -o world "file://$(pwd)/file_parent" main 2>err && test_i18ngrep "see protocol.version in" err && test_i18ngrep "server options require protocol version 2 or later" err @@ -325,7 +353,7 @@ test_expect_success 'partial clone' ' grep "version 2" trace && # Ensure that the old version of the file is missing - git -C client rev-list --quiet --objects --missing=print master \ + git -C client rev-list --quiet --objects --missing=print main \ >observed.oids && grep "$(git -C server rev-parse message1:a.txt)" observed.oids && @@ -350,7 +378,7 @@ test_expect_success 'partial fetch' ' SERVER="file://$(pwd)/server" && GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ - fetch --filter=blob:none "$SERVER" master:refs/heads/other && + fetch --filter=blob:none "$SERVER" main:refs/heads/other && grep "version 2" trace && # Ensure that the old version of the file is missing @@ -395,7 +423,7 @@ test_expect_success 'even with handcrafted request, filter does not work if not command=fetch object-format=$(test_oid algo) 0001 - want $(git -C server rev-parse master) + want $(git -C server rev-parse main) filter blob:none 0000 EOF @@ -539,7 +567,7 @@ test_expect_success 'deepen-relative' ' test_commit -C server four && # Sanity check that only "three" is downloaded - git -C client log --pretty=tformat:%s master >actual && + git -C client log --pretty=tformat:%s main >actual && echo three >expected && test_cmp expected actual && @@ -548,7 +576,7 @@ test_expect_success 'deepen-relative' ' # Ensure that protocol v2 is used grep "fetch< version 2" trace && - git -C client log --pretty=tformat:%s origin/master >actual && + git -C client log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && four three @@ -557,6 +585,65 @@ test_expect_success 'deepen-relative' ' test_cmp expected actual ' +setup_negotiate_only () { + SERVER="$1" + URI="$2" + + rm -rf "$SERVER" client + + git init "$SERVER" + test_commit -C "$SERVER" one + test_commit -C "$SERVER" two + + git clone "$URI" client + test_commit -C client three +} + +test_expect_success 'usage: --negotiate-only without --negotiation-tip' ' + SERVER="server" && + URI="file://$(pwd)/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + cat >err.expect <<-\EOF && + fatal: --negotiate-only needs one or more --negotiate-tip=* + EOF + + test_must_fail git -c protocol.version=2 -C client fetch \ + --negotiate-only \ + origin 2>err.actual && + test_cmp err.expect err.actual +' + +test_expect_success 'file:// --negotiate-only' ' + SERVER="server" && + URI="file://$(pwd)/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + git -c protocol.version=2 -C client fetch \ + --no-tags \ + --negotiate-only \ + --negotiation-tip=$(git -C client rev-parse HEAD) \ + origin >out && + COMMON=$(git -C "$SERVER" rev-parse two) && + grep "$COMMON" out +' + +test_expect_success 'file:// --negotiate-only with protocol v0' ' + SERVER="server" && + URI="file://$(pwd)/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + test_must_fail git -c protocol.version=0 -C client fetch \ + --no-tags \ + --negotiate-only \ + --negotiation-tip=$(git -C client rev-parse HEAD) \ + origin 2>err && + test_i18ngrep "negotiate-only requires protocol v2" err +' + # Test protocol v2 with 'http://' transport # . "$TEST_DIRECTORY"/lib-httpd.sh @@ -670,7 +757,7 @@ test_expect_success 'fetch with http:// using protocol v2' ' GIT_TRACE_PACKET="$(pwd)/log" git -C http_child -c protocol.version=2 \ fetch && - git -C http_child log -1 --format=%s origin/master >actual && + git -C http_child log -1 --format=%s origin/main >actual && git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect && test_cmp expect actual && @@ -698,11 +785,11 @@ test_expect_success 'fetch from namespaced repo respects namespaces' ' test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/nsrepo" one && test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/nsrepo" two && git -C "$HTTPD_DOCUMENT_ROOT_PATH/nsrepo" \ - update-ref refs/namespaces/ns/refs/heads/master one && + update-ref refs/namespaces/ns/refs/heads/main one && GIT_TRACE_PACKET="$(pwd)/log" git -C http_child -c protocol.version=2 \ fetch "$HTTPD_URL/smart_namespace/nsrepo" \ - refs/heads/master:refs/heads/theirs && + refs/heads/main:refs/heads/theirs && # Server responded using protocol v2 grep "fetch< version 2" log && @@ -733,7 +820,7 @@ test_expect_success 'push with http:// and a config of v2 does not request v2' ' test_commit -C http_child three && # Push to another branch, as the target repository has the - # master branch checked out and we cannot push into it. + # main branch checked out and we cannot push into it. GIT_TRACE_PACKET="$(pwd)/log" git -C http_child -c protocol.version=2 \ push origin HEAD:client_branch && @@ -847,11 +934,33 @@ test_expect_success 'part of packfile response provided as URI' ' test -f hfound && test -f h2found && - # Ensure that there are exactly 6 files (3 .pack and 3 .idx). - ls http_child/.git/objects/pack/* >filelist && + # Ensure that there are exactly 3 packfiles with associated .idx + ls http_child/.git/objects/pack/*.pack \ + http_child/.git/objects/pack/*.idx >filelist && test_line_count = 6 filelist ' +test_expect_success 'packfile URIs with fetch instead of clone' ' + P="$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && + rm -rf "$P" http_child log && + + git init "$P" && + git -C "$P" config "uploadpack.allowsidebandall" "true" && + + echo my-blob >"$P/my-blob" && + git -C "$P" add my-blob && + git -C "$P" commit -m x && + + configure_exclusion "$P" my-blob >h && + + git init http_child && + + GIT_TEST_SIDEBAND_ALL=1 \ + git -C http_child -c protocol.version=2 \ + -c fetch.uriprotocols=http,https \ + fetch "$HTTPD_URL/smart/http_parent" +' + test_expect_success 'fetching with valid packfile URI but invalid hash fails' ' P="$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && rm -rf "$P" http_child log && @@ -901,8 +1010,9 @@ test_expect_success 'packfile-uri with transfer.fsckobjects' ' -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child && - # Ensure that there are exactly 4 files (2 .pack and 2 .idx). - ls http_child/.git/objects/pack/* >filelist && + # Ensure that there are exactly 2 packfiles with associated .idx + ls http_child/.git/objects/pack/*.pack \ + http_child/.git/objects/pack/*.idx >filelist && test_line_count = 4 filelist ' @@ -936,6 +1046,100 @@ test_expect_success 'packfile-uri with transfer.fsckobjects fails on bad object' test_i18ngrep "invalid author/committer line - missing email" error ' +test_expect_success 'packfile-uri with transfer.fsckobjects succeeds when .gitmodules is separate from tree' ' + P="$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && + rm -rf "$P" http_child && + + git init "$P" && + git -C "$P" config "uploadpack.allowsidebandall" "true" && + + echo "[submodule libfoo]" >"$P/.gitmodules" && + echo "path = include/foo" >>"$P/.gitmodules" && + echo "url = git://example.com/git/lib.git" >>"$P/.gitmodules" && + git -C "$P" add .gitmodules && + git -C "$P" commit -m x && + + configure_exclusion "$P" .gitmodules >h && + + sane_unset GIT_TEST_SIDEBAND_ALL && + git -c protocol.version=2 -c transfer.fsckobjects=1 \ + -c fetch.uriprotocols=http,https \ + clone "$HTTPD_URL/smart/http_parent" http_child && + + # Ensure that there are exactly 2 packfiles with associated .idx + ls http_child/.git/objects/pack/*.pack \ + http_child/.git/objects/pack/*.idx >filelist && + test_line_count = 4 filelist +' + +test_expect_success 'packfile-uri with transfer.fsckobjects fails when .gitmodules separate from tree is invalid' ' + P="$HTTPD_DOCUMENT_ROOT_PATH/http_parent" && + rm -rf "$P" http_child err && + + git init "$P" && + git -C "$P" config "uploadpack.allowsidebandall" "true" && + + echo "[submodule \"..\"]" >"$P/.gitmodules" && + echo "path = include/foo" >>"$P/.gitmodules" && + echo "url = git://example.com/git/lib.git" >>"$P/.gitmodules" && + git -C "$P" add .gitmodules && + git -C "$P" commit -m x && + + configure_exclusion "$P" .gitmodules >h && + + sane_unset GIT_TEST_SIDEBAND_ALL && + test_must_fail git -c protocol.version=2 -c transfer.fsckobjects=1 \ + -c fetch.uriprotocols=http,https \ + clone "$HTTPD_URL/smart/http_parent" http_child 2>err && + test_i18ngrep "disallowed submodule name" err +' + +test_expect_success 'http:// --negotiate-only' ' + SERVER="$HTTPD_DOCUMENT_ROOT_PATH/server" && + URI="$HTTPD_URL/smart/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + git -c protocol.version=2 -C client fetch \ + --no-tags \ + --negotiate-only \ + --negotiation-tip=$(git -C client rev-parse HEAD) \ + origin >out && + COMMON=$(git -C "$SERVER" rev-parse two) && + grep "$COMMON" out +' + +test_expect_success 'http:// --negotiate-only without wait-for-done support' ' + SERVER="server" && + URI="$HTTPD_URL/one_time_perl/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + echo "s/ wait-for-done/ xxxx-xxx-xxxx/" \ + >"$HTTPD_ROOT_PATH/one-time-perl" && + + test_must_fail git -c protocol.version=2 -C client fetch \ + --no-tags \ + --negotiate-only \ + --negotiation-tip=$(git -C client rev-parse HEAD) \ + origin 2>err && + test_i18ngrep "server does not support wait-for-done" err +' + +test_expect_success 'http:// --negotiate-only with protocol v0' ' + SERVER="$HTTPD_DOCUMENT_ROOT_PATH/server" && + URI="$HTTPD_URL/smart/server" && + + setup_negotiate_only "$SERVER" "$URI" && + + test_must_fail git -c protocol.version=0 -C client fetch \ + --no-tags \ + --negotiate-only \ + --negotiation-tip=$(git -C client rev-parse HEAD) \ + origin 2>err && + test_i18ngrep "negotiate-only requires protocol v2" err +' + # 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. diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index d9ecf0f4a9..e9e471621d 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -2,6 +2,9 @@ test_description='upload-pack ref-in-want' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh get_actual_refs () { @@ -16,7 +19,8 @@ get_actual_commits () { test-tool pkt-line unpack-sideband <out >o.pack && git index-pack o.pack && git verify-pack -v o.idx >objs && - grep commit objs | cut -d" " -f1 | sort >actual_commits + sed -n -e 's/\([0-9a-f][0-9a-f]*\) commit .*/\1/p' objs >objs.sed && + sort >actual_commits <objs.sed } check_output () { @@ -38,12 +42,13 @@ write_command () { # c(o/foo) d(o/bar) # \ / -# b e(baz) f(master) +# b e(baz) f(main) # \__ | __/ # \ | / # a test_expect_success 'setup repository' ' test_commit a && + git branch -M main && git checkout -b o/foo && test_commit b && test_commit c && @@ -51,7 +56,7 @@ test_expect_success 'setup repository' ' test_commit d && git checkout -b baz a && test_commit e && - git checkout master && + git checkout main && test_commit f ' @@ -88,7 +93,7 @@ test_expect_success 'invalid want-ref line' ' test_expect_success 'basic want-ref' ' oid=$(git rev-parse f) && cat >expected_refs <<-EOF && - $oid refs/heads/master + $oid refs/heads/main EOF git rev-parse f >expected_commits && @@ -97,7 +102,7 @@ test_expect_success 'basic want-ref' ' $(write_command fetch) 0001 no-progress - want-ref refs/heads/master + want-ref refs/heads/main have $oid done 0000 @@ -135,7 +140,7 @@ test_expect_success 'multiple want-ref lines' ' test_expect_success 'mix want and want-ref' ' oid=$(git rev-parse f) && cat >expected_refs <<-EOF && - $oid refs/heads/master + $oid refs/heads/main EOF git rev-parse e f >expected_commits && @@ -143,7 +148,7 @@ test_expect_success 'mix want and want-ref' ' $(write_command fetch) 0001 no-progress - want-ref refs/heads/master + want-ref refs/heads/main want $(git rev-parse e) have $(git rev-parse a) done @@ -182,7 +187,7 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" # $REPO # c(o/foo) d(o/bar) # \ / -# b e(baz) f(master) +# b e(baz) f(main) # \__ | __/ # \ | / # a @@ -193,10 +198,10 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" # . # . # | -# a(master) +# a(main) test_expect_success 'setup repos for fetching with ref-in-want tests' ' ( - git init "$REPO" && + git init -b main "$REPO" && cd "$REPO" && test_commit a && @@ -209,7 +214,7 @@ test_expect_success 'setup repos for fetching with ref-in-want tests' ' test_commit_bulk --id=s 33 && # Add novel commits to upstream - git checkout master && + git checkout main && cd "$REPO" && git checkout -b o/foo && test_commit b && @@ -218,7 +223,7 @@ test_expect_success 'setup repos for fetching with ref-in-want tests' ' test_commit d && git checkout -b baz a && test_commit e && - git checkout master && + git checkout main && test_commit f ) && git -C "$REPO" config uploadpack.allowRefInWant true && @@ -245,12 +250,12 @@ test_expect_success 'fetching multiple refs' ' rm -rf local && cp -r "$LOCAL_PRISTINE" local && - GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin master baz && + GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin main baz && - git -C "$REPO" rev-parse "master" "baz" >expected && - git -C local rev-parse refs/remotes/origin/master refs/remotes/origin/baz >actual && + git -C "$REPO" rev-parse "main" "baz" >expected && + git -C local rev-parse refs/remotes/origin/main refs/remotes/origin/baz >actual && test_cmp expected actual && - grep "want-ref refs/heads/master" log && + grep "want-ref refs/heads/main" log && grep "want-ref refs/heads/baz" log ' @@ -261,13 +266,13 @@ test_expect_success 'fetching ref and exact OID' ' cp -r "$LOCAL_PRISTINE" local && oid=$(git -C "$REPO" rev-parse b) && GIT_TRACE_PACKET="$(pwd)/log" git -C local fetch origin \ - master "$oid":refs/heads/actual && + main "$oid":refs/heads/actual && - git -C "$REPO" rev-parse "master" "b" >expected && - git -C local rev-parse refs/remotes/origin/master refs/heads/actual >actual && + git -C "$REPO" rev-parse "main" "b" >expected && + git -C local rev-parse refs/remotes/origin/main refs/heads/actual >actual && test_cmp expected actual && grep "want $oid" log && - grep "want-ref refs/heads/master" log + grep "want-ref refs/heads/main" log ' test_expect_success 'fetching with wildcard that does not match any refs' ' @@ -301,7 +306,7 @@ LOCAL_PRISTINE="$(pwd)/local_pristine" test_expect_success 'setup repos for change-while-negotiating test' ' ( - git init "$REPO" && + git init -b main "$REPO" && cd "$REPO" && >.git/git-daemon-export-ok && test_commit m1 && @@ -316,7 +321,7 @@ test_expect_success 'setup repos for change-while-negotiating test' ' test_commit_bulk --id=s 33 && # Add novel commits to upstream - git checkout master && + git checkout main && cd "$REPO" && test_commit m2 && test_commit m3 && @@ -342,7 +347,7 @@ test_expect_success 'server is initially ahead - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master $(test_oid numeric) && + inconsistency main $(test_oid numeric) && test_must_fail git -C local fetch 2>err && test_i18ngrep "fatal: remote error: upload-pack: not our ref" err ' @@ -351,11 +356,11 @@ test_expect_success 'server is initially ahead - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master $(test_oid numeric) && + inconsistency main $(test_oid numeric) && git -C local fetch && - git -C "$REPO" rev-parse --verify master >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify main >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -363,11 +368,11 @@ test_expect_success 'server is initially behind - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master "master^" && + inconsistency main "main^" && git -C local fetch && - git -C "$REPO" rev-parse --verify "master^" >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify "main^" >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -375,11 +380,11 @@ test_expect_success 'server is initially behind - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - inconsistency master "master^" && + inconsistency main "main^" && git -C local fetch && - git -C "$REPO" rev-parse --verify "master" >expected && - git -C local rev-parse --verify refs/remotes/origin/master >actual && + git -C "$REPO" rev-parse --verify "main" >expected && + git -C local rev-parse --verify refs/remotes/origin/main >actual && test_cmp expected actual ' @@ -387,10 +392,10 @@ test_expect_success 'server loses a ref - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - echo "s/master/raster/" >"$HTTPD_ROOT_PATH/one-time-perl" && + echo "s/main/rain/" >"$HTTPD_ROOT_PATH/one-time-perl" && test_must_fail git -C local fetch 2>err && - test_i18ngrep "fatal: remote error: unknown ref refs/heads/raster" err + test_i18ngrep "fatal: remote error: unknown ref refs/heads/rain" err ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5705-session-id-in-capabilities.sh b/t/t5705-session-id-in-capabilities.sh new file mode 100755 index 0000000000..f1d189d5bc --- /dev/null +++ b/t/t5705-session-id-in-capabilities.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +test_description='session ID in capabilities' + +. ./test-lib.sh + +REPO="$(pwd)/repo" +LOCAL_PRISTINE="$(pwd)/local_pristine" + +test_expect_success 'setup repos for session ID capability tests' ' + git init "$REPO" && + test_commit -C "$REPO" a && + git clone "file://$REPO" "$LOCAL_PRISTINE" && + test_commit -C "$REPO" b +' + +for PROTO in 0 1 2 +do + test_expect_success "session IDs not advertised by default (fetch v${PROTO})" ' + test_when_finished "rm -rf local tr2-client-events tr2-server-events" && + cp -r "$LOCAL_PRISTINE" local && + GIT_TRACE2_EVENT="$(pwd)/tr2-client-events" \ + git -c protocol.version=$PROTO -C local fetch \ + --upload-pack "GIT_TRACE2_EVENT=\"$(pwd)/tr2-server-events\" git-upload-pack" \ + origin && + test -z "$(grep \"key\":\"server-sid\" tr2-client-events)" && + test -z "$(grep \"key\":\"client-sid\" tr2-server-events)" + ' + + test_expect_success "session IDs not advertised by default (push v${PROTO})" ' + test_when_finished "rm -rf local tr2-client-events tr2-server-events" && + test_when_finished "git -C local push --delete origin new-branch" && + cp -r "$LOCAL_PRISTINE" local && + git -C local pull --no-rebase origin && + GIT_TRACE2_EVENT_NESTING=5 \ + GIT_TRACE2_EVENT="$(pwd)/tr2-client-events" \ + git -c protocol.version=$PROTO -C local push \ + --receive-pack "GIT_TRACE2_EVENT=\"$(pwd)/tr2-server-events\" git-receive-pack" \ + origin HEAD:new-branch && + test -z "$(grep \"key\":\"server-sid\" tr2-client-events)" && + test -z "$(grep \"key\":\"client-sid\" tr2-server-events)" + ' +done + +test_expect_success 'enable SID advertisement' ' + git -C "$REPO" config transfer.advertiseSID true && + git -C "$LOCAL_PRISTINE" config transfer.advertiseSID true +' + +for PROTO in 0 1 2 +do + test_expect_success "session IDs advertised (fetch v${PROTO})" ' + test_when_finished "rm -rf local tr2-client-events tr2-server-events" && + cp -r "$LOCAL_PRISTINE" local && + GIT_TRACE2_EVENT="$(pwd)/tr2-client-events" \ + git -c protocol.version=$PROTO -C local fetch \ + --upload-pack "GIT_TRACE2_EVENT=\"$(pwd)/tr2-server-events\" git-upload-pack" \ + origin && + grep \"key\":\"server-sid\" tr2-client-events && + grep \"key\":\"client-sid\" tr2-server-events + ' + + test_expect_success "session IDs advertised (push v${PROTO})" ' + test_when_finished "rm -rf local tr2-client-events tr2-server-events" && + test_when_finished "git -C local push --delete origin new-branch" && + cp -r "$LOCAL_PRISTINE" local && + git -C local pull --no-rebase origin && + GIT_TRACE2_EVENT_NESTING=5 \ + GIT_TRACE2_EVENT="$(pwd)/tr2-client-events" \ + git -c protocol.version=$PROTO -C local push \ + --receive-pack "GIT_TRACE2_EVENT=\"$(pwd)/tr2-server-events\" git-receive-pack" \ + origin HEAD:new-branch && + grep \"key\":\"server-sid\" tr2-client-events && + grep \"key\":\"client-sid\" tr2-server-events + ' +done + +test_done diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh index 0f04b6cddb..d386076dbd 100755 --- a/t/t5801-remote-helpers.sh +++ b/t/t5801-remote-helpers.sh @@ -5,6 +5,9 @@ test_description='Test remote-helper import and export commands' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh @@ -71,18 +74,18 @@ test_expect_success 'fetch multiple branches' ' (cd local && git fetch ) && - compare_refs server master local refs/remotes/origin/master && + compare_refs server main local refs/remotes/origin/main && compare_refs server new local refs/remotes/origin/new ' test_expect_success 'push when remote has extra refs' ' (cd local && - git reset --hard origin/master && + git reset --hard origin/main && echo content >>file && git commit -a -m six && git push ) && - compare_refs local master server master + compare_refs local main server main ' test_expect_success 'push new branch by name' ' @@ -174,7 +177,7 @@ test_expect_failure 'pushing without marks' ' test_expect_success 'push all with existing object' ' (cd local && - git branch dup2 master && + git branch dup2 main && git push origin --all ) && compare_refs local dup2 server dup2 @@ -182,7 +185,7 @@ test_expect_success 'push all with existing object' ' test_expect_success 'push ref with existing object' ' (cd local && - git branch dup master && + git branch dup main && git push origin dup ) && compare_refs local dup server dup @@ -190,7 +193,7 @@ test_expect_success 'push ref with existing object' ' test_expect_success GPG 'push signed tag' ' (cd local && - git checkout master && + git checkout main && git tag -s -m signed-tag signed-tag && git push origin signed-tag ) && @@ -200,7 +203,7 @@ test_expect_success GPG 'push signed tag' ' test_expect_success GPG 'push signed tag with signed-tags capability' ' (cd local && - git checkout master && + git checkout main && git tag -s -m signed-tag signed-tag-2 && GIT_REMOTE_TESTGIT_SIGNED_TAGS=1 git push origin signed-tag-2 ) && @@ -209,7 +212,7 @@ test_expect_success GPG 'push signed tag with signed-tags capability' ' test_expect_success 'push update refs' ' (cd local && - git checkout -b update master && + git checkout -b update main && echo update >>file && git commit -a -m update && git push origin update && @@ -260,7 +263,7 @@ test_expect_success 'proper failure checks for fetching' ' test_expect_success 'proper failure checks for pushing' ' test_when_finished "rm -rf local/git.marks local/testgit.marks" && (cd local && - git checkout -b crash master && + git checkout -b crash main && echo crash >>file && git commit -a -m crash && test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all && @@ -272,7 +275,7 @@ test_expect_success 'proper failure checks for pushing' ' test_expect_success 'push messages' ' (cd local && - git checkout -b new_branch master && + git checkout -b new_branch main && echo new >>file && git commit -a -m new && git push origin new_branch && @@ -286,7 +289,7 @@ test_expect_success 'push messages' ' test_expect_success 'fetch HEAD' ' (cd server && - git checkout master && + git checkout main && echo more >>file && git commit -a -m more ) && @@ -298,7 +301,7 @@ test_expect_success 'fetch HEAD' ' test_expect_success 'fetch url' ' (cd server && - git checkout master && + git checkout main && echo more >>file && git commit -a -m more ) && diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index fc4d55dcb2..12def7bcbf 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -2,6 +2,9 @@ test_description='miscellaneous rev-list tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -85,7 +88,7 @@ test_expect_success 'propagate uninteresting flag down correctly' ' ' test_expect_success 'symleft flag bit is propagated down from tag' ' - git log --format="%m %s" --left-right v1.0...master >actual && + git log --format="%m %s" --left-right v1.0...main >actual && cat >expect <<-\EOF && < another < that diff --git a/t/t6001-rev-list-graft.sh b/t/t6001-rev-list-graft.sh index 7504ba4751..90d93f77fa 100755 --- a/t/t6001-rev-list-graft.sh +++ b/t/t6001-rev-list-graft.sh @@ -2,6 +2,9 @@ test_description='Revision traversal vs grafts and path limiter' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -20,7 +23,7 @@ test_expect_success setup ' git commit -a -m "Third in one history." && A2=$(git rev-parse --verify HEAD) && - rm -f .git/refs/heads/master .git/index && + rm -f .git/refs/heads/main .git/index && echo >fileA fileA again && echo >subdir/fileB fileB again && diff --git a/t/t6004-rev-list-path-optim.sh b/t/t6004-rev-list-path-optim.sh index 3e8c42ee0b..cd4f420e2a 100755 --- a/t/t6004-rev-list-path-optim.sh +++ b/t/t6004-rev-list-path-optim.sh @@ -4,7 +4,7 @@ test_description='git rev-list trivial path optimization test d/z1 b0 b1 - o------------------------*----o master + o------------------------*----o main / / o---------o----o----o----o side a0 c0 c1 a1 c2 @@ -13,6 +13,9 @@ test_description='git rev-list trivial path optimization test ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -55,18 +58,18 @@ test_expect_success 'further setup' ' git add c && test_tick && git commit -m "Side makes yet another irrelevant commit" && - git checkout master && + git checkout main && echo Another >b && echo Munged >d/z && git add b d/z && test_tick && - git commit -m "Master touches b" && - git tag master_b0 && + git commit -m "Main touches b" && + git tag main_b0 && git merge side && echo Touched >b && git add b && test_tick && - git commit -m "Master touches b again" + git commit -m "Main touches b again" ' test_expect_success 'path optimization 2' ' @@ -76,13 +79,13 @@ test_expect_success 'path optimization 2' ' ' test_expect_success 'pathspec with leading path' ' - git rev-parse master^ master_b0 side_c0 initial >expected && + git rev-parse main^ main_b0 side_c0 initial >expected && git rev-list HEAD -- d >actual && test_cmp expected actual ' test_expect_success 'pathspec with glob (1)' ' - git rev-parse master^ master_b0 side_c0 initial >expected && + git rev-parse main^ main_b0 side_c0 initial >expected && git rev-list HEAD -- "d/*" >actual && test_cmp expected actual ' diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh index bc95da8a5f..41d0ca00b1 100755 --- a/t/t6006-rev-list-format.sh +++ b/t/t6006-rev-list-format.sh @@ -5,6 +5,9 @@ test_description='git rev-list --pretty=format test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -38,22 +41,59 @@ test_expect_success 'setup' ' echo "$added_iso88591" | git commit -F - && head1=$(git rev-parse --verify HEAD) && head1_short=$(git rev-parse --verify --short $head1) && + head1_short4=$(git rev-parse --verify --short=4 $head1) && tree1=$(git rev-parse --verify HEAD:) && tree1_short=$(git rev-parse --verify --short $tree1) && echo "$changed" > foo && echo "$changed_iso88591" | git commit -a -F - && head2=$(git rev-parse --verify HEAD) && head2_short=$(git rev-parse --verify --short $head2) && + head2_short4=$(git rev-parse --verify --short=4 $head2) && tree2=$(git rev-parse --verify HEAD:) && tree2_short=$(git rev-parse --verify --short $tree2) && git config --unset i18n.commitEncoding ' -# usage: test_format name format_string [failure] <expected_output +# usage: test_format [argument...] name format_string [failure] <expected_output test_format () { + local args= + while true + do + case "$1" in + --*) + args="$args $1" + shift;; + *) + break;; + esac + done cat >expect.$1 test_expect_${3:-success} "format $1" " - git rev-list --pretty=format:'$2' master >output.$1 && + git rev-list $args --pretty=format:'$2' main >output.$1 && + test_cmp expect.$1 output.$1 + " +} + +# usage: test_pretty [argument...] name format_name [failure] <expected_output +test_pretty () { + local args= + while true + do + case "$1" in + --*) + args="$args $1" + shift;; + *) + break;; + esac + done + cat >expect.$1 + test_expect_${3:-success} "pretty $1 (without --no-commit-header)" " + git rev-list $args --pretty='$2' main >output.$1 && + test_cmp expect.$1 output.$1 + " + test_expect_${3:-success} "pretty $1 (with --no-commit-header)" " + git rev-list $args --no-commit-header --pretty='$2' main >output.$1 && test_cmp expect.$1 output.$1 " } @@ -90,6 +130,20 @@ $head1 $head1_short EOF +test_format --no-commit-header hash-no-header %H%n%h <<EOF +$head2 +$head2_short +$head1 +$head1_short +EOF + +test_format --abbrev-commit --abbrev=0 --no-commit-header hash-no-header-abbrev %H%n%h <<EOF +$head2 +$head2_short4 +$head1 +$head1_short4 +EOF + test_format tree %T%n%t <<EOF commit $head2 $tree2 @@ -178,19 +232,44 @@ $added EOF +test_format --no-commit-header raw-body-no-header %B <<EOF +$changed + +$added + +EOF + +test_pretty oneline oneline <<EOF +$head2 $changed +$head1 $added +EOF + +test_pretty short short <<EOF +commit $head2 +Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + + $changed + +commit $head1 +Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> + + $added + +EOF + test_expect_success 'basic colors' ' cat >expect <<-EOF && commit $head2 <RED>foo<GREEN>bar<BLUE>baz<RESET>xyzzy EOF format="%Credfoo%Cgreenbar%Cbluebaz%Cresetxyzzy" && - git rev-list --color --format="$format" -1 master >actual.raw && + git rev-list --color --format="$format" -1 main >actual.raw && test_decode_color <actual.raw >actual && test_cmp expect actual ' test_expect_success '%S is not a placeholder for rev-list yet' ' - git rev-list --format="%S" -1 master | grep "%S" + git rev-list --format="%S" -1 main | grep "%S" ' test_expect_success 'advanced colors' ' @@ -199,7 +278,7 @@ test_expect_success 'advanced colors' ' <BOLD;RED;BYELLOW>foo<RESET> EOF format="%C(red yellow bold)foo%C(reset)" && - git rev-list --color --format="$format" -1 master >actual.raw && + git rev-list --color --format="$format" -1 main >actual.raw && test_decode_color <actual.raw >actual && test_cmp expect actual ' @@ -339,7 +418,7 @@ commit $head1 .. (hinzugef${added_utf8_part_iso88591}gt) foo EOF -test_expect_success 'prepare expected messages (for test %b)' ' +test_expect_success 'setup expected messages (for test %b)' ' cat <<-EOF >expected.utf-8 && commit $head3 This commit message is much longer than the others, @@ -406,7 +485,7 @@ test_expect_success '%x00 shows NUL' ' test_expect_success '%ad respects --date=' ' echo 2005-04-07 >expect.ad-short && - git log -1 --date=short --pretty=tformat:%ad >output.ad-short master && + git log -1 --date=short --pretty=tformat:%ad >output.ad-short main && test_cmp expect.ad-short output.ad-short ' @@ -494,8 +573,8 @@ test_expect_success '"%h %gD: %gs" is same as git-reflog (with --abbrev)' ' ' test_expect_success '%gd shortens ref name' ' - echo "master@{0}" >expect.gd-short && - git log -g -1 --format=%gd refs/heads/master >actual.gd-short && + echo "main@{0}" >expect.gd-short && + git log -g -1 --format=%gd refs/heads/main >actual.gd-short && test_cmp expect.gd-short actual.gd-short ' diff --git a/t/t6007-rev-list-cherry-pick-file.sh b/t/t6007-rev-list-cherry-pick-file.sh index f0268372d2..aebe4b69e1 100755 --- a/t/t6007-rev-list-cherry-pick-file.sh +++ b/t/t6007-rev-list-cherry-pick-file.sh @@ -2,6 +2,9 @@ test_description='test git rev-list --cherry-pick -- file' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # A---B---D---F @@ -31,7 +34,7 @@ test_expect_success setup ' test_tick && git commit -m "E" && git tag E && - git checkout master && + git checkout main && git checkout branch foo && test_tick && git commit -m "B" && @@ -233,7 +236,7 @@ test_expect_success '--cherry-pick with independent, but identical branches' ' test_tick && git commit -m "independent, too" foo && test -z "$(git rev-list --left-right --cherry-pick \ - HEAD...master -- foo)" + HEAD...main -- foo)" ' cat >expect <<EOF @@ -245,6 +248,18 @@ test_expect_success '--count --left-right' ' test_cmp expect actual ' +test_expect_success '--cherry-pick with duplicates on each side' ' + git checkout -b dup-orig && + test_commit dup-base && + git revert dup-base && + git cherry-pick dup-base && + git checkout -b dup-side HEAD~3 && + test_tick && + git cherry-pick -3 dup-orig && + git rev-list --cherry-pick dup-orig...dup-side >actual && + test_must_be_empty actual +' + # Corrupt the object store deliberately to make sure # the object is not even checked for its existence. remove_loose_object () { diff --git a/t/t6008-rev-list-submodule.sh b/t/t6008-rev-list-submodule.sh index c4af9ca0a7..3153a0d891 100755 --- a/t/t6008-rev-list-submodule.sh +++ b/t/t6008-rev-list-submodule.sh @@ -5,6 +5,9 @@ test_description='git rev-list involving submodules that this repo has' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -36,7 +39,7 @@ test_expect_success 'setup' ' ' test_expect_success "Ilari's test" ' - git rev-list --objects super master ^super^ + git rev-list --objects super main ^super^ ' test_done diff --git a/t/t6009-rev-list-parent.sh b/t/t6009-rev-list-parent.sh index 916d9692bc..63fa7c8313 100755 --- a/t/t6009-rev-list-parent.sh +++ b/t/t6009-rev-list-parent.sh @@ -2,6 +2,9 @@ test_description='ancestor culling and limiting by parent number' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_revlist () { @@ -45,7 +48,7 @@ test_expect_success 'setup roots, merges and octopuses' ' test_commit seven && git checkout -b yetanotherbranch four && test_commit eight && - git checkout master && + git checkout main && test_tick && git merge --allow-unrelated-histories -m normalmerge newroot && git tag normalmerge && @@ -56,7 +59,7 @@ test_expect_success 'setup roots, merges and octopuses' ' test_tick && git merge -m tetrapus sidebranch anotherbranch yetanotherbranch && git tag tetrapus && - git checkout master + git checkout main ' test_expect_success 'rev-list roots' ' @@ -123,7 +126,7 @@ test_expect_success 'dodecapus' ' roots="$roots root$i" || return done && - git checkout master && + git checkout main && test_tick && git merge -m dodecapus $roots && git tag dodecapus && diff --git a/t/t6012-rev-list-simplify.sh b/t/t6012-rev-list-simplify.sh index b6fa43ace0..4f7fa8b6c0 100755 --- a/t/t6012-rev-list-simplify.sh +++ b/t/t6012-rev-list-simplify.sh @@ -2,6 +2,9 @@ test_description='merge simplification' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh note () { @@ -43,7 +46,7 @@ test_expect_success setup ' git add side && test_tick && git commit -m "Side root" && note J && - git checkout master && + git checkout main && echo "Hello" >file && echo "second" >lost && @@ -65,7 +68,7 @@ test_expect_success setup ' note D && test_tick && - test_must_fail git merge -m "merge" master && + test_must_fail git merge -m "merge" main && >lost && git commit -a -m "merge" && note E && @@ -74,7 +77,7 @@ test_expect_success setup ' test_tick && git commit -m "Irrelevant change" && note F && - git checkout master && + git checkout main && echo "Yet another" >elif && git add elif && test_tick && git commit -m "Another irrelevant change" && @@ -87,7 +90,7 @@ test_expect_success setup ' test_tick && git commit -a -m "Final change" && note I && - git checkout master && + git checkout main && test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated && note K && @@ -168,10 +171,10 @@ test_expect_success '--full-diff is not affected by --parents' ' # # This example is explained in Documentation/rev-list-options.txt -test_expect_success 'rebuild repo' ' +test_expect_success 'setup rebuild repo' ' rm -rf .git * && git init && - git switch -c main && + git switch -c topic && echo base >file && git add file && @@ -186,7 +189,7 @@ test_expect_success 'rebuild repo' ' git add file && test_commit B && - git switch main && + git switch topic && test_must_fail git merge -m "M" B && echo A >file && echo B >>file && @@ -207,7 +210,7 @@ test_expect_success 'rebuild repo' ' git merge -m R -Xtheirs X && note R && - git switch main && + git switch topic && git merge -m N R && note N && @@ -221,7 +224,7 @@ test_expect_success 'rebuild repo' ' git add z && test_commit Z && - git switch main && + git switch topic && git merge -m O Z && note O && diff --git a/t/t6013-rev-list-reverse-parents.sh b/t/t6013-rev-list-reverse-parents.sh index 89458d370f..39793cbbd6 100755 --- a/t/t6013-rev-list-reverse-parents.sh +++ b/t/t6013-rev-list-reverse-parents.sh @@ -2,6 +2,9 @@ test_description='--reverse combines with --parents' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh @@ -18,24 +21,24 @@ test_expect_success 'set up --reverse example' ' commit two && git checkout -b side HEAD^ && commit three && - git checkout master && + git checkout main && git merge -s ours side && commit five ' test_expect_success '--reverse --parents --full-history combines correctly' ' - git rev-list --parents --full-history master -- foo | + git rev-list --parents --full-history main -- foo | perl -e "print reverse <>" > expected && - git rev-list --reverse --parents --full-history master -- foo \ + git rev-list --reverse --parents --full-history main -- foo \ > actual && test_cmp expected actual ' test_expect_success '--boundary does too' ' - git rev-list --boundary --parents --full-history master ^root -- foo | + git rev-list --boundary --parents --full-history main ^root -- foo | perl -e "print reverse <>" > expected && git rev-list --boundary --reverse --parents --full-history \ - master ^root -- foo > actual && + main ^root -- foo > actual && test_cmp expected actual ' diff --git a/t/t6016-rev-list-graph-simplify-history.sh b/t/t6016-rev-list-graph-simplify-history.sh index f5e6e92f5b..54b0a6f5f8 100755 --- a/t/t6016-rev-list-graph-simplify-history.sh +++ b/t/t6016-rev-list-graph-simplify-history.sh @@ -7,14 +7,23 @@ test_description='--graph and simplified history' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-log-graph.sh + +check_graph () { + cat >expect && + lib_test_cmp_graph --format=%s "$@" +} test_expect_success 'set up rev-list --graph test' ' # 3 commits on branch A test_commit A1 foo.txt && test_commit A2 bar.txt && test_commit A3 bar.txt && - git branch -m master A && + git branch -m main A && # 2 commits on branch B, started from A1 git checkout -b B A1 && @@ -28,7 +37,7 @@ test_expect_success 'set up rev-list --graph test' ' # Octopus merge B and C into branch A git checkout A && - git merge B C && + git merge B C -m A4 && git tag A4 && test_commit A5 bar.txt && @@ -38,81 +47,64 @@ test_expect_success 'set up rev-list --graph test' ' test_commit C3 foo.txt && test_commit C4 bar.txt && git checkout A && - git merge -s ours C && + git merge -s ours C -m A6 && git tag A6 && - test_commit A7 bar.txt && - - # Store commit names in variables for later use - A1=$(git rev-parse --verify A1) && - A2=$(git rev-parse --verify A2) && - A3=$(git rev-parse --verify A3) && - A4=$(git rev-parse --verify A4) && - A5=$(git rev-parse --verify A5) && - A6=$(git rev-parse --verify A6) && - A7=$(git rev-parse --verify A7) && - B1=$(git rev-parse --verify B1) && - B2=$(git rev-parse --verify B2) && - C1=$(git rev-parse --verify C1) && - C2=$(git rev-parse --verify C2) && - C3=$(git rev-parse --verify C3) && - C4=$(git rev-parse --verify C4) - ' + test_commit A7 bar.txt +' test_expect_success '--graph --all' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "| * $C3" >> expected && - echo "* | $A5" >> expected && - echo "| | " >> expected && - echo "| \\ " >> expected && - echo "*-. | $A4" >> expected && - echo "|\\ \\| " >> expected && - echo "| | * $C2" >> expected && - echo "| | * $C1" >> expected && - echo "| * | $B2" >> expected && - echo "| * | $B1" >> expected && - echo "* | | $A3" >> expected && - echo "| |/ " >> expected && - echo "|/| " >> expected && - echo "* | $A2" >> expected && - echo "|/ " >> expected && - echo "* $A1" >> expected && - git rev-list --graph --all > actual && - test_cmp expected actual - ' + check_graph --all <<-\EOF + * A7 + * A6 + |\ + | * C4 + | * C3 + * | A5 + | | + | \ + *-. | A4 + |\ \| + | | * C2 + | | * C1 + | * | B2 + | * | B1 + * | | A3 + | |/ + |/| + * | A2 + |/ + * A1 + EOF +' # Make sure the graph_is_interesting() code still realizes # that undecorated merges are interesting, even with --simplify-by-decoration test_expect_success '--graph --simplify-by-decoration' ' - rm -f expected && git tag -d A4 && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "| * $C3" >> expected && - echo "* | $A5" >> expected && - echo "| | " >> expected && - echo "| \\ " >> expected && - echo "*-. | $A4" >> expected && - echo "|\\ \\| " >> expected && - echo "| | * $C2" >> expected && - echo "| | * $C1" >> expected && - echo "| * | $B2" >> expected && - echo "| * | $B1" >> expected && - echo "* | | $A3" >> expected && - echo "| |/ " >> expected && - echo "|/| " >> expected && - echo "* | $A2" >> expected && - echo "|/ " >> expected && - echo "* $A1" >> expected && - git rev-list --graph --all --simplify-by-decoration > actual && - test_cmp expected actual - ' + check_graph --all --simplify-by-decoration <<-\EOF + * A7 + * A6 + |\ + | * C4 + | * C3 + * | A5 + | | + | \ + *-. | A4 + |\ \| + | | * C2 + | | * C1 + | * | B2 + | * | B1 + * | | A3 + | |/ + |/| + * | A2 + |/ + * A1 + EOF +' test_expect_success 'setup: get rid of decorations on B' ' git tag -d B2 && @@ -122,142 +114,133 @@ test_expect_success 'setup: get rid of decorations on B' ' # Graph with branch B simplified away test_expect_success '--graph --simplify-by-decoration prune branch B' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "| * $C3" >> expected && - echo "* | $A5" >> expected && - echo "* | $A4" >> expected && - echo "|\\| " >> expected && - echo "| * $C2" >> expected && - echo "| * $C1" >> expected && - echo "* | $A3" >> expected && - echo "|/ " >> expected && - echo "* $A2" >> expected && - echo "* $A1" >> expected && - git rev-list --graph --simplify-by-decoration --all > actual && - test_cmp expected actual - ' + check_graph --simplify-by-decoration --all <<-\EOF + * A7 + * A6 + |\ + | * C4 + | * C3 + * | A5 + * | A4 + |\| + | * C2 + | * C1 + * | A3 + |/ + * A2 + * A1 + EOF +' test_expect_success '--graph --full-history -- bar.txt' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "* | $A5" >> expected && - echo "* | $A4" >> expected && - echo "|\\| " >> expected && - echo "* | $A3" >> expected && - echo "|/ " >> expected && - echo "* $A2" >> expected && - git rev-list --graph --full-history --all -- bar.txt > actual && - test_cmp expected actual - ' + check_graph --full-history --all -- bar.txt <<-\EOF + * A7 + * A6 + |\ + | * C4 + * | A5 + * | A4 + |\| + * | A3 + |/ + * A2 + EOF +' test_expect_success '--graph --full-history --simplify-merges -- bar.txt' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "* | $A5" >> expected && - echo "* | $A3" >> expected && - echo "|/ " >> expected && - echo "* $A2" >> expected && - git rev-list --graph --full-history --simplify-merges --all \ - -- bar.txt > actual && - test_cmp expected actual - ' + check_graph --full-history --simplify-merges --all -- bar.txt <<-\EOF + * A7 + * A6 + |\ + | * C4 + * | A5 + * | A3 + |/ + * A2 + EOF +' test_expect_success '--graph -- bar.txt' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A5" >> expected && - echo "* $A3" >> expected && - echo "| * $C4" >> expected && - echo "|/ " >> expected && - echo "* $A2" >> expected && - git rev-list --graph --all -- bar.txt > actual && - test_cmp expected actual - ' + check_graph --all -- bar.txt <<-\EOF + * A7 + * A5 + * A3 + | * C4 + |/ + * A2 + EOF +' test_expect_success '--graph --sparse -- bar.txt' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "* $A5" >> expected && - echo "* $A4" >> expected && - echo "* $A3" >> expected && - echo "| * $C4" >> expected && - echo "| * $C3" >> expected && - echo "| * $C2" >> expected && - echo "| * $C1" >> expected && - echo "|/ " >> expected && - echo "* $A2" >> expected && - echo "* $A1" >> expected && - git rev-list --graph --sparse --all -- bar.txt > actual && - test_cmp expected actual - ' + check_graph --sparse --all -- bar.txt <<-\EOF + * A7 + * A6 + * A5 + * A4 + * A3 + | * C4 + | * C3 + | * C2 + | * C1 + |/ + * A2 + * A1 + EOF +' test_expect_success '--graph ^C4' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "* $A5" >> expected && - echo "* $A4" >> expected && - echo "|\\ " >> expected && - echo "| * $B2" >> expected && - echo "| * $B1" >> expected && - echo "* $A3" >> expected && - git rev-list --graph --all ^C4 > actual && - test_cmp expected actual - ' + check_graph --all ^C4 <<-\EOF + * A7 + * A6 + * A5 + * A4 + |\ + | * B2 + | * B1 + * A3 + EOF +' test_expect_success '--graph ^C3' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "* $A5" >> expected && - echo "* $A4" >> expected && - echo "|\\ " >> expected && - echo "| * $B2" >> expected && - echo "| * $B1" >> expected && - echo "* $A3" >> expected && - git rev-list --graph --all ^C3 > actual && - test_cmp expected actual - ' + check_graph --all ^C3 <<-\EOF + * A7 + * A6 + |\ + | * C4 + * A5 + * A4 + |\ + | * B2 + | * B1 + * A3 + EOF +' # I don't think the ordering of the boundary commits is really # that important, but this test depends on it. If the ordering ever changes # in the code, we'll need to update this test. test_expect_success '--graph --boundary ^C3' ' - rm -f expected && - echo "* $A7" >> expected && - echo "* $A6" >> expected && - echo "|\\ " >> expected && - echo "| * $C4" >> expected && - echo "* | $A5" >> expected && - echo "| | " >> expected && - echo "| \\ " >> expected && - echo "*-. \\ $A4" >> expected && - echo "|\\ \\ \\ " >> expected && - echo "| * | | $B2" >> expected && - echo "| * | | $B1" >> expected && - echo "* | | | $A3" >> expected && - echo "o | | | $A2" >> expected && - echo "|/ / / " >> expected && - echo "o / / $A1" >> expected && - echo " / / " >> expected && - echo "| o $C3" >> expected && - echo "|/ " >> expected && - echo "o $C2" >> expected && - git rev-list --graph --boundary --all ^C3 > actual && - test_cmp expected actual - ' + check_graph --boundary --all ^C3 <<-\EOF + * A7 + * A6 + |\ + | * C4 + * | A5 + | | + | \ + *-. \ A4 + |\ \ \ + | * | | B2 + | * | | B1 + * | | | A3 + o | | | A2 + |/ / / + o / / A1 + / / + | o C3 + |/ + o C2 + EOF +' test_done diff --git a/t/t6017-rev-list-stdin.sh b/t/t6017-rev-list-stdin.sh index 667b37564e..05162512a0 100755 --- a/t/t6017-rev-list-stdin.sh +++ b/t/t6017-rev-list-stdin.sh @@ -5,6 +5,9 @@ test_description='log family learns --stdin' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check () { @@ -40,7 +43,7 @@ test_expect_success setup ' done && for i in $them do - git checkout -b side-$i master~$i && + git checkout -b side-$i main~$i && echo updated $i >file-$i && git add file-$i && test_tick && @@ -49,7 +52,7 @@ test_expect_success setup ' ) ' -check master +check main check side-1 ^side-4 check side-1 ^side-7 -- check side-1 ^side-7 -- file-1 @@ -66,11 +69,11 @@ test_expect_success 'not only --stdin' ' file-2 EOF cat >input <<-EOF && - ^master^ + ^main^ -- file-2 EOF - git log --pretty=tformat:%s --name-only --stdin master -- file-1 \ + git log --pretty=tformat:%s --name-only --stdin main -- file-1 \ <input >actual && test_cmp expect actual ' diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh index b31ff7eeec..24b34add83 100755 --- a/t/t6018-rev-list-glob.sh +++ b/t/t6018-rev-list-glob.sh @@ -2,6 +2,9 @@ test_description='rev-list/rev-parse --glob' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh commit () { @@ -20,23 +23,23 @@ compare () { test_expect_success 'setup' ' - commit master && - git checkout -b subspace/one master && + commit main && + git checkout -b subspace/one main && commit one && - git checkout -b subspace/two master && + git checkout -b subspace/two main && commit two && - git checkout -b subspace-x master && + git checkout -b subspace-x main && commit subspace-x && - git checkout -b other/three master && + git checkout -b other/three main && commit three && - git checkout -b someref master && + git checkout -b someref main && commit some && - git checkout master && - commit master2 && - git tag foo/bar master && - commit master3 && - git update-ref refs/remotes/foo/baz master && - commit master4 && + git checkout main && + commit topic_2 && + git tag foo/bar main && + commit topic_3 && + git update-ref refs/remotes/foo/baz main && + commit topic_4 && git update-ref refs/remotes/upstream/one subspace/one && git update-ref refs/remotes/upstream/two subspace/two && git update-ref refs/remotes/upstream/x subspace-x && @@ -83,7 +86,7 @@ test_expect_failure 'rev-parse accepts --glob as detached option' ' test_expect_failure 'rev-parse is not confused by option-like glob' ' - compare rev-parse "master" "--glob --symbolic master" + compare rev-parse "main" "--glob --symbolic main" ' @@ -111,15 +114,15 @@ test_expect_success 'rev-parse --glob=heads/subspace/* --glob=heads/other/*' ' ' -test_expect_success 'rev-parse --glob=heads/someref/* master' ' +test_expect_success 'rev-parse --glob=heads/someref/* main' ' - compare rev-parse "master" "--glob=heads/someref/* master" + compare rev-parse "main" "--glob=heads/someref/* main" ' test_expect_success 'rev-parse --glob=heads/*' ' - compare rev-parse "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" + compare rev-parse "main other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" ' @@ -136,7 +139,7 @@ test_expect_success 'rev-parse --remotes=foo' ' ' test_expect_success 'rev-parse --exclude with --branches' ' - compare rev-parse "--exclude=*/* --branches" "master someref subspace-x" + compare rev-parse "--exclude=*/* --branches" "main someref subspace-x" ' test_expect_success 'rev-parse --exclude with --all' ' @@ -221,7 +224,7 @@ test_expect_success 'rev-list --glob refs/heads/subspace/*' ' test_expect_success 'rev-list not confused by option-like --glob arg' ' - compare rev-list "master" "--glob -0 master" + compare rev-list "main" "--glob -0 main" ' @@ -269,13 +272,13 @@ test_expect_success 'rev-list --branches=subspace' ' test_expect_success 'rev-list --branches' ' - compare rev-list "master subspace-x someref other/three subspace/one subspace/two" "--branches" + compare rev-list "main subspace-x someref other/three subspace/one subspace/two" "--branches" ' -test_expect_success 'rev-list --glob=heads/someref/* master' ' +test_expect_success 'rev-list --glob=heads/someref/* main' ' - compare rev-list "master" "--glob=heads/someref/* master" + compare rev-list "main" "--glob=heads/someref/* main" ' @@ -287,7 +290,7 @@ test_expect_success 'rev-list --glob=heads/subspace/* --glob=heads/other/*' ' test_expect_success 'rev-list --glob=heads/*' ' - compare rev-list "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" + compare rev-list "main other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" ' @@ -310,7 +313,7 @@ test_expect_success 'rev-list --remotes=foo' ' ' test_expect_success 'rev-list --exclude with --branches' ' - compare rev-list "--exclude=*/* --branches" "master someref subspace-x" + compare rev-list "--exclude=*/* --branches" "main someref subspace-x" ' test_expect_success 'rev-list --exclude with --all' ' @@ -354,13 +357,13 @@ test_expect_success 'shortlog accepts --glob/--tags/--remotes' ' compare shortlog "subspace/one subspace/two" --branches=subspace && compare shortlog \ - "master subspace-x someref other/three subspace/one subspace/two" \ + "main subspace-x someref other/three subspace/one subspace/two" \ --branches && - compare shortlog master "--glob=heads/someref/* master" && + compare shortlog main "--glob=heads/someref/* main" && compare shortlog "subspace/one subspace/two other/three" \ "--glob=heads/subspace/* --glob=heads/other/*" && compare shortlog \ - "master other/three someref subspace-x subspace/one subspace/two" \ + "main other/three someref subspace-x subspace/one subspace/two" \ "--glob=heads/*" && compare shortlog foo/bar --tags=foo && compare shortlog "foo/bar qux/one qux/two qux/x" --tags && @@ -371,14 +374,14 @@ test_expect_success 'shortlog accepts --glob/--tags/--remotes' ' test_expect_failure 'shortlog accepts --glob as detached option' ' compare shortlog \ - "master other/three someref subspace-x subspace/one subspace/two" \ + "main other/three someref subspace-x subspace/one subspace/two" \ "--glob heads/*" ' test_expect_failure 'shortlog --glob is not confused by option-like argument' ' - compare shortlog master "--glob -e master" + compare shortlog main "--glob -e main" ' diff --git a/t/t6019-rev-list-ancestry-path.sh b/t/t6019-rev-list-ancestry-path.sh index 353f84313f..20adbece65 100755 --- a/t/t6019-rev-list-ancestry-path.sh +++ b/t/t6019-rev-list-ancestry-path.sh @@ -21,6 +21,9 @@ test_description='--ancestry-path' # --ancestry-path G..M -- G.t == L # --ancestry-path --simplify-merges G^..M -- G.t == G L +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_merge () { @@ -128,15 +131,15 @@ test_expect_success 'setup criss-cross' ' (cd criss-cross && git init && test_commit A && - git checkout -b xb master && + git checkout -b xb main && test_commit B && - git checkout -b xc master && + git checkout -b xc main && test_commit C && git checkout -b xbc xb -- && git merge xc && git checkout -b xcb xc -- && git merge xb && - git checkout master) + git checkout main) ' # no commits in bc descend from cb diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh new file mode 100755 index 0000000000..b13e8a52a9 --- /dev/null +++ b/t/t6020-bundle-misc.sh @@ -0,0 +1,478 @@ +#!/bin/sh +# +# Copyright (c) 2021 Jiang Xin +# + +test_description='Test git-bundle' + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-bundle.sh + +# Create a commit or tag and set the variable with the object ID. +test_commit_setvar () { + notick= + signoff= + indir= + merge= + tag= + var= + + while test $# != 0 + do + case "$1" in + --merge) + merge=t + ;; + --tag) + tag=t + ;; + --notick) + notick=t + ;; + --signoff) + signoff="$1" + ;; + -C) + shift + indir="$1" + ;; + -*) + echo >&2 "error: unknown option $1" + return 1 + ;; + *) + break + ;; + esac + shift + done + if test $# -lt 2 + then + echo >&2 "error: test_commit_setvar must have at least 2 arguments" + return 1 + fi + var=$1 + shift + indir=${indir:+"$indir"/} + if test -z "$notick" + then + test_tick + fi && + if test -n "$merge" + then + git ${indir:+ -C "$indir"} merge --no-edit --no-ff \ + ${2:+-m "$2"} "$1" && + oid=$(git ${indir:+ -C "$indir"} rev-parse HEAD) + elif test -n "$tag" + then + git ${indir:+ -C "$indir"} tag -m "$1" "$1" "${2:-HEAD}" && + oid=$(git ${indir:+ -C "$indir"} rev-parse "$1") + else + file=${2:-"$1.t"} && + echo "${3-$1}" >"$indir$file" && + git ${indir:+ -C "$indir"} add "$file" && + git ${indir:+ -C "$indir"} commit $signoff -m "$1" && + oid=$(git ${indir:+ -C "$indir"} rev-parse HEAD) + fi && + eval $var=$oid +} + +get_abbrev_oid () { + oid=$1 && + suffix=${oid#???????} && + oid=${oid%$suffix} && + if test -n "$oid" + then + echo "$oid" + else + echo "undefined-oid" + fi +} + +# Format the output of git commands to make a user-friendly and stable +# text. We can easily prepare the expect text without having to worry +# about future changes of the commit ID. +make_user_friendly_and_stable_output () { + sed \ + -e "s/$(get_abbrev_oid $A)[0-9a-f]*/<COMMIT-A>/g" \ + -e "s/$(get_abbrev_oid $B)[0-9a-f]*/<COMMIT-B>/g" \ + -e "s/$(get_abbrev_oid $C)[0-9a-f]*/<COMMIT-C>/g" \ + -e "s/$(get_abbrev_oid $D)[0-9a-f]*/<COMMIT-D>/g" \ + -e "s/$(get_abbrev_oid $E)[0-9a-f]*/<COMMIT-E>/g" \ + -e "s/$(get_abbrev_oid $F)[0-9a-f]*/<COMMIT-F>/g" \ + -e "s/$(get_abbrev_oid $G)[0-9a-f]*/<COMMIT-G>/g" \ + -e "s/$(get_abbrev_oid $H)[0-9a-f]*/<COMMIT-H>/g" \ + -e "s/$(get_abbrev_oid $I)[0-9a-f]*/<COMMIT-I>/g" \ + -e "s/$(get_abbrev_oid $J)[0-9a-f]*/<COMMIT-J>/g" \ + -e "s/$(get_abbrev_oid $K)[0-9a-f]*/<COMMIT-K>/g" \ + -e "s/$(get_abbrev_oid $L)[0-9a-f]*/<COMMIT-L>/g" \ + -e "s/$(get_abbrev_oid $M)[0-9a-f]*/<COMMIT-M>/g" \ + -e "s/$(get_abbrev_oid $N)[0-9a-f]*/<COMMIT-N>/g" \ + -e "s/$(get_abbrev_oid $O)[0-9a-f]*/<COMMIT-O>/g" \ + -e "s/$(get_abbrev_oid $P)[0-9a-f]*/<COMMIT-P>/g" \ + -e "s/$(get_abbrev_oid $TAG1)[0-9a-f]*/<TAG-1>/g" \ + -e "s/$(get_abbrev_oid $TAG2)[0-9a-f]*/<TAG-2>/g" \ + -e "s/$(get_abbrev_oid $TAG3)[0-9a-f]*/<TAG-3>/g" +} + +format_and_save_expect () { + sed -e 's/Z$//' >expect +} + +# (C) (D, pull/1/head, topic/1) +# o --- o +# / \ (L) +# / \ o (H, topic/2) (M, tag:v2) +# / (F) \ / (N, tag:v3) +# / o --------- o (G, pull/2/head) o --- o --- o (release) +# / / \ \ / \ +# o --- o --- o -------- o -- o ------------------ o ------- o --- o (main) +# (A) (B) (E, tag:v1) (I) (J) (K) (O) (P) +# +test_expect_success 'setup' ' + # Try to make a stable fixed width for abbreviated commit ID, + # this fixed-width oid will be replaced with "<OID>". + git config core.abbrev 7 && + + # branch main: commit A & B + test_commit_setvar A "Commit A" main.txt && + test_commit_setvar B "Commit B" main.txt && + + # branch topic/1: commit C & D, refs/pull/1/head + git checkout -b topic/1 && + test_commit_setvar C "Commit C" topic-1.txt && + test_commit_setvar D "Commit D" topic-1.txt && + git update-ref refs/pull/1/head HEAD && + + # branch topic/1: commit E, tag v1 + git checkout main && + test_commit_setvar E "Commit E" main.txt && + test_commit_setvar --tag TAG1 v1 && + + # branch topic/2: commit F & G, refs/pull/2/head + git checkout -b topic/2 && + test_commit_setvar F "Commit F" topic-2.txt && + test_commit_setvar G "Commit G" topic-2.txt && + git update-ref refs/pull/2/head HEAD && + test_commit_setvar H "Commit H" topic-2.txt && + + # branch main: merge commit I & J + git checkout main && + test_commit_setvar --merge I topic/1 "Merge commit I" && + test_commit_setvar --merge J refs/pull/2/head "Merge commit J" && + + # branch main: commit K + git checkout main && + test_commit_setvar K "Commit K" main.txt && + + # branch release: + git checkout -b release && + test_commit_setvar L "Commit L" release.txt && + test_commit_setvar M "Commit M" release.txt && + test_commit_setvar --tag TAG2 v2 && + test_commit_setvar N "Commit N" release.txt && + test_commit_setvar --tag TAG3 v3 && + + # branch main: merge commit O, commit P + git checkout main && + test_commit_setvar --merge O tags/v2 "Merge commit O" && + test_commit_setvar P "Commit P" main.txt +' + +test_expect_success 'create bundle from special rev: main^!' ' + git bundle create special-rev.bdl "main^!" && + + git bundle list-heads special-rev.bdl | + make_user_friendly_and_stable_output >actual && + cat >expect <<-\EOF && + <COMMIT-P> refs/heads/main + EOF + test_cmp expect actual && + + git bundle verify special-rev.bdl | + make_user_friendly_and_stable_output >actual && + format_and_save_expect <<-\EOF && + The bundle contains this ref: + <COMMIT-P> refs/heads/main + The bundle requires this ref: + <COMMIT-O> Z + EOF + test_cmp expect actual && + + test_bundle_object_count special-rev.bdl 3 +' + +test_expect_success 'create bundle with --max-count option' ' + git bundle create max-count.bdl --max-count 1 \ + main \ + "^release" \ + refs/tags/v1 \ + refs/pull/1/head \ + refs/pull/2/head && + + git bundle verify max-count.bdl | + make_user_friendly_and_stable_output >actual && + format_and_save_expect <<-\EOF && + The bundle contains these 2 refs: + <COMMIT-P> refs/heads/main + <TAG-1> refs/tags/v1 + The bundle requires this ref: + <COMMIT-O> Z + EOF + test_cmp expect actual && + + test_bundle_object_count max-count.bdl 4 +' + +test_expect_success 'create bundle with --since option' ' + git log -1 --pretty="%ad" $M >actual && + cat >expect <<-\EOF && + Thu Apr 7 15:26:13 2005 -0700 + EOF + test_cmp expect actual && + + git bundle create since.bdl \ + --since "Thu Apr 7 15:27:00 2005 -0700" \ + --all && + + git bundle verify since.bdl | + make_user_friendly_and_stable_output >actual && + format_and_save_expect <<-\EOF && + The bundle contains these 5 refs: + <COMMIT-P> refs/heads/main + <COMMIT-N> refs/heads/release + <TAG-2> refs/tags/v2 + <TAG-3> refs/tags/v3 + <COMMIT-P> HEAD + The bundle requires these 2 refs: + <COMMIT-M> Z + <COMMIT-K> Z + EOF + test_cmp expect actual && + + test_bundle_object_count --thin since.bdl 13 +' + +test_expect_success 'create bundle 1 - no prerequisites' ' + # create bundle from args + git bundle create 1.bdl topic/1 topic/2 && + + # create bundle from stdin + cat >input <<-\EOF && + topic/1 + topic/2 + EOF + git bundle create stdin-1.bdl --stdin <input && + + cat >expect <<-\EOF && + The bundle contains these 2 refs: + <COMMIT-D> refs/heads/topic/1 + <COMMIT-H> refs/heads/topic/2 + The bundle records a complete history. + EOF + + # verify bundle, which has no prerequisites + git bundle verify 1.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + git bundle verify stdin-1.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + test_bundle_object_count 1.bdl 24 && + test_bundle_object_count stdin-1.bdl 24 +' + +test_expect_success 'create bundle 2 - has prerequisites' ' + # create bundle from args + git bundle create 2.bdl \ + --ignore-missing \ + ^topic/deleted \ + ^$D \ + ^topic/2 \ + release && + + # create bundle from stdin + # input has a non-exist reference: "topic/deleted" + cat >input <<-EOF && + ^topic/deleted + ^$D + ^topic/2 + EOF + git bundle create stdin-2.bdl \ + --ignore-missing \ + --stdin \ + release <input && + + format_and_save_expect <<-\EOF && + The bundle contains this ref: + <COMMIT-N> refs/heads/release + The bundle requires these 3 refs: + <COMMIT-D> Z + <COMMIT-E> Z + <COMMIT-G> Z + EOF + + git bundle verify 2.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + git bundle verify stdin-2.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + test_bundle_object_count 2.bdl 16 && + test_bundle_object_count stdin-2.bdl 16 +' + +test_expect_success 'fail to verify bundle without prerequisites' ' + git init --bare test1.git && + + format_and_save_expect <<-\EOF && + error: Repository lacks these prerequisite commits: + error: <COMMIT-D> Z + error: <COMMIT-E> Z + error: <COMMIT-G> Z + EOF + + test_must_fail git -C test1.git bundle verify ../2.bdl 2>&1 | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + test_must_fail git -C test1.git bundle verify ../stdin-2.bdl 2>&1 | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual +' + +test_expect_success 'create bundle 3 - two refs, same object' ' + # create bundle from args + git bundle create --version=3 3.bdl \ + ^release \ + ^topic/1 \ + ^topic/2 \ + main \ + HEAD && + + # create bundle from stdin + cat >input <<-\EOF && + ^release + ^topic/1 + ^topic/2 + EOF + git bundle create --version=3 stdin-3.bdl \ + --stdin \ + main HEAD <input && + + format_and_save_expect <<-\EOF && + The bundle contains these 2 refs: + <COMMIT-P> refs/heads/main + <COMMIT-P> HEAD + The bundle requires these 2 refs: + <COMMIT-M> Z + <COMMIT-K> Z + EOF + + git bundle verify 3.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + git bundle verify stdin-3.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + test_bundle_object_count 3.bdl 4 && + test_bundle_object_count stdin-3.bdl 4 +' + +test_expect_success 'create bundle 4 - with tags' ' + # create bundle from args + git bundle create 4.bdl \ + ^main \ + ^release \ + ^topic/1 \ + ^topic/2 \ + --all && + + # create bundle from stdin + cat >input <<-\EOF && + ^main + ^release + ^topic/1 + ^topic/2 + EOF + git bundle create stdin-4.bdl \ + --ignore-missing \ + --stdin \ + --all <input && + + cat >expect <<-\EOF && + The bundle contains these 3 refs: + <TAG-1> refs/tags/v1 + <TAG-2> refs/tags/v2 + <TAG-3> refs/tags/v3 + The bundle records a complete history. + EOF + + git bundle verify 4.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + git bundle verify stdin-4.bdl | + make_user_friendly_and_stable_output >actual && + test_cmp expect actual && + + test_bundle_object_count 4.bdl 3 && + test_bundle_object_count stdin-4.bdl 3 +' + +test_expect_success 'clone from bundle' ' + git clone --mirror 1.bdl mirror.git && + git -C mirror.git show-ref | + make_user_friendly_and_stable_output >actual && + cat >expect <<-\EOF && + <COMMIT-D> refs/heads/topic/1 + <COMMIT-H> refs/heads/topic/2 + EOF + test_cmp expect actual && + + git -C mirror.git fetch ../2.bdl "+refs/*:refs/*" && + git -C mirror.git show-ref | + make_user_friendly_and_stable_output >actual && + cat >expect <<-\EOF && + <COMMIT-N> refs/heads/release + <COMMIT-D> refs/heads/topic/1 + <COMMIT-H> refs/heads/topic/2 + EOF + test_cmp expect actual && + + git -C mirror.git fetch ../3.bdl "+refs/*:refs/*" && + git -C mirror.git show-ref | + make_user_friendly_and_stable_output >actual && + cat >expect <<-\EOF && + <COMMIT-P> refs/heads/main + <COMMIT-N> refs/heads/release + <COMMIT-D> refs/heads/topic/1 + <COMMIT-H> refs/heads/topic/2 + EOF + test_cmp expect actual && + + git -C mirror.git fetch ../4.bdl "+refs/*:refs/*" && + git -C mirror.git show-ref | + make_user_friendly_and_stable_output >actual && + cat >expect <<-\EOF && + <COMMIT-P> refs/heads/main + <COMMIT-N> refs/heads/release + <COMMIT-D> refs/heads/topic/1 + <COMMIT-H> refs/heads/topic/2 + <TAG-1> refs/tags/v1 + <TAG-2> refs/tags/v2 + <TAG-3> refs/tags/v3 + EOF + test_cmp expect actual +' + +test_done diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index b886529e59..a1baf4e451 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -6,6 +6,9 @@ test_description='Tests git bisect functionality' exec </dev/null +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh add_line_into_file() @@ -82,9 +85,16 @@ test_expect_success 'bisect fails if given any junk instead of revs' ' git bisect bad $HASH4 ' -test_expect_success 'bisect reset: back in the master branch' ' +test_expect_success 'bisect start without -- takes unknown arg as pathspec' ' + git bisect reset && + git bisect start foo bar && + grep foo ".git/BISECT_NAMES" && + grep bar ".git/BISECT_NAMES" +' + +test_expect_success 'bisect reset: back in the main branch' ' git bisect reset && - echo "* master" > branch.expect && + echo "* main" > branch.expect && git branch > branch.output && cmp branch.expect branch.output ' @@ -95,7 +105,7 @@ test_expect_success 'bisect reset: back in another branch' ' git bisect good $HASH1 && git bisect bad $HASH3 && git bisect reset && - echo " master" > branch.expect && + echo " main" > branch.expect && echo "* other" >> branch.expect && git branch > branch.output && cmp branch.expect branch.output @@ -341,7 +351,7 @@ test_expect_success 'bisect skip many ranges' ' test_expect_success 'bisect starting with a detached HEAD' ' git bisect reset && - git checkout master^ && + git checkout main^ && HEAD=$(git rev-parse --verify HEAD) && git bisect start && test $HEAD = $(cat .git/BISECT_START) && @@ -568,9 +578,9 @@ test_expect_success 'skipping away from skipped commit' ' test "$para3" = "$PARA_HASH3" ' -test_expect_success 'erroring out when using bad path parameters' ' +test_expect_success 'erroring out when using bad path arguments' ' test_must_fail git bisect start $PARA_HASH7 $HASH1 -- foobar 2> error.txt && - test_i18ngrep "bad path parameters" error.txt + test_i18ngrep "bad path arguments" error.txt ' test_expect_success 'test bisection on bare repo - --no-checkout specified' ' @@ -709,7 +719,7 @@ test_expect_success 'bisect: --no-checkout - target after breakage' ' test_expect_success 'bisect: demonstrate identification of damage boundary' " git bisect reset && git checkout broken && - git bisect start broken master --no-checkout && + git bisect start broken main --no-checkout && test_must_fail git bisect run \"\$SHELL_PATH\" -c ' GOOD=\$(git for-each-ref \"--format=%(objectname)\" refs/bisect/good-*) && git rev-list --objects BISECT_HEAD --not \$GOOD >tmp.\$\$ && @@ -819,7 +829,7 @@ test_expect_success 'bisect terms needs 0 or 1 argument' ' test_must_fail git bisect terms 1 2 && test_must_fail git bisect terms 2>actual && echo "error: no terms defined" >expected && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'bisect terms shows good/bad after start' ' @@ -893,7 +903,7 @@ test_expect_success 'bisect start --term-* does store terms' ' Your current terms are two for the old state and one for the new state. EOF - test_i18ncmp expected actual && + test_cmp expected actual && git bisect terms --term-bad >actual && echo one >expected && test_cmp expected actual && @@ -912,6 +922,17 @@ test_expect_success 'bisect start takes options and revs in any order' ' test_cmp expected actual ' +# Bisect is started with --term-new and --term-old arguments, +# then skip. The HEAD should be changed. +test_expect_success 'bisect skip works with --term*' ' + git bisect reset && + git bisect start --term-new=fixed --term-old=unfixed HEAD $HASH1 && + hash_skipped_from=$(git rev-parse --verify HEAD) && + git bisect skip && + hash_skipped_to=$(git rev-parse --verify HEAD) && + test "$hash_skipped_from" != "$hash_skipped_to" +' + test_expect_success 'git bisect reset cleans bisection state properly' ' git bisect reset && git bisect start && @@ -919,14 +940,26 @@ test_expect_success 'git bisect reset cleans bisection state properly' ' git bisect bad $HASH4 && git bisect reset && test -z "$(git for-each-ref "refs/bisect/*")" && - test_path_is_missing "$GIT_DIR/BISECT_EXPECTED_REV" && - test_path_is_missing "$GIT_DIR/BISECT_ANCESTORS_OK" && - test_path_is_missing "$GIT_DIR/BISECT_LOG" && - test_path_is_missing "$GIT_DIR/BISECT_RUN" && - test_path_is_missing "$GIT_DIR/BISECT_TERMS" && - test_path_is_missing "$GIT_DIR/head-name" && - test_path_is_missing "$GIT_DIR/BISECT_HEAD" && - test_path_is_missing "$GIT_DIR/BISECT_START" + test_path_is_missing ".git/BISECT_EXPECTED_REV" && + test_path_is_missing ".git/BISECT_ANCESTORS_OK" && + test_path_is_missing ".git/BISECT_LOG" && + test_path_is_missing ".git/BISECT_RUN" && + test_path_is_missing ".git/BISECT_TERMS" && + test_path_is_missing ".git/head-name" && + test_path_is_missing ".git/BISECT_HEAD" && + test_path_is_missing ".git/BISECT_START" +' + +test_expect_success 'bisect handles annotated tags' ' + test_commit commit-one && + git tag -m foo tag-one && + test_commit commit-two && + git tag -m foo tag-two && + git bisect start && + git bisect good tag-one && + git bisect bad tag-two >output && + bad=$(git rev-parse --verify tag-two^{commit}) && + grep "$bad is the first bad commit" output ' test_done diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh index ad1922b999..a313849406 100755 --- a/t/t6040-tracking-info.sh +++ b/t/t6040-tracking-info.sh @@ -2,6 +2,9 @@ test_description='remote tracking stats' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh advance () { @@ -34,7 +37,7 @@ test_expect_success setup ' git branch -d brokenbase && git checkout -b b6 origin ) && - git checkout -b follower --track master && + git checkout -b follower --track main && advance h ' @@ -54,16 +57,16 @@ test_expect_success 'branch -v' ' git branch -v ) | sed -n -e "$t6040_script" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF -b1 [origin/master: ahead 1, behind 1] d -b2 [origin/master: ahead 1, behind 1] d -b3 [origin/master: behind 1] b -b4 [origin/master: ahead 2] f +b1 [origin/main: ahead 1, behind 1] d +b2 [origin/main: ahead 1, behind 1] d +b3 [origin/main: behind 1] b +b4 [origin/main: ahead 2] f b5 [brokenbase: gone] g -b6 [origin/master] c +b6 [origin/main] c EOF test_expect_success 'branch -vv' ' @@ -72,7 +75,7 @@ test_expect_success 'branch -vv' ' git branch -vv ) | sed -n -e "$t6040_script" >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'checkout (diverged from upstream)' ' @@ -83,7 +86,7 @@ test_expect_success 'checkout (diverged from upstream)' ' ' test_expect_success 'checkout with local tracked branch' ' - git checkout master && + git checkout main && git checkout follower >actual && test_i18ngrep "is ahead of" actual ' @@ -100,7 +103,7 @@ test_expect_success 'checkout (up-to-date with upstream)' ' ( cd test && git checkout b6 ) >actual && - test_i18ngrep "Your branch is up to date with .origin/master" actual + test_i18ngrep "Your branch is up to date with .origin/main" actual ' test_expect_success 'status (diverged from upstream)' ' @@ -130,11 +133,11 @@ test_expect_success 'status (up-to-date with upstream)' ' # reports nothing to commit test_must_fail git commit --dry-run ) >actual && - test_i18ngrep "Your branch is up to date with .origin/master" actual + test_i18ngrep "Your branch is up to date with .origin/main" actual ' cat >expect <<\EOF -## b1...origin/master [ahead 1, behind 1] +## b1...origin/main [ahead 1, behind 1] EOF test_expect_success 'status -s -b (diverged from upstream)' ' @@ -143,11 +146,11 @@ test_expect_success 'status -s -b (diverged from upstream)' ' git checkout b1 >/dev/null && git status -s -b | head -1 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF -## b1...origin/master [different] +## b1...origin/main [different] EOF test_expect_success 'status -s -b --no-ahead-behind (diverged from upstream)' ' @@ -156,11 +159,11 @@ test_expect_success 'status -s -b --no-ahead-behind (diverged from upstream)' ' git checkout b1 >/dev/null && git status -s -b --no-ahead-behind | head -1 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF -## b1...origin/master [different] +## b1...origin/main [different] EOF test_expect_success 'status.aheadbehind=false status -s -b (diverged from upstream)' ' @@ -169,12 +172,12 @@ test_expect_success 'status.aheadbehind=false status -s -b (diverged from upstre git checkout b1 >/dev/null && git -c status.aheadbehind=false status -s -b | head -1 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF On branch b1 -Your branch and 'origin/master' have diverged, +Your branch and 'origin/main' have diverged, and have 1 and 1 different commits each, respectively. EOF @@ -184,7 +187,7 @@ test_expect_success 'status --long --branch' ' git checkout b1 >/dev/null && git status --long -b | head -3 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'status --long --branch' ' @@ -193,12 +196,12 @@ test_expect_success 'status --long --branch' ' git checkout b1 >/dev/null && git -c status.aheadbehind=true status --long -b | head -3 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF On branch b1 -Your branch and 'origin/master' refer to different commits. +Your branch and 'origin/main' refer to different commits. EOF test_expect_success 'status --long --branch --no-ahead-behind' ' @@ -207,7 +210,7 @@ test_expect_success 'status --long --branch --no-ahead-behind' ' git checkout b1 >/dev/null && git status --long -b --no-ahead-behind | head -2 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'status.aheadbehind=false status --long --branch' ' @@ -216,7 +219,7 @@ test_expect_success 'status.aheadbehind=false status --long --branch' ' git checkout b1 >/dev/null && git -c status.aheadbehind=false status --long -b | head -2 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF @@ -229,11 +232,11 @@ test_expect_success 'status -s -b (upstream is gone)' ' git checkout b5 >/dev/null && git status -s -b | head -1 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<\EOF -## b6...origin/master +## b6...origin/main EOF test_expect_success 'status -s -b (up-to-date with upstream)' ' @@ -242,11 +245,11 @@ test_expect_success 'status -s -b (up-to-date with upstream)' ' git checkout b6 >/dev/null && git status -s -b | head -1 ) >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'fail to track lightweight tags' ' - git checkout master && + git checkout main && git tag light && test_must_fail git branch --track lighttrack light >actual && test_i18ngrep ! "set up to track" actual && @@ -254,7 +257,7 @@ test_expect_success 'fail to track lightweight tags' ' ' test_expect_success 'fail to track annotated tags' ' - git checkout master && + git checkout main && git tag -m heavy heavy && test_must_fail git branch --track heavytrack heavy >actual && test_i18ngrep ! "set up to track" actual && @@ -262,29 +265,29 @@ test_expect_success 'fail to track annotated tags' ' ' test_expect_success '--set-upstream-to does not change branch' ' - git branch from-master master && - git branch --set-upstream-to master from-master && - git branch from-master2 master && - test_must_fail git config branch.from-master2.merge > actual && - git rev-list from-master2 && - git update-ref refs/heads/from-master2 from-master2^ && - git rev-parse from-master2 >expect2 && - git branch --set-upstream-to master from-master2 && - git config branch.from-master.merge > actual && - git rev-parse from-master2 >actual2 && - grep -q "^refs/heads/master$" actual && + git branch from-main main && + git branch --set-upstream-to main from-main && + git branch from-topic_2 main && + test_must_fail git config branch.from-topic_2.merge > actual && + git rev-list from-topic_2 && + git update-ref refs/heads/from-topic_2 from-topic_2^ && + git rev-parse from-topic_2 >expect2 && + git branch --set-upstream-to main from-topic_2 && + git config branch.from-main.merge > actual && + git rev-parse from-topic_2 >actual2 && + grep -q "^refs/heads/main$" actual && cmp expect2 actual2 ' test_expect_success '--set-upstream-to @{-1}' ' git checkout follower && - git checkout from-master2 && - git config branch.from-master2.merge > expect2 && - git branch --set-upstream-to @{-1} from-master && - git config branch.from-master.merge > actual && - git config branch.from-master2.merge > actual2 && - git branch --set-upstream-to follower from-master && - git config branch.from-master.merge > expect && + git checkout from-topic_2 && + git config branch.from-topic_2.merge > expect2 && + git branch --set-upstream-to @{-1} from-main && + git config branch.from-main.merge > actual && + git config branch.from-topic_2.merge > actual2 && + git branch --set-upstream-to follower from-main && + git config branch.from-main.merge > expect && test_cmp expect2 actual2 && test_cmp expect actual ' diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh index df1eff0fb8..82013fc903 100755 --- a/t/t6041-bisect-submodule.sh +++ b/t/t6041-bisect-submodule.sh @@ -8,7 +8,7 @@ test_description='bisect can handle submodules' git_bisect () { git status -su >expect && ls -1pR * >>expect && - tar cf "$TRASH_DIRECTORY/tmp.tar" * && + "$TAR" cf "$TRASH_DIRECTORY/tmp.tar" * && GOOD=$(git rev-parse --verify HEAD) && may_only_be_test_must_fail "$2" && $2 git checkout "$1" && @@ -25,7 +25,7 @@ git_bisect () { git bisect start && git bisect good $GOOD && rm -rf * && - tar xf "$TRASH_DIRECTORY/tmp.tar" && + "$TAR" xf "$TRASH_DIRECTORY/tmp.tar" && git status -su >actual && ls -1pR * >>actual && test_cmp expect actual && diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index c80dc10b8f..e33d512ec1 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -4,6 +4,9 @@ # test_description='Tests replace refs functionality' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" @@ -129,13 +132,13 @@ tagger T A Gger <> 0 +0000 EOF test_expect_success 'tag replaced commit' ' - git mktag <tag.sig >.git/refs/tags/mytag 2>message + git mktag <tag.sig >.git/refs/tags/mytag ' test_expect_success '"git fsck" works' ' - git fsck master >fsck_master.out && - test_i18ngrep "dangling commit $R" fsck_master.out && - test_i18ngrep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_master.out && + git fsck main >fsck_main.out && + test_i18ngrep "dangling commit $R" fsck_main.out && + test_i18ngrep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_main.out && test -z "$(git fsck)" ' @@ -218,7 +221,7 @@ test_expect_success 'create parallel branch without the bug' ' git cherry-pick $HASH6 && PARA6=$(git rev-parse --verify HEAD) && git replace $HASH6 $PARA6 && - git checkout master && + git checkout main && cur=$(git rev-parse --verify HEAD) && test "$cur" = "$HASH7" && git log --pretty=oneline | grep $PARA2 && @@ -461,7 +464,7 @@ test_expect_success GPG 'set up a merge commit with a mergetag' ' git commit -m "hello: 2 more lines from a test branch" && HASH9=$(git rev-parse --verify HEAD) && git tag -s -m "tag for testing with a mergetag" test_tag HEAD && - git checkout master && + git checkout main && git merge -s ours test_tag && HASH10=$(git rev-parse --verify HEAD) && git cat-file commit $HASH10 | grep "^mergetag object" diff --git a/t/t6101-rev-parse-parents.sh b/t/t6101-rev-parse-parents.sh index 7531262a5e..78b5851780 100755 --- a/t/t6101-rev-parse-parents.sh +++ b/t/t6101-rev-parse-parents.sh @@ -5,6 +5,9 @@ test_description='Test git rev-parse with different parent options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_cmp_rev_output () { @@ -18,7 +21,7 @@ test_expect_success 'setup' ' test_commit second && git checkout --orphan tmp && test_commit start2 && - git checkout master && + git checkout main && git merge -m next --allow-unrelated-histories start2 && test_commit final && diff --git a/t/t6110-rev-list-sparse.sh b/t/t6110-rev-list-sparse.sh index 656ac7fe9d..13c1da5352 100755 --- a/t/t6110-rev-list-sparse.sh +++ b/t/t6110-rev-list-sparse.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='operations that cull histories in unusual ways' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -10,7 +13,7 @@ test_expect_success setup ' git checkout -b side HEAD^ && test_commit D && test_commit E && - git merge master + git merge main ' test_expect_success 'rev-list --first-parent --boundary' ' diff --git a/t/t6111-rev-list-treesame.sh b/t/t6111-rev-list-treesame.sh index 4244638285..e07b6070e0 100755 --- a/t/t6111-rev-list-treesame.sh +++ b/t/t6111-rev-list-treesame.sh @@ -13,6 +13,9 @@ test_description='TREESAME and limiting' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh note () { @@ -33,13 +36,13 @@ test_expect_success setup ' git checkout other-branch && test_commit "Added other" other "Hello" C && - git checkout master && + git checkout main && test_merge D other-branch && git checkout third-branch && test_commit "Third file" third "Nothing" E && - git checkout master && + git checkout main && test_commit "file=Blah" file "Blah" F && test_tick && git merge --no-commit third-branch && @@ -56,7 +59,7 @@ test_expect_success setup ' test_tick && git revert I && note J && - git checkout master && + git checkout main && test_tick && git merge --no-ff fiddler-branch && note K && diff --git a/t/t6112-rev-list-filters-objects.sh b/t/t6112-rev-list-filters-objects.sh index de0e5a5d36..4ade105db3 100755 --- a/t/t6112-rev-list-filters-objects.sh +++ b/t/t6112-rev-list-filters-objects.sh @@ -2,6 +2,9 @@ test_description='git rev-list using object filtering' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Test the blob:none filter. @@ -156,6 +159,78 @@ test_expect_success 'verify blob:limit=1m' ' test_must_be_empty observed ' +# Test object:type=<type> filter. + +test_expect_success 'setup object-type' ' + test_create_repo object-type && + test_commit --no-tag -C object-type message blob && + git -C object-type tag tag -m tag-message +' + +test_expect_success 'verify object:type= fails with invalid type' ' + test_must_fail git -C object-type rev-list --objects --filter=object:type= HEAD && + test_must_fail git -C object-type rev-list --objects --filter=object:type=invalid HEAD +' + +test_expect_success 'verify object:type=blob prints blob and commit' ' + git -C object-type rev-parse HEAD >expected && + printf "%s blob\n" $(git -C object-type rev-parse HEAD:blob) >>expected && + git -C object-type rev-list --objects --filter=object:type=blob HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=tree prints tree and commit' ' + ( + git -C object-type rev-parse HEAD && + printf "%s \n" $(git -C object-type rev-parse HEAD^{tree}) + ) >expected && + git -C object-type rev-list --objects --filter=object:type=tree HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=commit prints commit' ' + git -C object-type rev-parse HEAD >expected && + git -C object-type rev-list --objects --filter=object:type=commit HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=tag prints tag' ' + ( + git -C object-type rev-parse HEAD && + printf "%s tag\n" $(git -C object-type rev-parse tag) + ) >expected && + git -C object-type rev-list --objects --filter=object:type=tag tag >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=blob prints only blob with --filter-provided-objects' ' + printf "%s blob\n" $(git -C object-type rev-parse HEAD:blob) >expected && + git -C object-type rev-list --objects \ + --filter=object:type=blob --filter-provided-objects HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=tree prints only tree with --filter-provided-objects' ' + printf "%s \n" $(git -C object-type rev-parse HEAD^{tree}) >expected && + git -C object-type rev-list --objects \ + --filter=object:type=tree HEAD --filter-provided-objects >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=commit prints only commit with --filter-provided-objects' ' + git -C object-type rev-parse HEAD >expected && + git -C object-type rev-list --objects \ + --filter=object:type=commit --filter-provided-objects HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'verify object:type=tag prints only tag with --filter-provided-objects' ' + printf "%s tag\n" $(git -C object-type rev-parse tag) >expected && + git -C object-type rev-list --objects \ + --filter=object:type=tag --filter-provided-objects tag >actual && + test_cmp expected actual +' + # Test sparse:path=<path> filter. # !!!! # NOTE: sparse:path filter support has been dropped for security reasons, @@ -223,7 +298,7 @@ test_expect_success 'verify sparse:oid=oid-ish omits top-level files' ' sort >expected && git -C r3 rev-list --quiet --objects --filter-print-omitted \ - --filter=sparse:oid=master:pattern HEAD >revs && + --filter=sparse:oid=main:pattern HEAD >revs && awk -f print_1.awk revs | sed "s/~//" | sort >observed && @@ -436,7 +511,7 @@ test_expect_success 'add sparse pattern blobs whose paths have reserved chars' ' test_expect_success 'combine:... with more than two sub-filters' ' git -C r3 rev-list --objects \ - --filter=combine:tree:3+blob:limit=40+sparse:oid=master:pattern \ + --filter=combine:tree:3+blob:limit=40+sparse:oid=main:pattern \ HEAD >actual && expect_has HEAD "" && @@ -454,7 +529,7 @@ test_expect_success 'combine:... with more than two sub-filters' ' cp actual expect && git -C r3 rev-list --objects \ - --filter=combine:tree:3+blob:limit=40+sparse:oid=master:pattern1%2brenamed%25 \ + --filter=combine:tree:3+blob:limit=40+sparse:oid=main:pattern1%2brenamed%25 \ HEAD >actual && test_cmp expect actual && @@ -464,23 +539,23 @@ test_expect_success 'combine:... with more than two sub-filters' ' test_when_finished "rm -f trace1" && GIT_TRACE=$(pwd)/trace1 git -C r3 rev-list --objects \ --filter=tree:3 --filter=blob:limit=40 \ - --filter=sparse:oid="master:p;at%ter+n" \ + --filter=sparse:oid="main:p;at%ter+n" \ HEAD >actual && test_cmp expect actual && - grep "Add to combine filter-spec: sparse:oid=master:p%3bat%25ter%2bn" \ + grep "Add to combine filter-spec: sparse:oid=main:p%3bat%25ter%2bn" \ trace1 && # Repeat the above test, but this time, the characters to encode are in # the LHS of the combined filter. test_when_finished "rm -f trace2" && GIT_TRACE=$(pwd)/trace2 git -C r3 rev-list --objects \ - --filter=sparse:oid=master:^~pattern \ + --filter=sparse:oid=main:^~pattern \ --filter=tree:3 --filter=blob:limit=40 \ HEAD >actual && test_cmp expect actual && - grep "Add to combine filter-spec: sparse:oid=master:%5e%7epattern" \ + grep "Add to combine filter-spec: sparse:oid=main:%5e%7epattern" \ trace2 ' diff --git a/t/t6113-rev-list-bitmap-filters.sh b/t/t6113-rev-list-bitmap-filters.sh index 2b551e6fd0..4d8e09167e 100755 --- a/t/t6113-rev-list-bitmap-filters.sh +++ b/t/t6113-rev-list-bitmap-filters.sh @@ -2,6 +2,7 @@ test_description='rev-list combining bitmaps and filters' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-bitmap.sh test_expect_success 'set up bitmapped repo' ' # one commit will have bitmaps, the other will not @@ -9,7 +10,8 @@ test_expect_success 'set up bitmapped repo' ' test_commit much-larger-blob-one && git repack -adb && test_commit two && - test_commit much-larger-blob-two + test_commit much-larger-blob-two && + git tag tag ' test_expect_success 'filters fallback to non-bitmap traversal' ' @@ -74,4 +76,69 @@ test_expect_success 'tree:1 filter' ' test_cmp expect actual ' +test_expect_success 'object:type filter' ' + git rev-list --objects --filter=object:type=tag tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter=object:type=tag tag >actual && + test_cmp expect actual && + + git rev-list --objects --filter=object:type=commit tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter=object:type=commit tag >actual && + test_bitmap_traversal expect actual && + + git rev-list --objects --filter=object:type=tree tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter=object:type=tree tag >actual && + test_bitmap_traversal expect actual && + + git rev-list --objects --filter=object:type=blob tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter=object:type=blob tag >actual && + test_bitmap_traversal expect actual +' + +test_expect_success 'object:type filter with --filter-provided-objects' ' + git rev-list --objects --filter-provided-objects --filter=object:type=tag tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter-provided-objects --filter=object:type=tag tag >actual && + test_cmp expect actual && + + git rev-list --objects --filter-provided-objects --filter=object:type=commit tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter-provided-objects --filter=object:type=commit tag >actual && + test_bitmap_traversal expect actual && + + git rev-list --objects --filter-provided-objects --filter=object:type=tree tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter-provided-objects --filter=object:type=tree tag >actual && + test_bitmap_traversal expect actual && + + git rev-list --objects --filter-provided-objects --filter=object:type=blob tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter-provided-objects --filter=object:type=blob tag >actual && + test_bitmap_traversal expect actual +' + +test_expect_success 'combine filter' ' + git rev-list --objects --filter=blob:limit=1000 --filter=object:type=blob tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter=blob:limit=1000 --filter=object:type=blob tag >actual && + test_bitmap_traversal expect actual +' + +test_expect_success 'combine filter with --filter-provided-objects' ' + git rev-list --objects --filter-provided-objects --filter=blob:limit=1000 --filter=object:type=blob tag >expect && + git rev-list --use-bitmap-index \ + --objects --filter-provided-objects --filter=blob:limit=1000 --filter=object:type=blob tag >actual && + test_bitmap_traversal expect actual && + + git cat-file --batch-check="%(objecttype) %(objectsize)" <actual >objects && + while read objecttype objectsize + do + test "$objecttype" = blob || return 1 + test "$objectsize" -le 1000 || return 1 + done <objects +' + test_done diff --git a/t/t6114-keep-packs.sh b/t/t6114-keep-packs.sh new file mode 100755 index 0000000000..9239d8aa46 --- /dev/null +++ b/t/t6114-keep-packs.sh @@ -0,0 +1,69 @@ +#!/bin/sh + +test_description='rev-list with .keep packs' +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit loose && + test_commit packed && + test_commit kept && + + KEPT_PACK=$(git pack-objects --revs .git/objects/pack/pack <<-EOF + refs/tags/kept + ^refs/tags/packed + EOF + ) && + MISC_PACK=$(git pack-objects --revs .git/objects/pack/pack <<-EOF + refs/tags/packed + ^refs/tags/loose + EOF + ) && + + touch .git/objects/pack/pack-$KEPT_PACK.keep +' + +rev_list_objects () { + git rev-list "$@" >out && + sort out +} + +idx_objects () { + git show-index <$1 >expect-idx && + cut -d" " -f2 <expect-idx | sort +} + +test_expect_success '--no-kept-objects excludes trees and blobs in .keep packs' ' + rev_list_objects --objects --all --no-object-names >kept && + rev_list_objects --objects --all --no-object-names --no-kept-objects >no-kept && + + idx_objects .git/objects/pack/pack-$KEPT_PACK.idx >expect && + comm -3 kept no-kept >actual && + + test_cmp expect actual +' + +test_expect_success '--no-kept-objects excludes kept non-MIDX object' ' + test_config core.multiPackIndex true && + + # Create a pack with just the commit object in pack, and do not mark it + # as kept (even though it appears in $KEPT_PACK, which does have a .keep + # file). + MIDX_PACK=$(git pack-objects .git/objects/pack/pack <<-EOF + $(git rev-parse kept) + EOF + ) && + + # Write a MIDX containing all packs, but use the version of the commit + # at "kept" in a non-kept pack by touching $MIDX_PACK. + touch .git/objects/pack/pack-$MIDX_PACK.pack && + git multi-pack-index write && + + rev_list_objects --objects --no-object-names --no-kept-objects HEAD >actual && + ( + idx_objects .git/objects/pack/pack-$MISC_PACK.idx && + git rev-list --objects --no-object-names refs/tags/loose + ) | sort >expect && + test_cmp expect actual +' + +test_done diff --git a/t/t6115-rev-list-du.sh b/t/t6115-rev-list-du.sh new file mode 100755 index 0000000000..b4aef32b71 --- /dev/null +++ b/t/t6115-rev-list-du.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +test_description='basic tests of rev-list --disk-usage' +. ./test-lib.sh + +# we want a mix of reachable and unreachable, as well as +# objects in the bitmapped pack and some outside of it +test_expect_success 'set up repository' ' + test_commit --no-tag one && + test_commit --no-tag two && + git repack -adb && + git reset --hard HEAD^ && + test_commit --no-tag three && + test_commit --no-tag four && + git reset --hard HEAD^ +' + +# We don't want to hardcode sizes, because they depend on the exact details of +# packing, zlib, etc. We'll assume that the regular rev-list and cat-file +# machinery works and compare the --disk-usage output to that. +disk_usage_slow () { + git rev-list --no-object-names "$@" | + git cat-file --batch-check="%(objectsize:disk)" | + perl -lne '$total += $_; END { print $total}' +} + +# check behavior with given rev-list options; note that +# whitespace is not preserved in args +check_du () { + args=$* + + test_expect_success "generate expected size ($args)" " + disk_usage_slow $args >expect + " + + test_expect_success "rev-list --disk-usage without bitmaps ($args)" " + git rev-list --disk-usage $args >actual && + test_cmp expect actual + " + + test_expect_success "rev-list --disk-usage with bitmaps ($args)" " + git rev-list --disk-usage --use-bitmap-index $args >actual && + test_cmp expect actual + " +} + +check_du HEAD +check_du --objects HEAD +check_du --objects HEAD^..HEAD + +test_done diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index f822d5d328..1a501ee09e 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -11,106 +11,90 @@ test_description='test describe' # # First parent of a merge commit is on the same line, second parent below. +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_describe () { + indir= && + while test $# != 0 + do + case "$1" in + -C) + indir="$2" + shift + ;; + *) + break + ;; + esac + shift + done && + indir=${indir:+"$indir"/} && expect="$1" shift describe_opts="$@" test_expect_success "describe $describe_opts" ' - R=$(git describe $describe_opts 2>err.actual) && - case "$R" in - $expect) echo happy ;; - *) echo "Oops - $R is not $expect" && - false ;; - esac + git ${indir:+ -C "$indir"} describe $describe_opts >raw && + sed -e "s/-g[0-9a-f]*\$/-gHASH/" <raw >actual && + echo "$expect" >expect && + test_cmp expect actual ' } test_expect_success setup ' + test_commit initial file one && + test_commit second file two && + test_commit third file three && + test_commit --annotate A file A && + test_commit c file c && - test_tick && - echo one >file && git add file && git commit -m initial && - one=$(git rev-parse HEAD) && - - git describe --always HEAD && - - test_tick && - echo two >file && git add file && git commit -m second && - two=$(git rev-parse HEAD) && - - test_tick && - echo three >file && git add file && git commit -m third && - - test_tick && - echo A >file && git add file && git commit -m A && - test_tick && - git tag -a -m A A && - - test_tick && - echo c >file && git add file && git commit -m c && - test_tick && - git tag c && - - git reset --hard $two && - test_tick && - echo B >side && git add side && git commit -m B && - test_tick && - git tag -a -m B B && + git reset --hard second && + test_commit --annotate B side B && test_tick && git merge -m Merged c && merged=$(git rev-parse HEAD) && - git reset --hard $two && - test_tick && - echo D >another && git add another && git commit -m D && - test_tick && - git tag -a -m D D && - test_tick && - git tag -a -m R R && - - test_tick && - echo DD >another && git commit -a -m another && + git reset --hard second && + test_commit --no-tag D another D && test_tick && - git tag e && + git tag -a -m R R && - test_tick && - echo DDD >another && git commit -a -m "yet another" && + test_commit e another DD && + test_commit --no-tag "yet another" another DDD && test_tick && git merge -m Merged $merged && - test_tick && - echo X >file && echo X >side && git add file side && - git commit -m x - + test_commit --no-tag x file ' -check_describe A-* HEAD -check_describe A-* HEAD^ -check_describe R-* HEAD^^ -check_describe A-* HEAD^^2 +check_describe A-8-gHASH HEAD +check_describe A-7-gHASH HEAD^ +check_describe R-2-gHASH HEAD^^ +check_describe A-3-gHASH HEAD^^2 check_describe B HEAD^^2^ -check_describe R-* HEAD^^^ +check_describe R-1-gHASH HEAD^^^ -check_describe c-* --tags HEAD -check_describe c-* --tags HEAD^ -check_describe e-* --tags HEAD^^ -check_describe c-* --tags HEAD^^2 +check_describe c-7-gHASH --tags HEAD +check_describe c-6-gHASH --tags HEAD^ +check_describe e-1-gHASH --tags HEAD^^ +check_describe c-2-gHASH --tags HEAD^^2 check_describe B --tags HEAD^^2^ check_describe e --tags HEAD^^^ -check_describe heads/master --all HEAD -check_describe tags/c-* --all HEAD^ +check_describe heads/main --all HEAD +check_describe tags/c-6-gHASH --all HEAD^ check_describe tags/e --all HEAD^^^ -check_describe B-0-* --long HEAD^^2^ -check_describe A-3-* --long HEAD^^2 +check_describe B-0-gHASH --long HEAD^^2^ +check_describe A-3-gHASH --long HEAD^^2 -check_describe c-7-* --tags -check_describe e-3-* --first-parent --tags +check_describe c-7-gHASH --tags +check_describe e-3-gHASH --first-parent --tags test_expect_success 'describe --contains defaults to HEAD without commit-ish' ' echo "A^0" >expect && @@ -121,20 +105,17 @@ test_expect_success 'describe --contains defaults to HEAD without commit-ish' ' ' check_describe tags/A --all A^0 -test_expect_success 'no warning was displayed for A' ' - test_must_be_empty err.actual -' -test_expect_success 'rename tag A to Q locally' ' - mv .git/refs/tags/A .git/refs/tags/Q -' -cat - >err.expect <<EOF -warning: tag 'Q' is externally known as 'A' -EOF -check_describe A-* HEAD -test_expect_success 'warning was displayed for Q' ' - test_i18ncmp err.expect err.actual -' +test_expect_success 'renaming tag A to Q locally produces a warning' " + mv .git/refs/tags/A .git/refs/tags/Q && + git describe HEAD 2>err >out && + cat >expected <<-\EOF && + warning: tag 'Q' is externally known as 'A' + EOF + test_cmp expected err && + grep -E '^A-8-g[0-9a-f]+$' out +" + test_expect_success 'misnamed annotated tag forces long output' ' description=$(git describe --no-long Q^0) && expr "$description" : "A-0-g[0-9a-f]*$" && @@ -158,46 +139,46 @@ test_expect_success 'rename tag Q back to A' ' ' test_expect_success 'pack tag refs' 'git pack-refs' -check_describe A-* HEAD +check_describe A-8-gHASH HEAD test_expect_success 'describe works from outside repo using --git-dir' ' git clone --bare "$TRASH_DIRECTORY" "$TRASH_DIRECTORY/bare" && git --git-dir "$TRASH_DIRECTORY/bare" describe >out && - grep -E "^A-[1-9][0-9]?-g[0-9a-f]+$" out + grep -E "^A-8-g[0-9a-f]+$" out ' -check_describe "A-*[0-9a-f]" --dirty +check_describe "A-8-gHASH" --dirty test_expect_success 'describe --dirty with --work-tree' ' ( cd "$TEST_DIRECTORY" && git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out" ) && - grep -E "^A-[1-9][0-9]?-g[0-9a-f]+$" out + grep -E "^A-8-g[0-9a-f]+$" out ' test_expect_success 'set-up dirty work tree' ' echo >>file ' -check_describe "A-*[0-9a-f]-dirty" --dirty - test_expect_success 'describe --dirty with --work-tree (dirty)' ' + git describe --dirty >expected && ( cd "$TEST_DIRECTORY" && git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out" ) && - grep -E "^A-[1-9][0-9]?-g[0-9a-f]+-dirty$" out + grep -E "^A-8-g[0-9a-f]+-dirty$" out && + test_cmp expected out ' -check_describe "A-*[0-9a-f].mod" --dirty=.mod - test_expect_success 'describe --dirty=.mod with --work-tree (dirty)' ' + git describe --dirty=.mod >expected && ( cd "$TEST_DIRECTORY" && git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty=.mod >"$TRASH_DIRECTORY/out" ) && - grep -E "^A-[1-9][0-9]?-g[0-9a-f]+.mod$" out + grep -E "^A-8-g[0-9a-f]+.mod$" out && + test_cmp expected out ' test_expect_success 'describe --dirty HEAD' ' @@ -220,21 +201,21 @@ test_expect_success 'set-up matching pattern tests' ' ' -check_describe "test-annotated-*" --match="test-*" +check_describe "test-annotated-3-gHASH" --match="test-*" -check_describe "test1-lightweight-*" --tags --match="test1-*" +check_describe "test1-lightweight-2-gHASH" --tags --match="test1-*" -check_describe "test2-lightweight-*" --tags --match="test2-*" +check_describe "test2-lightweight-1-gHASH" --tags --match="test2-*" -check_describe "test2-lightweight-*" --long --tags --match="test2-*" HEAD^ +check_describe "test2-lightweight-0-gHASH" --long --tags --match="test2-*" HEAD^ -check_describe "test2-lightweight-*" --long --tags --match="test1-*" --match="test2-*" HEAD^ +check_describe "test2-lightweight-0-gHASH" --long --tags --match="test1-*" --match="test2-*" HEAD^ -check_describe "test2-lightweight-*" --long --tags --match="test1-*" --no-match --match="test2-*" HEAD^ +check_describe "test2-lightweight-0-gHASH" --long --tags --match="test1-*" --no-match --match="test2-*" HEAD^ -check_describe "test1-lightweight-*" --long --tags --match="test1-*" --match="test3-*" HEAD +check_describe "test1-lightweight-2-gHASH" --long --tags --match="test1-*" --match="test3-*" HEAD -check_describe "test1-lightweight-*" --long --tags --match="test3-*" --match="test1-*" HEAD +check_describe "test1-lightweight-2-gHASH" --long --tags --match="test3-*" --match="test1-*" HEAD test_expect_success 'set-up branches' ' git branch branch_A A && @@ -244,11 +225,11 @@ test_expect_success 'set-up branches' ' git update-ref refs/original/original_branch_A test-annotated~2 ' -check_describe "heads/branch_A*" --all --match="branch_*" --exclude="branch_C" HEAD +check_describe "heads/branch_A-11-gHASH" --all --match="branch_*" --exclude="branch_C" HEAD -check_describe "remotes/origin/remote_branch_A*" --all --match="origin/remote_branch_*" --exclude="origin/remote_branch_C" HEAD +check_describe "remotes/origin/remote_branch_A-11-gHASH" --all --match="origin/remote_branch_*" --exclude="origin/remote_branch_C" HEAD -check_describe "original/original_branch_A*" --all test-annotated~1 +check_describe "original/original_branch_A-6-gHASH" --all test-annotated~1 test_expect_success '--match does not work for other types' ' test_must_fail git describe --all --match="*original_branch_*" test-annotated~1 @@ -403,15 +384,15 @@ test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' ' i=1 && while test $i -lt 8000 do - echo "commit refs/heads/master + echo "commit refs/heads/main committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200 data <<EOF commit #$i EOF" - test $i = 1 && echo "from refs/heads/master^0" + test $i = 1 && echo "from refs/heads/main^0" i=$(($i + 1)) done | git fast-import && - git checkout master && + git checkout main && git tag far-far-away HEAD^ && echo "HEAD~4000 tags/far-far-away~3999" >expect && git name-rev HEAD~4000 >actual && @@ -442,7 +423,7 @@ test_expect_success 'describe complains about missing object' ' ' test_expect_success 'name-rev a rev shortly after epoch' ' - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout --orphan no-timestamp-underflow && # Any date closer to epoch than the CUTOFF_DATE_SLOP constant @@ -456,7 +437,7 @@ test_expect_success 'name-rev a rev shortly after epoch' ' test_cmp expect actual ' -# A--------------master +# A--------------main # \ / # \----------M2 # \ / @@ -487,10 +468,10 @@ test_expect_success 'name-rev covers all conditions while looking at parents' ' git checkout $A && git merge --no-ff HEAD@{1} && # M2 - git checkout master && + git checkout main && git merge --no-ff HEAD@{1} && - echo "$B master^2^2~1^2" >expect && + echo "$B main^2^2~1^2" >expect && git name-rev $B >actual && test_cmp expect actual @@ -503,7 +484,7 @@ test_expect_success 'name-rev covers all conditions while looking at parents' ' # o-----o---o----x # A # -test_expect_success 'describe commits with disjoint bases' ' +test_expect_success 'setup: describe commits with disjoint bases' ' git init disjoint1 && ( cd disjoint1 && @@ -516,19 +497,19 @@ test_expect_success 'describe commits with disjoint bases' ' git checkout --orphan branch && rm file && echo B > file2 && git add file2 && git commit -m B && git tag B -a -m B && - git merge --no-ff --allow-unrelated-histories master -m x && - - check_describe "A-3-*" HEAD + git merge --no-ff --allow-unrelated-histories main -m x ) ' +check_describe -C disjoint1 "A-3-gHASH" HEAD + # B # o---o---o------------. # \ # o---o---x # A # -test_expect_success 'describe commits with disjoint bases 2' ' +test_expect_success 'setup: describe commits with disjoint bases 2' ' git init disjoint2 && ( cd disjoint2 && @@ -542,10 +523,10 @@ test_expect_success 'describe commits with disjoint bases 2' ' echo o >> file2 && git add file2 && GIT_COMMITTER_DATE="2020-01-01 15:01" git commit -m o && echo B >> file2 && git add file2 && GIT_COMMITTER_DATE="2020-01-01 15:02" git commit -m B && git tag B -a -m B && - git merge --no-ff --allow-unrelated-histories master -m x && - - check_describe "B-3-*" HEAD + git merge --no-ff --allow-unrelated-histories main -m x ) ' +check_describe -C disjoint2 "B-3-gHASH" HEAD + test_done diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh index c670668409..0f1cb49ced 100755 --- a/t/t6134-pathspec-in-submodule.sh +++ b/t/t6134-pathspec-in-submodule.sh @@ -21,7 +21,7 @@ EOF test_expect_success 'error message for path inside submodule' ' echo a >sub/a && test_must_fail git add sub/a 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'error message for path inside submodule from within submodule' ' diff --git a/t/t6200-fmt-merge-msg.sh b/t/t6200-fmt-merge-msg.sh index 7d549748ef..44f55d93fe 100755 --- a/t/t6200-fmt-merge-msg.sh +++ b/t/t6200-fmt-merge-msg.sh @@ -5,6 +5,9 @@ test_description='fmt-merge-msg test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" @@ -81,7 +84,7 @@ test_expect_success GPG 'set up a signed tag' ' test_expect_success 'message for merging local branch' ' echo "Merge branch ${apos}left${apos}" >expected && - git checkout master && + git checkout main && git fetch . left && git fmt-merge-msg <.git/FETCH_HEAD >actual && @@ -89,7 +92,7 @@ test_expect_success 'message for merging local branch' ' ' test_expect_success GPG 'message for merging local tag signed by good key' ' - git checkout master && + git checkout main && git fetch . signed-good-tag && git fmt-merge-msg <.git/FETCH_HEAD >actual 2>&1 && grep "^Merge tag ${apos}signed-good-tag${apos}" actual && @@ -98,7 +101,7 @@ test_expect_success GPG 'message for merging local tag signed by good key' ' ' test_expect_success GPG 'message for merging local tag signed by unknown key' ' - git checkout master && + git checkout main && git fetch . signed-good-tag && GNUPGHOME=. git fmt-merge-msg <.git/FETCH_HEAD >actual 2>&1 && grep "^Merge tag ${apos}signed-good-tag${apos}" actual && @@ -109,7 +112,7 @@ test_expect_success GPG 'message for merging local tag signed by unknown key' ' test_expect_success 'message for merging external branch' ' echo "Merge branch ${apos}left${apos} of $(pwd)" >expected && - git checkout master && + git checkout main && git fetch "$(pwd)" left && git fmt-merge-msg <.git/FETCH_HEAD >actual && @@ -133,7 +136,7 @@ test_expect_success '[merge] summary/log configuration' ' test_config merge.log true && test_unconfig merge.summary && - git checkout master && + git checkout main && test_tick && git fetch . left && @@ -142,7 +145,7 @@ test_expect_success '[merge] summary/log configuration' ' test_unconfig merge.log && test_config merge.summary true && - git checkout master && + git checkout main && test_tick && git fetch . left && @@ -153,7 +156,7 @@ test_expect_success '[merge] summary/log configuration' ' ' test_expect_success 'setup FETCH_HEAD' ' - git checkout master && + git checkout main && test_tick && git fetch . left ' @@ -281,7 +284,7 @@ test_expect_success 'fmt-merge-msg -m' ' test_unconfig merge.log && test_unconfig merge.summary && - git checkout master && + git checkout main && git fetch "$(pwd)" left && git fmt-merge-msg -m "Sync with left" <.git/FETCH_HEAD >actual && git fmt-merge-msg --log -m "Sync with left" \ @@ -323,28 +326,28 @@ test_expect_success 'setup: expected shortlog for two branches' ' test_expect_success 'shortlog for two branches' ' test_config merge.log true && test_unconfig merge.summary && - git checkout master && + git checkout main && test_tick && git fetch . left right && git fmt-merge-msg <.git/FETCH_HEAD >actual1 && test_unconfig merge.log && test_config merge.summary true && - git checkout master && + git checkout main && test_tick && git fetch . left right && git fmt-merge-msg <.git/FETCH_HEAD >actual2 && test_config merge.log yes && test_unconfig merge.summary && - git checkout master && + git checkout main && test_tick && git fetch . left right && git fmt-merge-msg <.git/FETCH_HEAD >actual3 && test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . left right && git fmt-merge-msg <.git/FETCH_HEAD >actual4 && @@ -358,7 +361,7 @@ test_expect_success 'shortlog for two branches' ' test_expect_success 'merge-msg -F' ' test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . left right && git fmt-merge-msg -F .git/FETCH_HEAD >actual && @@ -368,7 +371,7 @@ test_expect_success 'merge-msg -F' ' test_expect_success 'merge-msg -F in subdirectory' ' test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . left right && mkdir sub && @@ -408,7 +411,7 @@ test_expect_success 'merge-msg tag' ' test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . tag tag-r3 && @@ -438,7 +441,7 @@ test_expect_success 'merge-msg two tags' ' test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . tag tag-r3 tag tag-l5 && @@ -468,7 +471,7 @@ test_expect_success 'merge-msg tag and branch' ' test_unconfig merge.log && test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . tag tag-r3 left && @@ -495,7 +498,7 @@ test_expect_success 'merge-msg lots of commits' ' test_config merge.summary yes && - git checkout master && + git checkout main && test_tick && git fetch . long && @@ -506,11 +509,11 @@ test_expect_success 'merge-msg lots of commits' ' test_expect_success 'merge-msg with "merging" an annotated tag' ' test_config merge.log true && - git checkout master^0 && + git checkout main^0 && git commit --allow-empty -m "One step ahead" && git tag -a -m "An annotated one" annote HEAD && - git checkout master && + git checkout main && git fetch . annote && git fmt-merge-msg <.git/FETCH_HEAD >actual && @@ -543,23 +546,23 @@ test_expect_success 'merge-msg with "merging" an annotated tag' ' ' test_expect_success 'merge.suppressDest configuration' ' - git checkout -B side master && + git checkout -B side main && git commit --allow-empty -m "One step ahead" && - git checkout master && + git checkout main && git fetch . side && git -c merge.suppressDest="" fmt-merge-msg <.git/FETCH_HEAD >full.1 && head -n1 full.1 >actual && - grep -e "Merge branch .side. into master" actual && + grep -e "Merge branch .side. into main" actual && git -c merge.suppressDest="mast" fmt-merge-msg <.git/FETCH_HEAD >full.2 && head -n1 full.2 >actual && - grep -e "Merge branch .side. into master$" actual && + grep -e "Merge branch .side. into main$" actual && - git -c merge.suppressDest="ma??er" fmt-merge-msg <.git/FETCH_HEAD >full.3 && + git -c merge.suppressDest="ma?*[rn]" fmt-merge-msg <.git/FETCH_HEAD >full.3 && head -n1 full.3 >actual && grep -e "Merge branch .side." actual && - ! grep -e " into master$" actual + ! grep -e " into main$" actual ' test_done diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index b359023189..9e0214076b 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -5,6 +5,9 @@ test_description='for-each-ref test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -28,12 +31,13 @@ test_expect_success setup ' echo "Using $datestamp" > one && git add one && git commit -m "Initial" && + git branch -M main && setdate_and_increment && git tag -a -m "Tagging at $datestamp" testtag && - git update-ref refs/remotes/origin/master master && + git update-ref refs/remotes/origin/main main && git remote add origin nowhere && - git config branch.master.remote origin && - git config branch.master.merge refs/heads/master && + git config branch.main.remote origin && + git config branch.main.merge refs/heads/main && git remote add myfork elsewhere && git config remote.pushdefault myfork && git config push.default current @@ -41,7 +45,7 @@ test_expect_success setup ' test_atom() { case "$1" in - head) ref=refs/heads/master ;; + head) ref=refs/heads/main ;; tag) ref=refs/tags/testtag ;; sym) ref=refs/heads/sym ;; *) ref=$1 ;; @@ -76,49 +80,49 @@ test_atom() { hexlen=$(test_oid hexsz) disklen=$(test_oid disklen) -test_atom head refname refs/heads/master -test_atom head refname: refs/heads/master -test_atom head refname:short master -test_atom head refname:lstrip=1 heads/master -test_atom head refname:lstrip=2 master -test_atom head refname:lstrip=-1 master -test_atom head refname:lstrip=-2 heads/master +test_atom head refname refs/heads/main +test_atom head refname: refs/heads/main +test_atom head refname:short main +test_atom head refname:lstrip=1 heads/main +test_atom head refname:lstrip=2 main +test_atom head refname:lstrip=-1 main +test_atom head refname:lstrip=-2 heads/main test_atom head refname:rstrip=1 refs/heads test_atom head refname:rstrip=2 refs test_atom head refname:rstrip=-1 refs test_atom head refname:rstrip=-2 refs/heads -test_atom head refname:strip=1 heads/master -test_atom head refname:strip=2 master -test_atom head refname:strip=-1 master -test_atom head refname:strip=-2 heads/master -test_atom head upstream refs/remotes/origin/master -test_atom head upstream:short origin/master -test_atom head upstream:lstrip=2 origin/master -test_atom head upstream:lstrip=-2 origin/master +test_atom head refname:strip=1 heads/main +test_atom head refname:strip=2 main +test_atom head refname:strip=-1 main +test_atom head refname:strip=-2 heads/main +test_atom head upstream refs/remotes/origin/main +test_atom head upstream:short origin/main +test_atom head upstream:lstrip=2 origin/main +test_atom head upstream:lstrip=-2 origin/main test_atom head upstream:rstrip=2 refs/remotes test_atom head upstream:rstrip=-2 refs/remotes -test_atom head upstream:strip=2 origin/master -test_atom head upstream:strip=-2 origin/master -test_atom head push refs/remotes/myfork/master -test_atom head push:short myfork/master -test_atom head push:lstrip=1 remotes/myfork/master -test_atom head push:lstrip=-1 master +test_atom head upstream:strip=2 origin/main +test_atom head upstream:strip=-2 origin/main +test_atom head push refs/remotes/myfork/main +test_atom head push:short myfork/main +test_atom head push:lstrip=1 remotes/myfork/main +test_atom head push:lstrip=-1 main test_atom head push:rstrip=1 refs/remotes/myfork test_atom head push:rstrip=-1 refs -test_atom head push:strip=1 remotes/myfork/master -test_atom head push:strip=-1 master +test_atom head push:strip=1 remotes/myfork/main +test_atom head push:strip=-1 main test_atom head objecttype commit test_atom head objectsize $((131 + hexlen)) test_atom head objectsize:disk $disklen test_atom head deltabase $ZERO_OID -test_atom head objectname $(git rev-parse refs/heads/master) -test_atom head objectname:short $(git rev-parse --short refs/heads/master) -test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master) -test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master) -test_atom head tree $(git rev-parse refs/heads/master^{tree}) -test_atom head tree:short $(git rev-parse --short refs/heads/master^{tree}) -test_atom head tree:short=1 $(git rev-parse --short=1 refs/heads/master^{tree}) -test_atom head tree:short=10 $(git rev-parse --short=10 refs/heads/master^{tree}) +test_atom head objectname $(git rev-parse refs/heads/main) +test_atom head objectname:short $(git rev-parse --short refs/heads/main) +test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/main) +test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/main) +test_atom head tree $(git rev-parse refs/heads/main^{tree}) +test_atom head tree:short $(git rev-parse --short refs/heads/main^{tree}) +test_atom head tree:short=1 $(git rev-parse --short=1 refs/heads/main^{tree}) +test_atom head tree:short=10 $(git rev-parse --short=10 refs/heads/main^{tree}) test_atom head parent '' test_atom head parent:short '' test_atom head parent:short=1 '' @@ -171,8 +175,8 @@ test_atom tag deltabase $ZERO_OID test_atom tag '*deltabase' $ZERO_OID test_atom tag objectname $(git rev-parse refs/tags/testtag) test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag) -test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master) -test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master) +test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/main) +test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/main) test_atom tag tree '' test_atom tag tree:short '' test_atom tag tree:short=1 '' @@ -253,7 +257,7 @@ test_date () { author_date=$3 && tagger_date=$4 && cat >expected <<-EOF && - 'refs/heads/master' '$committer_date' '$author_date' + 'refs/heads/main' '$committer_date' '$author_date' 'refs/tags/testtag' '$tagger_date' EOF ( @@ -375,8 +379,8 @@ test_expect_success 'exercise strftime with odd fields' ' ' cat >expected <<\EOF -refs/heads/master -refs/remotes/origin/master +refs/heads/main +refs/remotes/origin/main refs/tags/testtag EOF @@ -388,8 +392,8 @@ test_expect_success 'Verify ascending sort' ' cat >expected <<\EOF refs/tags/testtag -refs/remotes/origin/master -refs/heads/master +refs/remotes/origin/main +refs/heads/main EOF test_expect_success 'Verify descending sort' ' @@ -424,8 +428,8 @@ test_expect_success 'exercise glob patterns with prefixes' ' ' cat >expected <<\EOF -'refs/heads/master' -'refs/remotes/origin/master' +'refs/heads/main' +'refs/remotes/origin/main' 'refs/tags/testtag' EOF @@ -445,8 +449,8 @@ test_expect_success 'Quoting style: python' ' ' cat >expected <<\EOF -"refs/heads/master" -"refs/remotes/origin/master" +"refs/heads/main" +"refs/remotes/origin/main" "refs/tags/testtag" EOF @@ -473,8 +477,8 @@ test_atom head upstream:nobracket,track 'ahead 1' test_expect_success 'setup for push:track[short]' ' test_commit third && - git update-ref refs/remotes/myfork/master master && - git reset master~1 + git update-ref refs/remotes/myfork/main main && + git reset main~1 ' test_atom head push:track '[behind 1]' @@ -490,8 +494,8 @@ test_expect_success 'Check that :track[short] works when upstream is invalid' ' [gone] EOF - test_when_finished "git config branch.master.merge refs/heads/master" && - git config branch.master.merge refs/heads/does-not-exist && + test_when_finished "git config branch.main.merge refs/heads/main" && + git config branch.main.merge refs/heads/does-not-exist && git for-each-ref \ --format="%(upstream:track)$LF%(upstream:trackshort)" \ refs/heads >actual && @@ -504,9 +508,9 @@ test_expect_success 'Check for invalid refname format' ' test_expect_success 'set up color tests' ' cat >expected.color <<-EOF && - $(git rev-parse --short refs/heads/master) <GREEN>master<RESET> - $(git rev-parse --short refs/remotes/myfork/master) <GREEN>myfork/master<RESET> - $(git rev-parse --short refs/remotes/origin/master) <GREEN>origin/master<RESET> + $(git rev-parse --short refs/heads/main) <GREEN>main<RESET> + $(git rev-parse --short refs/remotes/myfork/main) <GREEN>myfork/main<RESET> + $(git rev-parse --short refs/remotes/origin/main) <GREEN>origin/main<RESET> $(git rev-parse --short refs/tags/testtag) <GREEN>testtag<RESET> $(git rev-parse --short refs/tags/third) <GREEN>third<RESET> $(git rev-parse --short refs/tags/two) <GREEN>two<RESET> @@ -538,8 +542,8 @@ test_expect_success 'color.ui=always does not override tty check' ' ' cat >expected <<\EOF -heads/master -tags/master +heads/main +tags/main EOF test_expect_success 'Check ambiguous head and tag refs (strict)' ' @@ -549,19 +553,19 @@ test_expect_success 'Check ambiguous head and tag refs (strict)' ' git add one && git commit -m "Branch" && setdate_and_increment && - git tag -m "Tagging at $datestamp" master && - git for-each-ref --format "%(refname:short)" refs/heads/master refs/tags/master >actual && + git tag -m "Tagging at $datestamp" main && + git for-each-ref --format "%(refname:short)" refs/heads/main refs/tags/main >actual && test_cmp expected actual ' cat >expected <<\EOF -heads/master -master +heads/main +main EOF test_expect_success 'Check ambiguous head and tag refs (loose)' ' git config --bool core.warnambiguousrefs false && - git for-each-ref --format "%(refname:short)" refs/heads/master refs/tags/master >actual && + git for-each-ref --format "%(refname:short)" refs/heads/main refs/tags/main >actual && test_cmp expected actual ' @@ -571,7 +575,7 @@ ambiguous EOF test_expect_success 'Check ambiguous head and tag refs II (loose)' ' - git checkout master && + git checkout main && git tag ambiguous testtag^0 && git branch ambiguous testtag^0 && git for-each-ref --format "%(refname:short)" refs/heads/ambiguous refs/tags/ambiguous >actual && @@ -705,8 +709,8 @@ body contents $sig" test_expect_success 'set up refs pointing to tree and blob' ' - git update-ref refs/mytrees/first refs/heads/master^{tree} && - git update-ref refs/myblobs/first refs/heads/master:one + git update-ref refs/mytrees/first refs/heads/main^{tree} && + git update-ref refs/myblobs/first refs/heads/main:one ' test_atom refs/mytrees/first subject "" @@ -778,7 +782,7 @@ test_expect_success 'equivalent sorts fall back on refname' ' ' test_expect_success 'do not dereference NULL upon %(HEAD) on unborn branch' ' - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual && sed -e "s/^\* / /" actual >expect && git checkout --orphan orphaned-branch && @@ -810,64 +814,163 @@ test_expect_success 'set up trailers for next test' ' EOF ' -test_expect_success '%(trailers:unfold) unfolds trailers' ' - { - unfold <trailers - echo - } >expect && - git for-each-ref --format="%(trailers:unfold)" refs/heads/master >actual && - test_cmp expect actual && - git for-each-ref --format="%(contents:trailers:unfold)" refs/heads/master >actual && - test_cmp expect actual -' +test_trailer_option () { + title=$1 option=$2 + cat >expect + test_expect_success "$title" ' + git for-each-ref --format="%($option)" refs/heads/main >actual && + test_cmp expect actual && + git for-each-ref --format="%(contents:$option)" refs/heads/main >actual && + test_cmp expect actual + ' +} -test_expect_success '%(trailers:only) shows only "key: value" trailers' ' - { - grep -v patch.description <trailers && - echo - } >expect && - git for-each-ref --format="%(trailers:only)" refs/heads/master >actual && - test_cmp expect actual && - git for-each-ref --format="%(contents:trailers:only)" refs/heads/master >actual && - test_cmp expect actual -' +test_trailer_option '%(trailers:unfold) unfolds trailers' \ + 'trailers:unfold' <<-EOF + $(unfold <trailers) -test_expect_success '%(trailers:only) and %(trailers:unfold) work together' ' - { - grep -v patch.description <trailers | unfold && - echo - } >expect && - git for-each-ref --format="%(trailers:only,unfold)" refs/heads/master >actual && - test_cmp expect actual && - git for-each-ref --format="%(trailers:unfold,only)" refs/heads/master >actual && - test_cmp actual actual && - git for-each-ref --format="%(contents:trailers:only,unfold)" refs/heads/master >actual && - test_cmp expect actual && - git for-each-ref --format="%(contents:trailers:unfold,only)" refs/heads/master >actual && - test_cmp actual actual -' - -test_expect_success '%(trailers) rejects unknown trailers arguments' ' - # error message cannot be checked under i18n - cat >expect <<-EOF && + EOF + +test_trailer_option '%(trailers:only) shows only "key: value" trailers' \ + 'trailers:only' <<-EOF + $(grep -v patch.description <trailers) + + EOF + +test_trailer_option '%(trailers:only=no,only=true) shows only "key: value" trailers' \ + 'trailers:only=no,only=true' <<-EOF + $(grep -v patch.description <trailers) + + EOF + +test_trailer_option '%(trailers:only=yes) shows only "key: value" trailers' \ + 'trailers:only=yes' <<-EOF + $(grep -v patch.description <trailers) + + EOF + +test_trailer_option '%(trailers:only=no) shows all trailers' \ + 'trailers:only=no' <<-EOF + $(cat trailers) + + EOF + +test_trailer_option '%(trailers:only) and %(trailers:unfold) work together' \ + 'trailers:only,unfold' <<-EOF + $(grep -v patch.description <trailers | unfold) + + EOF + +test_trailer_option '%(trailers:unfold) and %(trailers:only) work together' \ + 'trailers:unfold,only' <<-EOF + $(grep -v patch.description <trailers | unfold) + + EOF + +test_trailer_option '%(trailers:key=foo) shows that trailer' \ + 'trailers:key=Signed-off-by' <<-EOF + Signed-off-by: A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:key=foo) is case insensitive' \ + 'trailers:key=SiGned-oFf-bY' <<-EOF + Signed-off-by: A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:key=foo:) trailing colon also works' \ + 'trailers:key=Signed-off-by:' <<-EOF + Signed-off-by: A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:key=foo) multiple keys' \ + 'trailers:key=Reviewed-by:,key=Signed-off-by' <<-EOF + Reviewed-by: A U Thor <author@example.com> + Signed-off-by: A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:key=nonexistent) becomes empty' \ + 'trailers:key=Shined-off-by:' <<-EOF + + EOF + +test_trailer_option '%(trailers:key=foo) handles multiple lines even if folded' \ + 'trailers:key=Acked-by' <<-EOF + $(grep -v patch.description <trailers | grep -v Signed-off-by | grep -v Reviewed-by) + + EOF + +test_trailer_option '%(trailers:key=foo,unfold) properly unfolds' \ + 'trailers:key=Signed-Off-by,unfold' <<-EOF + $(unfold <trailers | grep Signed-off-by) + + EOF + +test_trailer_option '%(trailers:key=foo,only=no) also includes nontrailer lines' \ + 'trailers:key=Signed-off-by,only=no' <<-EOF + Signed-off-by: A U Thor <author@example.com> + $(grep patch.description <trailers) + + EOF + +test_trailer_option '%(trailers:key=foo,valueonly) shows only value' \ + 'trailers:key=Signed-off-by,valueonly' <<-EOF + A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:separator) changes separator' \ + 'trailers:separator=%x2C,key=Reviewed-by,key=Signed-off-by:' <<-EOF + Reviewed-by: A U Thor <author@example.com>,Signed-off-by: A U Thor <author@example.com> + EOF + +test_trailer_option '%(trailers:key_value_separator) changes key-value separator' \ + 'trailers:key_value_separator=%x2C,key=Reviewed-by,key=Signed-off-by:' <<-EOF + Reviewed-by,A U Thor <author@example.com> + Signed-off-by,A U Thor <author@example.com> + + EOF + +test_trailer_option '%(trailers:separator,key_value_separator) changes both separators' \ + 'trailers:separator=%x2C,key_value_separator=%x2C,key=Reviewed-by,key=Signed-off-by:' <<-EOF + Reviewed-by,A U Thor <author@example.com>,Signed-off-by,A U Thor <author@example.com> + EOF + +test_failing_trailer_option () { + title=$1 option=$2 + cat >expect + test_expect_success "$title" ' + # error message cannot be checked under i18n + test_must_fail git for-each-ref --format="%($option)" refs/heads/main 2>actual && + test_cmp expect actual && + test_must_fail git for-each-ref --format="%(contents:$option)" refs/heads/main 2>actual && + test_cmp expect actual + ' +} + +test_failing_trailer_option '%(trailers) rejects unknown trailers arguments' \ + 'trailers:unsupported' <<-\EOF fatal: unknown %(trailers) argument: unsupported EOF - test_must_fail git for-each-ref --format="%(trailers:unsupported)" 2>actual && - test_i18ncmp expect actual && - test_must_fail git for-each-ref --format="%(contents:trailers:unsupported)" 2>actual && - test_i18ncmp expect actual -' + +test_failing_trailer_option '%(trailers:key) without value is error' \ + 'trailers:key' <<-\EOF + fatal: expected %(trailers:key=<value>) + EOF test_expect_success 'if arguments, %(contents:trailers) shows error if colon is missing' ' cat >expect <<-EOF && fatal: unrecognized %(contents) argument: trailersonly EOF test_must_fail git for-each-ref --format="%(contents:trailersonly)" 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'basic atom: head contents:trailers' ' - git for-each-ref --format="%(contents:trailers)" refs/heads/master >actual && + git for-each-ref --format="%(contents:trailers)" refs/heads/main >actual && sanitize_pgp <actual >actual.clean && # git for-each-ref ends with a blank line cat >expect <<-EOF && @@ -896,16 +999,16 @@ test_expect_success 'trailer parsing not fooled by --- line' ' echo "trailer: right" && echo } >expect && - git for-each-ref --format="%(trailers)" refs/heads/master >actual && + git for-each-ref --format="%(trailers)" refs/heads/main >actual && test_cmp expect actual ' test_expect_success 'Add symbolic ref for the following tests' ' - git symbolic-ref refs/heads/sym refs/heads/master + git symbolic-ref refs/heads/sym refs/heads/main ' cat >expected <<EOF -refs/heads/master +refs/heads/main EOF test_expect_success 'Verify usage of %(symref) atom' ' @@ -914,7 +1017,7 @@ test_expect_success 'Verify usage of %(symref) atom' ' ' cat >expected <<EOF -heads/master +heads/main EOF test_expect_success 'Verify usage of %(symref:short) atom' ' @@ -923,8 +1026,8 @@ test_expect_success 'Verify usage of %(symref:short) atom' ' ' cat >expected <<EOF -master -heads/master +main +heads/main EOF test_expect_success 'Verify usage of %(symref:lstrip) atom' ' @@ -953,22 +1056,23 @@ test_expect_success ':remotename and :remoteref' ' ( cd remote-tests && test_commit initial && + git branch -M main && git remote add from fifth.coffee:blub && - git config branch.master.remote from && - git config branch.master.merge refs/heads/stable && + git config branch.main.remote from && + git config branch.main.merge refs/heads/stable && git remote add to southridge.audio:repo && git config remote.to.push "refs/heads/*:refs/heads/pushed/*" && - git config branch.master.pushRemote to && + git config branch.main.pushRemote to && for pair in "%(upstream)=refs/remotes/from/stable" \ "%(upstream:remotename)=from" \ "%(upstream:remoteref)=refs/heads/stable" \ - "%(push)=refs/remotes/to/pushed/master" \ + "%(push)=refs/remotes/to/pushed/main" \ "%(push:remotename)=to" \ - "%(push:remoteref)=refs/heads/pushed/master" + "%(push:remoteref)=refs/heads/pushed/main" do echo "${pair#*=}" >expect && git for-each-ref --format="${pair%=*}" \ - refs/heads/master >actual && + refs/heads/main >actual && test_cmp expect actual done && git branch push-simple && @@ -981,12 +1085,12 @@ test_expect_success ':remotename and :remoteref' ' ' test_expect_success 'for-each-ref --ignore-case ignores case' ' - git for-each-ref --format="%(refname)" refs/heads/MASTER >actual && + git for-each-ref --format="%(refname)" refs/heads/MAIN >actual && test_must_be_empty actual && - echo refs/heads/master >expect && + echo refs/heads/main >expect && git for-each-ref --format="%(refname)" --ignore-case \ - refs/heads/MASTER >actual && + refs/heads/MAIN >actual && test_cmp expect actual ' @@ -1030,4 +1134,14 @@ test_expect_success 'for-each-ref --ignore-case works on multiple sort keys' ' test_cmp expect actual ' +test_expect_success 'for-each-ref reports broken tags' ' + git tag -m "good tag" broken-tag-good HEAD && + git cat-file tag broken-tag-good >good && + sed s/commit/blob/ <good >bad && + bad=$(git hash-object -w -t tag bad) && + git update-ref refs/tags/broken-tag-bad $bad && + test_must_fail git for-each-ref --format="%(*objectname)" \ + refs/tags/broken-tag-* +' + test_done diff --git a/t/t6301-for-each-ref-errors.sh b/t/t6301-for-each-ref-errors.sh index 809854fc0c..40edf9dab5 100755 --- a/t/t6301-for-each-ref-errors.sh +++ b/t/t6301-for-each-ref-errors.sh @@ -20,8 +20,8 @@ test_expect_success 'Broken refs are reported correctly' ' test_when_finished "rm -f .git/$r" && echo "warning: ignoring broken ref $r" >broken-err && git for-each-ref >out 2>err && - test_i18ncmp full-list out && - test_i18ncmp broken-err err + test_cmp full-list out && + test_cmp broken-err err ' test_expect_success 'NULL_SHA1 refs are reported correctly' ' @@ -31,10 +31,10 @@ test_expect_success 'NULL_SHA1 refs are reported correctly' ' echo "warning: ignoring broken ref $r" >zeros-err && git for-each-ref >out 2>err && test_cmp full-list out && - test_i18ncmp zeros-err err && + test_cmp zeros-err err && git for-each-ref --format="%(objectname) %(refname)" >brief-out 2>brief-err && test_cmp brief-list brief-out && - test_i18ncmp zeros-err brief-err + test_cmp zeros-err brief-err ' test_expect_success 'Missing objects are reported correctly' ' @@ -43,7 +43,7 @@ test_expect_success 'Missing objects are reported correctly' ' test_when_finished "rm -f .git/$r" && echo "fatal: missing object $MISSING for $r" >missing-err && test_must_fail git for-each-ref 2>err && - test_i18ncmp missing-err err && + test_cmp missing-err err && ( cat brief-list && echo "$MISSING $r" diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh index 35408d53fd..1537aa2179 100755 --- a/t/t6302-for-each-ref-filter.sh +++ b/t/t6302-for-each-ref-filter.sh @@ -2,11 +2,15 @@ test_description='test for-each-refs usage of ref-filter APIs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh test_expect_success 'setup some history and refs' ' test_commit one && + git branch -M main && test_commit two && test_commit three && git checkout -b side && @@ -26,17 +30,17 @@ test_expect_success 'setup some history and refs' ' git tag $sign -m "A signed tag" signed-tag && git tag $sign -m "Signed doubly" doubly-signed-tag signed-tag && - git checkout master && - git update-ref refs/odd/spot master + git checkout main && + git update-ref refs/odd/spot main ' test_expect_success 'filtering with --points-at' ' cat >expect <<-\EOF && - refs/heads/master + refs/heads/main refs/odd/spot refs/tags/three EOF - git for-each-ref --format="%(refname)" --points-at=master >actual && + git for-each-ref --format="%(refname)" --points-at=main >actual && test_cmp expect actual ' @@ -53,13 +57,13 @@ test_expect_success 'check signed tags with --points-at' ' test_expect_success 'filtering with --merged' ' cat >expect <<-\EOF && - refs/heads/master + refs/heads/main refs/odd/spot refs/tags/one refs/tags/three refs/tags/two EOF - git for-each-ref --format="%(refname)" --merged=master >actual && + git for-each-ref --format="%(refname)" --merged=main >actual && test_cmp expect actual ' @@ -72,13 +76,13 @@ test_expect_success 'filtering with --no-merged' ' refs/tags/four refs/tags/signed-tag EOF - git for-each-ref --format="%(refname)" --no-merged=master >actual && + git for-each-ref --format="%(refname)" --no-merged=main >actual && test_cmp expect actual ' test_expect_success 'filtering with --contains' ' cat >expect <<-\EOF && - refs/heads/master + refs/heads/main refs/heads/side refs/odd/spot refs/tags/annotated-tag @@ -113,9 +117,28 @@ test_expect_success '%(color) must fail' ' test_must_fail git for-each-ref --format="%(color)%(refname)" ' +test_expect_success '%(color:#aa22ac) must succeed' ' + test_when_finished rm -rf test && + git init test && + ( + cd test && + test_commit initial && + git branch -M main && + cat >expect <<-\EOF && + refs/heads/main + refs/tags/initial + EOF + git remote add origin nowhere && + git config branch.main.remote origin && + git config branch.main.merge refs/heads/main && + git for-each-ref --format="%(color:#aa22ac)%(refname)" >actual && + test_cmp expect actual + ) +' + test_expect_success 'left alignment is default' ' cat >expect <<-\EOF && - refname is refs/heads/master |refs/heads/master + refname is refs/heads/main |refs/heads/main refname is refs/heads/side |refs/heads/side refname is refs/odd/spot |refs/odd/spot refname is refs/tags/annotated-tag|refs/tags/annotated-tag @@ -133,7 +156,7 @@ test_expect_success 'left alignment is default' ' test_expect_success 'middle alignment' ' cat >expect <<-\EOF && - | refname is refs/heads/master |refs/heads/master + | refname is refs/heads/main |refs/heads/main | refname is refs/heads/side |refs/heads/side | refname is refs/odd/spot |refs/odd/spot |refname is refs/tags/annotated-tag|refs/tags/annotated-tag @@ -151,7 +174,7 @@ test_expect_success 'middle alignment' ' test_expect_success 'right alignment' ' cat >expect <<-\EOF && - | refname is refs/heads/master|refs/heads/master + | refname is refs/heads/main|refs/heads/main | refname is refs/heads/side|refs/heads/side | refname is refs/odd/spot|refs/odd/spot |refname is refs/tags/annotated-tag|refs/tags/annotated-tag @@ -168,7 +191,7 @@ test_expect_success 'right alignment' ' ' cat >expect <<-\EOF -| refname is refs/heads/master |refs/heads/master +| refname is refs/heads/main |refs/heads/main | refname is refs/heads/side |refs/heads/side | refname is refs/odd/spot |refs/odd/spot | refname is refs/tags/annotated-tag |refs/tags/annotated-tag @@ -215,7 +238,7 @@ EOF test_expect_success 'alignment with format quote' " cat >expect <<-\EOF && - |' '\''master| A U Thor'\'' '| + |' '\''main| A U Thor'\'' '| |' '\''side| A U Thor'\'' '| |' '\''odd/spot| A U Thor'\'' '| |' '\''annotated-tag| '\'' '| @@ -233,7 +256,7 @@ test_expect_success 'alignment with format quote' " test_expect_success 'nested alignment with quote formatting' " cat >expect <<-\EOF && - |' master '| + |' main '| |' side '| |' odd/spot '| |' annotated-tag '| @@ -251,7 +274,7 @@ test_expect_success 'nested alignment with quote formatting' " test_expect_success 'check `%(contents:lines=1)`' ' cat >expect <<-\EOF && - master |three + main |three side |four odd/spot |three annotated-tag |An annotated tag @@ -269,7 +292,7 @@ test_expect_success 'check `%(contents:lines=1)`' ' test_expect_success 'check `%(contents:lines=0)`' ' cat >expect <<-\EOF && - master | + main | side | odd/spot | annotated-tag | @@ -287,7 +310,7 @@ test_expect_success 'check `%(contents:lines=0)`' ' test_expect_success 'check `%(contents:lines=99999)`' ' cat >expect <<-\EOF && - master |three + main |three side |four odd/spot |three annotated-tag |An annotated tag @@ -360,7 +383,7 @@ test_expect_success 'improper usage of %(if), %(then), %(else) and %(end) atoms' test_expect_success 'check %(if)...%(then)...%(end) atoms' ' git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Author: %(authorname)%(end)" >actual && cat >expect <<-\EOF && - refs/heads/master Author: A U Thor + refs/heads/main Author: A U Thor refs/heads/side Author: A U Thor refs/odd/spot Author: A U Thor refs/tags/annotated-tag @@ -381,7 +404,7 @@ test_expect_success 'check %(if)...%(then)...%(end) atoms' ' test_expect_success 'check %(if)...%(then)...%(else)...%(end) atoms' ' git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(else)No author%(end): %(refname)" >actual && cat >expect <<-\EOF && - A U Thor: refs/heads/master + A U Thor: refs/heads/main A U Thor: refs/heads/side A U Thor: refs/odd/spot No author: refs/tags/annotated-tag @@ -401,7 +424,7 @@ test_expect_success 'check %(if)...%(then)...%(else)...%(end) atoms' ' test_expect_success 'ignore spaces in %(if) atom usage' ' git for-each-ref --format="%(refname:short): %(if)%(HEAD)%(then)Head ref%(else)Not Head ref%(end)" >actual && cat >expect <<-\EOF && - master: Head ref + main: Head ref side: Not Head ref odd/spot: Not Head ref annotated-tag: Not Head ref @@ -420,34 +443,34 @@ test_expect_success 'ignore spaces in %(if) atom usage' ' ' test_expect_success 'check %(if:equals=<string>)' ' - git for-each-ref --format="%(if:equals=master)%(refname:short)%(then)Found master%(else)Not master%(end)" refs/heads/ >actual && + git for-each-ref --format="%(if:equals=main)%(refname:short)%(then)Found main%(else)Not main%(end)" refs/heads/ >actual && cat >expect <<-\EOF && - Found master - Not master + Found main + Not main EOF test_cmp expect actual ' test_expect_success 'check %(if:notequals=<string>)' ' - git for-each-ref --format="%(if:notequals=master)%(refname:short)%(then)Not master%(else)Found master%(end)" refs/heads/ >actual && + git for-each-ref --format="%(if:notequals=main)%(refname:short)%(then)Not main%(else)Found main%(end)" refs/heads/ >actual && cat >expect <<-\EOF && - Found master - Not master + Found main + Not main EOF test_cmp expect actual ' -test_expect_success '--merged is incompatible with --no-merged' ' - test_must_fail git for-each-ref --merged HEAD --no-merged HEAD +test_expect_success '--merged is compatible with --no-merged' ' + git for-each-ref --merged HEAD --no-merged HEAD ' test_expect_success 'validate worktree atom' ' cat >expect <<-EOF && - master: $(pwd) - master_worktree: $(pwd)/worktree_dir + main: $(pwd) + main_worktree: $(pwd)/worktree_dir side: not checked out EOF - git worktree add -b master_worktree worktree_dir master && + git worktree add -b main_worktree worktree_dir main && git for-each-ref --format="%(refname:short): %(if)%(worktreepath)%(then)%(worktreepath)%(else)not checked out%(end)" refs/heads/ >actual && rm -r worktree_dir && git worktree prune && diff --git a/t/t6400-merge-df.sh b/t/t6400-merge-df.sh index 400a4cd139..57a67cf362 100755 --- a/t/t6400-merge-df.sh +++ b/t/t6400-merge-df.sh @@ -4,6 +4,9 @@ # test_description='Test merge with directory/file conflicts' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'prepare repository' ' @@ -24,12 +27,12 @@ test_expect_success 'prepare repository' ' ' test_expect_success 'Merge with d/f conflicts' ' - test_expect_code 1 git merge -m "merge msg" master + test_expect_code 1 git merge -m "merge msg" main ' test_expect_success 'F/D conflict' ' git reset --hard && - git checkout master && + git checkout main && rm .git/index && mkdir before && @@ -47,7 +50,7 @@ test_expect_success 'F/D conflict' ' git add . && git commit -m para && - git merge master + git merge main ' test_expect_success 'setup modify/delete + directory/file conflict' ' @@ -79,9 +82,14 @@ test_expect_success 'modify/delete + directory/file conflict' ' git checkout delete^0 && test_must_fail git merge modify && - test 5 -eq $(git ls-files -s | wc -l) && - test 4 -eq $(git ls-files -u | wc -l) && - test 1 -eq $(git ls-files -o | wc -l) && + test_stdout_line_count = 5 git ls-files -s && + test_stdout_line_count = 4 git ls-files -u && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 0 git ls-files -o + else + test_stdout_line_count = 1 git ls-files -o + fi && test_path_is_file letters/file && test_path_is_file letters.txt && @@ -95,9 +103,14 @@ test_expect_success 'modify/delete + directory/file conflict; other way' ' test_must_fail git merge delete && - test 5 -eq $(git ls-files -s | wc -l) && - test 4 -eq $(git ls-files -u | wc -l) && - test 1 -eq $(git ls-files -o | wc -l) && + test_stdout_line_count = 5 git ls-files -s && + test_stdout_line_count = 4 git ls-files -u && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 0 git ls-files -o + else + test_stdout_line_count = 1 git ls-files -o + fi && test_path_is_file letters/file && test_path_is_file letters.txt && @@ -124,7 +137,7 @@ test_expect_success 'Simple merge in repo with interesting pathnames' ' git add . && git commit -m initial && - git branch main && + git branch topic && git branch other && git checkout other && @@ -132,10 +145,10 @@ test_expect_success 'Simple merge in repo with interesting pathnames' ' git add -u && git commit -m other && - git checkout main && - echo main >foo/bar/baz && + git checkout topic && + echo topic >foo/bar/baz && git add -u && - git commit -m main && + git commit -m topic && git merge other && git ls-files -s >out && diff --git a/t/t6402-merge-rename.sh b/t/t6402-merge-rename.sh index bbbba3dcbf..3da2896e3b 100755 --- a/t/t6402-merge-rename.sh +++ b/t/t6402-merge-rename.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Merge-recursive merging renames' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh modify () { @@ -54,9 +57,9 @@ test_expect_success 'setup' ' git branch change && git branch change+rename && - sed -e "/^g /s/.*/g : master changes a line/" <A >A+ && + sed -e "/^g /s/.*/g : main changes a line/" <A >A+ && mv A+ A && - git commit -a -m "master updates A" && + git commit -a -m "main updates A" && git checkout yellow && rm -f M && @@ -94,7 +97,7 @@ test_expect_success 'setup' ' git update-index --add B && git commit -q -a -m "changed and renamed" && - git checkout master + git checkout main ' test_expect_success 'pull renaming branch into unrenaming one' \ @@ -102,14 +105,12 @@ test_expect_success 'pull renaming branch into unrenaming one' \ git show-branch && test_expect_code 1 git pull . white && git ls-files -s && - git ls-files -u B >b.stages && - test_line_count = 3 b.stages && - git ls-files -s N >n.stages && - test_line_count = 1 n.stages && + test_stdout_line_count = 3 git ls-files -u B && + test_stdout_line_count = 1 git ls-files -s N && sed -ne "/^g/{ p q - }" B | grep master && + }" B | grep main && git diff --exit-code white N ' @@ -119,10 +120,8 @@ test_expect_success 'pull renaming branch into another renaming one' \ git reset --hard && git checkout red && test_expect_code 1 git pull . white && - git ls-files -u B >b.stages && - test_line_count = 3 b.stages && - git ls-files -s N >n.stages && - test_line_count = 1 n.stages && + test_stdout_line_count = 3 git ls-files -u B && + test_stdout_line_count = 1 git ls-files -s N && sed -ne "/^g/{ p q @@ -134,11 +133,9 @@ test_expect_success 'pull unrenaming branch into renaming one' \ ' git reset --hard && git show-branch && - test_expect_code 1 git pull . master && - git ls-files -u B >b.stages && - test_line_count = 3 b.stages && - git ls-files -s N >n.stages && - test_line_count = 1 n.stages && + test_expect_code 1 git pull . main && + test_stdout_line_count = 3 git ls-files -u B && + test_stdout_line_count = 1 git ls-files -s N && sed -ne "/^g/{ p q @@ -151,14 +148,10 @@ test_expect_success 'pull conflicting renames' \ git reset --hard && git show-branch && test_expect_code 1 git pull . blue && - git ls-files -u A >a.stages && - test_line_count = 1 a.stages && - git ls-files -u B >b.stages && - test_line_count = 1 b.stages && - git ls-files -u C >c.stages && - test_line_count = 1 c.stages && - git ls-files -s N >n.stages && - test_line_count = 1 n.stages && + test_stdout_line_count = 1 git ls-files -u A && + test_stdout_line_count = 1 git ls-files -u B && + test_stdout_line_count = 1 git ls-files -u C && + test_stdout_line_count = 1 git ls-files -s N && sed -ne "/^g/{ p q @@ -187,7 +180,7 @@ test_expect_success 'interference with untracked working tree file' ' test_expect_success 'interference with untracked working tree file' ' git reset --hard && rm -f A M && - git checkout -f master && + git checkout -f main && git tag -f anchor && git show-branch && git pull . yellow && @@ -198,7 +191,7 @@ test_expect_success 'interference with untracked working tree file' ' test_expect_success 'updated working tree file should prevent the merge' ' git reset --hard && rm -f A M && - git checkout -f master && + git checkout -f main && git tag -f anchor && git show-branch && echo >>M one line addition && @@ -211,7 +204,7 @@ test_expect_success 'updated working tree file should prevent the merge' ' test_expect_success 'updated working tree file should prevent the merge' ' git reset --hard && rm -f A M && - git checkout -f master && + git checkout -f main && git tag -f anchor && git show-branch && echo >>M one line addition && @@ -229,7 +222,7 @@ test_expect_success 'interference with untracked working tree file' ' git tag -f anchor && git show-branch && echo >M this file should not matter && - git pull . master && + git pull . main && test_path_is_file M && ! { git ls-files -s | @@ -320,10 +313,15 @@ test_expect_success 'Rename+D/F conflict; renamed file merges but dir in way' ' test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output && test_i18ngrep "Auto-merging dir" output && - test_i18ngrep "Adding as dir~HEAD instead" output && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_i18ngrep "moving it to dir~HEAD instead" output + else + test_i18ngrep "Adding as dir~HEAD instead" output + fi && - test 3 -eq "$(git ls-files -u | wc -l)" && - test 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 2 git ls-files -u dir/file-in-the-way && test_must_fail git diff --quiet && test_must_fail git diff --cached --quiet && @@ -342,10 +340,15 @@ test_expect_success 'Same as previous, but merged other way' ' ! grep "error: refusing to lose untracked file at" errors && test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output && test_i18ngrep "Auto-merging dir" output && - test_i18ngrep "Adding as dir~renamed-file-has-no-conflicts instead" output && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_i18ngrep "moving it to dir~renamed-file-has-no-conflicts instead" output + else + test_i18ngrep "Adding as dir~renamed-file-has-no-conflicts instead" output + fi && - test 3 -eq "$(git ls-files -u | wc -l)" && - test 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 2 git ls-files -u dir/file-in-the-way && test_must_fail git diff --quiet && test_must_fail git diff --cached --quiet && @@ -361,8 +364,8 @@ test_expect_success 'Rename+D/F conflict; renamed file cannot merge, dir not in git checkout -q renamed-file-has-conflicts^0 && test_must_fail git merge --strategy=recursive dir-not-in-way && - test 3 -eq "$(git ls-files -u | wc -l)" && - test 3 -eq "$(git ls-files -u dir | wc -l)" && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 3 git ls-files -u dir && test_must_fail git diff --quiet && test_must_fail git diff --cached --quiet && @@ -396,9 +399,16 @@ test_expect_success 'Rename+D/F conflict; renamed file cannot merge and dir in t git checkout -q renamed-file-has-conflicts^0 && test_must_fail git merge --strategy=recursive dir-in-way && - test 5 -eq "$(git ls-files -u | wc -l)" && - test 3 -eq "$(git ls-files -u dir | grep -v file-in-the-way | wc -l)" && - test 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" && + test_stdout_line_count = 5 git ls-files -u && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 3 git ls-files -u dir~HEAD + else + git ls-files -u dir >out && + test 3 -eq $(grep -v file-in-the-way out | wc -l) && + rm -f out + fi && + test_stdout_line_count = 2 git ls-files -u dir/file-in-the-way && test_must_fail git diff --quiet && test_must_fail git diff --cached --quiet && @@ -414,9 +424,16 @@ test_expect_success 'Same as previous, but merged other way' ' git checkout -q dir-in-way^0 && test_must_fail git merge --strategy=recursive renamed-file-has-conflicts && - test 5 -eq "$(git ls-files -u | wc -l)" && - test 3 -eq "$(git ls-files -u dir | grep -v file-in-the-way | wc -l)" && - test 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" && + test_stdout_line_count = 5 git ls-files -u && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 3 git ls-files -u dir~renamed-file-has-conflicts + else + git ls-files -u dir >out && + test 3 -eq $(grep -v file-in-the-way out | wc -l) && + rm -f out + fi && + test_stdout_line_count = 2 git ls-files -u dir/file-in-the-way && test_must_fail git diff --quiet && test_must_fail git diff --cached --quiet && @@ -471,7 +488,12 @@ test_expect_success 'both rename source and destination involved in D/F conflict git checkout -q rename-dest^0 && test_must_fail git merge --strategy=recursive source-conflict && - test 1 -eq "$(git ls-files -u | wc -l)" && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 2 git ls-files -u + else + test_stdout_line_count = 1 git ls-files -u + fi && test_must_fail git diff --quiet && @@ -505,34 +527,63 @@ test_expect_success 'setup pair rename to parent of other (D/F conflicts)' ' git commit -m "Rename one/file -> two" ' -test_expect_success 'pair rename to parent of other (D/F conflicts) w/ untracked dir' ' - git checkout -q rename-one^0 && - mkdir one && - test_must_fail git merge --strategy=recursive rename-two && +if test "$GIT_TEST_MERGE_ALGORITHM" = ort +then + test_expect_success 'pair rename to parent of other (D/F conflicts) w/ untracked dir' ' + git checkout -q rename-one^0 && + mkdir one && + test_must_fail git merge --strategy=recursive rename-two && - test 2 -eq "$(git ls-files -u | wc -l)" && - test 1 -eq "$(git ls-files -u one | wc -l)" && - test 1 -eq "$(git ls-files -u two | wc -l)" && + test_stdout_line_count = 4 git ls-files -u && + test_stdout_line_count = 2 git ls-files -u one && + test_stdout_line_count = 2 git ls-files -u two && - test_must_fail git diff --quiet && + test_must_fail git diff --quiet && - test 4 -eq $(find . | grep -v .git | wc -l) && + test 3 -eq $(find . | grep -v .git | wc -l) && - test_path_is_dir one && - test_path_is_file one~rename-two && - test_path_is_file two && - test "other" = $(cat one~rename-two) && - test "stuff" = $(cat two) -' + test_path_is_file one && + test_path_is_file two && + test "other" = $(cat one) && + test "stuff" = $(cat two) + ' +else + test_expect_success 'pair rename to parent of other (D/F conflicts) w/ untracked dir' ' + git checkout -q rename-one^0 && + mkdir one && + test_must_fail git merge --strategy=recursive rename-two && + + test_stdout_line_count = 2 git ls-files -u && + test_stdout_line_count = 1 git ls-files -u one && + test_stdout_line_count = 1 git ls-files -u two && + + test_must_fail git diff --quiet && + + test 4 -eq $(find . | grep -v .git | wc -l) && + + test_path_is_dir one && + test_path_is_file one~rename-two && + test_path_is_file two && + test "other" = $(cat one~rename-two) && + test "stuff" = $(cat two) + ' +fi test_expect_success 'pair rename to parent of other (D/F conflicts) w/ clean start' ' git reset --hard && git clean -fdqx && test_must_fail git merge --strategy=recursive rename-two && - test 2 -eq "$(git ls-files -u | wc -l)" && - test 1 -eq "$(git ls-files -u one | wc -l)" && - test 1 -eq "$(git ls-files -u two | wc -l)" && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 4 git ls-files -u && + test_stdout_line_count = 2 git ls-files -u one && + test_stdout_line_count = 2 git ls-files -u two + else + test_stdout_line_count = 2 git ls-files -u && + test_stdout_line_count = 1 git ls-files -u one && + test_stdout_line_count = 1 git ls-files -u two + fi && test_must_fail git diff --quiet && @@ -572,12 +623,22 @@ test_expect_success 'check handling of differently renamed file with D/F conflic git checkout -q first-rename^0 && test_must_fail git merge --strategy=recursive second-rename && - test 5 -eq "$(git ls-files -s | wc -l)" && - test 3 -eq "$(git ls-files -u | wc -l)" && - test 1 -eq "$(git ls-files -u one | wc -l)" && - test 1 -eq "$(git ls-files -u two | wc -l)" && - test 1 -eq "$(git ls-files -u original | wc -l)" && - test 2 -eq "$(git ls-files -o | wc -l)" && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_stdout_line_count = 5 git ls-files -s && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 1 git ls-files -u one~HEAD && + test_stdout_line_count = 1 git ls-files -u two~second-rename && + test_stdout_line_count = 1 git ls-files -u original && + test_stdout_line_count = 0 git ls-files -o + else + test_stdout_line_count = 5 git ls-files -s && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 1 git ls-files -u one && + test_stdout_line_count = 1 git ls-files -u two && + test_stdout_line_count = 1 git ls-files -u original && + test_stdout_line_count = 2 git ls-files -o + fi && test_path_is_file one/file && test_path_is_file two/file && @@ -612,11 +673,11 @@ test_expect_success 'check handling of differently renamed file with D/F conflic git checkout -q first-rename-redo^0 && test_must_fail git merge --strategy=recursive second-rename-redo && - test 3 -eq "$(git ls-files -u | wc -l)" && - test 1 -eq "$(git ls-files -u one | wc -l)" && - test 1 -eq "$(git ls-files -u two | wc -l)" && - test 1 -eq "$(git ls-files -u original | wc -l)" && - test 0 -eq "$(git ls-files -o | wc -l)" && + test_stdout_line_count = 3 git ls-files -u && + test_stdout_line_count = 1 git ls-files -u one && + test_stdout_line_count = 1 git ls-files -u two && + test_stdout_line_count = 1 git ls-files -u original && + test_stdout_line_count = 0 git ls-files -o && test_path_is_file one && test_path_is_file two && @@ -700,7 +761,7 @@ test_expect_success 'setup avoid unnecessary update, dir->(file,nothing)' ' git rm -rf df && git commit -mB && - git checkout master && + git checkout main && git rm -rf df && echo bla >df && git add -A && @@ -708,7 +769,7 @@ test_expect_success 'setup avoid unnecessary update, dir->(file,nothing)' ' ' test_expect_success 'avoid unnecessary update, dir->(file,nothing)' ' - git checkout -q master^0 && + git checkout -q main^0 && test-tool chmtime --get -3600 df >expect && git merge side && test-tool chmtime --get df >actual && @@ -730,14 +791,14 @@ test_expect_success 'setup avoid unnecessary update, modify/delete' ' git rm -f file && git commit -m "Delete file" && - git checkout master && + git checkout main && echo bla >file && git add -A && git commit -m "Modify file" ' test_expect_success 'avoid unnecessary update, modify/delete' ' - git checkout -q master^0 && + git checkout -q main^0 && test-tool chmtime --get -3600 file >expect && test_must_fail git merge side && test-tool chmtime --get file >actual && @@ -759,13 +820,13 @@ test_expect_success 'setup avoid unnecessary update, rename/add-dest' ' git add -A && git commit -m "Add file copy" && - git checkout master && + git checkout main && git mv file newfile && git commit -m "Rename file" ' test_expect_success 'avoid unnecessary update, rename/add-dest' ' - git checkout -q master^0 && + git checkout -q main^0 && test-tool chmtime --get -3600 newfile >expect && git merge side && test-tool chmtime --get newfile >actual && @@ -794,9 +855,11 @@ test_expect_success 'setup merge of rename + small change' ' test_expect_success 'merge rename + small change' ' git merge rename_branch && - test 1 -eq $(git ls-files -s | wc -l) && - test 0 -eq $(git ls-files -o | wc -l) && - test $(git rev-parse HEAD:renamed_file) = $(git rev-parse HEAD~1:file) + test_stdout_line_count = 1 git ls-files -s && + test_stdout_line_count = 0 git ls-files -o && + newhash=$(git rev-parse HEAD:renamed_file) && + oldhash=$(git rev-parse HEAD~1:file) && + test $newhash = $oldhash ' test_expect_success 'setup for use of extended merge markers' ' @@ -815,15 +878,15 @@ test_expect_success 'setup for use of extended merge markers' ' git mv original_file renamed_file && git commit -mB && - git checkout master && + git checkout main && echo 8.5 >>original_file && git add original_file && git commit -mC ' -test_expect_success 'merge master into rename has correct extended markers' ' +test_expect_success 'merge main into rename has correct extended markers' ' git checkout rename^0 && - test_must_fail git merge -s recursive master^0 && + test_must_fail git merge -s recursive main^0 && cat >expected <<-\EOF && 1 @@ -838,14 +901,14 @@ test_expect_success 'merge master into rename has correct extended markers' ' 9 ======= 8.5 - >>>>>>> master^0:original_file + >>>>>>> main^0:original_file EOF test_cmp expected renamed_file ' -test_expect_success 'merge rename into master has correct extended markers' ' +test_expect_success 'merge rename into main has correct extended markers' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && test_must_fail git merge -s recursive rename^0 && cat >expected <<-\EOF && @@ -881,13 +944,13 @@ test_expect_success 'setup spurious "refusing to lose untracked" message' ' git mv original_file renamed_file && git commit -mB && - git checkout master && + git checkout main && git rm original_file && git commit -mC ' test_expect_success 'no spurious "refusing to lose untracked" message' ' - git checkout master^0 && + git checkout main^0 && test_must_fail git merge rename^0 2>errors.txt && ! grep "refusing to lose untracked file" errors.txt ' diff --git a/t/t6404-recursive-merge.sh b/t/t6404-recursive-merge.sh index 332cfc53fd..eaf48e941e 100755 --- a/t/t6404-recursive-merge.sh +++ b/t/t6404-recursive-merge.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Test merge without common ancestors' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # This scenario is based on a real-world repository of Shawn Pearce. @@ -15,15 +18,17 @@ GIT_COMMITTER_DATE="2006-12-12 23:28:00 +0100" export GIT_COMMITTER_DATE test_expect_success 'setup tests' ' + GIT_TEST_COMMIT_GRAPH=0 && + export GIT_TEST_COMMIT_GRAPH && echo 1 >a1 && git add a1 && GIT_AUTHOR_DATE="2006-12-12 23:00:00" git commit -m 1 a1 && - git checkout -b A master && + git checkout -b A main && echo A >a1 && GIT_AUTHOR_DATE="2006-12-12 23:00:01" git commit -m A a1 && - git checkout -b B master && + git checkout -b B main && echo B >a1 && GIT_AUTHOR_DATE="2006-12-12 23:00:02" git commit -m B a1 && @@ -66,7 +71,7 @@ test_expect_success 'setup tests' ' ' test_expect_success 'combined merge conflicts' ' - test_must_fail env GIT_TEST_COMMIT_GRAPH=0 git merge -m final G + test_must_fail git merge -m final G ' test_expect_success 'result contains a conflict' ' @@ -82,6 +87,7 @@ test_expect_success 'result contains a conflict' ' ' test_expect_success 'virtual trees were processed' ' + # TODO: fragile test, relies on ambigious merge-base resolution git ls-files --stage >out && cat >expect <<-EOF && @@ -118,12 +124,22 @@ test_expect_success 'mark rename/delete as unmerged' ' test_tick && git commit -m rename && test_must_fail git merge delete && - test 1 = $(git ls-files --unmerged | wc -l) && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test 2 = $(git ls-files --unmerged | wc -l) + else + test 1 = $(git ls-files --unmerged | wc -l) + fi && git rev-parse --verify :2:a2 && test_must_fail git rev-parse --verify :3:a2 && git checkout -f delete && test_must_fail git merge rename && - test 1 = $(git ls-files --unmerged | wc -l) && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test 2 = $(git ls-files --unmerged | wc -l) + else + test 1 = $(git ls-files --unmerged | wc -l) + fi && test_must_fail git rev-parse --verify :2:a2 && git rev-parse --verify :3:a2 ' diff --git a/t/t6405-merge-symlinks.sh b/t/t6405-merge-symlinks.sh index 6c0a90d044..7435fce71e 100755 --- a/t/t6405-merge-symlinks.sh +++ b/t/t6405-merge-symlinks.sh @@ -8,6 +8,9 @@ test_description='merging symlinks on filesystem w/o symlink support. This tests that git merge-recursive writes merge results as plain files if core.symlinks is false.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -19,7 +22,7 @@ test_expect_success 'setup' ' git branch b-file && l=$(printf file | git hash-object -t blob -w --stdin) && echo "120000 $l symlink" | git update-index --index-info && - git commit -m master && + git commit -m main && git checkout b-symlink && l=$(printf file-different | git hash-object -t blob -w --stdin) && echo "120000 $l symlink" | git update-index --index-info && @@ -30,28 +33,28 @@ test_expect_success 'setup' ' git commit -m b-file ' -test_expect_success 'merge master into b-symlink, which has a different symbolic link' ' +test_expect_success 'merge main into b-symlink, which has a different symbolic link' ' git checkout b-symlink && - test_must_fail git merge master + test_must_fail git merge main ' test_expect_success 'the merge result must be a file' ' test_path_is_file symlink ' -test_expect_success 'merge master into b-file, which has a file instead of a symbolic link' ' +test_expect_success 'merge main into b-file, which has a file instead of a symbolic link' ' git reset --hard && git checkout b-file && - test_must_fail git merge master + test_must_fail git merge main ' test_expect_success 'the merge result must be a file' ' test_path_is_file symlink ' -test_expect_success 'merge b-file, which has a file instead of a symbolic link, into master' ' +test_expect_success 'merge b-file, which has a file instead of a symbolic link, into main' ' git reset --hard && - git checkout master && + git checkout main && test_must_fail git merge b-file ' diff --git a/t/t6406-merge-attr.sh b/t/t6406-merge-attr.sh index 76a55f838c..8494645837 100755 --- a/t/t6406-merge-attr.sh +++ b/t/t6406-merge-attr.sh @@ -5,6 +5,9 @@ test_description='per path merge controlled by merge attribute' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -19,10 +22,10 @@ test_expect_success setup ' git branch side && for f in text binary union do - echo Master >>$f && git add $f || return 1 + echo Main >>$f && git add $f || return 1 done && test_tick && - git commit -m Master && + git commit -m Main && git checkout side && for f in text binary union @@ -64,7 +67,7 @@ test_expect_success merge ' echo "union merge=union" } >.gitattributes && - if git merge master + if git merge main then echo Gaah, should have conflicted false @@ -87,7 +90,7 @@ test_expect_success 'check merge result in working tree' ' grep "<<<<<<<" text && cmp binary-orig binary && ! grep "<<<<<<<" union && - grep Master union && + grep Main union && grep Side union ' @@ -115,13 +118,13 @@ test_expect_success 'custom merge backend' ' git config --replace-all \ merge.custom.name "custom merge driver for testing" && - git merge master && + git merge main && cmp binary union && sed -e 1,3d text >check-1 && - o=$(git unpack-file master^:text) && + o=$(git unpack-file main^:text) && a=$(git unpack-file side^:text) && - b=$(git unpack-file master:text) && + b=$(git unpack-file main:text) && sh -c "./custom-merge $o $a $b 0 text" && sed -e 1,3d $a >check-2 && cmp check-1 check-2 && @@ -136,7 +139,7 @@ test_expect_success 'custom merge backend' ' git config --replace-all \ merge.custom.name "custom merge driver for testing" && - if git merge master + if git merge main then echo "Eh? should have conflicted" false @@ -146,9 +149,9 @@ test_expect_success 'custom merge backend' ' cmp binary union && sed -e 1,3d text >check-1 && - o=$(git unpack-file master^:text) && + o=$(git unpack-file main^:text) && a=$(git unpack-file anchor:text) && - b=$(git unpack-file master:text) && + b=$(git unpack-file main:text) && sh -c "./custom-merge $o $a $b 0 text" && sed -e 1,3d $a >check-2 && cmp check-1 check-2 && @@ -176,7 +179,7 @@ test_expect_success 'up-to-date merge without common ancestor' ' test_tick && ( cd repo1 && - git fetch ../repo2 master && + git fetch ../repo2 main && git merge --allow-unrelated-histories FETCH_HEAD ) ' @@ -201,7 +204,25 @@ test_expect_success 'custom merge does not lock index' ' # By packaging the command in test_when_finished, we get both # the correctness check and the clean-up. test_when_finished "kill \$(cat sleep.pid)" && - git merge master + git merge main +' + +test_expect_success 'binary files with union attribute' ' + git checkout -b bin-main && + printf "base\0" >bin.txt && + echo "bin.txt merge=union" >.gitattributes && + git add bin.txt .gitattributes && + git commit -m base && + + printf "one\0" >bin.txt && + git commit -am one && + + git checkout -b bin-side HEAD^ && + printf "two\0" >bin.txt && + git commit -am two && + + test_must_fail git merge bin-main 2>stderr && + grep -i "warning.*cannot merge.*HEAD vs. bin-main" stderr ' test_done diff --git a/t/t6407-merge-binary.sh b/t/t6407-merge-binary.sh index 4e6c7cb77e..d4273f2575 100755 --- a/t/t6407-merge-binary.sh +++ b/t/t6407-merge-binary.sh @@ -2,6 +2,9 @@ test_description='ask merge-recursive to merge binary files' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -20,7 +23,7 @@ test_expect_success setup ' git ls-files -s a >E0 && git ls-files -s m | sed -e "s/ 0 / 3 /" >E3 && test_tick && - git commit -m "master adds some" && + git commit -m "main adds some" && git checkout side && echo rezrov >>m && @@ -39,7 +42,7 @@ test_expect_success resolve ' rm -f a* m* && git reset --hard anchor && - if git merge -s resolve master + if git merge -s resolve main then echo Oops, should not have succeeded false @@ -54,7 +57,7 @@ test_expect_success recursive ' rm -f a* m* && git reset --hard anchor && - if git merge -s recursive master + if git merge -s recursive main then echo Oops, should not have succeeded false diff --git a/t/t6409-merge-subtree.sh b/t/t6409-merge-subtree.sh index 793f0c8bf3..d406b2343c 100755 --- a/t/t6409-merge-subtree.sh +++ b/t/t6409-merge-subtree.sh @@ -2,6 +2,9 @@ test_description='subtree merge strategy' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -14,10 +17,10 @@ test_expect_success setup ' echo >>hello world && git add hello && git commit -m second && - git checkout master && + git checkout main && for i in mundo $s; do echo $i; done >hello && git add hello && - git commit -m master + git commit -m main ' @@ -35,11 +38,11 @@ test_expect_success 'setup branch sub' ' test_commit foo ' -test_expect_success 'setup branch main' ' - git checkout -b main master && +test_expect_success 'setup topic branch' ' + git checkout -b topic main && git merge -s ours --no-commit --allow-unrelated-histories sub && git read-tree --prefix=dir/ -u sub && - git commit -m "initial merge of sub into main" && + git commit -m "initial merge of sub into topic" && test_path_is_file dir/foo.t && test_path_is_file hello ' @@ -49,9 +52,9 @@ test_expect_success 'update branch sub' ' test_commit bar ' -test_expect_success 'update branch main' ' - git checkout main && - git merge -s subtree sub -m "second merge of sub into main" && +test_expect_success 'update topic branch' ' + git checkout topic && + git merge -s subtree sub -m "second merge of sub into topic" && test_path_is_file dir/bar.t && test_path_is_file dir/foo.t && test_path_is_file hello @@ -77,8 +80,8 @@ test_expect_success 'setup' ' test_expect_success 'initial merge' ' git remote add -f gui ../git-gui && - git merge -s ours --no-commit --allow-unrelated-histories gui/master && - git read-tree --prefix=git-gui/ -u gui/master && + git merge -s ours --no-commit --allow-unrelated-histories gui/main && + git read-tree --prefix=git-gui/ -u gui/main && git commit -m "Merge git-gui as our subdirectory" && git checkout -b work && git ls-files -s >actual && @@ -94,10 +97,10 @@ test_expect_success 'merge update' ' echo git-gui2 > git-gui.sh && o3=$(git hash-object git-gui.sh) && git add git-gui.sh && - git checkout -b master2 && + git checkout -b topic_2 && git commit -m "update git-gui" && cd ../git && - git pull -s subtree gui master2 && + git pull -s subtree gui topic_2 && git ls-files -s >actual && ( echo "100644 $o3 0 git-gui/git-gui.sh" && @@ -108,10 +111,10 @@ test_expect_success 'merge update' ' test_expect_success 'initial ambiguous subtree' ' cd ../git && - git reset --hard master && - git checkout -b master2 && - git merge -s ours --no-commit gui/master && - git read-tree --prefix=git-gui2/ -u gui/master && + git reset --hard main && + git checkout -b topic_2 && + git merge -s ours --no-commit gui/main && + git read-tree --prefix=git-gui2/ -u gui/main && git commit -m "Merge git-gui2 as our subdirectory" && git checkout -b work2 && git ls-files -s >actual && @@ -125,8 +128,8 @@ test_expect_success 'initial ambiguous subtree' ' test_expect_success 'merge using explicit' ' cd ../git && - git reset --hard master2 && - git pull -Xsubtree=git-gui gui master2 && + git reset --hard topic_2 && + git pull -Xsubtree=git-gui gui topic_2 && git ls-files -s >actual && ( echo "100644 $o3 0 git-gui/git-gui.sh" && @@ -138,8 +141,8 @@ test_expect_success 'merge using explicit' ' test_expect_success 'merge2 using explicit' ' cd ../git && - git reset --hard master2 && - git pull -Xsubtree=git-gui2 gui master2 && + git reset --hard topic_2 && + git pull -Xsubtree=git-gui2 gui topic_2 && git ls-files -s >actual && ( echo "100644 $o1 0 git-gui/git-gui.sh" && diff --git a/t/t6411-merge-filemode.sh b/t/t6411-merge-filemode.sh index 87741efad3..f54c915d6a 100755 --- a/t/t6411-merge-filemode.sh +++ b/t/t6411-merge-filemode.sh @@ -1,17 +1,20 @@ #!/bin/sh test_description='merge: handle file mode' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'set up mode change in one branch' ' : >file1 && git add file1 && git commit -m initial && - git checkout -b a1 master && + git checkout -b a1 main && : >dummy && git add dummy && git commit -m a && - git checkout -b b1 master && + git checkout -b b1 main && test_chmod +x file1 && git add file1 && git commit -m b1 @@ -39,12 +42,12 @@ do_one_mode resolve b1 a1 test_expect_success 'set up mode change in both branches' ' git reset --hard HEAD && - git checkout -b a2 master && + git checkout -b a2 main && : >file2 && H=$(git hash-object file2) && test_chmod +x file2 && git commit -m a2 && - git checkout -b b2 master && + git checkout -b b2 main && : >file2 && git add file2 && git commit -m b2 && @@ -76,7 +79,7 @@ do_both_modes resolve test_expect_success 'set up delete/modechange scenario' ' git reset --hard && - git checkout -b deletion master && + git checkout -b deletion main && git rm file1 && git commit -m deletion ' diff --git a/t/t6412-merge-large-rename.sh b/t/t6412-merge-large-rename.sh index 80777386dc..c50d315722 100755 --- a/t/t6412-merge-large-rename.sh +++ b/t/t6412-merge-large-rename.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='merging with large rename matrix' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh count() { @@ -30,7 +33,7 @@ test_rename() { test_expect_success "rename ($1, $2)" ' n='$1' && expect='$2' && - git checkout -f master && + git checkout -f main && test_might_fail git branch -D test$n && git reset --hard initial && for i in $(count $n); do @@ -50,8 +53,8 @@ test_rename() { git add . && git commit -m change+rename=$n && case "$expect" in - ok) git merge master ;; - *) test_must_fail git merge master ;; + ok) git merge main ;; + *) test_must_fail git merge main ;; esac ' } diff --git a/t/t6413-merge-crlf.sh b/t/t6413-merge-crlf.sh index e8d65eefb5..affea255fe 100755 --- a/t/t6413-merge-crlf.sh +++ b/t/t6413-merge-crlf.sh @@ -8,6 +8,9 @@ test_description='merge conflict in crlf repo ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -24,7 +27,7 @@ test_expect_success setup ' echo line from b | append_cr >file && git commit -m "add line from b" file && git tag b && - git checkout master + git checkout main ' test_expect_success 'Check "ours" is CRLF' ' diff --git a/t/t6414-merge-rename-nocruft.sh b/t/t6414-merge-rename-nocruft.sh index a25e730460..d7e3c1fa6e 100755 --- a/t/t6414-merge-rename-nocruft.sh +++ b/t/t6414-merge-rename-nocruft.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Merge-recursive merging renames' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -65,7 +68,7 @@ test_expect_success 'setup' ' git update-index A && git commit -m "blue modify A" && - git checkout master + git checkout main ' # This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae diff --git a/t/t6415-merge-dir-to-symlink.sh b/t/t6415-merge-dir-to-symlink.sh index 2eddcc7664..2ce104aca7 100755 --- a/t/t6415-merge-dir-to-symlink.sh +++ b/t/t6415-merge-dir-to-symlink.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='merging when a directory was replaced with a symlink' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'create a commit where dir a/b changed to symlink' ' @@ -19,7 +22,7 @@ test_expect_success 'create a commit where dir a/b changed to symlink' ' test_expect_success 'checkout does not clobber untracked symlink' ' git checkout HEAD^0 && - git reset --hard master && + git reset --hard main && git rm --cached a/b && git commit -m "untracked symlink remains" && test_must_fail git checkout start^0 @@ -27,7 +30,7 @@ test_expect_success 'checkout does not clobber untracked symlink' ' test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' ' git checkout HEAD^0 && - git reset --hard master && + git reset --hard main && git rm --cached a/b && git commit -m "untracked symlink remains" && git checkout -f start^0 && @@ -36,7 +39,7 @@ test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' ' test_expect_success 'checkout should not have deleted a/b-2/c/d' ' git checkout HEAD^0 && - git reset --hard master && + git reset --hard main && git checkout start^0 && test_path_is_file a/b-2/c/d ' @@ -53,7 +56,7 @@ test_expect_success 'setup for merge test' ' test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' ' git reset --hard && git checkout baseline^0 && - git merge -s resolve master && + git merge -s resolve main && test_path_is_file a/b-2/c/d ' @@ -64,7 +67,7 @@ test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' ' git reset --hard && git checkout baseline^0 && - git merge -s recursive master && + git merge -s recursive main && test_path_is_file a/b-2/c/d ' @@ -74,7 +77,7 @@ test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && git merge -s resolve baseline^0 && test_path_is_file a/b-2/c/d ' @@ -85,7 +88,7 @@ test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && git merge -s recursive baseline^0 && test_path_is_file a/b-2/c/d ' @@ -98,7 +101,7 @@ test_expect_failure 'do not lose untracked in merge (resolve)' ' git reset --hard && git checkout baseline^0 && >a/b/c/e && - test_must_fail git merge -s resolve master && + test_must_fail git merge -s resolve main && test_path_is_file a/b/c/e && test_path_is_file a/b-2/c/d ' @@ -107,7 +110,7 @@ test_expect_success 'do not lose untracked in merge (recursive)' ' git reset --hard && git checkout baseline^0 && >a/b/c/e && - test_must_fail git merge -s recursive master && + test_must_fail git merge -s recursive main && test_path_is_file a/b/c/e && test_path_is_file a/b-2/c/d ' @@ -116,14 +119,14 @@ test_expect_success 'do not lose modifications in merge (resolve)' ' git reset --hard && git checkout baseline^0 && echo more content >>a/b/c/d && - test_must_fail git merge -s resolve master + test_must_fail git merge -s resolve main ' test_expect_success 'do not lose modifications in merge (recursive)' ' git reset --hard && git checkout baseline^0 && echo more content >>a/b/c/d && - test_must_fail git merge -s recursive master + test_must_fail git merge -s recursive main ' test_expect_success 'setup a merge where dir a/b-2 changed to symlink' ' diff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh index fd98989b14..84f5082366 100755 --- a/t/t6416-recursive-corner-cases.sh +++ b/t/t6416-recursive-corner-cases.sh @@ -2,7 +2,11 @@ test_description='recursive merge corner cases involving criss-cross merges' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh # # L1 L2 @@ -384,7 +388,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete' ' test_line_count = 2 out && git rev-parse >expect \ - master:file B:file && + main:file B:file && git rev-parse >actual \ :1:file :2:file && test_cmp expect actual @@ -406,7 +410,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev test_line_count = 2 out && git rev-parse >expect \ - master:file B:file && + main:file B:file && git rev-parse >actual \ :1:file :3:file && test_cmp expect actual @@ -537,9 +541,15 @@ test_expect_success 'setup differently handled merges of directory/file conflict git checkout B^0 && test_must_fail git merge C^0 && - git clean -fd && - git rm -rf a/ && - git rm a && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git rm -rf a/ && + git rm a~HEAD + else + git clean -fd && + git rm -rf a/ && + git rm a + fi && git cat-file -p B:a >a2 && git add a2 && git commit -m D2 && @@ -558,7 +568,12 @@ test_expect_success 'setup differently handled merges of directory/file conflict git checkout C^0 && test_must_fail git merge B^0 && - git clean -fd && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git rm a~B^0 + else + git clean -fd + fi && git rm -rf a/ && test_write_lines 1 2 3 4 5 6 7 8 >a && git add a && @@ -567,9 +582,15 @@ test_expect_success 'setup differently handled merges of directory/file conflict git checkout C^0 && test_must_fail git merge B^0 && - git clean -fd && - git rm -rf a/ && - git rm a && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git rm -rf a/ && + git rm a~B^0 + else + git clean -fd && + git rm -rf a/ && + git rm a + fi && test_write_lines 1 2 3 4 5 6 7 8 >a2 && git add a2 && git commit -m E4 && @@ -587,18 +608,34 @@ test_expect_success 'merge of D1 & E1 fails but has appropriate contents' ' test_must_fail git merge -s recursive E1^0 && - git ls-files -s >out && - test_line_count = 2 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 1 out && - - git rev-parse >expect \ - A:ignore-me B:a && - git rev-parse >actual \ - :0:ignore-me :2:a && - test_cmp expect actual + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + A:ignore-me B:a D1:a && + git rev-parse >actual \ + :0:ignore-me :1:a :2:a && + test_cmp expect actual + else + git ls-files -s >out && + test_line_count = 2 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + A:ignore-me B:a && + git rev-parse >actual \ + :0:ignore-me :2:a && + test_cmp expect actual + fi ) ' @@ -612,18 +649,34 @@ test_expect_success 'merge of E1 & D1 fails but has appropriate contents' ' test_must_fail git merge -s recursive D1^0 && - git ls-files -s >out && - test_line_count = 2 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 1 out && - - git rev-parse >expect \ - A:ignore-me B:a && - git rev-parse >actual \ - :0:ignore-me :3:a && - test_cmp expect actual + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + A:ignore-me B:a D1:a && + git rev-parse >actual \ + :0:ignore-me :1:a :3:a && + test_cmp expect actual + else + git ls-files -s >out && + test_line_count = 2 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + A:ignore-me B:a && + git rev-parse >actual \ + :0:ignore-me :3:a && + test_cmp expect actual + fi ) ' @@ -637,17 +690,32 @@ test_expect_success 'merge of D1 & E2 fails but has appropriate contents' ' test_must_fail git merge -s recursive E2^0 && - git ls-files -s >out && - test_line_count = 4 out && - git ls-files -u >out && - test_line_count = 3 out && - git ls-files -o >out && - test_line_count = 2 out && - - git rev-parse >expect \ - B:a E2:a/file C:a/file A:ignore-me && - git rev-parse >actual \ - :2:a :3:a/file :1:a/file :0:ignore-me && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 5 out && + git ls-files -u >out && + test_line_count = 4 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + B:a D1:a E2:a/file C:a/file A:ignore-me && + git rev-parse >actual \ + :1:a~HEAD :2:a~HEAD :3:a/file :1:a/file :0:ignore-me + else + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 3 out && + git ls-files -o >out && + test_line_count = 2 out && + + git rev-parse >expect \ + B:a E2:a/file C:a/file A:ignore-me && + git rev-parse >actual \ + :2:a :3:a/file :1:a/file :0:ignore-me + fi && test_cmp expect actual && test_path_is_file a~HEAD @@ -664,17 +732,32 @@ test_expect_success 'merge of E2 & D1 fails but has appropriate contents' ' test_must_fail git merge -s recursive D1^0 && - git ls-files -s >out && - test_line_count = 4 out && - git ls-files -u >out && - test_line_count = 3 out && - git ls-files -o >out && - test_line_count = 2 out && - - git rev-parse >expect \ - B:a E2:a/file C:a/file A:ignore-me && - git rev-parse >actual \ - :3:a :2:a/file :1:a/file :0:ignore-me && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 5 out && + git ls-files -u >out && + test_line_count = 4 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >expect \ + B:a D1:a E2:a/file C:a/file A:ignore-me && + git rev-parse >actual \ + :1:a~D1^0 :3:a~D1^0 :2:a/file :1:a/file :0:ignore-me + else + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 3 out && + git ls-files -o >out && + test_line_count = 2 out && + + git rev-parse >expect \ + B:a E2:a/file C:a/file A:ignore-me && + git rev-parse >actual \ + :3:a :2:a/file :1:a/file :0:ignore-me + fi && test_cmp expect actual && test_path_is_file a~D1^0 @@ -706,7 +789,7 @@ test_expect_success 'merge of D1 & E3 succeeds' ' ) ' -test_expect_success 'merge of D1 & E4 notifies user a and a2 are related' ' +test_expect_merge_algorithm failure success 'merge of D1 & E4 puts merge of a and a2 in both a and a2' ' test_when_finished "git -C directory-file reset --hard" && test_when_finished "git -C directory-file clean -fdqx" && ( @@ -724,7 +807,7 @@ test_expect_success 'merge of D1 & E4 notifies user a and a2 are related' ' test_line_count = 1 out && git rev-parse >expect \ - A:ignore-me B:a D1:a E4:a2 && + A:ignore-me B:a E4:a2 E4:a2 && git rev-parse >actual \ :0:ignore-me :1:a~Temporary\ merge\ branch\ 2 :2:a :3:a2 && test_cmp expect actual @@ -1069,7 +1152,7 @@ test_expect_success 'setup symlink modify/modify' ' ) ' -test_expect_failure 'check symlink modify/modify' ' +test_expect_merge_algorithm failure success 'check symlink modify/modify' ' ( cd symlink-modify-modify && @@ -1135,7 +1218,7 @@ test_expect_success 'setup symlink add/add' ' ) ' -test_expect_failure 'check symlink add/add' ' +test_expect_merge_algorithm failure success 'check symlink add/add' ' ( cd symlink-add-add && @@ -1223,7 +1306,7 @@ test_expect_success 'setup submodule modify/modify' ' ) ' -test_expect_failure 'check submodule modify/modify' ' +test_expect_merge_algorithm failure success 'check submodule modify/modify' ' ( cd submodule-modify-modify && @@ -1311,7 +1394,7 @@ test_expect_success 'setup submodule add/add' ' ) ' -test_expect_failure 'check submodule add/add' ' +test_expect_merge_algorithm failure success 'check submodule add/add' ' ( cd submodule-add-add && @@ -1386,7 +1469,7 @@ test_expect_success 'setup conflicting entry types (submodule vs symlink)' ' ) ' -test_expect_failure 'check conflicting entry types (submodule vs symlink)' ' +test_expect_merge_algorithm failure success 'check conflicting entry types (submodule vs symlink)' ' ( cd submodule-symlink-add-add && @@ -1473,12 +1556,12 @@ test_expect_failure 'check conflicting modes for regular file' ' # Setup: # L1---L2 # / \ / \ -# master X ? +# main X ? # \ / \ / # R1---R2 # # Where: -# master has two files, named 'b' and 'a' +# main has two files, named 'b' and 'a' # branches L1 and R1 both modify each of the two files in conflicting ways # # L2 is a merge of R1 into L1; more on it later. @@ -1583,7 +1666,7 @@ test_expect_success 'check nested conflicts' ' cd nested_conflicts && git clean -f && - MASTER=$(git rev-parse --short master) && + MAIN=$(git rev-parse --short main) && git checkout L2^0 && # Merge must fail; there is a conflict @@ -1599,24 +1682,24 @@ test_expect_success 'check nested conflicts' ' test_line_count = 1 out && # Create a and b from virtual merge base X - git cat-file -p master:a >base && + git cat-file -p main:a >base && git cat-file -p L1:a >ours && git cat-file -p R1:a >theirs && test_must_fail git merge-file --diff3 \ -L "Temporary merge branch 1" \ - -L "$MASTER" \ + -L "$MAIN" \ -L "Temporary merge branch 2" \ ours \ base \ theirs && sed -e "s/^\([<|=>]\)/\1\1/" ours >vmb_a && - git cat-file -p master:b >base && + git cat-file -p main:b >base && git cat-file -p L1:b >ours && git cat-file -p R1:b >theirs && test_must_fail git merge-file --diff3 \ -L "Temporary merge branch 1" \ - -L "$MASTER" \ + -L "$MAIN" \ -L "Temporary merge branch 2" \ ours \ base \ @@ -1668,12 +1751,12 @@ test_expect_success 'check nested conflicts' ' # Setup: # L1---L2---L3 # / \ / \ / \ -# master X1 X2 ? +# main X1 X2 ? # \ / \ / \ / # R1---R2---R3 # # Where: -# master has one file named 'content' +# main has one file named 'content' # branches L1 and R1 both modify each of the two files in conflicting ways # # L<n> (n>1) is a merge of R<n-1> into L<n-1> @@ -1754,7 +1837,7 @@ test_expect_success 'check virtual merge base with nested conflicts' ' ( cd virtual_merge_base_has_nested_conflicts && - MASTER=$(git rev-parse --short master) && + MAIN=$(git rev-parse --short main) && git checkout L3^0 && # Merge must fail; there is a conflict @@ -1777,13 +1860,13 @@ test_expect_success 'check virtual merge base with nested conflicts' ' # Imitate X1 merge base, except without long enough conflict # markers because a subsequent sed will modify them. Put # result into vmb. - git cat-file -p master:content >base && + git cat-file -p main:content >base && git cat-file -p L:content >left && git cat-file -p R:content >right && cp left merged-once && test_must_fail git merge-file --diff3 \ -L "Temporary merge branch 1" \ - -L "$MASTER" \ + -L "$MAIN" \ -L "Temporary merge branch 2" \ merged-once \ base \ diff --git a/t/t6417-merge-ours-theirs.sh b/t/t6417-merge-ours-theirs.sh index 0aebc6c028..ac9aee9a66 100755 --- a/t/t6417-merge-ours-theirs.sh +++ b/t/t6417-merge-ours-theirs.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Merge-recursive ours and theirs variants' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -20,11 +23,11 @@ test_expect_success setup ' sed -e "s/9/nueve/" >file <elif && git commit -a -m theirs && - git checkout master^0 + git checkout main^0 ' test_expect_success 'plain recursive - should conflict' ' - git reset --hard master && + git reset --hard main && test_must_fail git merge -s recursive side && grep nine file && grep nueve file && @@ -34,7 +37,7 @@ test_expect_success 'plain recursive - should conflict' ' ' test_expect_success 'recursive favouring theirs' ' - git reset --hard master && + git reset --hard main && git merge -s recursive -Xtheirs side && ! grep nine file && grep nueve file && @@ -44,7 +47,7 @@ test_expect_success 'recursive favouring theirs' ' ' test_expect_success 'recursive favouring ours' ' - git reset --hard master && + git reset --hard main && git merge -s recursive -X ours side && grep nine file && ! grep nueve file && @@ -56,26 +59,26 @@ test_expect_success 'recursive favouring ours' ' test_expect_success 'binary file with -Xours/-Xtheirs' ' echo file binary >.gitattributes && - git reset --hard master && + git reset --hard main && git merge -s recursive -X theirs side && git diff --exit-code side HEAD -- file && - git reset --hard master && + git reset --hard main && git merge -s recursive -X ours side && - git diff --exit-code master HEAD -- file + git diff --exit-code main HEAD -- file ' test_expect_success 'pull passes -X to underlying merge' ' - git reset --hard master && git pull -s recursive -Xours . side && - git reset --hard master && git pull -s recursive -X ours . side && - git reset --hard master && git pull -s recursive -Xtheirs . side && - git reset --hard master && git pull -s recursive -X theirs . side && - git reset --hard master && test_must_fail git pull -s recursive -X bork . side + git reset --hard main && git pull -s recursive -Xours . side && + git reset --hard main && git pull -s recursive -X ours . side && + git reset --hard main && git pull -s recursive -Xtheirs . side && + git reset --hard main && git pull -s recursive -X theirs . side && + git reset --hard main && test_must_fail git pull -s recursive -X bork . side ' test_expect_success SYMLINKS 'symlink with -Xours/-Xtheirs' ' - git reset --hard master && - git checkout -b two master && + git reset --hard main && + git checkout -b two main && ln -s target-zero link && git add link && git commit -m "add link pointing to zero" && diff --git a/t/t6418-merge-text-auto.sh b/t/t6418-merge-text-auto.sh index 30983d18b1..1e0296dd17 100755 --- a/t/t6418-merge-text-auto.sh +++ b/t/t6418-merge-text-auto.sh @@ -2,16 +2,19 @@ test_description='CRLF merge conflict across text=auto change -* [master] remove .gitattributes +* [main] remove .gitattributes ! [side] add line from b -- + [side] add line from b -* [master] remove .gitattributes -* [master^] add line from a -* [master~2] normalize file +* [main] remove .gitattributes +* [main^] add line from a +* [main~2] normalize file *+ [side^] Initial ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b @@ -64,7 +67,7 @@ test_expect_success setup ' git commit -m "add line from b" && git tag b && - git checkout master + git checkout main ' test_expect_success 'set up fuzz_conflict() helper' ' @@ -195,7 +198,7 @@ test_expect_success 'Test delete/normalize conflict' ' git reset --hard initial && git rm file && git commit -m "remove file" && - git checkout master && + git checkout main && git reset --hard a^ && git merge side && test_path_is_missing file diff --git a/t/t6419-merge-ignorecase.sh b/t/t6419-merge-ignorecase.sh index 531850d834..b64b75acf5 100755 --- a/t/t6419-merge-ignorecase.sh +++ b/t/t6419-merge-ignorecase.sh @@ -2,6 +2,9 @@ test_description='git-merge with case-changing rename on case-insensitive file system' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq CASE_INSENSITIVE_FS @@ -20,18 +23,18 @@ test_expect_success 'merge with case-changing rename' ' >foo && git add foo && git commit -m "intervening commit" && - git checkout master && + git checkout main && git rm TestCase && >testcase && git add testcase && git commit -m "rename to testcase" && git checkout with-camel && - git merge master -m "merge" && + git merge main -m "merge" && test_path_is_file testcase ' test_expect_success 'merge with case-changing rename on both sides' ' - git checkout master && + git checkout main && git reset --hard baseline && git branch -D with-camel && git checkout -b with-camel && @@ -40,13 +43,13 @@ test_expect_success 'merge with case-changing rename on both sides' ' >foo && git add foo && git commit -m "intervening commit" && - git checkout master && + git checkout main && git rm TestCase && >testcase && git add testcase && git commit -m "rename to testcase" && git checkout with-camel && - git merge master -m "merge" && + git merge main -m "merge" && test_path_is_file testcase ' diff --git a/t/t6421-merge-partial-clone.sh b/t/t6421-merge-partial-clone.sh new file mode 100755 index 0000000000..36bcd7c328 --- /dev/null +++ b/t/t6421-merge-partial-clone.sh @@ -0,0 +1,440 @@ +#!/bin/sh + +test_description="limiting blob downloads when merging with partial clones" +# Uses a methodology similar to +# t6042: corner cases with renames but not criss-cross merges +# t6036: corner cases with both renames and criss-cross merges +# t6423: directory rename detection +# +# The setup for all of them, pictorially, is: +# +# A +# o +# / \ +# O o ? +# \ / +# o +# B +# +# To help make it easier to follow the flow of tests, they have been +# divided into sections and each test will start with a quick explanation +# of what commits O, A, and B contain. +# +# Notation: +# z/{b,c} means files z/b and z/c both exist +# x/d_1 means file x/d exists with content d1. (Purpose of the +# underscore notation is to differentiate different +# files that might be renamed into each other's paths.) + +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh + +test_setup_repo () { + test -d server && return + test_create_repo server && + ( + cd server && + + git config uploadpack.allowfilter 1 && + git config uploadpack.allowanysha1inwant 1 && + + mkdir -p general && + test_seq 2 9 >general/leap1 && + cp general/leap1 general/leap2 && + echo leap2 >>general/leap2 && + + mkdir -p basename && + cp general/leap1 basename/numbers && + cp general/leap1 basename/sequence && + cp general/leap1 basename/values && + echo numbers >>basename/numbers && + echo sequence >>basename/sequence && + echo values >>basename/values && + + mkdir -p dir/unchanged && + mkdir -p dir/subdir/tweaked && + echo a >dir/subdir/a && + echo b >dir/subdir/b && + echo c >dir/subdir/c && + echo d >dir/subdir/d && + echo e >dir/subdir/e && + cp general/leap1 dir/subdir/Makefile && + echo toplevel makefile >>dir/subdir/Makefile && + echo f >dir/subdir/tweaked/f && + echo g >dir/subdir/tweaked/g && + echo h >dir/subdir/tweaked/h && + echo subdirectory makefile >dir/subdir/tweaked/Makefile && + for i in $(test_seq 1 88) + do + echo content $i >dir/unchanged/file_$i + done && + git add . && + git commit -m "O" && + + git branch O && + git branch A && + git branch B-single && + git branch B-dir && + git branch B-many && + + git switch A && + + git rm general/leap* && + mkdir general/ && + test_seq 1 9 >general/jump1 && + cp general/jump1 general/jump2 && + echo leap2 >>general/jump2 && + + rm basename/numbers basename/sequence basename/values && + mkdir -p basename/subdir/ + cp general/jump1 basename/subdir/numbers && + cp general/jump1 basename/subdir/sequence && + cp general/jump1 basename/subdir/values && + echo numbers >>basename/subdir/numbers && + echo sequence >>basename/subdir/sequence && + echo values >>basename/subdir/values && + + git rm dir/subdir/tweaked/f && + echo more >>dir/subdir/e && + echo more >>dir/subdir/Makefile && + echo more >>dir/subdir/tweaked/Makefile && + mkdir dir/subdir/newsubdir && + echo rust code >dir/subdir/newsubdir/newfile.rs && + git mv dir/subdir/e dir/subdir/newsubdir/ && + git mv dir folder && + git add . && + git commit -m "A" && + + git switch B-single && + echo new first line >dir/subdir/Makefile && + cat general/leap1 >>dir/subdir/Makefile && + echo toplevel makefile >>dir/subdir/Makefile && + echo perl code >general/newfile.pl && + git add . && + git commit -m "B-single" && + + git switch B-dir && + echo java code >dir/subdir/newfile.java && + echo scala code >dir/subdir/newfile.scala && + echo groovy code >dir/subdir/newfile.groovy && + git add . && + git commit -m "B-dir" && + + git switch B-many && + test_seq 2 10 >general/leap1 && + rm general/leap2 && + cp general/leap1 general/leap2 && + echo leap2 >>general/leap2 && + + rm basename/numbers basename/sequence basename/values && + mkdir -p basename/subdir/ + cp general/leap1 basename/subdir/numbers && + cp general/leap1 basename/subdir/sequence && + cp general/leap1 basename/subdir/values && + echo numbers >>basename/subdir/numbers && + echo sequence >>basename/subdir/sequence && + echo values >>basename/subdir/values && + + mkdir dir/subdir/newsubdir/ && + echo c code >dir/subdir/newfile.c && + echo python code >dir/subdir/newsubdir/newfile.py && + git add . && + git commit -m "B-many" && + + git switch A + ) +} + +# Testcase: Objects downloaded for single relevant rename +# Commit O: +# general/{leap1_O, leap2_O} +# basename/{numbers_O, sequence_O, values_O} +# dir/subdir/{a,b,c,d,e_O,Makefile_TOP_O} +# dir/subdir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Commit A: +# (Rename leap->jump, rename basename/ -> basename/subdir/, rename dir/ +# -> folder/, move e into newsubdir, add newfile.rs, remove f, modify +# both both Makefiles and jumps) +# general/{jump1_A, jump2_A} +# basename/subdir/{numbers_A, sequence_A, values_A} +# folder/subdir/{a,b,c,d,Makefile_TOP_A} +# folder/subdir/newsubdir/{e_A,newfile.rs} +# folder/subdir/tweaked/{g,h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# Commit B(-single): +# (add newfile.pl, tweak Makefile_TOP) +# general/{leap1_O, leap2_O,newfile.pl} +# basename/{numbers_O, sequence_O, values_O} +# dir/{a,b,c,d,e_O,Makefile_TOP_B} +# dir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Expected: +# general/{jump1_A, jump2_A,newfile.pl} +# basename/subdir/{numbers_A, sequence_A, values_A} +# folder/subdir/{a,b,c,d,Makefile_TOP_Merged} +# folder/subdir/newsubdir/{e_A,newfile.rs} +# folder/subdir/tweaked/{g,h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# +# Objects that need to be fetched: +# Rename detection: +# Side1 (O->A): +# Basename-matches rename detection only needs to fetch these objects: +# Makefile_TOP_O, Makefile_TOP_A +# (Despite many renames, all others are content irrelevant. They +# are also location irrelevant because newfile.rs was added on +# the side doing the directory rename, and newfile.pl was added to +# a directory that was not renamed on either side.) +# General rename detection only needs to fetch these objects: +# <None> +# (Even though newfile.rs, jump[12], basename/subdir/*, and e +# could all be used as destinations in rename detection, the +# basename detection for Makefile matches up all relevant +# sources, so these other files never end up needing to be +# used) +# Side2 (O->B): +# Basename-matches rename detection only needs to fetch these objects: +# <None> +# (there are no deleted files, so no possible sources) +# General rename detection only needs to fetch these objects: +# <None> +# (there are no deleted files, so no possible sources) +# Merge: +# 3-way content merge needs to grab these objects: +# Makefile_TOP_B +# Nothing else needs to fetch objects +# +# Summary: 2 fetches (1 for 2 objects, 1 for 1 object) +# +test_expect_merge_algorithm failure success 'Objects downloaded for single relevant rename' ' + test_setup_repo && + git clone --sparse --filter=blob:none "file://$(pwd)/server" objects-single && + ( + cd objects-single && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-before && + + git checkout -q origin/A && + + GIT_TRACE2_PERF="$(pwd)/trace.output" git \ + -c merge.directoryRenames=true merge --no-stat \ + --no-progress origin/B-single && + + # Check the number of objects we reported we would fetch + cat >expect <<-EOF && + fetch_count:2 + fetch_count:1 + EOF + grep fetch_count trace.output | cut -d "|" -f 9 | tr -d " ." >actual && + test_cmp expect actual && + + # Check the number of fetch commands exec-ed + grep d0.*fetch.negotiationAlgorithm trace.output >fetches && + test_line_count = 2 fetches && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-after && + comm -2 -3 missing-objects-before missing-objects-after >old && + comm -1 -3 missing-objects-before missing-objects-after >new && + # No new missing objects + test_must_be_empty new && + # Fetched 2 + 1 = 3 objects + test_line_count = 3 old + ) +' + +# Testcase: Objects downloaded for directory rename +# Commit O: +# general/{leap1_O, leap2_O} +# basename/{numbers_O, sequence_O, values_O} +# dir/subdir/{a,b,c,d,e_O,Makefile_TOP_O} +# dir/subdir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Commit A: +# (Rename leap->jump, rename basename/ -> basename/subdir/, rename dir/ -> +# folder/, move e into newsubdir, add newfile.rs, remove f, modify +# both Makefiles and jumps) +# general/{jump1_A, jump2_A} +# basename/subdir/{numbers_A, sequence_A, values_A} +# folder/subdir/{a,b,c,d,Makefile_TOP_A} +# folder/subdir/newsubdir/{e_A,newfile.rs} +# folder/subdir/tweaked/{g,h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# Commit B(-dir): +# (add dir/subdir/newfile.{java,scala,groovy} +# general/{leap1_O, leap2_O} +# basename/{numbers_O, sequence_O, values_O} +# dir/subdir/{a,b,c,d,e_O,Makefile_TOP_O, +# newfile.java,newfile.scala,newfile.groovy} +# dir/subdir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Expected: +# general/{jump1_A, jump2_A} +# basename/subdir/{numbers_A, sequence_A, values_A} +# folder/subdir/{a,b,c,d,Makefile_TOP_A, +# newfile.java,newfile.scala,newfile.groovy} +# folder/subdir/newsubdir/{e_A,newfile.rs} +# folder/subdir/tweaked/{g,h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# +# Objects that need to be fetched: +# Makefile_TOP_O, Makefile_TOP_A +# Makefile_SUB_O, Makefile_SUB_A +# e_O, e_A +# * Despite A's rename of jump->leap, those renames are irrelevant. +# * Despite A's rename of basename/ -> basename/subdir/, those renames are +# irrelevant. +# * Because of A's rename of dir/ -> folder/ and B-dir's addition of +# newfile.* into dir/subdir/, we need to determine directory renames. +# (Technically, there are enough exact renames to determine directory +# rename detection, but the current implementation always does +# basename searching before directory rename detection. Running it +# also before basename searching would mean doing directory rename +# detection twice, but it's a bit expensive to do that and cases like +# this are not all that common.) +# Summary: 1 fetches for 6 objects +# +test_expect_merge_algorithm failure success 'Objects downloaded when a directory rename triggered' ' + test_setup_repo && + git clone --sparse --filter=blob:none "file://$(pwd)/server" objects-dir && + ( + cd objects-dir && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-before && + + git checkout -q origin/A && + + GIT_TRACE2_PERF="$(pwd)/trace.output" git \ + -c merge.directoryRenames=true merge --no-stat \ + --no-progress origin/B-dir && + + # Check the number of objects we reported we would fetch + cat >expect <<-EOF && + fetch_count:6 + EOF + grep fetch_count trace.output | cut -d "|" -f 9 | tr -d " ." >actual && + test_cmp expect actual && + + # Check the number of fetch commands exec-ed + grep d0.*fetch.negotiationAlgorithm trace.output >fetches && + test_line_count = 1 fetches && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-after && + comm -2 -3 missing-objects-before missing-objects-after >old && + comm -1 -3 missing-objects-before missing-objects-after >new && + # No new missing objects + test_must_be_empty new && + # Fetched 6 objects + test_line_count = 6 old + ) +' + +# Testcase: Objects downloaded with lots of renames and modifications +# Commit O: +# general/{leap1_O, leap2_O} +# basename/{numbers_O, sequence_O, values_O} +# dir/subdir/{a,b,c,d,e_O,Makefile_TOP_O} +# dir/subdir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Commit A: +# (Rename leap->jump, rename basename/ -> basename/subdir/, rename dir/ +# -> folder/, move e into newsubdir, add newfile.rs, remove f, modify +# both both Makefiles and jumps) +# general/{jump1_A, jump2_A} +# basename/subdir/{numbers_A, sequence_A, values_A} +# folder/subdir/{a,b,c,d,Makefile_TOP_A} +# folder/subdir/newsubdir/{e_A,newfile.rs} +# folder/subdir/tweaked/{g,h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# Commit B(-minimal): +# (modify both leaps, rename basename/ -> basename/subdir/, add +# newfile.{c,py}) +# general/{leap1_B, leap2_B} +# basename/subdir/{numbers_B, sequence_B, values_B} +# dir/{a,b,c,d,e_O,Makefile_TOP_O,newfile.c} +# dir/tweaked/{f,g,h,Makefile_SUB_O,newfile.py} +# dir/unchanged/<LOTS OF FILES> +# Expected: +# general/{jump1_Merged, jump2_Merged} +# basename/subdir/{numbers_Merged, sequence_Merged, values_Merged} +# folder/subdir/{a,b,c,d,Makefile_TOP_A,newfile.c} +# folder/subdir/newsubdir/e_A +# folder/subdir/tweaked/{g,h,Makefile_SUB_A,newfile.py} +# folder/unchanged/<LOTS OF FILES> +# +# Objects that need to be fetched: +# Rename detection: +# Side1 (O->A): +# Basename-matches rename detection only needs to fetch these objects: +# numbers_O, numbers_A +# sequence_O, sequence_A +# values_O, values_A +# Makefile_TOP_O, Makefile_TOP_A +# Makefile_SUB_O, Makefile_SUB_A +# e_O, e_A +# General rename detection only needs to fetch these objects: +# leap1_O, leap2_O +# jump1_A, jump2_A, newfile.rs +# (only need remaining relevant sources, but any relevant sources need +# to be matched against all possible unpaired destinations) +# Side2 (O->B): +# Basename-matches rename detection only needs to fetch these objects: +# numbers_B +# sequence_B +# values_B +# (because numbers_O, sequence_O, and values_O already fetched above) +# General rename detection only needs to fetch these objects: +# <None> +# Merge: +# 3-way content merge needs to grab these objects: +# leap1_B +# leap2_B +# Nothing else needs to fetch objects +# +# Summary: 4 fetches (1 for 6 objects, 1 for 8, 1 for 3, 1 for 2) +# +test_expect_merge_algorithm failure success 'Objects downloaded with lots of renames and modifications' ' + test_setup_repo && + git clone --sparse --filter=blob:none "file://$(pwd)/server" objects-many && + ( + cd objects-many && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-before && + + git checkout -q origin/A && + + GIT_TRACE2_PERF="$(pwd)/trace.output" git \ + -c merge.directoryRenames=true merge --no-stat \ + --no-progress origin/B-many && + + # Check the number of objects we reported we would fetch + cat >expect <<-EOF && + fetch_count:12 + fetch_count:5 + fetch_count:3 + fetch_count:2 + EOF + grep fetch_count trace.output | cut -d "|" -f 9 | tr -d " ." >actual && + test_cmp expect actual && + + # Check the number of fetch commands exec-ed + grep d0.*fetch.negotiationAlgorithm trace.output >fetches && + test_line_count = 4 fetches && + + git rev-list --objects --all --missing=print | + grep "^?" | sort >missing-objects-after && + comm -2 -3 missing-objects-before missing-objects-after >old && + comm -1 -3 missing-objects-before missing-objects-after >new && + # No new missing objects + test_must_be_empty new && + # Fetched 12 + 5 + 3 + 2 = 22 objects + test_line_count = 22 old + ) +' + +test_done diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh index 3375eaf4e7..bf4ce3c63d 100755 --- a/t/t6422-merge-rename-corner-cases.sh +++ b/t/t6422-merge-rename-corner-cases.sh @@ -3,7 +3,11 @@ test_description="recursive merge corner cases w/ renames but not criss-crosses" # t6036 has corner cases that involve both criss-cross merges and renames +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh test_setup_rename_delete_untracked () { test_create_repo rename-delete-untracked && @@ -312,15 +316,18 @@ test_expect_success 'rename/directory conflict + clean content merge' ' git ls-files -u >out && test_line_count = 1 out && git ls-files -o >out && - test_line_count = 2 out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_line_count = 1 out + else + test_line_count = 2 out + fi && echo 0 >expect && git cat-file -p base:file >>expect && echo 7 >>expect && test_cmp expect newfile~HEAD && - test $(git rev-parse :2:newfile) = $(git hash-object expect) && - test_path_is_file newfile/realfile && test_path_is_file newfile~HEAD ) @@ -343,7 +350,12 @@ test_expect_success 'rename/directory conflict + content merge conflict' ' git ls-files -u >out && test_line_count = 3 out && git ls-files -o >out && - test_line_count = 2 out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_line_count = 1 out + else + test_line_count = 2 out + fi && git cat-file -p left-conflict:newfile >left && git cat-file -p base:file >base && @@ -355,10 +367,16 @@ test_expect_success 'rename/directory conflict + content merge conflict' ' left base right && test_cmp left newfile~HEAD && - git rev-parse >expect \ - base:file left-conflict:newfile right:file && - git rev-parse >actual \ - :1:newfile :2:newfile :3:newfile && + git rev-parse >expect \ + base:file left-conflict:newfile right:file && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git rev-parse >actual \ + :1:newfile~HEAD :2:newfile~HEAD :3:newfile~HEAD + else + git rev-parse >actual \ + :1:newfile :2:newfile :3:newfile + fi && test_cmp expect actual && test_path_is_file newfile/realfile && @@ -878,7 +896,7 @@ test_setup_rad () { ) } -test_expect_failure 'rad-check: rename/add/delete conflict' ' +test_expect_merge_algorithm failure success 'rad-check: rename/add/delete conflict' ' test_setup_rad && ( cd rad && @@ -951,7 +969,7 @@ test_setup_rrdd () { ) } -test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' ' +test_expect_merge_algorithm failure success 'rrdd-check: rename/rename(2to1)/delete/delete conflict' ' test_setup_rrdd && ( cd rrdd && @@ -1040,7 +1058,7 @@ test_setup_mod6 () { ) } -test_expect_failure 'mod6-check: chains of rename/rename(1to2) and rename/rename(2to1)' ' +test_expect_merge_algorithm failure success 'mod6-check: chains of rename/rename(1to2) and rename/rename(2to1)' ' test_setup_mod6 && ( cd mod6 && @@ -1115,7 +1133,7 @@ test_conflicts_with_adds_and_renames() { # Setup: # L # / \ - # master ? + # main ? # \ / # R # @@ -1245,7 +1263,7 @@ test_conflicts_with_adds_and_renames() { :2:three \ :3:three && git rev-parse >expected \ - master:irrelevant_file \ + main:irrelevant_file \ file_v2 \ file_v4 && test_cmp expected actual && @@ -1275,12 +1293,12 @@ test_conflicts_with_adds_and_renames add add # Setup: # L # / \ -# master ? +# main ? # \ / # R # # Where: -# master has two files, named 'one' and 'two'. +# main has two files, named 'one' and 'two'. # branches L and R both modify 'one', in conflicting ways. # branches L and R both modify 'two', in conflicting ways. # branch L also renames 'one' to 'three'. @@ -1361,7 +1379,7 @@ test_expect_success 'check nested conflicts from rename/rename(2to1)' ' test_line_count = 1 out && # Compare :2:three to expected values - git cat-file -p master:one >base && + git cat-file -p main:one >base && git cat-file -p L:three >ours && git cat-file -p R:one >theirs && test_must_fail git merge-file \ @@ -1372,7 +1390,7 @@ test_expect_success 'check nested conflicts from rename/rename(2to1)' ' test_cmp expect L-three && # Compare :2:three to expected values - git cat-file -p master:two >base && + git cat-file -p main:two >base && git cat-file -p L:two >ours && git cat-file -p R:three >theirs && test_must_fail git merge-file \ diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh index f7ecbb886d..4af4fb0038 100755 --- a/t/t6423-merge-rename-directories.sh +++ b/t/t6423-merge-rename-directories.sh @@ -26,6 +26,7 @@ test_description="recursive merge with directory renames" # files that might be renamed into each other's paths.) . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh ########################################################################### @@ -301,11 +302,20 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict' git cat-file -p :2:x/wham >expect && git cat-file -p :3:x/wham >other && >empty && - test_must_fail git merge-file \ - -L "HEAD" \ - -L "" \ - -L "B^0" \ - expect empty other && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge-file \ + -L "HEAD:y/wham" \ + -L "" \ + -L "B^0:z/wham" \ + expect empty other + else + test_must_fail git merge-file \ + -L "HEAD" \ + -L "" \ + -L "B^0" \ + expect empty other + fi && test_cmp expect x/wham ) ' @@ -444,7 +454,7 @@ test_expect_success '1f: Split a directory into two other directories' ' # the directory renamed, but the files within it. (see 1b) # # If renames split a directory into two or more others, the directory -# with the most renames, "wins" (see 1c). However, see the testcases +# with the most renames, "wins" (see 1f). However, see the testcases # in section 2, plus testcases 3a and 4a. ########################################################################### @@ -1176,10 +1186,18 @@ test_expect_success '5d: Directory/file/file conflict due to directory rename' ' git ls-files -u >out && test_line_count = 1 out && git ls-files -o >out && - test_line_count = 2 out && - - git rev-parse >actual \ - :0:y/b :0:y/c :0:z/d :0:y/f :2:y/d :0:y/d/e && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_line_count = 1 out && + + git rev-parse >actual \ + :0:y/b :0:y/c :0:z/d :0:y/f :2:y/d~HEAD :0:y/d/e + else + test_line_count = 2 out && + + git rev-parse >actual \ + :0:y/b :0:y/c :0:z/d :0:y/f :2:y/d :0:y/d/e + fi && git rev-parse >expect \ O:z/b O:z/c B:z/d B:z/f A:y/d B:y/d/e && test_cmp expect actual && @@ -1262,35 +1280,144 @@ test_expect_success '6a: Tricky rename/delete' ' test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && test_i18ngrep "CONFLICT (rename/delete).*z/c.*y/c" out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >actual \ + :0:y/b :1:y/c :3:y/c && + git rev-parse >expect \ + O:z/b O:z/c O:z/c + else + git ls-files -s >out && + test_line_count = 2 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >actual \ + :0:y/b :3:y/c && + git rev-parse >expect \ + O:z/b O:z/c + fi && + test_cmp expect actual + ) +' + +# Testcase 6b1, Same rename done on both sides +# (Related to testcase 6b2 and 8e) +# Commit O: z/{b,c,d,e} +# Commit A: y/{b,c,d}, x/e +# Commit B: y/{b,c,d}, z/{e,f} +# Expected: y/{b,c,d,f}, x/e +# Note: Directory rename detection says A renamed z/ -> y/ (3 paths renamed +# to y/ and only 1 renamed to x/), therefore the new file 'z/f' in B +# should be moved to 'y/f'. +# +# This is a bit of an edge case where any behavior might surprise users, +# whether that is treating A as renaming z/ -> y/, treating A as renaming +# z/ -> x/, or treating A as not doing any directory rename. However, I +# think this answer is the least confusing and most consistent with the +# rules elsewhere. +# +# A note about z/ -> x/, since it may not be clear how that could come +# about: If we were to ignore files renamed by both sides +# (i.e. z/{b,c,d}), as directory rename detection did in git-2.18 thru +# at least git-2.28, then we would note there are no renames from z/ to +# y/ and one rename from z/ to x/ and thus come to the conclusion that +# A renamed z/ -> x/. This seems more confusing for end users than a +# rename of z/ to y/, it makes directory rename detection behavior +# harder for them to predict. As such, we modified the rule, changed +# the behavior on testcases 6b2 and 8e, and introduced this 6b1 testcase. + +test_setup_6b1 () { + test_create_repo 6b1 && + ( + cd 6b1 && + + mkdir z && + echo b >z/b && + echo c >z/c && + echo d >z/d && + echo e >z/e && + git add z && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git checkout A && + git mv z y && + mkdir x && + git mv y/e x/e && + test_tick && + git commit -m "A" && + + git checkout B && + git mv z y && + mkdir z && + git mv y/e z/e && + echo f >z/f && + git add z/f && + test_tick && + git commit -m "B" + ) +} + +test_expect_merge_algorithm failure success '6b1: Same renames done on both sides, plus another rename' ' + test_setup_6b1 && + ( + cd 6b1 && + + git checkout A^0 && + + git -c merge.directoryRenames=true merge -s recursive B^0 && + git ls-files -s >out && - test_line_count = 2 out && + test_line_count = 5 out && git ls-files -u >out && - test_line_count = 1 out && + test_line_count = 0 out && git ls-files -o >out && test_line_count = 1 out && git rev-parse >actual \ - :0:y/b :3:y/c && + HEAD:y/b HEAD:y/c HEAD:y/d HEAD:x/e HEAD:y/f && git rev-parse >expect \ - O:z/b O:z/c && + O:z/b O:z/c O:z/d O:z/e B:z/f && test_cmp expect actual ) ' -# Testcase 6b, Same rename done on both sides +# Testcase 6b2, Same rename done on both sides # (Related to testcases 6c and 8e) # Commit O: z/{b,c} # Commit A: y/{b,c} # Commit B: y/{b,c}, z/d -# Expected: y/{b,c}, z/d -# Note: If we did directory rename detection here, we'd move z/d into y/, -# but B did that rename and still decided to put the file into z/, -# so we probably shouldn't apply directory rename detection for it. - -test_setup_6b () { - test_create_repo 6b && +# Expected: y/{b,c,d} +# Alternate: y/{b,c}, z/d +# Note: Directory rename detection says A renamed z/ -> y/, therefore the new +# file 'z/d' in B should be moved to 'y/d'. +# +# We could potentially ignore the renames of z/{b,c} on side A since +# those were renamed on both sides. However, it's a bit of a corner +# case because what if there was also a z/e that side A moved to x/e +# and side B left alone? If we used the "ignore renames done on both +# sides" logic, then we'd compute that A renamed z/ -> x/, and move +# z/d to x/d. That seems more surprising and uglier than allowing +# the z/ -> y/ rename. + +test_setup_6b2 () { + test_create_repo 6b2 && ( - cd 6b && + cd 6b2 && mkdir z && echo b >z/b && @@ -1318,10 +1445,10 @@ test_setup_6b () { ) } -test_expect_success '6b: Same rename done on both sides' ' - test_setup_6b && +test_expect_merge_algorithm failure success '6b2: Same rename done on both sides' ' + test_setup_6b2 && ( - cd 6b && + cd 6b2 && git checkout A^0 && @@ -1335,7 +1462,7 @@ test_expect_success '6b: Same rename done on both sides' ' test_line_count = 1 out && git rev-parse >actual \ - HEAD:y/b HEAD:y/c HEAD:z/d && + HEAD:y/b HEAD:y/c HEAD:y/d && git rev-parse >expect \ O:z/b O:z/c B:z/d && test_cmp expect actual @@ -1343,7 +1470,7 @@ test_expect_success '6b: Same rename done on both sides' ' ' # Testcase 6c, Rename only done on same side -# (Related to testcases 6b and 8e) +# (Related to testcases 6b1, 6b2, and 8e) # Commit O: z/{b,c} # Commit A: z/{b,c} (no change) # Commit B: y/{b,c}, z/d @@ -1705,11 +1832,20 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename' git cat-file -p :2:y/d >expect && git cat-file -p :3:y/d >other && >empty && - test_must_fail git merge-file \ - -L "HEAD" \ - -L "" \ - -L "B^0" \ - expect empty other && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge-file \ + -L "HEAD:y/d" \ + -L "" \ + -L "B^0:z/d" \ + expect empty other + else + test_must_fail git merge-file \ + -L "HEAD" \ + -L "" \ + -L "B^0" \ + expect empty other + fi && test_cmp expect y/d ) ' @@ -1831,17 +1967,32 @@ test_expect_success '7d: transitive rename involved in rename/delete; how is it test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out && - git ls-files -s >out && - test_line_count = 3 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 1 out && - - git rev-parse >actual \ - :0:y/b :0:y/c :3:y/d && - git rev-parse >expect \ - O:z/b O:z/c O:x/d && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >actual \ + :0:y/b :0:y/c :1:y/d :3:y/d && + git rev-parse >expect \ + O:z/b O:z/c O:x/d O:x/d + else + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >actual \ + :0:y/b :0:y/c :3:y/d && + git rev-parse >expect \ + O:z/b O:z/c O:x/d + fi && test_cmp expect actual ) ' @@ -1922,17 +2073,32 @@ test_expect_success '7e: transitive rename in rename/delete AND dirs in the way' test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out && - git ls-files -s >out && - test_line_count = 5 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 2 out && - - git rev-parse >actual \ - :0:x/d/f :0:y/d/g :0:y/b :0:y/c :3:y/d && - git rev-parse >expect \ - A:x/d/f A:y/d/g O:z/b O:z/c O:x/d && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git ls-files -s >out && + test_line_count = 6 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 1 out && + + git rev-parse >actual \ + :0:x/d/f :0:y/d/g :0:y/b :0:y/c :1:y/d~B^0 :3:y/d~B^0 && + git rev-parse >expect \ + A:x/d/f A:y/d/g O:z/b O:z/c O:x/d O:x/d + else + git ls-files -s >out && + test_line_count = 5 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 2 out && + + git rev-parse >actual \ + :0:x/d/f :0:y/d/g :0:y/b :0:y/c :3:y/d && + git rev-parse >expect \ + A:x/d/f A:y/d/g O:z/b O:z/c O:x/d + fi && test_cmp expect actual && git hash-object y/d~B^0 >actual && @@ -2269,14 +2435,22 @@ test_expect_success '8d: rename/delete...or not?' ' # Notes: In commit A, directory z got renamed to y. In commit B, directory z # did NOT get renamed; the directory is still present; instead it is # considered to have just renamed a subset of paths in directory z -# elsewhere. However, this is much like testcase 6b (where commit B -# moves all the original paths out of z/ but opted to keep d -# within z/). This makes it hard to judge where d should end up. +# elsewhere. This is much like testcase 6b2 (where commit B moves all +# the original paths out of z/ but opted to keep d within z/). # -# It's possible that users would get confused about this, but what -# should we do instead? It's not at all clear to me whether z/d or -# y/d or something else is a better resolution here, and other cases -# start getting really tricky, so I just picked one. +# It was not clear in the past what should be done with this testcase; +# in fact, I noted that I "just picked one" previously. However, +# following the new logic for testcase 6b2, we should take the rename +# and move z/d to y/d. +# +# 6b1, 6b2, and this case are definitely somewhat fuzzy in terms of +# whether they are optimal for end users, but (a) the default for +# directory rename detection is to mark these all as conflicts +# anyway, (b) it feels like this is less prone to higher order corner +# case confusion, and (c) the current algorithm requires less global +# knowledge (i.e. less coupling in the algorithm between renames done +# on both sides) which thus means users are better able to predict +# the behavior, and predict it without computing as many details. test_setup_8e () { test_create_repo 8e && @@ -2731,7 +2905,7 @@ test_setup_9e () { ) } -test_expect_success C_LOCALE_OUTPUT '9e: N-to-1 whammo' ' +test_expect_success '9e: N-to-1 whammo' ' test_setup_9e && ( cd 9e && @@ -3040,6 +3214,7 @@ test_expect_success '10a: Overwrite untracked with normal rename/delete' ' echo important >z/d && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && + test_path_is_missing .git/MERGE_HEAD && test_i18ngrep "The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && @@ -3109,21 +3284,34 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' ' echo contents >y/e && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out && - test_i18ngrep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out && - - git ls-files -s >out && - test_line_count = 3 out && - git ls-files -u >out && - test_line_count = 2 out && - git ls-files -o >out && - test_line_count = 5 out && - - git rev-parse >actual \ - :0:y/b :3:y/d :3:y/e && - git rev-parse >expect \ - O:z/b O:z/c B:z/e && - test_cmp expect actual && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + + git ls-files -s >out && + test_line_count = 1 out && + git ls-files -u >out && + test_line_count = 0 out && + git ls-files -o >out && + test_line_count = 5 out + else + test_i18ngrep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out && + test_i18ngrep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out && + + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 5 out && + + git rev-parse >actual \ + :0:y/b :3:y/d :3:y/e && + git rev-parse >expect \ + O:z/b O:z/c B:z/e && + test_cmp expect actual + fi && echo very >expect && test_cmp expect y/c && @@ -3186,25 +3374,38 @@ test_expect_success '10c1: Overwrite untracked with dir rename/rename(1to2)' ' echo important >y/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out && - - git ls-files -s >out && - test_line_count = 6 out && - git ls-files -u >out && - test_line_count = 3 out && - git ls-files -o >out && - test_line_count = 3 out && - - git rev-parse >actual \ - :0:y/a :0:y/b :0:x/d :1:x/c :2:w/c :3:y/c && - git rev-parse >expect \ - O:z/a O:z/b O:x/d O:x/c O:x/c O:x/c && - test_cmp expect actual && - - git hash-object y/c~B^0 >actual && - git rev-parse O:x/c >expect && - test_cmp expect actual && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 0 out && + git ls-files -o >out && + test_line_count = 3 out + else + test_i18ngrep "CONFLICT (rename/rename)" out && + test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out && + + git ls-files -s >out && + test_line_count = 6 out && + git ls-files -u >out && + test_line_count = 3 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:y/a :0:y/b :0:x/d :1:x/c :2:w/c :3:y/c && + git rev-parse >expect \ + O:z/a O:z/b O:x/d O:x/c O:x/c O:x/c && + test_cmp expect actual && + + git hash-object y/c~B^0 >actual && + git rev-parse O:x/c >expect && + test_cmp expect actual + fi && echo important >expect && test_cmp expect y/c @@ -3224,25 +3425,38 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth echo important >y/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive A^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out && - - git ls-files -s >out && - test_line_count = 6 out && - git ls-files -u >out && - test_line_count = 3 out && - git ls-files -o >out && - test_line_count = 3 out && - - git rev-parse >actual \ - :0:y/a :0:y/b :0:x/d :1:x/c :3:w/c :2:y/c && - git rev-parse >expect \ - O:z/a O:z/b O:x/d O:x/c O:x/c O:x/c && - test_cmp expect actual && - - git hash-object y/c~HEAD >actual && - git rev-parse O:x/c >expect && - test_cmp expect actual && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 0 out && + git ls-files -o >out && + test_line_count = 3 out + else + test_i18ngrep "CONFLICT (rename/rename)" out && + test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out && + + git ls-files -s >out && + test_line_count = 6 out && + git ls-files -u >out && + test_line_count = 3 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:y/a :0:y/b :0:x/d :1:x/c :3:w/c :2:y/c && + git rev-parse >expect \ + O:z/a O:z/b O:x/d O:x/c O:x/c O:x/c && + test_cmp expect actual && + + git hash-object y/c~HEAD >actual && + git rev-parse O:x/c >expect && + test_cmp expect actual + fi && echo important >expect && test_cmp expect y/c @@ -3300,37 +3514,50 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' ' echo important >y/wham && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/wham" out && - - git ls-files -s >out && - test_line_count = 6 out && - git ls-files -u >out && - test_line_count = 2 out && - git ls-files -o >out && - test_line_count = 3 out && - - git rev-parse >actual \ - :0:y/a :0:y/b :0:y/d :0:y/e :2:y/wham :3:y/wham && - git rev-parse >expect \ - O:z/a O:z/b O:x/d O:x/e O:z/c O:x/f && - test_cmp expect actual && - - test_must_fail git rev-parse :1:y/wham && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + + git ls-files -s >out && + test_line_count = 6 out && + git ls-files -u >out && + test_line_count = 0 out && + git ls-files -o >out && + test_line_count = 3 out + else + test_i18ngrep "CONFLICT (rename/rename)" out && + test_i18ngrep "Refusing to lose untracked file at y/wham" out && + + git ls-files -s >out && + test_line_count = 6 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:y/a :0:y/b :0:y/d :0:y/e :2:y/wham :3:y/wham && + git rev-parse >expect \ + O:z/a O:z/b O:x/d O:x/e O:z/c O:x/f && + test_cmp expect actual && + + test_must_fail git rev-parse :1:y/wham && + + # Test that two-way merge in y/wham~merged is as expected + git cat-file -p :2:y/wham >expect && + git cat-file -p :3:y/wham >other && + >empty && + test_must_fail git merge-file \ + -L "HEAD" \ + -L "" \ + -L "B^0" \ + expect empty other && + test_cmp expect y/wham~merged + fi && echo important >expect && - test_cmp expect y/wham && - - # Test that the two-way merge in y/wham~merged is as expected - git cat-file -p :2:y/wham >expect && - git cat-file -p :3:y/wham >other && - >empty && - test_must_fail git merge-file \ - -L "HEAD" \ - -L "" \ - -L "B^0" \ - expect empty other && - test_cmp expect y/wham~merged + test_cmp expect y/wham ) ' @@ -3369,7 +3596,7 @@ test_setup_10e () { ) } -test_expect_failure '10e: Does git complain about untracked file that is not really in the way?' ' +test_expect_merge_algorithm failure success '10e: Does git complain about untracked file that is not really in the way?' ' test_setup_10e && ( cd 10e && @@ -3460,28 +3687,35 @@ test_expect_success '11a: Avoid losing dirty contents with simple rename' ' echo stuff >>z/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "Refusing to lose dirty file at z/c" out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + test_i18ngrep "Refusing to lose dirty file at z/c" out && + + git ls-files -s >out && + test_line_count = 2 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:z/a :2:z/c && + git rev-parse >expect \ + O:z/a B:z/b && + test_cmp expect actual && + + git hash-object z/c~HEAD >actual && + git rev-parse B:z/b >expect && + test_cmp expect actual + fi && test_seq 1 10 >expected && echo stuff >>expected && - test_cmp expected z/c && - - git ls-files -s >out && - test_line_count = 2 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 4 out && - - git rev-parse >actual \ - :0:z/a :2:z/c && - git rev-parse >expect \ - O:z/a B:z/b && - test_cmp expect actual && + test_cmp expected z/c - git hash-object z/c~HEAD >actual && - git rev-parse B:z/b >expect && - test_cmp expect actual ) ' @@ -3532,32 +3766,39 @@ test_expect_success '11b: Avoid losing dirty file involved in directory rename' git checkout A^0 && echo stuff >>z/c && - git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "Refusing to lose dirty file at z/c" out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && + test_i18ngrep "Refusing to lose dirty file at z/c" out && + + git ls-files -s >out && + test_line_count = 3 out && + git ls-files -u >out && + test_line_count = 0 out && + git ls-files -m >out && + test_line_count = 0 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:x/b :0:y/a :0:y/c && + git rev-parse >expect \ + O:x/b O:z/a B:x/c && + test_cmp expect actual && + + git hash-object y/c >actual && + git rev-parse B:x/c >expect && + test_cmp expect actual + fi && grep -q stuff z/c && test_seq 1 10 >expected && echo stuff >>expected && - test_cmp expected z/c && - - git ls-files -s >out && - test_line_count = 3 out && - git ls-files -u >out && - test_line_count = 0 out && - git ls-files -m >out && - test_line_count = 0 out && - git ls-files -o >out && - test_line_count = 4 out && - - git rev-parse >actual \ - :0:x/b :0:y/a :0:y/c && - git rev-parse >expect \ - O:x/b O:z/a B:x/c && - test_cmp expect actual && - - git hash-object y/c >actual && - git rev-parse B:x/c >expect && - test_cmp expect actual + test_cmp expected z/c ) ' @@ -3609,7 +3850,13 @@ test_expect_success '11c: Avoid losing not-uptodate with rename + D/F conflict' echo stuff >>y/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "following files would be overwritten by merge" err && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + test_i18ngrep "following files would be overwritten by merge" err + fi && grep -q stuff y/c && test_seq 1 10 >expected && @@ -3677,29 +3924,35 @@ test_expect_success '11d: Avoid losing not-uptodate with rename + D/F conflict' echo stuff >>z/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "Refusing to lose dirty file at z/c" out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + test_i18ngrep "Refusing to lose dirty file at z/c" out && + + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 1 out && + git ls-files -o >out && + test_line_count = 4 out && + + git rev-parse >actual \ + :0:x/b :0:y/a :0:y/c/d :3:y/c && + git rev-parse >expect \ + O:x/b O:z/a B:y/c/d B:x/c && + test_cmp expect actual && + + git hash-object y/c~HEAD >actual && + git rev-parse B:x/c >expect && + test_cmp expect actual + fi && grep -q stuff z/c && test_seq 1 10 >expected && echo stuff >>expected && - test_cmp expected z/c && - - git ls-files -s >out && - test_line_count = 4 out && - git ls-files -u >out && - test_line_count = 1 out && - git ls-files -o >out && - test_line_count = 5 out && - - git rev-parse >actual \ - :0:x/b :0:y/a :0:y/c/d :3:y/c && - git rev-parse >expect \ - O:x/b O:z/a B:y/c/d B:x/c && - test_cmp expect actual && - - git hash-object y/c~HEAD >actual && - git rev-parse B:x/c >expect && - test_cmp expect actual + test_cmp expected z/c ) ' @@ -3757,37 +4010,43 @@ test_expect_success '11e: Avoid deleting not-uptodate with dir rename/rename(1to echo mods >>y/c && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose dirty file at y/c" out && - - git ls-files -s >out && - test_line_count = 7 out && - git ls-files -u >out && - test_line_count = 4 out && - git ls-files -o >out && - test_line_count = 3 out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + test_i18ngrep "CONFLICT (rename/rename)" out && + test_i18ngrep "Refusing to lose dirty file at y/c" out && + + git ls-files -s >out && + test_line_count = 7 out && + git ls-files -u >out && + test_line_count = 4 out && + git ls-files -o >out && + test_line_count = 3 out && + + git rev-parse >actual \ + :0:y/a :0:y/b :0:x/d :1:x/c :2:w/c :2:y/c :3:y/c && + git rev-parse >expect \ + O:z/a O:z/b O:x/d O:x/c O:x/c A:y/c O:x/c && + test_cmp expect actual && + + # See if y/c~merged has expected contents; requires manually + # doing the expected file merge + git cat-file -p A:y/c >c1 && + git cat-file -p B:z/c >c2 && + >empty && + test_must_fail git merge-file \ + -L "HEAD" \ + -L "" \ + -L "B^0" \ + c1 empty c2 && + test_cmp c1 y/c~merged + fi && echo different >expected && echo mods >>expected && - test_cmp expected y/c && - - git rev-parse >actual \ - :0:y/a :0:y/b :0:x/d :1:x/c :2:w/c :2:y/c :3:y/c && - git rev-parse >expect \ - O:z/a O:z/b O:x/d O:x/c O:x/c A:y/c O:x/c && - test_cmp expect actual && - - # See if y/c~merged has expected contents; requires manually - # doing the expected file merge - git cat-file -p A:y/c >c1 && - git cat-file -p B:z/c >c2 && - >empty && - test_must_fail git merge-file \ - -L "HEAD" \ - -L "" \ - -L "B^0" \ - c1 empty c2 && - test_cmp c1 y/c~merged + test_cmp expected y/c ) ' @@ -3840,38 +4099,44 @@ test_expect_success '11f: Avoid deleting not-uptodate with dir rename/rename(2to echo important >>y/wham && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose dirty file at y/wham" out && - - git ls-files -s >out && - test_line_count = 4 out && - git ls-files -u >out && - test_line_count = 2 out && - git ls-files -o >out && - test_line_count = 3 out && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_path_is_missing .git/MERGE_HEAD && + test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + else + test_i18ngrep "CONFLICT (rename/rename)" out && + test_i18ngrep "Refusing to lose dirty file at y/wham" out && + + git ls-files -s >out && + test_line_count = 4 out && + git ls-files -u >out && + test_line_count = 2 out && + git ls-files -o >out && + test_line_count = 3 out && + + test_must_fail git rev-parse :1:y/wham && + + git rev-parse >actual \ + :0:y/a :0:y/b :2:y/wham :3:y/wham && + git rev-parse >expect \ + O:z/a O:z/b O:x/c O:x/d && + test_cmp expect actual && + + # Test that two-way merge in y/wham~merged is as expected + git cat-file -p :2:y/wham >expect && + git cat-file -p :3:y/wham >other && + >empty && + test_must_fail git merge-file \ + -L "HEAD" \ + -L "" \ + -L "B^0" \ + expect empty other && + test_cmp expect y/wham~merged + fi && test_seq 1 10 >expected && echo important >>expected && - test_cmp expected y/wham && - - test_must_fail git rev-parse :1:y/wham && - - git rev-parse >actual \ - :0:y/a :0:y/b :2:y/wham :3:y/wham && - git rev-parse >expect \ - O:z/a O:z/b O:x/c O:x/d && - test_cmp expect actual && - - # Test that the two-way merge in y/wham~merged is as expected - git cat-file -p :2:y/wham >expect && - git cat-file -p :3:y/wham >other && - >empty && - test_must_fail git merge-file \ - -L "HEAD" \ - -L "" \ - -L "B^0" \ - expect empty other && - test_cmp expect y/wham~merged + test_cmp expected y/wham ) ' @@ -3947,31 +4212,124 @@ test_expect_success '12a: Moving one directory hierarchy into another' ' ) ' -# Testcase 12b, Moving two directory hierarchies into each other +# Testcase 12b1, Moving two directory hierarchies into each other # (Related to testcases 1c and 12c) # Commit O: node1/{leaf1, leaf2}, node2/{leaf3, leaf4} # Commit A: node1/{leaf1, leaf2, node2/{leaf3, leaf4}} # Commit B: node2/{leaf3, leaf4, node1/{leaf1, leaf2}} -# Expected: node1/node2/node1/{leaf1, leaf2}, +# Expected: node1/node2/{leaf3, leaf4} +# node2/node1/{leaf1, leaf2} +# NOTE: If there were new files added to the old node1/ or node2/ directories, +# then we would need to detect renames for those directories and would +# find that: +# commit A renames node2/ -> node1/node2/ +# commit B renames node1/ -> node2/node1/ +# Applying those directory renames to the initial result (making all +# four paths experience a transitive renaming), yields +# node1/node2/node1/{leaf1, leaf2} # node2/node1/node2/{leaf3, leaf4} +# as the result. It may be really weird to have two directories +# rename each other, but simple rules give weird results when given +# weird inputs. HOWEVER, the "If" at the beginning of those NOTE was +# false; there were no new files added and thus there is no directory +# rename detection to perform. As such, we just have simple renames +# and the expected answer is: +# node1/node2/{leaf3, leaf4} +# node2/node1/{leaf1, leaf2} + +test_setup_12b1 () { + test_create_repo 12b1 && + ( + cd 12b1 && + + mkdir -p node1 node2 && + echo leaf1 >node1/leaf1 && + echo leaf2 >node1/leaf2 && + echo leaf3 >node2/leaf3 && + echo leaf4 >node2/leaf4 && + git add node1 node2 && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git checkout A && + git mv node2/ node1/ && + test_tick && + git commit -m "A" && + + git checkout B && + git mv node1/ node2/ && + test_tick && + git commit -m "B" + ) +} + +test_expect_merge_algorithm failure success '12b1: Moving two directory hierarchies into each other' ' + test_setup_12b1 && + ( + cd 12b1 && + + git checkout A^0 && + + git -c merge.directoryRenames=true merge -s recursive B^0 && + + git ls-files -s >out && + test_line_count = 4 out && + + git rev-parse >actual \ + HEAD:node2/node1/leaf1 \ + HEAD:node2/node1/leaf2 \ + HEAD:node1/node2/leaf3 \ + HEAD:node1/node2/leaf4 && + git rev-parse >expect \ + O:node1/leaf1 \ + O:node1/leaf2 \ + O:node2/leaf3 \ + O:node2/leaf4 && + test_cmp expect actual + ) +' + +# Testcase 12b2, Moving two directory hierarchies into each other +# (Related to testcases 1c and 12c) +# Commit O: node1/{leaf1, leaf2}, node2/{leaf3, leaf4} +# Commit A: node1/{leaf1, leaf2, leaf5, node2/{leaf3, leaf4}} +# Commit B: node2/{leaf3, leaf4, leaf6, node1/{leaf1, leaf2}} +# Expected: node1/node2/{node1/{leaf1, leaf2}, leaf6} +# node2/node1/{node2/{leaf3, leaf4}, leaf5} # NOTE: Without directory renames, we would expect -# node2/node1/{leaf1, leaf2}, -# node1/node2/{leaf3, leaf4} +# A: node2/leaf3 -> node1/node2/leaf3 +# A: node2/leaf1 -> node1/node2/leaf4 +# A: Adds node1/leaf5 +# B: node1/leaf1 -> node2/node1/leaf1 +# B: node1/leaf2 -> node2/node1/leaf2 +# B: Adds node2/leaf6 # with directory rename detection, we note that # commit A renames node2/ -> node1/node2/ # commit B renames node1/ -> node2/node1/ -# therefore, applying those directory renames to the initial result -# (making all four paths experience a transitive renaming), yields -# the expected result. +# therefore, applying A's directory rename to the paths added in B gives: +# B: node1/leaf1 -> node1/node2/node1/leaf1 +# B: node1/leaf2 -> node1/node2/node1/leaf2 +# B: Adds node1/node2/leaf6 +# and applying B's directory rename to the paths added in A gives: +# A: node2/leaf3 -> node2/node1/node2/leaf3 +# A: node2/leaf1 -> node2/node1/node2/leaf4 +# A: Adds node2/node1/leaf5 +# resulting in the expected +# node1/node2/{node1/{leaf1, leaf2}, leaf6} +# node2/node1/{node2/{leaf3, leaf4}, leaf5} # # You may ask, is it weird to have two directories rename each other? # To which, I can do no more than shrug my shoulders and say that # even simple rules give weird results when given weird inputs. -test_setup_12b () { - test_create_repo 12b && +test_setup_12b2 () { + test_create_repo 12b2 && ( - cd 12b && + cd 12b2 && mkdir -p node1 node2 && echo leaf1 >node1/leaf1 && @@ -3988,43 +4346,51 @@ test_setup_12b () { git checkout A && git mv node2/ node1/ && + echo leaf5 >node1/leaf5 && + git add node1/leaf5 && test_tick && git commit -m "A" && git checkout B && git mv node1/ node2/ && + echo leaf6 >node2/leaf6 && + git add node2/leaf6 && test_tick && git commit -m "B" ) } -test_expect_success '12b: Moving two directory hierarchies into each other' ' - test_setup_12b && +test_expect_success '12b2: Moving two directory hierarchies into each other' ' + test_setup_12b2 && ( - cd 12b && + cd 12b2 && git checkout A^0 && git -c merge.directoryRenames=true merge -s recursive B^0 && git ls-files -s >out && - test_line_count = 4 out && + test_line_count = 6 out && git rev-parse >actual \ HEAD:node1/node2/node1/leaf1 \ HEAD:node1/node2/node1/leaf2 \ HEAD:node2/node1/node2/leaf3 \ - HEAD:node2/node1/node2/leaf4 && + HEAD:node2/node1/node2/leaf4 \ + HEAD:node2/node1/leaf5 \ + HEAD:node1/node2/leaf6 && git rev-parse >expect \ O:node1/leaf1 \ O:node1/leaf2 \ O:node2/leaf3 \ - O:node2/leaf4 && + O:node2/leaf4 \ + A:node1/leaf5 \ + B:node2/leaf6 && test_cmp expect actual ) ' -# Testcase 12c, Moving two directory hierarchies into each other w/ content merge +# Testcase 12c1, Moving two directory hierarchies into each other w/ content merge # (Related to testcase 12b) # Commit O: node1/{ leaf1_1, leaf2_1}, node2/{leaf3_1, leaf4_1} # Commit A: node1/{ leaf1_2, leaf2_2, node2/{leaf3_2, leaf4_2}} @@ -4032,13 +4398,13 @@ test_expect_success '12b: Moving two directory hierarchies into each other' ' # Expected: Content merge conflicts for each of: # node1/node2/node1/{leaf1, leaf2}, # node2/node1/node2/{leaf3, leaf4} -# NOTE: This is *exactly* like 12c, except that every path is modified on +# NOTE: This is *exactly* like 12b1, except that every path is modified on # each side of the merge. -test_setup_12c () { - test_create_repo 12c && +test_setup_12c1 () { + test_create_repo 12c1 && ( - cd 12c && + cd 12c1 && mkdir -p node1 node2 && printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf1\n" >node1/leaf1 && @@ -4069,10 +4435,10 @@ test_setup_12c () { ) } -test_expect_success '12c: Moving one directory hierarchy into another w/ content merge' ' - test_setup_12c && +test_expect_merge_algorithm failure success '12c1: Moving one directory hierarchy into another w/ content merge' ' + test_setup_12c1 && ( - cd 12c && + cd 12c1 && git checkout A^0 && @@ -4082,6 +4448,102 @@ test_expect_success '12c: Moving one directory hierarchy into another w/ content test_line_count = 12 out && git rev-parse >actual \ + :1:node2/node1/leaf1 \ + :1:node2/node1/leaf2 \ + :1:node1/node2/leaf3 \ + :1:node1/node2/leaf4 \ + :2:node2/node1/leaf1 \ + :2:node2/node1/leaf2 \ + :2:node1/node2/leaf3 \ + :2:node1/node2/leaf4 \ + :3:node2/node1/leaf1 \ + :3:node2/node1/leaf2 \ + :3:node1/node2/leaf3 \ + :3:node1/node2/leaf4 && + git rev-parse >expect \ + O:node1/leaf1 \ + O:node1/leaf2 \ + O:node2/leaf3 \ + O:node2/leaf4 \ + A:node1/leaf1 \ + A:node1/leaf2 \ + A:node1/node2/leaf3 \ + A:node1/node2/leaf4 \ + B:node2/node1/leaf1 \ + B:node2/node1/leaf2 \ + B:node2/leaf3 \ + B:node2/leaf4 && + test_cmp expect actual + ) +' + +# Testcase 12c2, Moving two directory hierarchies into each other w/ content merge +# (Related to testcase 12b) +# Commit O: node1/{ leaf1_1, leaf2_1}, node2/{leaf3_1, leaf4_1} +# Commit A: node1/{ leaf1_2, leaf2_2, node2/{leaf3_2, leaf4_2}, leaf5} +# Commit B: node2/{node1/{leaf1_3, leaf2_3}, leaf3_3, leaf4_3, leaf6} +# Expected: Content merge conflicts for each of: +# node1/node2/node1/{leaf1, leaf2} +# node2/node1/node2/{leaf3, leaf4} +# plus +# node2/node1/leaf5 +# node1/node2/leaf6 +# NOTE: This is *exactly* like 12b2, except that every path from O is modified +# on each side of the merge. + +test_setup_12c2 () { + test_create_repo 12c2 && + ( + cd 12c2 && + + mkdir -p node1 node2 && + printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf1\n" >node1/leaf1 && + printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf2\n" >node1/leaf2 && + printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf3\n" >node2/leaf3 && + printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf4\n" >node2/leaf4 && + git add node1 node2 && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git checkout A && + git mv node2/ node1/ && + for i in `git ls-files`; do echo side A >>$i; done && + git add -u && + echo leaf5 >node1/leaf5 && + git add node1/leaf5 && + test_tick && + git commit -m "A" && + + git checkout B && + git mv node1/ node2/ && + for i in `git ls-files`; do echo side B >>$i; done && + git add -u && + echo leaf6 >node2/leaf6 && + git add node2/leaf6 && + test_tick && + git commit -m "B" + ) +} + +test_expect_success '12c2: Moving one directory hierarchy into another w/ content merge' ' + test_setup_12c2 && + ( + cd 12c2 && + + git checkout A^0 && + + test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 && + + git ls-files -s >out && + test_line_count = 14 out && + git ls-files -u >out && + test_line_count = 12 out && + + git rev-parse >actual \ :1:node1/node2/node1/leaf1 \ :1:node1/node2/node1/leaf2 \ :1:node2/node1/node2/leaf3 \ @@ -4093,7 +4555,9 @@ test_expect_success '12c: Moving one directory hierarchy into another w/ content :3:node1/node2/node1/leaf1 \ :3:node1/node2/node1/leaf2 \ :3:node2/node1/node2/leaf3 \ - :3:node2/node1/node2/leaf4 && + :3:node2/node1/node2/leaf4 \ + :0:node2/node1/leaf5 \ + :0:node1/node2/leaf6 && git rev-parse >expect \ O:node1/leaf1 \ O:node1/leaf2 \ @@ -4106,7 +4570,9 @@ test_expect_success '12c: Moving one directory hierarchy into another w/ content B:node2/node1/leaf1 \ B:node2/node1/leaf2 \ B:node2/leaf3 \ - B:node2/leaf4 && + B:node2/leaf4 \ + A:node1/leaf5 \ + B:node2/leaf6 && test_cmp expect actual ) ' @@ -4227,6 +4693,512 @@ test_expect_success '12e: Rename/merge subdir into the root, variant 2' ' ) ' +# Testcase 12f, Rebase of patches with big directory rename +# Commit O: +# dir/subdir/{a,b,c,d,e_O,Makefile_TOP_O} +# dir/subdir/tweaked/{f,g,h,Makefile_SUB_O} +# dir/unchanged/<LOTS OF FILES> +# Commit A: +# (Remove f & g, move e into newsubdir, rename dir/->folder/, modify files) +# folder/subdir/{a,b,c,d,Makefile_TOP_A} +# folder/subdir/newsubdir/e_A +# folder/subdir/tweaked/{h,Makefile_SUB_A} +# folder/unchanged/<LOTS OF FILES> +# Commit B1: +# (add newfile.{c,py}, modify underscored files) +# dir/{a,b,c,d,e_B1,Makefile_TOP_B1,newfile.c} +# dir/tweaked/{f,g,h,Makefile_SUB_B1,newfile.py} +# dir/unchanged/<LOTS OF FILES> +# Commit B2: +# (Modify e further, add newfile.rs) +# dir/{a,b,c,d,e_B2,Makefile_TOP_B1,newfile.c,newfile.rs} +# dir/tweaked/{f,g,h,Makefile_SUB_B1,newfile.py} +# dir/unchanged/<LOTS OF FILES> +# Expected: +# B1-picked: +# folder/subdir/{a,b,c,d,Makefile_TOP_Merge1,newfile.c} +# folder/subdir/newsubdir/e_Merge1 +# folder/subdir/tweaked/{h,Makefile_SUB_Merge1,newfile.py} +# folder/unchanged/<LOTS OF FILES> +# B2-picked: +# folder/subdir/{a,b,c,d,Makefile_TOP_Merge1,newfile.c,newfile.rs} +# folder/subdir/newsubdir/e_Merge2 +# folder/subdir/tweaked/{h,Makefile_SUB_Merge1,newfile.py} +# folder/unchanged/<LOTS OF FILES> +# Things being checked here: +# 1. dir/subdir/newfile.c does not get pushed into folder/subdir/newsubdir/. +# dir/subdir/{a,b,c,d} -> folder/subdir/{a,b,c,d} looks like +# dir/ -> folder/, +# whereas dir/subdir/e -> folder/subdir/newsubdir/e looks like +# dir/subdir/ -> folder/subdir/newsubdir/ +# and if we note that newfile.c is found in dir/subdir/, we might overlook +# the dir/ -> folder/ rule that has more weight. Older git versions did +# this. +# 2. The code to do trivial directory resolves. Note that +# dir/subdir/unchanged/ is unchanged and can be deleted, and files in the +# new folder/subdir/unchanged/ are not needed as a target to any renames. +# Thus, in the second collect_merge_info_callback() we can just resolve +# these two directories trivially without recursing.) +# 3. Exercising the codepaths for caching renames and deletes from one cherry +# pick and re-applying them in the subsequent one. + +test_setup_12f () { + test_create_repo 12f && + ( + cd 12f && + + mkdir -p dir/unchanged && + mkdir -p dir/subdir/tweaked && + echo a >dir/subdir/a && + echo b >dir/subdir/b && + echo c >dir/subdir/c && + echo d >dir/subdir/d && + test_seq 1 10 >dir/subdir/e && + test_seq 10 20 >dir/subdir/Makefile && + echo f >dir/subdir/tweaked/f && + echo g >dir/subdir/tweaked/g && + echo h >dir/subdir/tweaked/h && + test_seq 20 30 >dir/subdir/tweaked/Makefile && + for i in `test_seq 1 88`; do + echo content $i >dir/unchanged/file_$i + done && + git add . && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git switch A && + git rm dir/subdir/tweaked/f dir/subdir/tweaked/g && + test_seq 2 10 >dir/subdir/e && + test_seq 11 20 >dir/subdir/Makefile && + test_seq 21 30 >dir/subdir/tweaked/Makefile && + mkdir dir/subdir/newsubdir && + git mv dir/subdir/e dir/subdir/newsubdir/ && + git mv dir folder && + git add . && + git commit -m "A" && + + git switch B && + mkdir dir/subdir/newsubdir/ && + echo c code >dir/subdir/newfile.c && + echo python code >dir/subdir/newsubdir/newfile.py && + test_seq 1 11 >dir/subdir/e && + test_seq 10 21 >dir/subdir/Makefile && + test_seq 20 31 >dir/subdir/tweaked/Makefile && + git add . && + git commit -m "B1" && + + echo rust code >dir/subdir/newfile.rs && + test_seq 1 12 >dir/subdir/e && + git add . && + git commit -m "B2" + ) +} + +test_expect_merge_algorithm failure failure '12f: Trivial directory resolve, caching, all kinds of fun' ' + test_setup_12f && + ( + cd 12f && + + git checkout A^0 && + git branch Bmod B && + + GIT_TRACE2_PERF="$(pwd)/trace.output" git -c merge.directoryRenames=true rebase A Bmod && + + echo Checking the pick of B1... && + + test_must_fail git rev-parse Bmod~1:dir && + + git ls-tree -r Bmod~1 >out && + test_line_count = 98 out && + + git diff --name-status A Bmod~1 >actual && + q_to_tab >expect <<-\EOF && + MQfolder/subdir/Makefile + AQfolder/subdir/newfile.c + MQfolder/subdir/newsubdir/e + AQfolder/subdir/newsubdir/newfile.py + MQfolder/subdir/tweaked/Makefile + EOF + test_cmp expect actual && + + # Three-way merged files + test_seq 2 11 >e_Merge1 && + test_seq 11 21 >Makefile_TOP && + test_seq 21 31 >Makefile_SUB && + git hash-object >expect \ + e_Merge1 \ + Makefile_TOP \ + Makefile_SUB && + git rev-parse >actual \ + Bmod~1:folder/subdir/newsubdir/e \ + Bmod~1:folder/subdir/Makefile \ + Bmod~1:folder/subdir/tweaked/Makefile && + test_cmp expect actual && + + # New files showed up at the right location with right contents + git rev-parse >expect \ + B~1:dir/subdir/newfile.c \ + B~1:dir/subdir/newsubdir/newfile.py && + git rev-parse >actual \ + Bmod~1:folder/subdir/newfile.c \ + Bmod~1:folder/subdir/newsubdir/newfile.py && + test_cmp expect actual && + + # Removed files + test_path_is_missing folder/subdir/tweaked/f && + test_path_is_missing folder/subdir/tweaked/g && + + # Unchanged files or directories + git rev-parse >actual \ + Bmod~1:folder/subdir/a \ + Bmod~1:folder/subdir/b \ + Bmod~1:folder/subdir/c \ + Bmod~1:folder/subdir/d \ + Bmod~1:folder/unchanged \ + Bmod~1:folder/subdir/tweaked/h && + git rev-parse >expect \ + O:dir/subdir/a \ + O:dir/subdir/b \ + O:dir/subdir/c \ + O:dir/subdir/d \ + O:dir/unchanged \ + O:dir/subdir/tweaked/h && + test_cmp expect actual && + + echo Checking the pick of B2... && + + test_must_fail git rev-parse Bmod:dir && + + git ls-tree -r Bmod >out && + test_line_count = 99 out && + + git diff --name-status Bmod~1 Bmod >actual && + q_to_tab >expect <<-\EOF && + AQfolder/subdir/newfile.rs + MQfolder/subdir/newsubdir/e + EOF + test_cmp expect actual && + + # Three-way merged file + test_seq 2 12 >e_Merge2 && + git hash-object e_Merge2 >expect && + git rev-parse Bmod:folder/subdir/newsubdir/e >actual && + test_cmp expect actual && + + grep region_enter.*collect_merge_info trace.output >collect && + test_line_count = 4 collect && + grep region_enter.*process_entries$ trace.output >process && + test_line_count = 2 process + ) +' + +# Testcase 12g, Testcase with two kinds of "relevant" renames +# Commit O: somefile_O, subdir/{a_O,b_O} +# Commit A: somefile_A, subdir/{a_O,b_O,c_A} +# Commit B: newfile_B, newdir/{a_B,b_B} +# Expected: newfile_{merged}, newdir/{a_B,b_B,c_A} + +test_setup_12g () { + test_create_repo 12g && + ( + cd 12g && + + mkdir -p subdir && + test_write_lines upon a time there was a >somefile && + test_write_lines 1 2 3 4 5 6 7 8 9 10 >subdir/a && + test_write_lines one two three four five six >subdir/b && + git add . && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git switch A && + test_write_lines once upon a time there was a >somefile && + > subdir/c && + git add somefile subdir/c && + test_tick && + git commit -m "A" && + + git checkout B && + git mv somefile newfile && + git mv subdir newdir && + echo repo >>newfile && + test_write_lines 1 2 3 4 5 6 7 8 9 10 11 >newdir/a && + test_write_lines one two three four five six seven >newdir/b && + git add newfile newdir && + test_tick && + git commit -m "B" + ) +} + +test_expect_success '12g: Testcase with two kinds of "relevant" renames' ' + test_setup_12g && + ( + cd 12g && + + git checkout A^0 && + + git -c merge.directoryRenames=true merge -s recursive B^0 && + + test_write_lines once upon a time there was a repo >expect && + test_cmp expect newfile && + + git ls-files -s >out && + test_line_count = 4 out && + + git rev-parse >actual \ + HEAD:newdir/a HEAD:newdir/b HEAD:newdir/c && + git rev-parse >expect \ + B:newdir/a B:newdir/b A:subdir/c && + test_cmp expect actual && + + test_must_fail git rev-parse HEAD:subdir/a && + test_must_fail git rev-parse HEAD:subdir/b && + test_must_fail git rev-parse HEAD:subdir/c && + test_path_is_missing subdir/ && + test_path_is_file newdir/c + ) +' + +# Testcase 12h, Testcase with two kinds of "relevant" renames +# Commit O: olddir/{a_1, b} +# Commit A: newdir/{a_2, b} +# Commit B: olddir/{alpha_1, b} +# Expected: newdir/{alpha_2, b} + +test_setup_12h () { + test_create_repo 12h && + ( + cd 12h && + + mkdir olddir && + test_seq 3 8 >olddir/a && + >olddir/b && + git add olddir && + git commit -m orig && + + git branch O && + git branch A && + git branch B && + + git switch A && + test_seq 3 10 >olddir/a && + git add olddir/a && + git mv olddir newdir && + git commit -m A && + + git switch B && + + git mv olddir/a olddir/alpha && + git commit -m B + ) +} + +test_expect_failure '12h: renaming a file within a renamed directory' ' + test_setup_12h && + ( + cd 12h && + + git checkout A^0 && + + test_might_fail git -c merge.directoryRenames=true merge -s recursive B^0 && + + git ls-files >tracked && + test_line_count = 2 tracked && + + test_path_is_missing olddir/a && + test_path_is_file newdir/alpha && + test_path_is_file newdir/b && + + git rev-parse >actual \ + HEAD:newdir/alpha HEAD:newdir/b && + git rev-parse >expect \ + A:newdir/a O:oldir/b && + test_cmp expect actual + ) +' + +# Testcase 12i, Directory rename causes rename-to-self +# Commit O: source/{subdir/foo, bar, baz_1} +# Commit A: source/{foo, bar, baz_1} +# Commit B: source/{subdir/{foo, bar}, baz_2} +# Expected: source/{foo, bar, baz_2}, with conflicts on +# source/bar vs. source/subdir/bar + +test_setup_12i () { + test_create_repo 12i && + ( + cd 12i && + + mkdir -p source/subdir && + echo foo >source/subdir/foo && + echo bar >source/bar && + echo baz >source/baz && + git add source && + git commit -m orig && + + git branch O && + git branch A && + git branch B && + + git switch A && + git mv source/subdir/foo source/foo && + git commit -m A && + + git switch B && + git mv source/bar source/subdir/bar && + echo more baz >>source/baz && + git commit -m B + ) +} + +test_expect_success '12i: Directory rename causes rename-to-self' ' + test_setup_12i && + ( + cd 12i && + + git checkout A^0 && + + test_must_fail git -c merge.directoryRenames=conflict merge -s recursive B^0 && + + test_path_is_missing source/subdir && + test_path_is_file source/bar && + test_path_is_file source/baz && + + git ls-files | uniq >tracked && + test_line_count = 3 tracked && + + git status --porcelain -uno >actual && + cat >expect <<-\EOF && + UU source/bar + M source/baz + EOF + test_cmp expect actual + ) +' + +# Testcase 12j, Directory rename to root causes rename-to-self +# Commit O: {subdir/foo, bar, baz_1} +# Commit A: {foo, bar, baz_1} +# Commit B: {subdir/{foo, bar}, baz_2} +# Expected: {foo, bar, baz_2}, with conflicts on bar vs. subdir/bar + +test_setup_12j () { + test_create_repo 12j && + ( + cd 12j && + + mkdir -p subdir && + echo foo >subdir/foo && + echo bar >bar && + echo baz >baz && + git add . && + git commit -m orig && + + git branch O && + git branch A && + git branch B && + + git switch A && + git mv subdir/foo foo && + git commit -m A && + + git switch B && + git mv bar subdir/bar && + echo more baz >>baz && + git commit -m B + ) +} + +test_expect_success '12j: Directory rename to root causes rename-to-self' ' + test_setup_12j && + ( + cd 12j && + + git checkout A^0 && + + test_must_fail git -c merge.directoryRenames=conflict merge -s recursive B^0 && + + test_path_is_missing subdir && + test_path_is_file bar && + test_path_is_file baz && + + git ls-files | uniq >tracked && + test_line_count = 3 tracked && + + git status --porcelain -uno >actual && + cat >expect <<-\EOF && + UU bar + M baz + EOF + test_cmp expect actual + ) +' + +# Testcase 12k, Directory rename with sibling causes rename-to-self +# Commit O: dirB/foo, dirA/{bar, baz_1} +# Commit A: dirA/{foo, bar, baz_1} +# Commit B: dirB/{foo, bar}, dirA/baz_2 +# Expected: dirA/{foo, bar, baz_2}, with conflicts on dirA/bar vs. dirB/bar + +test_setup_12k () { + test_create_repo 12k && + ( + cd 12k && + + mkdir dirA dirB && + echo foo >dirB/foo && + echo bar >dirA/bar && + echo baz >dirA/baz && + git add . && + git commit -m orig && + + git branch O && + git branch A && + git branch B && + + git switch A && + git mv dirB/* dirA/ && + git commit -m A && + + git switch B && + git mv dirA/bar dirB/bar && + echo more baz >>dirA/baz && + git commit -m B + ) +} + +test_expect_success '12k: Directory rename with sibling causes rename-to-self' ' + test_setup_12k && + ( + cd 12k && + + git checkout A^0 && + + test_must_fail git -c merge.directoryRenames=conflict merge -s recursive B^0 && + + test_path_is_missing dirB && + test_path_is_file dirA/bar && + test_path_is_file dirA/baz && + + git ls-files | uniq >tracked && + test_line_count = 3 tracked && + + git status --porcelain -uno >actual && + cat >expect <<-\EOF && + UU dirA/bar + M dirA/baz + EOF + test_cmp expect actual + ) +' + ########################################################################### # SECTION 13: Checking informational and conflict messages # diff --git a/t/t6425-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh index f79d021590..459b431a60 100755 --- a/t/t6425-merge-rename-delete.sh +++ b/t/t6425-merge-rename-delete.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='Merge-recursive rename/delete conflict message' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'rename/delete' ' @@ -12,7 +15,7 @@ test_expect_success 'rename/delete' ' git mv A B && git commit -m "rename" && - git checkout master && + git checkout main && git rm A && git commit -m "delete" && diff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh index 699813671c..7b5f1c1dcd 100755 --- a/t/t6426-merge-skip-unneeded-updates.sh +++ b/t/t6426-merge-skip-unneeded-updates.sh @@ -23,6 +23,7 @@ test_description="merge cases" # files that might be renamed into each other's paths.) . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh ########################################################################### @@ -491,7 +492,9 @@ test_expect_success '3a-L: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' test_cmp expect actual && test_must_fail git rev-parse HEAD:bq HEAD:foo/bq && - test_path_is_missing bq foo/bq foo/whatever + test_path_is_missing bq && + test_path_is_missing foo/bq && + test_path_is_missing foo/whatever ) ' @@ -521,7 +524,9 @@ test_expect_success '3a-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' test_cmp expect actual && test_must_fail git rev-parse HEAD:bq HEAD:foo/bq && - test_path_is_missing bq foo/bq foo/whatever + test_path_is_missing bq && + test_path_is_missing foo/bq && + test_path_is_missing foo/whatever ) ' @@ -587,7 +592,9 @@ test_expect_success '3b-L: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' test_cmp expect actual && test_must_fail git rev-parse HEAD:bq HEAD:foo/bq && - test_path_is_missing bq foo/bq foo/whatever + test_path_is_missing bq && + test_path_is_missing foo/bq && + test_path_is_missing foo/whatever ) ' @@ -617,7 +624,9 @@ test_expect_success '3b-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' test_cmp expect actual && test_must_fail git rev-parse HEAD:bq HEAD:foo/bq && - test_path_is_missing bq foo/bq foo/whatever + test_path_is_missing bq && + test_path_is_missing foo/bq && + test_path_is_missing foo/whatever ) ' @@ -666,7 +675,7 @@ test_setup_4a () { # correct requires doing the merge in-memory first, then realizing that no # updates to the file are necessary, and thus that we can just leave the path # alone. -test_expect_failure '4a: Change on A, change on B subset of A, dirty mods present' ' +test_expect_merge_algorithm failure success '4a: Change on A, change on B subset of A, dirty mods present' ' test_setup_4a && ( cd 4a && diff --git a/t/t6427-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh index f4655bb358..25c4b720e7 100755 --- a/t/t6427-diff3-conflict-markers.sh +++ b/t/t6427-diff3-conflict-markers.sh @@ -2,6 +2,9 @@ test_description='recursive merge diff3 style conflict markers' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Setup: @@ -43,7 +46,7 @@ test_expect_success 'check no merge base' ' # Setup: # L1 # / \ -# master ? +# main ? # \ / # R1 # @@ -90,18 +93,18 @@ test_expect_success 'check unique merge base' ' cd unique_merge_base && git checkout L^0 && - MASTER=$(git rev-parse --short master) && + MAIN=$(git rev-parse --short main) && test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 && - grep "|||||| $MASTER:content" renamed + grep "|||||| $MAIN:content" renamed ) ' # Setup: # L1---L2--L3 # / \ / \ -# master X1 ? +# main X1 ? # \ / \ / # R1---R2--R3 # @@ -191,10 +194,10 @@ test_expect_success 'rebase --merge describes parent of commit being picked' ' ( cd rebase && test_commit base file && - test_commit master file && + test_commit main file && git checkout -b side HEAD^ && test_commit side file && - test_must_fail git -c merge.conflictstyle=diff3 rebase --merge master && + test_must_fail git -c merge.conflictstyle=diff3 rebase --merge main && grep "||||||| parent of" file ) ' @@ -203,7 +206,7 @@ test_expect_success 'rebase --apply describes fake ancestor base' ' ( cd rebase && git rebase --abort && - test_must_fail git -c merge.conflictstyle=diff3 rebase --apply master && + test_must_fail git -c merge.conflictstyle=diff3 rebase --apply main && grep "||||||| constructed merge base" file ) ' diff --git a/t/t6428-merge-conflicts-sparse.sh b/t/t6428-merge-conflicts-sparse.sh new file mode 100755 index 0000000000..7e8bf497f8 --- /dev/null +++ b/t/t6428-merge-conflicts-sparse.sh @@ -0,0 +1,158 @@ +#!/bin/sh + +test_description="merge cases" + +# The setup for all of them, pictorially, is: +# +# A +# o +# / \ +# O o ? +# \ / +# o +# B +# +# To help make it easier to follow the flow of tests, they have been +# divided into sections and each test will start with a quick explanation +# of what commits O, A, and B contain. +# +# Notation: +# z/{b,c} means files z/b and z/c both exist +# x/d_1 means file x/d exists with content d1. (Purpose of the +# underscore notation is to differentiate different +# files that might be renamed into each other's paths.) + +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh + + +# Testcase basic, conflicting changes in 'numerals' + +test_setup_numerals () { + test_create_repo numerals_$1 && + ( + cd numerals_$1 && + + >README && + test_write_lines I II III >numerals && + git add README numerals && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git checkout A && + test_write_lines I II III IIII >numerals && + git add numerals && + test_tick && + git commit -m "A" && + + git checkout B && + test_write_lines I II III IV >numerals && + git add numerals && + test_tick && + git commit -m "B" && + + cat <<-EOF >expected-index && + H README + M numerals + M numerals + M numerals + EOF + + cat <<-EOF >expected-merge + I + II + III + <<<<<<< HEAD + IIII + ======= + IV + >>>>>>> B^0 + EOF + + ) +} + +test_expect_success 'conflicting entries written to worktree even if sparse' ' + test_setup_numerals plain && + ( + cd numerals_plain && + + git checkout A^0 && + + test_path_is_file README && + test_path_is_file numerals && + + git sparse-checkout init && + git sparse-checkout set README && + + test_path_is_file README && + test_path_is_missing numerals && + + test_must_fail git merge -s recursive B^0 && + + git ls-files -t >index_files && + test_cmp expected-index index_files && + + test_path_is_file README && + test_path_is_file numerals && + + test_cmp expected-merge numerals && + + # 4 other files: + # * expected-merge + # * expected-index + # * index_files + # * others + git ls-files -o >others && + test_line_count = 4 others + ) +' + +test_expect_merge_algorithm failure success 'present-despite-SKIP_WORKTREE handled reasonably' ' + test_setup_numerals in_the_way && + ( + cd numerals_in_the_way && + + git checkout A^0 && + + test_path_is_file README && + test_path_is_file numerals && + + git sparse-checkout init && + git sparse-checkout set README && + + test_path_is_file README && + test_path_is_missing numerals && + + echo foobar >numerals && + + test_must_fail git merge -s recursive B^0 && + + git ls-files -t >index_files && + test_cmp expected-index index_files && + + test_path_is_file README && + test_path_is_file numerals && + + test_cmp expected-merge numerals && + + # There should still be a file with "foobar" in it + grep foobar * && + + # 5 other files: + # * expected-merge + # * expected-index + # * index_files + # * others + # * whatever name was given to the numerals file that had + # "foobar" in it + git ls-files -o >others && + test_line_count = 5 others + ) +' + +test_done diff --git a/t/t6429-merge-sequence-rename-caching.sh b/t/t6429-merge-sequence-rename-caching.sh new file mode 100755 index 0000000000..035edc40b1 --- /dev/null +++ b/t/t6429-merge-sequence-rename-caching.sh @@ -0,0 +1,700 @@ +#!/bin/sh + +test_description="remember regular & dir renames in sequence of merges" + +. ./test-lib.sh + +# +# NOTE 1: this testfile tends to not only rename files, but modify on both +# sides; without modifying on both sides, optimizations can kick in +# which make rename detection irrelevant or trivial. We want to make +# sure that we are triggering rename caching rather than rename +# bypassing. +# +# NOTE 2: this testfile uses 'test-tool fast-rebase' instead of either +# cherry-pick or rebase. sequencer.c is only superficially +# integrated with merge-ort; it calls merge_switch_to_result() +# after EACH merge, which updates the index and working copy AND +# throws away the cached results (because merge_switch_to_result() +# is only supposed to be called at the end of the sequence). +# Integrating them more deeply is a big task, so for now the tests +# use 'test-tool fast-rebase'. +# + + +# +# In the following simple testcase: +# Base: numbers_1, values_1 +# Upstream: numbers_2, values_2 +# Topic_1: sequence_3 +# Topic_2: scruples_3 +# or, in english, rename numbers -> sequence in the first commit, and rename +# values -> scruples in the second commit. +# +# This shouldn't be a challenge, it's just verifying that cached renames isn't +# preventing us from finding new renames. +# +test_expect_success 'caching renames does not preclude finding new ones' ' + test_create_repo caching-renames-and-new-renames && + ( + cd caching-renames-and-new-renames && + + test_seq 2 10 >numbers && + test_seq 2 10 >values && + git add numbers values && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 1 10 >numbers && + test_seq 1 10 >values && + git add numbers values && + git commit -m "Tweaked both files" && + + git switch topic && + + test_seq 2 12 >numbers && + git add numbers && + git mv numbers sequence && + git commit -m A && + + test_seq 2 12 >values && + git add values && + git mv values scruples && + git commit -m B && + + # + # Actual testing + # + + git switch upstream && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream~1..topic + + git ls-files >tracked-files && + test_line_count = 2 tracked-files && + test_seq 1 12 >expect && + test_cmp expect sequence && + test_cmp expect scruples + ) +' + +# +# In the following testcase: +# Base: numbers_1 +# Upstream: rename numbers_1 -> sequence_2 +# Topic_1: numbers_3 +# Topic_2: numbers_1 +# or, in english, the first commit on the topic branch modifies numbers by +# shrinking it (dramatically) and the second commit on topic reverts its +# parent. +# +# Can git apply both patches? +# +# Traditional cherry-pick/rebase will fail to apply the second commit, the +# one that reverted its parent, because despite detecting the rename from +# 'numbers' to 'sequence' for the first commit, it fails to detect that +# rename when picking the second commit. That's "reasonable" given the +# dramatic change in size of the file, but remembering the rename and +# reusing it is reasonable too. +# +# We do test here that we expect rename detection to only be run once total +# (the topic side of history doesn't need renames, and with caching we +# should be able to only run rename detection on the upstream side one +# time.) +test_expect_success 'cherry-pick both a commit and its immediate revert' ' + test_create_repo pick-commit-and-its-immediate-revert && + ( + cd pick-commit-and-its-immediate-revert && + + test_seq 11 30 >numbers && + git add numbers && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 1 30 >numbers && + git add numbers && + git mv numbers sequence && + git commit -m "Renamed (and modified) numbers -> sequence" && + + git switch topic && + + test_seq 11 13 >numbers && + git add numbers && + git commit -m A && + + git revert HEAD && + + # + # Actual testing + # + + git switch upstream && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream~1..topic && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 1 calls + ) +' + +# +# In the following testcase: +# Base: sequence_1 +# Upstream: rename sequence_1 -> values_2 +# Topic_1: rename sequence_1 -> values_3 +# Topic_2: add unrelated sequence_4 +# or, in english, both sides rename sequence -> values, and then the second +# commit on the topic branch adds an unrelated file called sequence. +# +# This testcase presents no problems for git traditionally, but having both +# sides do the same rename in effect "uses it up" and if it remains cached, +# could cause a spurious rename/add conflict. +# +test_expect_success 'rename same file identically, then reintroduce it' ' + test_create_repo rename-rename-1to1-then-add-old-filename && + ( + cd rename-rename-1to1-then-add-old-filename && + + test_seq 3 8 >sequence && + git add sequence && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 1 8 >sequence && + git add sequence && + git mv sequence values && + git commit -m "Renamed (and modified) sequence -> values" && + + git switch topic && + + test_seq 3 10 >sequence && + git add sequence && + git mv sequence values && + git commit -m A && + + test_write_lines A B C D E F G H I J >sequence && + git add sequence && + git commit -m B && + + # + # Actual testing + # + + git switch upstream && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream~1..topic && + + git ls-files >tracked && + test_line_count = 2 tracked && + test_path_is_file values && + test_path_is_file sequence && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 2 calls + ) +' + +# +# In the following testcase: +# Base: olddir/{valuesZ_1, valuesY_1, valuesX_1} +# Upstream: rename olddir/valuesZ_1 -> dirA/valuesZ_2 +# rename olddir/valuesY_1 -> dirA/valuesY_2 +# rename olddir/valuesX_1 -> dirB/valuesX_2 +# Topic_1: rename olddir/valuesZ_1 -> dirA/valuesZ_3 +# rename olddir/valuesY_1 -> dirA/valuesY_3 +# Topic_2: add olddir/newfile +# Expected Pick1: dirA/{valuesZ, valuesY}, dirB/valuesX +# Expected Pick2: dirA/{valuesZ, valuesY}, dirB/{valuesX, newfile} +# +# This testcase presents no problems for git traditionally, but having both +# sides do the same renames in effect "use it up" but if the renames remain +# cached, the directory rename could put newfile in the wrong directory. +# +test_expect_success 'rename same file identically, then add file to old dir' ' + test_create_repo rename-rename-1to1-then-add-file-to-old-dir && + ( + cd rename-rename-1to1-then-add-file-to-old-dir && + + mkdir olddir/ && + test_seq 3 8 >olddir/valuesZ && + test_seq 3 8 >olddir/valuesY && + test_seq 3 8 >olddir/valuesX && + git add olddir && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 1 8 >olddir/valuesZ && + test_seq 1 8 >olddir/valuesY && + test_seq 1 8 >olddir/valuesX && + git add olddir && + mkdir dirA && + git mv olddir/valuesZ olddir/valuesY dirA && + git mv olddir/ dirB/ && + git commit -m "Renamed (and modified) values*" && + + git switch topic && + + test_seq 3 10 >olddir/valuesZ && + test_seq 3 10 >olddir/valuesY && + git add olddir && + mkdir dirA && + git mv olddir/valuesZ olddir/valuesY dirA && + git commit -m A && + + >olddir/newfile && + git add olddir/newfile && + git commit -m B && + + # + # Actual testing + # + + git switch upstream && + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream~1..topic && + + git ls-files >tracked && + test_line_count = 4 tracked && + test_path_is_file dirA/valuesZ && + test_path_is_file dirA/valuesY && + test_path_is_file dirB/valuesX && + test_path_is_file dirB/newfile && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 3 calls + ) +' + +# +# In the following testcase, upstream renames a directory, and the topic branch +# first adds a file to the directory, then later renames the directory +# differently: +# Base: olddir/a +# olddir/b +# Upstream: rename olddir/ -> newdir/ +# Topic_1: add olddir/newfile +# Topic_2: rename olddir/ -> otherdir/ +# +# Here we are just concerned that cached renames might prevent us from seeing +# the rename conflict, and we want to ensure that we do get a conflict. +# +# While at it, though, we do test that we only try to detect renames 2 +# times and not three. (The first merge needs to detect renames on the +# upstream side. Traditionally, the second merge would need to detect +# renames on both sides of history, but our caching of upstream renames +# should avoid the need to re-detect upstream renames.) +# +test_expect_success 'cached dir rename does not prevent noticing later conflict' ' + test_create_repo dir-rename-cache-not-occluding-later-conflict && + ( + cd dir-rename-cache-not-occluding-later-conflict && + + mkdir olddir && + test_seq 3 10 >olddir/a && + test_seq 3 10 >olddir/b && + git add olddir && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 3 10 >olddir/a && + test_seq 3 10 >olddir/b && + git add olddir && + git mv olddir newdir && + git commit -m "Dir renamed" && + + git switch topic && + + >olddir/newfile && + git add olddir/newfile && + git commit -m A && + + test_seq 1 8 >olddir/a && + test_seq 1 8 >olddir/b && + git add olddir && + git mv olddir otherdir && + git commit -m B && + + # + # Actual testing + # + + git switch upstream && + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test_must_fail test-tool fast-rebase --onto HEAD upstream~1 topic >output && + #git cherry-pick upstream..topic && + + grep CONFLICT..rename/rename output && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 2 calls + ) +' + +# Helper for the next two tests +test_setup_upstream_rename () { + test_create_repo $1 && + ( + cd $1 && + + test_seq 3 8 >somefile && + test_seq 3 8 >relevant-rename && + git add somefile relevant-rename && + mkdir olddir && + test_write_lines a b c d e f g >olddir/a && + test_write_lines z y x w v u t >olddir/b && + git add olddir && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch upstream && + test_seq 1 8 >somefile && + test_seq 1 8 >relevant-rename && + git add somefile relevant-rename && + git mv relevant-rename renamed && + echo h >>olddir/a && + echo s >>olddir/b && + git add olddir && + git mv olddir newdir && + git commit -m "Dir renamed" + ) +} + +# +# In the following testcase, upstream renames a file in the toplevel directory +# as well as its only directory: +# Base: relevant-rename_1 +# somefile +# olddir/a +# olddir/b +# Upstream: rename relevant-rename_1 -> renamed_2 +# rename olddir/ -> newdir/ +# Topic_1: relevant-rename_3 +# Topic_2: olddir/newfile_1 +# Topic_3: olddir/newfile_2 +# +# In this testcase, since the first commit being picked only modifies a +# file in the toplevel directory, the directory rename is irrelevant for +# that first merge. However, we need to notice the directory rename for +# the merge that picks the second commit, and we don't want the third +# commit to mess up its location either. We want to make sure that +# olddir/newfile doesn't exist in the result and that newdir/newfile does. +# +# We also test that we only do rename detection twice. We never need +# rename detection on the topic side of history, but we do need it twice on +# the upstream side of history. For the first topic commit, we only need +# the +# relevant-rename -> renamed +# rename, because olddir is unmodified by Topic_1. For Topic_2, however, +# the new file being added to olddir means files that were previously +# irrelevant for rename detection are now relevant, forcing us to repeat +# rename detection for the paths we don't already have cached. Topic_3 also +# tweaks olddir/newfile, but the renames in olddir/ will have been cached +# from the second rename detection run. +# +test_expect_success 'dir rename unneeded, then add new file to old dir' ' + test_setup_upstream_rename dir-rename-unneeded-until-new-file && + ( + cd dir-rename-unneeded-until-new-file && + + git switch topic && + + test_seq 3 10 >relevant-rename && + git add relevant-rename && + git commit -m A && + + echo foo >olddir/newfile && + git add olddir/newfile && + git commit -m B && + + echo bar >>olddir/newfile && + git add olddir/newfile && + git commit -m C && + + # + # Actual testing + # + + git switch upstream && + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream..topic && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 2 calls && + + git ls-files >tracked && + test_line_count = 5 tracked && + test_path_is_missing olddir/newfile && + test_path_is_file newdir/newfile + ) +' + +# +# The following testcase is *very* similar to the last one, but instead of +# adding a new olddir/newfile, it renames somefile -> olddir/newfile: +# Base: relevant-rename_1 +# somefile_1 +# olddir/a +# olddir/b +# Upstream: rename relevant-rename_1 -> renamed_2 +# rename olddir/ -> newdir/ +# Topic_1: relevant-rename_3 +# Topic_2: rename somefile -> olddir/newfile_2 +# Topic_3: modify olddir/newfile_3 +# +# In this testcase, since the first commit being picked only modifies a +# file in the toplevel directory, the directory rename is irrelevant for +# that first merge. However, we need to notice the directory rename for +# the merge that picks the second commit, and we don't want the third +# commit to mess up its location either. We want to make sure that +# neither somefile or olddir/newfile exists in the result and that +# newdir/newfile does. +# +# This testcase needs one more call to rename detection than the last +# testcase, because of the somefile -> olddir/newfile rename in Topic_2. +test_expect_success 'dir rename unneeded, then rename existing file into old dir' ' + test_setup_upstream_rename dir-rename-unneeded-until-file-moved-inside && + ( + cd dir-rename-unneeded-until-file-moved-inside && + + git switch topic && + + test_seq 3 10 >relevant-rename && + git add relevant-rename && + git commit -m A && + + test_seq 1 10 >somefile && + git add somefile && + git mv somefile olddir/newfile && + git commit -m B && + + test_seq 1 12 >olddir/newfile && + git add olddir/newfile && + git commit -m C && + + # + # Actual testing + # + + git switch upstream && + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream..topic && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 3 calls && + + test_path_is_missing somefile && + test_path_is_missing olddir/newfile && + test_path_is_file newdir/newfile && + git ls-files >tracked && + test_line_count = 4 tracked + ) +' + +# Helper for the next two tests +test_setup_topic_rename () { + test_create_repo $1 && + ( + cd $1 && + + test_seq 3 8 >somefile && + mkdir olddir && + test_seq 3 8 >olddir/a && + echo b >olddir/b && + git add olddir somefile && + git commit -m orig && + + git branch upstream && + git branch topic && + + git switch topic && + test_seq 1 8 >somefile && + test_seq 1 8 >olddir/a && + git add somefile olddir/a && + git mv olddir newdir && + git commit -m "Dir renamed" && + + test_seq 1 10 >somefile && + git add somefile && + mkdir olddir && + >olddir/unrelated-file && + git add olddir && + git commit -m "Unrelated file in recreated old dir" + ) +} + +# +# In the following testcase, the first commit on the topic branch renames +# a directory, while the second recreates the old directory and places a +# file into it: +# Base: somefile +# olddir/a +# olddir/b +# Upstream: olddir/newfile +# Topic_1: somefile_2 +# rename olddir/ -> newdir/ +# Topic_2: olddir/unrelated-file +# +# Note that the first pick should merge: +# Base: somefile +# olddir/{a,b} +# Upstream: olddir/newfile +# Topic_1: rename olddir/ -> newdir/ +# For which the expected result (assuming merge.directoryRenames=true) is +# clearly: +# Result: somefile +# newdir/{a, b, newfile} +# +# While the second pick does the following three-way merge: +# Base (Topic_1): somefile +# newdir/{a,b} +# Upstream (Result from 1): same files as base, but adds newdir/newfile +# Topic_2: same files as base, but adds olddir/unrelated-file +# +# The second merge is pretty trivial; upstream adds newdir/newfile, and +# topic_2 adds olddir/unrelated-file. We're just testing that we don't +# accidentally cache directory renames somehow and rename +# olddir/unrelated-file to newdir/unrelated-file. +# +# This testcase should only need one call to diffcore_rename_extended(). +test_expect_success 'caching renames only on upstream side, part 1' ' + test_setup_topic_rename cache-renames-only-upstream-add-file && + ( + cd cache-renames-only-upstream-add-file && + + git switch upstream && + + >olddir/newfile && + git add olddir/newfile && + git commit -m "Add newfile" && + + # + # Actual testing + # + + git switch upstream && + + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream..topic && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 1 calls && + + git ls-files >tracked && + test_line_count = 5 tracked && + test_path_is_missing newdir/unrelated-file && + test_path_is_file olddir/unrelated-file && + test_path_is_file newdir/newfile && + test_path_is_file newdir/b && + test_path_is_file newdir/a && + test_path_is_file somefile + ) +' + +# +# The following testcase is *very* similar to the last one, but instead of +# adding a new olddir/newfile, it renames somefile -> olddir/newfile: +# Base: somefile +# olddir/a +# olddir/b +# Upstream: somefile_1 -> olddir/newfile +# Topic_1: rename olddir/ -> newdir/ +# somefile_2 +# Topic_2: olddir/unrelated-file +# somefile_3 +# +# Much like the previous test, this case is actually trivial and we are just +# making sure there isn't some spurious directory rename caching going on +# for the wrong side of history. +# +# +# This testcase should only need two calls to diffcore_rename_extended(), +# both for the first merge, one for each side of history. +# +test_expect_success 'caching renames only on upstream side, part 2' ' + test_setup_topic_rename cache-renames-only-upstream-rename-file && + ( + cd cache-renames-only-upstream-rename-file && + + git switch upstream && + + git mv somefile olddir/newfile && + git commit -m "Add newfile" && + + # + # Actual testing + # + + git switch upstream && + + git config merge.directoryRenames true && + + GIT_TRACE2_PERF="$(pwd)/trace.output" && + export GIT_TRACE2_PERF && + + test-tool fast-rebase --onto HEAD upstream~1 topic && + #git cherry-pick upstream..topic && + + grep region_enter.*diffcore_rename trace.output >calls && + test_line_count = 2 calls && + + git ls-files >tracked && + test_line_count = 4 tracked && + test_path_is_missing newdir/unrelated-file && + test_path_is_file olddir/unrelated-file && + test_path_is_file newdir/newfile && + test_path_is_file newdir/b && + test_path_is_file newdir/a + ) +' + +test_done diff --git a/t/t6430-merge-recursive.sh b/t/t6430-merge-recursive.sh index d48d211a95..ffcc01fe65 100755 --- a/t/t6430-merge-recursive.sh +++ b/t/t6430-merge-recursive.sh @@ -2,7 +2,11 @@ test_description='merge-recursive backend test' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh test_expect_success 'setup 1' ' @@ -34,7 +38,7 @@ test_expect_success 'setup 1' ' git add a d/e && test_tick && - git commit -m "master modifies a and d/e" && + git commit -m "main modifies a and d/e" && c1=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD && git ls-files -s ) >actual && ( @@ -465,7 +469,7 @@ test_expect_success SYMLINKS 'dir in working tree with symlink ancestor does not git checkout -b branch1 && git commit --allow-empty -m "empty commit" && - git checkout master && + git checkout main && git rm foo && mkdir foo && >foo/bar && @@ -474,7 +478,7 @@ test_expect_success SYMLINKS 'dir in working tree with symlink ancestor does not git checkout branch1 && - git cherry-pick master && + git cherry-pick main && test_path_is_dir foo && test_path_is_file foo/bar ) @@ -489,8 +493,8 @@ test_expect_success 'reset and 3-way merge' ' test_expect_success 'reset and bind merge' ' - git reset --hard master && - git read-tree --prefix=M/ master && + git reset --hard main && + git read-tree --prefix=M/ main && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" && @@ -504,7 +508,7 @@ test_expect_success 'reset and bind merge' ' ) >expected && test_cmp expected actual && - git read-tree --prefix=a1/ master && + git read-tree --prefix=a1/ main && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" && @@ -522,7 +526,7 @@ test_expect_success 'reset and bind merge' ' ) >expected && test_cmp expected actual && - git read-tree --prefix=z/ master && + git read-tree --prefix=z/ main && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" && @@ -598,11 +602,11 @@ test_expect_success 'merge-recursive w/ empty work tree - theirs has rename' ' test_expect_success 'merge removes empty directories' ' - git reset --hard master && + git reset --hard main && git checkout -b rm && git rm d/e && git commit -mremoved-d/e && - git checkout master && + git checkout main && git merge -s recursive rm && test_path_is_missing d ' @@ -641,7 +645,7 @@ test_expect_success 'merge-recursive copy vs. rename' ' test_cmp expected actual ' -test_expect_failure 'merge-recursive rename vs. rename/symlink' ' +test_expect_merge_algorithm failure success 'merge-recursive rename vs. rename/symlink' ' git checkout -f rename && git merge rename-ln && @@ -663,7 +667,7 @@ test_expect_failure 'merge-recursive rename vs. rename/symlink' ' test_expect_success 'merging with triple rename across D/F conflict' ' git reset --hard HEAD && - git checkout -b main && + git checkout -b topic && git rm -rf . && echo "just a file" >sub1 && @@ -682,7 +686,7 @@ test_expect_success 'merging with triple rename across D/F conflict' ' test_tick && git commit -a -m changesimplefile && - git checkout main && + git checkout topic && git rm sub1 && git mv sub2 sub1 && test_tick && diff --git a/t/t6432-merge-recursive-space-options.sh b/t/t6432-merge-recursive-space-options.sh index b56180ee4a..db4b77e63d 100755 --- a/t/t6432-merge-recursive-space-options.sh +++ b/t/t6432-merge-recursive-space-options.sh @@ -2,15 +2,18 @@ test_description='merge-recursive space options -* [master] Clarify +* [main] Clarify ! [remote] Remove cruft -- + [remote] Remove cruft -* [master] Clarify +* [main] Clarify *+ [remote^] Initial revision * ok 1: setup ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b @@ -87,7 +90,7 @@ test_expect_success 'setup' ' mv text.txt+ text.txt && git commit -a -m "Remove cruft" && - git checkout master && + git checkout main && sed -e " s/\(not in his right mind\),\(.*\)/\1;\2Q/ s/Quite correct\(.*\)/It is too correct\1Q/ diff --git a/t/t6433-merge-toplevel.sh b/t/t6433-merge-toplevel.sh index e29c284b9b..b16031465f 100755 --- a/t/t6433-merge-toplevel.sh +++ b/t/t6433-merge-toplevel.sh @@ -2,10 +2,13 @@ test_description='"git merge" top-level frontend' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh t3033_reset () { - git checkout -B master two && + git checkout -B main two && git branch -f left three && git branch -f right four } @@ -21,7 +24,7 @@ test_expect_success setup ' test_commit four && git checkout --orphan newroot && test_commit five && - git checkout master + git checkout main ' # Local branches @@ -61,7 +64,7 @@ test_expect_success 'merge octopus, non-fast-forward (ff)' ' test_expect_success 'merge octopus, fast-forward (does not ff)' ' t3033_reset && git merge left right && - # two (master) is not an ancestor of three (left) and four (right) + # two (main) is not an ancestor of three (left) and four (right) test_must_fail git rev-parse --verify HEAD^4 && git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && git rev-parse two three four | sort >expect && @@ -118,7 +121,7 @@ test_expect_success 'merge FETCH_HEAD octopus fast-forward (does not ff)' ' t3033_reset && git fetch . left right && git merge FETCH_HEAD && - # two (master) is not an ancestor of three (left) and four (right) + # two (main) is not an ancestor of three (left) and four (right) test_must_fail git rev-parse --verify HEAD^4 && git rev-parse HEAD^1 HEAD^2 HEAD^3 | sort >actual && git rev-parse two three four | sort >expect && diff --git a/t/t6434-merge-recursive-rename-options.sh b/t/t6434-merge-recursive-rename-options.sh index 3d9fae68c4..a11707835b 100755 --- a/t/t6434-merge-recursive-rename-options.sh +++ b/t/t6434-merge-recursive-rename-options.sh @@ -5,11 +5,11 @@ test_description='merge-recursive rename options Test rename detection by examining rename/delete conflicts. * (HEAD -> rename) rename -| * (master) delete +| * (main) delete |/ * base -git diff --name-status base master +git diff --name-status base main D 0-old D 1-old D 2-old @@ -26,6 +26,9 @@ they are rounded down (see, e.g., Documentation/diff-generate-patch.txt, which mentions this in a different context). ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh get_expected_stages () { @@ -118,7 +121,7 @@ test_expect_success 'setup repo' ' get_expected_stages 2 && get_expected_stages 3 && check_50="false" && - tail="HEAD^ -- HEAD master" + tail="HEAD^ -- HEAD main" ' test_expect_success 'setup thresholds' ' diff --git a/t/t6436-merge-overwrite.sh b/t/t6436-merge-overwrite.sh index dd8ab7ede1..84b4aacf49 100755 --- a/t/t6436-merge-overwrite.sh +++ b/t/t6436-merge-overwrite.sh @@ -4,6 +4,9 @@ test_description='git-merge Do not overwrite changes.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -97,11 +100,19 @@ test_expect_success 'will not overwrite unstaged changes in renamed file' ' git mv c1.c other.c && git commit -m rename && cp important other.c && - test_must_fail git merge c1a >out && - test_i18ngrep "Refusing to lose dirty file at other.c" out && - test_path_is_file other.c~HEAD && - test $(git hash-object other.c~HEAD) = $(git rev-parse c1a:c1.c) && - test_cmp important other.c + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge c1a >out 2>err && + test_i18ngrep "would be overwritten by merge" err && + test_cmp important other.c && + test_path_is_missing .git/MERGE_HEAD + else + test_must_fail git merge c1a >out && + test_i18ngrep "Refusing to lose dirty file at other.c" out && + test_path_is_file other.c~HEAD && + test $(git hash-object other.c~HEAD) = $(git rev-parse c1a:c1.c) && + test_cmp important other.c + fi ' test_expect_success 'will not overwrite untracked subtree' ' @@ -128,7 +139,7 @@ test_expect_success 'will not overwrite untracked file in leading path' ' cp important sub && cp important sub2 && test_must_fail git merge sub 2>out && - test_i18ncmp out expect && + test_cmp out expect && test_path_is_missing .git/MERGE_HEAD && test_cmp important sub && test_cmp important sub2 && @@ -163,7 +174,7 @@ test_expect_success 'will not overwrite untracked file on unborn branch' ' git checkout --orphan new && cp important c0.c && test_must_fail git merge c0 2>out && - test_i18ncmp out expect + test_cmp out expect ' test_expect_success 'will not overwrite untracked file on unborn branch .git/MERGE_HEAD sanity etc.' ' @@ -185,7 +196,7 @@ test_expect_success 'set up unborn branch and content' ' ' test_expect_success 'will not clobber WT/index when merging into unborn' ' - git merge master && + git merge main && grep foo tracked-file && git show :tracked-file >expect && grep foo expect && diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh index 6a1e5f8232..e5e89c2045 100755 --- a/t/t6437-submodule-merge.sh +++ b/t/t6437-submodule-merge.sh @@ -2,7 +2,11 @@ test_description='merging with submodules' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh # # history @@ -27,7 +31,7 @@ test_expect_success setup ' test_tick && git commit -m root && - git checkout -b a master && + git checkout -b a main && (cd sub && echo A > file && git add file && @@ -37,7 +41,7 @@ test_expect_success setup ' test_tick && git commit -m a && - git checkout -b b master && + git checkout -b b main && (cd sub && echo B > file && git add file && @@ -127,7 +131,12 @@ test_expect_success 'merging should conflict for non fast-forward' ' git checkout -b test-nonforward b && (cd sub && git rev-parse sub-d > ../expect) && - test_must_fail git merge c 2> actual && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge c >actual + else + test_must_fail git merge c 2> actual + fi && grep $(cat expect) actual > /dev/null && git reset --hard) ' @@ -138,9 +147,21 @@ test_expect_success 'merging should fail for ambiguous common parent' ' (cd sub && git checkout -b ambiguous sub-b && git merge sub-c && - git rev-parse sub-d > ../expect1 && - git rev-parse ambiguous > ../expect2) && - test_must_fail git merge c 2> actual && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + git rev-parse --short sub-d >../expect1 && + git rev-parse --short ambiguous >../expect2 + else + git rev-parse sub-d > ../expect1 && + git rev-parse ambiguous > ../expect2 + fi + ) && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge c >actual + else + test_must_fail git merge c 2> actual + fi && grep $(cat expect1) actual > /dev/null && grep $(cat expect2) actual > /dev/null && git reset --hard) @@ -237,22 +258,22 @@ test_expect_success 'setup for recursive merge with submodule' ' (cd sub && git init && test_commit a && - git checkout -b sub-b master && + git checkout -b sub-b main && test_commit b && - git checkout -b sub-c master && + git checkout -b sub-c main && test_commit c && git checkout -b sub-bc sub-b && git merge sub-c && git checkout -b sub-cb sub-c && git merge sub-b && - git checkout master) && + git checkout main) && git add sub && git commit -m a && - git checkout -b top-b master && + git checkout -b top-b main && (cd sub && git checkout sub-b) && git add sub && git commit -m b && - git checkout -b top-c master && + git checkout -b top-c main && (cd sub && git checkout sub-c) && git add sub && git commit -m c && @@ -308,7 +329,7 @@ test_expect_success 'setup file/submodule conflict' ' ) ' -test_expect_failure 'file/submodule conflict' ' +test_expect_merge_algorithm failure success 'file/submodule conflict' ' test_when_finished "git -C file-submodule reset --hard" && ( cd file-submodule && @@ -417,7 +438,7 @@ test_expect_failure 'directory/submodule conflict; keep submodule clean' ' ) ' -test_expect_failure !FAIL_PREREQS 'directory/submodule conflict; should not treat submodule files as untracked or in the way' ' +test_expect_merge_algorithm failure success !FAIL_PREREQS 'directory/submodule conflict; should not treat submodule files as untracked or in the way' ' test_when_finished "git -C directory-submodule/path reset --hard" && test_when_finished "git -C directory-submodule reset --hard" && ( diff --git a/t/t6438-submodule-directory-file-conflicts.sh b/t/t6438-submodule-directory-file-conflicts.sh index 04bf4be7d7..8df67a0ef9 100755 --- a/t/t6438-submodule-directory-file-conflicts.sh +++ b/t/t6438-submodule-directory-file-conflicts.sh @@ -12,8 +12,11 @@ test_submodule_switch "merge --ff" test_submodule_switch "merge --ff-only" -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" != ort +then + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch "merge --no-ff" test_done diff --git a/t/t6439-merge-co-error-msgs.sh b/t/t6439-merge-co-error-msgs.sh index 5c8894d94f..5bfb027099 100755 --- a/t/t6439-merge-co-error-msgs.sh +++ b/t/t6439-merge-co-error-msgs.sh @@ -2,6 +2,9 @@ test_description='unpack-trees error messages' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh @@ -18,7 +21,7 @@ test_expect_success 'setup' ' git add two three four five && git commit -m Second && - git checkout master && + git checkout main && echo other >two && echo other >three && echo other >four && @@ -37,14 +40,14 @@ EOF test_expect_success 'untracked files overwritten by merge (fast and non-fast forward)' ' test_must_fail git merge branch 2>out && - test_i18ncmp out expect && + test_cmp out expect && git commit --allow-empty -m empty && ( GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY && test_must_fail git merge branch 2>out2 ) && - test_i18ncmp out2 expect && + test_cmp out2 expect && git reset --hard HEAD^ ' @@ -65,7 +68,7 @@ test_expect_success 'untracked files or local changes ovewritten by merge' ' git add three && git add four && test_must_fail git merge branch 2>out && - test_i18ncmp out expect + test_cmp out expect ' cat >expect <<\EOF @@ -83,11 +86,11 @@ test_expect_success 'cannot switch branches because of local changes' ' echo two >rep/two && git add rep/one rep/two && git commit -m Fourth && - git checkout master && + git checkout main && echo uno >rep/one && echo dos >rep/two && test_must_fail git checkout branch 2>out && - test_i18ncmp out expect + test_cmp out expect ' cat >expect <<\EOF @@ -101,7 +104,7 @@ EOF test_expect_success 'not uptodate file porcelain checkout error' ' git add rep/one rep/two && test_must_fail git checkout branch 2>out && - test_i18ncmp out expect + test_cmp out expect ' cat >expect <<\EOF @@ -128,11 +131,11 @@ test_expect_success 'not_uptodate_dir porcelain checkout error' ' >rep2 && git add rep rep2 && git commit -m "added test as a file" && - git checkout master && + git checkout main && >rep/untracked-file && >rep2/untracked-file && test_must_fail git checkout branch 2>out && - test_i18ncmp out ../expect + test_cmp out ../expect ' test_done diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh index 4a3b8f48ac..10c7ae7f09 100755 --- a/t/t6500-gc.sh +++ b/t/t6500-gc.sh @@ -78,7 +78,7 @@ test_expect_success 'gc --keep-largest-pack' ' git gc && ( cd .git/objects/pack && ls *.pack ) >pack-list && test_line_count = 1 pack-list && - BASE_PACK=.git/objects/pack/pack-*.pack && + cp pack-list base-pack-list && test_commit four && git repack -d && test_commit five && @@ -90,11 +90,57 @@ test_expect_success 'gc --keep-largest-pack' ' test_line_count = 2 pack-list && awk "/^P /{print \$2}" <.git/objects/info/packs >pack-info && test_line_count = 2 pack-info && - test_path_is_file $BASE_PACK && + test_path_is_file .git/objects/pack/$(cat base-pack-list) && git fsck ) ' +test_expect_success 'pre-auto-gc hook can stop auto gc' ' + cat >err.expect <<-\EOF && + no gc for you + EOF + + git init pre-auto-gc-hook && + ( + cd pre-auto-gc-hook && + write_script ".git/hooks/pre-auto-gc" <<-\EOF && + echo >&2 no gc for you && + exit 1 + EOF + + git config gc.auto 3 && + git config gc.autoDetach false && + + # We need to create two object whose sha1s start with 17 + # since this is what git gc counts. As it happens, these + # two blobs will do so. + test_commit "$(test_oid obj1)" && + test_commit "$(test_oid obj2)" && + + git gc --auto >../out.actual 2>../err.actual + ) && + test_must_be_empty out.actual && + test_cmp err.expect err.actual && + + cat >err.expect <<-\EOF && + will gc for you + Auto packing the repository for optimum performance. + See "git help gc" for manual housekeeping. + EOF + + ( + cd pre-auto-gc-hook && + write_script ".git/hooks/pre-auto-gc" <<-\EOF && + echo >&2 will gc for you && + exit 0 + EOF + git gc --auto >../out.actual 2>../err.actual + ) && + + test_must_be_empty out.actual && + test_cmp err.expect err.actual +' + test_expect_success 'auto gc with too many loose objects does not attempt to create bitmaps' ' test_config gc.auto 3 && test_config gc.autodetach false && @@ -106,17 +152,17 @@ test_expect_success 'auto gc with too many loose objects does not attempt to cre test_commit "$(test_oid obj2)" && # Our first gc will create a pack; our second will create a second pack git gc --auto && - ls .git/objects/pack | sort >existing_packs && + ls .git/objects/pack/pack-*.pack | sort >existing_packs && test_commit "$(test_oid obj3)" && test_commit "$(test_oid obj4)" && git gc --auto 2>err && test_i18ngrep ! "^warning:" err && - ls .git/objects/pack/ | sort >post_packs && + ls .git/objects/pack/pack-*.pack | sort >post_packs && comm -1 -3 existing_packs post_packs >new && comm -2 -3 existing_packs post_packs >del && test_line_count = 0 del && # No packs are deleted - test_line_count = 2 new # There is one new pack and its .idx + test_line_count = 1 new # There is one new pack ' test_expect_success 'gc --no-quiet' ' diff --git a/t/t6501-freshen-objects.sh b/t/t6501-freshen-objects.sh index 8a3bb4105b..10662456ae 100755 --- a/t/t6501-freshen-objects.sh +++ b/t/t6501-freshen-objects.sh @@ -25,6 +25,9 @@ # to refer to an existing tree). test_description='check pruning of dependent objects' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # We care about reachability, so we do not want to use @@ -40,15 +43,25 @@ commit () { } maybe_repack () { - if test -n "$repack"; then + case "$title" in + loose) + : skip repack + ;; + repack) git repack -ad - fi + ;; + bitmap) + git repack -adb + ;; + *) + echo >&2 "unknown test type in maybe_repack" + return 1 + ;; + esac } -for repack in '' true; do - title=${repack:+repack} - title=${title:-loose} - +for title in loose repack bitmap +do test_expect_success "make repo completely empty ($title)" ' rm -rf .git && git init @@ -67,7 +80,7 @@ for repack in '' true; do git checkout -b experiment && commit abandon && maybe_repack && - git checkout master && + git checkout main && git branch -D experiment ' diff --git a/t/t6600-test-reach.sh b/t/t6600-test-reach.sh index 475564bee7..3d7a62ddab 100755 --- a/t/t6600-test-reach.sh +++ b/t/t6600-test-reach.sh @@ -55,10 +55,13 @@ test_expect_success 'setup' ' git show-ref -s commit-5-5 | git commit-graph write --stdin-commits && mv .git/objects/info/commit-graph commit-graph-half && chmod u+w commit-graph-half && + git -c commitGraph.generationVersion=1 commit-graph write --reachable && + mv .git/objects/info/commit-graph commit-graph-no-gdat && + chmod u+w commit-graph-no-gdat && git config core.commitGraph true ' -run_three_modes () { +run_all_modes () { test_when_finished rm -rf .git/objects/info/commit-graph && "$@" <input >actual && test_cmp expect actual && @@ -67,11 +70,14 @@ run_three_modes () { test_cmp expect actual && cp commit-graph-half .git/objects/info/commit-graph && "$@" <input >actual && + test_cmp expect actual && + cp commit-graph-no-gdat .git/objects/info/commit-graph && + "$@" <input >actual && test_cmp expect actual } -test_three_modes () { - run_three_modes test-tool reach "$@" +test_all_modes () { + run_all_modes test-tool reach "$@" } test_expect_success 'ref_newer:miss' ' @@ -80,7 +86,7 @@ test_expect_success 'ref_newer:miss' ' B:commit-4-9 EOF echo "ref_newer(A,B):0" >expect && - test_three_modes ref_newer + test_all_modes ref_newer ' test_expect_success 'ref_newer:hit' ' @@ -89,7 +95,7 @@ test_expect_success 'ref_newer:hit' ' B:commit-2-3 EOF echo "ref_newer(A,B):1" >expect && - test_three_modes ref_newer + test_all_modes ref_newer ' test_expect_success 'in_merge_bases:hit' ' @@ -98,7 +104,7 @@ test_expect_success 'in_merge_bases:hit' ' B:commit-8-8 EOF echo "in_merge_bases(A,B):1" >expect && - test_three_modes in_merge_bases + test_all_modes in_merge_bases ' test_expect_success 'in_merge_bases:miss' ' @@ -107,7 +113,37 @@ test_expect_success 'in_merge_bases:miss' ' B:commit-5-9 EOF echo "in_merge_bases(A,B):0" >expect && - test_three_modes in_merge_bases + test_all_modes in_merge_bases +' + +test_expect_success 'in_merge_bases_many:hit' ' + cat >input <<-\EOF && + A:commit-6-8 + X:commit-6-9 + X:commit-5-7 + EOF + echo "in_merge_bases_many(A,X):1" >expect && + test_all_modes in_merge_bases_many +' + +test_expect_success 'in_merge_bases_many:miss' ' + cat >input <<-\EOF && + A:commit-6-8 + X:commit-7-7 + X:commit-8-6 + EOF + echo "in_merge_bases_many(A,X):0" >expect && + test_all_modes in_merge_bases_many +' + +test_expect_success 'in_merge_bases_many:miss-heuristic' ' + cat >input <<-\EOF && + A:commit-6-8 + X:commit-7-5 + X:commit-6-6 + EOF + echo "in_merge_bases_many(A,X):0" >expect && + test_all_modes in_merge_bases_many ' test_expect_success 'is_descendant_of:hit' ' @@ -118,7 +154,7 @@ test_expect_success 'is_descendant_of:hit' ' X:commit-1-1 EOF echo "is_descendant_of(A,X):1" >expect && - test_three_modes is_descendant_of + test_all_modes is_descendant_of ' test_expect_success 'is_descendant_of:miss' ' @@ -129,7 +165,7 @@ test_expect_success 'is_descendant_of:miss' ' X:commit-7-6 EOF echo "is_descendant_of(A,X):0" >expect && - test_three_modes is_descendant_of + test_all_modes is_descendant_of ' test_expect_success 'get_merge_bases_many' ' @@ -144,7 +180,7 @@ test_expect_success 'get_merge_bases_many' ' git rev-parse commit-5-6 \ commit-4-7 | sort } >expect && - test_three_modes get_merge_bases_many + test_all_modes get_merge_bases_many ' test_expect_success 'reduce_heads' ' @@ -166,7 +202,7 @@ test_expect_success 'reduce_heads' ' commit-2-8 \ commit-1-10 | sort } >expect && - test_three_modes reduce_heads + test_all_modes reduce_heads ' test_expect_success 'can_all_from_reach:hit' ' @@ -189,7 +225,7 @@ test_expect_success 'can_all_from_reach:hit' ' Y:commit-8-1 EOF echo "can_all_from_reach(X,Y):1" >expect && - test_three_modes can_all_from_reach + test_all_modes can_all_from_reach ' test_expect_success 'can_all_from_reach:miss' ' @@ -211,7 +247,7 @@ test_expect_success 'can_all_from_reach:miss' ' Y:commit-8-5 EOF echo "can_all_from_reach(X,Y):0" >expect && - test_three_modes can_all_from_reach + test_all_modes can_all_from_reach ' test_expect_success 'can_all_from_reach_with_flag: tags case' ' @@ -234,7 +270,7 @@ test_expect_success 'can_all_from_reach_with_flag: tags case' ' Y:commit-8-1 EOF echo "can_all_from_reach_with_flag(X,_,_,0,0):1" >expect && - test_three_modes can_all_from_reach_with_flag + test_all_modes can_all_from_reach_with_flag ' test_expect_success 'commit_contains:hit' ' @@ -250,8 +286,8 @@ test_expect_success 'commit_contains:hit' ' X:commit-9-3 EOF echo "commit_contains(_,A,X,_):1" >expect && - test_three_modes commit_contains && - test_three_modes commit_contains --tag + test_all_modes commit_contains && + test_all_modes commit_contains --tag ' test_expect_success 'commit_contains:miss' ' @@ -267,8 +303,8 @@ test_expect_success 'commit_contains:miss' ' X:commit-9-3 EOF echo "commit_contains(_,A,X,_):0" >expect && - test_three_modes commit_contains && - test_three_modes commit_contains --tag + test_all_modes commit_contains && + test_all_modes commit_contains --tag ' test_expect_success 'rev-list: basic topo-order' ' @@ -280,7 +316,7 @@ test_expect_success 'rev-list: basic topo-order' ' commit-6-2 commit-5-2 commit-4-2 commit-3-2 commit-2-2 commit-1-2 \ commit-6-1 commit-5-1 commit-4-1 commit-3-1 commit-2-1 commit-1-1 \ >expect && - run_three_modes git rev-list --topo-order commit-6-6 + run_all_modes git rev-list --topo-order commit-6-6 ' test_expect_success 'rev-list: first-parent topo-order' ' @@ -292,7 +328,7 @@ test_expect_success 'rev-list: first-parent topo-order' ' commit-6-2 \ commit-6-1 commit-5-1 commit-4-1 commit-3-1 commit-2-1 commit-1-1 \ >expect && - run_three_modes git rev-list --first-parent --topo-order commit-6-6 + run_all_modes git rev-list --first-parent --topo-order commit-6-6 ' test_expect_success 'rev-list: range topo-order' ' @@ -304,7 +340,7 @@ test_expect_success 'rev-list: range topo-order' ' commit-6-2 commit-5-2 commit-4-2 \ commit-6-1 commit-5-1 commit-4-1 \ >expect && - run_three_modes git rev-list --topo-order commit-3-3..commit-6-6 + run_all_modes git rev-list --topo-order commit-3-3..commit-6-6 ' test_expect_success 'rev-list: range topo-order' ' @@ -316,7 +352,7 @@ test_expect_success 'rev-list: range topo-order' ' commit-6-2 commit-5-2 commit-4-2 \ commit-6-1 commit-5-1 commit-4-1 \ >expect && - run_three_modes git rev-list --topo-order commit-3-8..commit-6-6 + run_all_modes git rev-list --topo-order commit-3-8..commit-6-6 ' test_expect_success 'rev-list: first-parent range topo-order' ' @@ -328,7 +364,7 @@ test_expect_success 'rev-list: first-parent range topo-order' ' commit-6-2 \ commit-6-1 commit-5-1 commit-4-1 \ >expect && - run_three_modes git rev-list --first-parent --topo-order commit-3-8..commit-6-6 + run_all_modes git rev-list --first-parent --topo-order commit-3-8..commit-6-6 ' test_expect_success 'rev-list: ancestry-path topo-order' ' @@ -338,7 +374,7 @@ test_expect_success 'rev-list: ancestry-path topo-order' ' commit-6-4 commit-5-4 commit-4-4 commit-3-4 \ commit-6-3 commit-5-3 commit-4-3 \ >expect && - run_three_modes git rev-list --topo-order --ancestry-path commit-3-3..commit-6-6 + run_all_modes git rev-list --topo-order --ancestry-path commit-3-3..commit-6-6 ' test_expect_success 'rev-list: symmetric difference topo-order' ' @@ -352,7 +388,7 @@ test_expect_success 'rev-list: symmetric difference topo-order' ' commit-3-8 commit-2-8 commit-1-8 \ commit-3-7 commit-2-7 commit-1-7 \ >expect && - run_three_modes git rev-list --topo-order commit-3-8...commit-6-6 + run_all_modes git rev-list --topo-order commit-3-8...commit-6-6 ' test_expect_success 'get_reachable_subset:all' ' @@ -372,7 +408,7 @@ test_expect_success 'get_reachable_subset:all' ' commit-1-7 \ commit-5-6 | sort ) >expect && - test_three_modes get_reachable_subset + test_all_modes get_reachable_subset ' test_expect_success 'get_reachable_subset:some' ' @@ -390,7 +426,7 @@ test_expect_success 'get_reachable_subset:some' ' git rev-parse commit-3-3 \ commit-1-7 | sort ) >expect && - test_three_modes get_reachable_subset + test_all_modes get_reachable_subset ' test_expect_success 'get_reachable_subset:none' ' @@ -404,7 +440,7 @@ test_expect_success 'get_reachable_subset:none' ' Y:commit-2-8 EOF echo "get_reachable_subset(X,Y)" >expect && - test_three_modes get_reachable_subset + test_all_modes get_reachable_subset ' test_done diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index 63d5f41a12..25bb9bbb89 100755 --- a/t/t7001-mv.sh +++ b/t/t7001-mv.sh @@ -3,74 +3,74 @@ test_description='git mv in subdirs' . ./test-lib.sh -test_expect_success \ - 'prepare reference tree' \ - 'mkdir path0 path1 && - cp "$TEST_DIRECTORY"/../COPYING path0/COPYING && - git add path0/COPYING && - git commit -m add -a' +test_expect_success 'prepare reference tree' ' + mkdir path0 path1 && + cp "$TEST_DIRECTORY"/../COPYING path0/COPYING && + git add path0/COPYING && + git commit -m add -a +' -test_expect_success \ - 'moving the file out of subdirectory' \ - 'cd path0 && git mv COPYING ../path1/COPYING' +test_expect_success 'moving the file out of subdirectory' ' + git -C path0 mv COPYING ../path1/COPYING +' # in path0 currently -test_expect_success \ - 'commiting the change' \ - 'cd .. && git commit -m move-out -a' +test_expect_success 'commiting the change' ' + git commit -m move-out -a +' -test_expect_success \ - 'checking the commit' \ - 'git diff-tree -r -M --name-status HEAD^ HEAD >actual && - grep "^R100..*path0/COPYING..*path1/COPYING" actual' +test_expect_success 'checking the commit' ' + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + grep "^R100..*path0/COPYING..*path1/COPYING" actual +' -test_expect_success \ - 'moving the file back into subdirectory' \ - 'cd path0 && git mv ../path1/COPYING COPYING' +test_expect_success 'moving the file back into subdirectory' ' + git -C path0 mv ../path1/COPYING COPYING +' # in path0 currently -test_expect_success \ - 'commiting the change' \ - 'cd .. && git commit -m move-in -a' - -test_expect_success \ - 'checking the commit' \ - 'git diff-tree -r -M --name-status HEAD^ HEAD >actual && - grep "^R100..*path1/COPYING..*path0/COPYING" actual' - -test_expect_success \ - 'mv --dry-run does not move file' \ - 'git mv -n path0/COPYING MOVED && - test -f path0/COPYING && - test ! -f MOVED' - -test_expect_success \ - 'checking -k on non-existing file' \ - 'git mv -k idontexist path0' - -test_expect_success \ - 'checking -k on untracked file' \ - 'touch untracked1 && - git mv -k untracked1 path0 && - test -f untracked1 && - test ! -f path0/untracked1' - -test_expect_success \ - 'checking -k on multiple untracked files' \ - 'touch untracked2 && - git mv -k untracked1 untracked2 path0 && - test -f untracked1 && - test -f untracked2 && - test ! -f path0/untracked1 && - test ! -f path0/untracked2' - -test_expect_success \ - 'checking -f on untracked file with existing target' \ - 'touch path0/untracked1 && - test_must_fail git mv -f untracked1 path0 && - test ! -f .git/index.lock && - test -f untracked1 && - test -f path0/untracked1' +test_expect_success 'commiting the change' ' + git commit -m move-in -a +' + +test_expect_success 'checking the commit' ' + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + grep "^R100..*path1/COPYING..*path0/COPYING" actual +' + +test_expect_success 'mv --dry-run does not move file' ' + git mv -n path0/COPYING MOVED && + test -f path0/COPYING && + test ! -f MOVED +' + +test_expect_success 'checking -k on non-existing file' ' + git mv -k idontexist path0 +' + +test_expect_success 'checking -k on untracked file' ' + >untracked1 && + git mv -k untracked1 path0 && + test -f untracked1 && + test ! -f path0/untracked1 +' + +test_expect_success 'checking -k on multiple untracked files' ' + >untracked2 && + git mv -k untracked1 untracked2 path0 && + test -f untracked1 && + test -f untracked2 && + test ! -f path0/untracked1 && + test ! -f path0/untracked2 +' + +test_expect_success 'checking -f on untracked file with existing target' ' + >path0/untracked1 && + test_must_fail git mv -f untracked1 path0 && + test ! -f .git/index.lock && + test -f untracked1 && + test -f path0/untracked1 +' # clean up the mess in case bad things happen rm -f idontexist untracked1 untracked2 \ @@ -78,87 +78,89 @@ rm -f idontexist untracked1 untracked2 \ .git/index.lock rmdir path1 -test_expect_success \ - 'moving to absent target with trailing slash' \ - 'test_must_fail git mv path0/COPYING no-such-dir/ && - test_must_fail git mv path0/COPYING no-such-dir// && - git mv path0/ no-such-dir/ && - test_path_is_dir no-such-dir' - -test_expect_success \ - 'clean up' \ - 'git reset --hard' - -test_expect_success \ - 'moving to existing untracked target with trailing slash' \ - 'mkdir path1 && - git mv path0/ path1/ && - test_path_is_dir path1/path0/' - -test_expect_success \ - 'moving to existing tracked target with trailing slash' \ - 'mkdir path2 && - >path2/file && git add path2/file && - git mv path1/path0/ path2/ && - test_path_is_dir path2/path0/' - -test_expect_success \ - 'clean up' \ - 'git reset --hard' - -test_expect_success \ - 'adding another file' \ - 'cp "$TEST_DIRECTORY"/../README.md path0/README && - git add path0/README && - git commit -m add2 -a' - -test_expect_success \ - 'moving whole subdirectory' \ - 'git mv path0 path2' - -test_expect_success \ - 'commiting the change' \ - 'git commit -m dir-move -a' - -test_expect_success \ - 'checking the commit' \ - 'git diff-tree -r -M --name-status HEAD^ HEAD >actual && - grep "^R100..*path0/COPYING..*path2/COPYING" actual && - grep "^R100..*path0/README..*path2/README" actual' - -test_expect_success \ - 'succeed when source is a prefix of destination' \ - 'git mv path2/COPYING path2/COPYING-renamed' - -test_expect_success \ - 'moving whole subdirectory into subdirectory' \ - 'git mv path2 path1' - -test_expect_success \ - 'commiting the change' \ - 'git commit -m dir-move -a' - -test_expect_success \ - 'checking the commit' \ - 'git diff-tree -r -M --name-status HEAD^ HEAD >actual && - grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual && - grep "^R100..*path2/README..*path1/path2/README" actual' - -test_expect_success \ - 'do not move directory over existing directory' \ - 'mkdir path0 && mkdir path0/path2 && test_must_fail git mv path2 path0' - -test_expect_success \ - 'move into "."' \ - 'git mv path1/path2/ .' +test_expect_success 'moving to absent target with trailing slash' ' + test_must_fail git mv path0/COPYING no-such-dir/ && + test_must_fail git mv path0/COPYING no-such-dir// && + git mv path0/ no-such-dir/ && + test_path_is_dir no-such-dir +' + +test_expect_success 'clean up' ' + git reset --hard +' + +test_expect_success 'moving to existing untracked target with trailing slash' ' + mkdir path1 && + git mv path0/ path1/ && + test_path_is_dir path1/path0/ +' + +test_expect_success 'moving to existing tracked target with trailing slash' ' + mkdir path2 && + >path2/file && git add path2/file && + git mv path1/path0/ path2/ && + test_path_is_dir path2/path0/ +' + +test_expect_success 'clean up' ' + git reset --hard +' + +test_expect_success 'adding another file' ' + cp "$TEST_DIRECTORY"/../README.md path0/README && + git add path0/README && + git commit -m add2 -a +' + +test_expect_success 'moving whole subdirectory' ' + git mv path0 path2 +' + +test_expect_success 'commiting the change' ' + git commit -m dir-move -a +' + +test_expect_success 'checking the commit' ' + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + grep "^R100..*path0/COPYING..*path2/COPYING" actual && + grep "^R100..*path0/README..*path2/README" actual +' + +test_expect_success 'succeed when source is a prefix of destination' ' + git mv path2/COPYING path2/COPYING-renamed +' + +test_expect_success 'moving whole subdirectory into subdirectory' ' + git mv path2 path1 +' + +test_expect_success 'commiting the change' ' + git commit -m dir-move -a +' + +test_expect_success 'checking the commit' ' + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual && + grep "^R100..*path2/README..*path1/path2/README" actual +' + +test_expect_success 'do not move directory over existing directory' ' + mkdir path0 && + mkdir path0/path2 && + test_must_fail git mv path2 path0 +' + +test_expect_success 'move into "."' ' + git mv path1/path2/ . +' test_expect_success "Michael Cassar's test case" ' rm -fr .git papers partA && git init && mkdir -p papers/unsorted papers/all-papers partA && - echo a > papers/unsorted/Thesis.pdf && - echo b > partA/outline.txt && - echo c > papers/unsorted/_another && + echo a >papers/unsorted/Thesis.pdf && + echo b >partA/outline.txt && + echo c >papers/unsorted/_another && git add papers partA && T1=$(git write-tree) && @@ -181,43 +183,42 @@ test_expect_success "Sergey Vlasov's test case" ' git mv ab a ' -test_expect_success 'absolute pathname' '( - - rm -fr mine && - mkdir mine && - cd mine && - test_create_repo one && - cd one && - mkdir sub && - >sub/file && - git add sub/file && - - git mv sub "$(pwd)/in" && - ! test -d sub && - test -d in && - git ls-files --error-unmatch in/file - - -)' - -test_expect_success 'absolute pathname outside should fail' '( - - rm -fr mine && - mkdir mine && - cd mine && - out=$(pwd) && - test_create_repo one && - cd one && - mkdir sub && - >sub/file && - git add sub/file && - - test_must_fail git mv sub "$out/out" && - test -d sub && - ! test -d ../in && - git ls-files --error-unmatch sub/file +test_expect_success 'absolute pathname' ' + ( + rm -fr mine && + mkdir mine && + cd mine && + test_create_repo one && + cd one && + mkdir sub && + >sub/file && + git add sub/file && + + git mv sub "$(pwd)/in" && + ! test -d sub && + test -d in && + git ls-files --error-unmatch in/file + ) +' -)' +test_expect_success 'absolute pathname outside should fail' ' + ( + rm -fr mine && + mkdir mine && + cd mine && + out=$(pwd) && + test_create_repo one && + cd one && + mkdir sub && + >sub/file && + git add sub/file && + + test_must_fail git mv sub "$out/out" && + test -d sub && + ! test -d ../in && + git ls-files --error-unmatch sub/file + ) +' test_expect_success 'git mv to move multiple sources into a directory' ' rm -fr .git && git init && @@ -227,23 +228,24 @@ test_expect_success 'git mv to move multiple sources into a directory' ' git add dir/?.txt && git mv dir/a.txt dir/b.txt other && git ls-files >actual && - { echo other/a.txt; echo other/b.txt; } >expect && + cat >expect <<-\EOF && + other/a.txt + other/b.txt + EOF test_cmp expect actual ' test_expect_success 'git mv should not change sha1 of moved cache entry' ' - rm -fr .git && git init && echo 1 >dirty && git add dirty && entry="$(git ls-files --stage dirty | cut -f 1)" && git mv dirty dirty2 && - [ "$entry" = "$(git ls-files --stage dirty2 | cut -f 1)" ] && + test "$entry" = "$(git ls-files --stage dirty2 | cut -f 1)" && echo 2 >dirty2 && git mv dirty2 dirty && - [ "$entry" = "$(git ls-files --stage dirty | cut -f 1)" ] - + test "$entry" = "$(git ls-files --stage dirty | cut -f 1)" ' rm -f dirty dirty2 @@ -266,7 +268,6 @@ test_expect_success 'git mv error on conflicted file' ' ' test_expect_success 'git mv should overwrite symlink to a file' ' - rm -fr .git && git init && echo 1 >moved && @@ -279,13 +280,11 @@ test_expect_success 'git mv should overwrite symlink to a file' ' test "$(cat symlink)" = 1 && git update-index --refresh && git diff-files --quiet - ' rm -f moved symlink test_expect_success 'git mv should overwrite file with a symlink' ' - rm -fr .git && git init && echo 1 >moved && @@ -296,11 +295,9 @@ test_expect_success 'git mv should overwrite file with a symlink' ' ! test -e symlink && git update-index --refresh && git diff-files --quiet - ' test_expect_success SYMLINKS 'check moved symlink' ' - test -h moved ' @@ -335,11 +332,8 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm mkdir mod && git mv sub mod/sub && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && git update-index --refresh && git diff-files --quiet ' @@ -358,11 +352,8 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu mkdir mod && git mv sub mod/sub && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && echo mod/sub >expected && git config -f .gitmodules submodule.sub.path >actual && test_cmp expected actual && @@ -376,16 +367,10 @@ test_expect_success 'git mv moves a submodule with gitfile' ' git submodule update && entry="$(git ls-files --stage sub | cut -f 1)" && mkdir mod && - ( - cd mod && - git mv ../sub/ . - ) && + git -C mod mv ../sub/ . && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && echo mod/sub >expected && git config -f .gitmodules submodule.sub.path >actual && test_cmp expected actual && @@ -403,11 +388,8 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' ' git mv sub mod/sub 2>actual.err && test_must_be_empty actual.err && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && git update-index --refresh && git diff-files --quiet ' @@ -427,11 +409,8 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta git mv sub mod/sub 2>actual.err && test_must_be_empty actual.err && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && git update-index --refresh && git diff-files --quiet ' @@ -446,13 +425,10 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule echo "warning: Could not find section in .gitmodules where path=sub" >expect.err && mkdir mod && git mv sub mod/sub 2>actual.err && - test_i18ncmp expect.err actual.err && + test_cmp expect.err actual.err && ! test -e sub && - [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && - ( - cd mod/sub && - git status - ) && + test "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" && + git -C mod/sub status && git update-index --refresh && git diff-files --quiet ' @@ -515,15 +491,17 @@ test_expect_success 'moving a submodule in nested directories' ' test_expect_success 'moving nested submodules' ' git commit -am "cleanup commit" && mkdir sub_nested_nested && - (cd sub_nested_nested && - touch nested_level2 && + ( + cd sub_nested_nested && + >nested_level2 && git init && git add . && git commit -m "nested level 2" ) && mkdir sub_nested && - (cd sub_nested && - touch nested_level1 && + ( + cd sub_nested && + >nested_level1 && git init && git add . && git commit -m "nested level 1" && diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 36477cb1f4..e18a218952 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git filter-branch' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" @@ -13,7 +16,7 @@ test_expect_success 'setup' ' mkdir dir && test_commit dir/D && test_commit E && - git checkout master && + git checkout main && test_commit C && git checkout branch && git merge C && @@ -25,7 +28,7 @@ test_expect_success 'setup' ' # * G # * Merge commit 'C' into branch # |\ -# | * (master) C +# | * (main) C # * | E # * | dir/D # * | D @@ -162,15 +165,15 @@ test_expect_success 'subdirectory filter result looks okay' ' ' test_expect_success 'more setup' ' - git checkout master && + git checkout main && mkdir subdir && echo A > subdir/new && git add subdir/new && test_tick && - git commit -m "subdir on master" subdir/new && + git commit -m "subdir on main" subdir/new && git rm A.t && test_tick && - git commit -m "again subdir on master" && + git commit -m "again subdir on main" && git merge branch ' @@ -199,7 +202,7 @@ test_expect_success 'author information is preserved' ' git branch preserved-author && (sane_unset GIT_AUTHOR_NAME && git filter-branch -f --msg-filter "cat; \ - test \$GIT_COMMIT != $(git rev-parse master) || \ + test \$GIT_COMMIT != $(git rev-parse main) || \ echo Hallo" \ preserved-author) && git rev-list --author="B V Uips" preserved-author >actual && @@ -218,7 +221,7 @@ test_expect_success "remove a certain author's commits" ' else\ git commit-tree \"\$@\";\ fi" removed-author && - cnt1=$(git rev-list master | wc -l) && + cnt1=$(git rev-list main | wc -l) && cnt2=$(git rev-list removed-author | wc -l) && test $cnt1 -eq $(($cnt2 + 1)) && git rev-list --author="B V Uips" removed-author >actual && @@ -226,7 +229,7 @@ test_expect_success "remove a certain author's commits" ' ' test_expect_success 'barf on invalid name' ' - test_must_fail git filter-branch -f master xy-problem && + test_must_fail git filter-branch -f main xy-problem && test_must_fail git filter-branch -f HEAD^ ' @@ -236,8 +239,8 @@ test_expect_success '"map" works in commit filter' ' mapped=\$(map \$parent) && actual=\$(echo \"\$@\" | sed \"s/^.*-p //\") && test \$mapped = \$actual && - git commit-tree \"\$@\";" master~2..master && - git rev-parse --verify master + git commit-tree \"\$@\";" main~2..main && + git rev-parse --verify main ' test_expect_success 'Name needing quotes' ' @@ -256,7 +259,7 @@ test_expect_success 'Name needing quotes' ' test_expect_success 'Subdirectory filter with disappearing trees' ' git reset --hard && - git checkout master && + git checkout main && mkdir foo && touch foo/bar && @@ -275,7 +278,7 @@ test_expect_success 'Subdirectory filter with disappearing trees' ' git commit -m "Re-adding foo" && git filter-branch -f --subdirectory-filter foo && - git rev-list master >actual && + git rev-list main >actual && test_line_count = 3 actual ' @@ -332,7 +335,7 @@ test_expect_success 'Tag name filtering allows slashes in tag names' ' test_cmp expect actual ' test_expect_success 'setup --prune-empty comparisons' ' - git checkout --orphan master-no-a && + git checkout --orphan main-no-a && git rm -rf . && unset test_tick && test_tick && @@ -343,7 +346,7 @@ test_expect_success 'setup --prune-empty comparisons' ' mkdir dir && test_commit dir/D dir/D.t dir/D dir/Dx && test_commit E E.t E Ex && - git checkout master-no-a && + git checkout main-no-a && test_commit C C.t C Cx && git checkout branch-no-a && git merge Cx -m "Merge tag '\''C'\'' into branch" && @@ -392,12 +395,15 @@ test_expect_success '--prune-empty is able to prune root commit' ' test_expect_success '--prune-empty is able to prune entire branch' ' git branch prune-entire B && git filter-branch -f --prune-empty --index-filter "git update-index --remove A.t B.t" prune-entire && - test_path_is_missing .git/refs/heads/prune-entire && - test_must_fail git reflog exists refs/heads/prune-entire + test_must_fail git rev-parse refs/heads/prune-entire && + if test_have_prereq REFFILES + then + test_must_fail git reflog exists refs/heads/prune-entire + fi ' test_expect_success '--remap-to-ancestor with filename filters' ' - git checkout master && + git checkout main && git reset --hard A && test_commit add-foo foo 1 && git branch moved-foo && @@ -407,15 +413,15 @@ test_expect_success '--remap-to-ancestor with filename filters' ' git branch moved-bar && test_commit change-foo foo 2 && git filter-branch -f --remap-to-ancestor \ - moved-foo moved-bar A..master \ + moved-foo moved-bar A..main \ -- -- foo && test $(git rev-parse moved-foo) = $(git rev-parse moved-bar) && - test $(git rev-parse moved-foo) = $(git rev-parse master^) && + test $(git rev-parse moved-foo) = $(git rev-parse main^) && test $orig_invariant = $(git rev-parse invariant) ' test_expect_success 'automatic remapping to ancestor with filename filters' ' - git checkout master && + git checkout main && git reset --hard A && test_commit add-foo2 foo 1 && git branch moved-foo2 && @@ -425,10 +431,10 @@ test_expect_success 'automatic remapping to ancestor with filename filters' ' git branch moved-bar2 && test_commit change-foo2 foo 2 && git filter-branch -f \ - moved-foo2 moved-bar2 A..master \ + moved-foo2 moved-bar2 A..main \ -- -- foo && test $(git rev-parse moved-foo2) = $(git rev-parse moved-bar2) && - test $(git rev-parse moved-foo2) = $(git rev-parse master^) && + test $(git rev-parse moved-foo2) = $(git rev-parse main^) && test $orig_invariant = $(git rev-parse invariant2) ' @@ -503,4 +509,35 @@ test_expect_success 'rewrite repository including refs that point at non-commit ! fgrep fatal filter-output ' +test_expect_success 'filter-branch handles ref deletion' ' + git switch --orphan empty-commit && + git commit --allow-empty -m "empty commit" && + git tag empty && + git branch to-delete && + git filter-branch -f --prune-empty to-delete >out 2>&1 && + grep "to-delete.*was deleted" out && + test_must_fail git rev-parse --verify to-delete +' + +test_expect_success 'filter-branch handles ref rewrite' ' + git checkout empty && + test_commit to-drop && + git branch rewrite && + git filter-branch -f \ + --index-filter "git rm --ignore-unmatch --cached to-drop.t" \ + rewrite >out 2>&1 && + grep "rewrite.*was rewritten" out && + ! grep -i warning out && + git diff-tree empty rewrite +' + +test_expect_success 'filter-branch handles ancestor rewrite' ' + test_commit to-exclude && + git branch ancestor && + git filter-branch -f ancestor -- :^to-exclude.t >out 2>&1 && + grep "ancestor.*was rewritten" out && + ! grep -i warning out && + git diff-tree HEAD^ ancestor +' + test_done diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index 74b637deb2..2f72c5c688 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -7,6 +7,9 @@ test_description='git tag Tests for operations with tags.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh . "$TEST_DIRECTORY"/lib-terminal.sh @@ -17,6 +20,13 @@ tag_exists () { git show-ref --quiet --verify refs/tags/"$1" } +test_expect_success 'setup' ' + test_oid_cache <<-EOM + othersigheader sha1:gpgsig-sha256 + othersigheader sha256:gpgsig + EOM +' + test_expect_success 'listing all tags in an empty tree should succeed' ' git tag -l && git tag @@ -88,7 +98,7 @@ test_expect_success 'creating a tag with --create-reflog should create reflog' ' git tag --create-reflog tag_with_reflog && git reflog exists refs/tags/tag_with_reflog && sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'annotated tag with --create-reflog has correct message' ' @@ -99,7 +109,7 @@ test_expect_success 'annotated tag with --create-reflog has correct message' ' git tag -m "annotated tag" --create-reflog tag_with_reflog && git reflog exists refs/tags/tag_with_reflog && sed -e "s/^.* //" .git/logs/refs/tags/tag_with_reflog >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success '--create-reflog does not create reflog on failure' ' @@ -1371,6 +1381,24 @@ test_expect_success GPG \ 'test_config gpg.program echo && test_must_fail git tag -s -m tail tag-gpg-failure' +# try to produce invalid signature +test_expect_success GPG 'git verifies tag is valid with double signature' ' + git tag -s -m tail tag-gpg-double-sig && + git cat-file tag tag-gpg-double-sig >tag && + othersigheader=$(test_oid othersigheader) && + sed -ne "/^\$/q;p" tag >new-tag && + cat <<-EOM >>new-tag && + $othersigheader -----BEGIN PGP SIGNATURE----- + someinvaliddata + -----END PGP SIGNATURE----- + EOM + sed -e "1,/^tagger/d" tag >>new-tag && + new_tag=$(git hash-object -t tag -w new-tag) && + git update-ref refs/tags/tag-gpg-double-sig $new_tag && + git verify-tag tag-gpg-double-sig && + git fsck +' + # try to sign with bad user.signingkey test_expect_success GPGSM \ 'git tag -s fails if gpgsm is misconfigured (bad key)' \ @@ -1406,7 +1434,7 @@ test_expect_success 'message in editor has initial comment: first line' ' # check the first line --- should be empty echo >first.expect && sed -e 1q <actual >first.actual && - test_i18ncmp first.expect first.actual + test_cmp first.expect first.actual ' test_expect_success \ @@ -1583,7 +1611,7 @@ test_expect_success 'checking that branch head with --no-contains lists all but " test_expect_success 'merging original branch into this branch' ' - git merge --strategy=ours master && + git merge --strategy=ours main && git tag v4.0 ' @@ -1729,7 +1757,7 @@ test_expect_success 'recursive tagging should give advice' ' hint: Disable this message with "git config advice.nestedTag false" EOF git tag -m nested nested annotated-v4.0 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'multiple --points-at are OR-ed together' ' @@ -1944,15 +1972,15 @@ test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a de i=1 && while test $i -lt 8000 do - echo "commit refs/heads/master + echo "commit refs/heads/main committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200 data <<EOF commit #$i EOF" - test $i = 1 && echo "from refs/heads/master^0" + test $i = 1 && echo "from refs/heads/main^0" i=$(($i + 1)) done | git fast-import && - git checkout master && + git checkout main && git tag far-far-away HEAD^ && run_with_limited_stack git tag --contains HEAD >actual && test_must_be_empty actual && @@ -2015,8 +2043,8 @@ test_expect_success '--merged can be used in non-list mode' ' test_cmp expect actual ' -test_expect_success '--merged is incompatible with --no-merged' ' - test_must_fail git tag --merged HEAD --no-merged HEAD +test_expect_success '--merged is compatible with --no-merged' ' + git tag --merged HEAD --no-merged HEAD ' test_expect_success '--merged shows merged tags' ' diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 00e09a375c..0e7cf75435 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -19,7 +19,7 @@ test_expect_success 'setup' ' test_expect_success TTY 'some commands use a pager' ' rm -f paginated.out && test_terminal git log && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_failure TTY 'pager runs from subdir' ' @@ -65,49 +65,49 @@ test_expect_success !MINGW,TTY 'LESS and LV envvars set by git-sh-setup' ' test_expect_success TTY 'some commands do not use a pager' ' rm -f paginated.out && test_terminal git rev-list HEAD && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success 'no pager when stdout is a pipe' ' rm -f paginated.out && git log | cat && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success 'no pager when stdout is a regular file' ' rm -f paginated.out && git log >file && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git --paginate rev-list uses a pager' ' rm -f paginated.out && test_terminal git --paginate rev-list HEAD && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success 'no pager even with --paginate when stdout is a pipe' ' rm -f file paginated.out && git --paginate log | cat && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'no pager with --no-pager' ' rm -f paginated.out && test_terminal git --no-pager log && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'configuration can disable pager' ' rm -f paginated.out && test_unconfig pager.grep && test_terminal git grep initial && - test -e paginated.out && + test_path_is_file paginated.out && rm -f paginated.out && test_config pager.grep false && test_terminal git grep initial && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'configuration can enable pager (from subdir)' ' @@ -122,107 +122,107 @@ test_expect_success TTY 'configuration can enable pager (from subdir)' ' test_terminal git bundle unbundle ../test.bundle ) && { - test -e paginated.out || - test -e subdir/paginated.out + test_path_is_file paginated.out || + test_path_is_file subdir/paginated.out } ' test_expect_success TTY 'git tag -l defaults to paging' ' rm -f paginated.out && test_terminal git tag -l && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git tag -l respects pager.tag' ' rm -f paginated.out && test_terminal git -c pager.tag=false tag -l && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag -l respects --no-pager' ' rm -f paginated.out && test_terminal git -c pager.tag --no-pager tag -l && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag with no args defaults to paging' ' # no args implies -l so this should page like -l rm -f paginated.out && test_terminal git tag && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git tag with no args respects pager.tag' ' # no args implies -l so this should page like -l rm -f paginated.out && test_terminal git -c pager.tag=false tag && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag --contains defaults to paging' ' # --contains implies -l so this should page like -l rm -f paginated.out && test_terminal git tag --contains && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git tag --contains respects pager.tag' ' # --contains implies -l so this should page like -l rm -f paginated.out && test_terminal git -c pager.tag=false tag --contains && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag -a defaults to not paging' ' test_when_finished "git tag -d newtag" && rm -f paginated.out && test_terminal git tag -am message newtag && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag -a ignores pager.tag' ' test_when_finished "git tag -d newtag" && rm -f paginated.out && test_terminal git -c pager.tag tag -am message newtag && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag -a respects --paginate' ' test_when_finished "git tag -d newtag" && rm -f paginated.out && test_terminal git --paginate tag -am message newtag && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git tag as alias ignores pager.tag with -a' ' test_when_finished "git tag -d newtag" && rm -f paginated.out && test_terminal git -c pager.tag -c alias.t=tag t -am message newtag && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git tag as alias respects pager.tag with -l' ' rm -f paginated.out && test_terminal git -c pager.tag=false -c alias.t=tag t -l && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git branch defaults to paging' ' rm -f paginated.out && test_terminal git branch && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git branch respects pager.branch' ' rm -f paginated.out && test_terminal git -c pager.branch=false branch && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git branch respects --no-pager' ' rm -f paginated.out && test_terminal git --no-pager branch && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git branch --edit-description ignores pager.branch' ' @@ -232,8 +232,8 @@ test_expect_success TTY 'git branch --edit-description ignores pager.branch' ' touch editor.used EOF EDITOR=./editor test_terminal git -c pager.branch branch --edit-description && - ! test -e paginated.out && - test -e editor.used + test_path_is_missing paginated.out && + test_path_is_file editor.used ' test_expect_success TTY 'git branch --set-upstream-to ignores pager.branch' ' @@ -242,13 +242,13 @@ test_expect_success TTY 'git branch --set-upstream-to ignores pager.branch' ' test_when_finished "git branch -D other" && test_terminal git -c pager.branch branch --set-upstream-to=other && test_when_finished "git branch --unset-upstream" && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git config ignores pager.config when setting' ' rm -f paginated.out && test_terminal git -c pager.config config foo.bar bar && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git config --edit ignores pager.config' ' @@ -257,33 +257,33 @@ test_expect_success TTY 'git config --edit ignores pager.config' ' touch editor.used EOF EDITOR=./editor test_terminal git -c pager.config config --edit && - ! test -e paginated.out && - test -e editor.used + test_path_is_missing paginated.out && + test_path_is_file editor.used ' test_expect_success TTY 'git config --get ignores pager.config' ' rm -f paginated.out && test_terminal git -c pager.config config --get foo.bar && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git config --get-urlmatch defaults to paging' ' rm -f paginated.out && test_terminal git -c http."https://foo.com/".bar=foo \ config --get-urlmatch http https://foo.com && - test -e paginated.out + test_path_is_file paginated.out ' test_expect_success TTY 'git config --get-all respects pager.config' ' rm -f paginated.out && test_terminal git -c pager.config=false config --get-all foo.bar && - ! test -e paginated.out + test_path_is_missing paginated.out ' test_expect_success TTY 'git config --list defaults to paging' ' rm -f paginated.out && test_terminal git config --list && - test -e paginated.out + test_path_is_file paginated.out ' @@ -392,7 +392,7 @@ test_default_pager() { export PATH && $full_command ) && - test -e default_pager_used + test_path_is_file default_pager_used " } @@ -406,7 +406,7 @@ test_PAGER_overrides() { PAGER='wc >PAGER_used' && export PAGER && $full_command && - test -e PAGER_used + test_path_is_file PAGER_used " } @@ -432,7 +432,7 @@ test_core_pager() { export PAGER && test_config core.pager 'wc >core.pager_used' && $full_command && - ${if_local_config}test -e core.pager_used + ${if_local_config}test_path_is_file core.pager_used " } @@ -464,7 +464,7 @@ test_pager_subdir_helper() { cd sub && $full_command ) && - ${if_local_config}test -e core.pager_used + ${if_local_config}test_path_is_file core.pager_used " } @@ -477,7 +477,7 @@ test_GIT_PAGER_overrides() { GIT_PAGER='wc >GIT_PAGER_used' && export GIT_PAGER && $full_command && - test -e GIT_PAGER_used + test_path_is_file GIT_PAGER_used " } @@ -489,7 +489,7 @@ test_doesnt_paginate() { GIT_PAGER='wc >GIT_PAGER_used' && export GIT_PAGER && $full_command && - ! test -e GIT_PAGER_used + test_path_is_missing GIT_PAGER_used " } @@ -656,4 +656,134 @@ test_expect_success TTY 'git tag with auto-columns ' ' test_cmp expect actual ' +test_expect_success 'setup trace2' ' + GIT_TRACE2_BRIEF=1 && + export GIT_TRACE2_BRIEF +' + +test_expect_success TTY 'git returns SIGPIPE on early pager exit' ' + test_when_finished "rm pager-used trace.normal" && + test_config core.pager ">pager-used; head -n 1; exit 0" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test_match_signal 13 "$OUT" + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:0 " child-exits && + test_path_is_file pager-used +' + +test_expect_success TTY 'git returns SIGPIPE on early pager non-zero exit' ' + test_when_finished "rm pager-used trace.normal" && + test_config core.pager ">pager-used; head -n 1; exit 1" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test_match_signal 13 "$OUT" + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:1 " child-exits && + test_path_is_file pager-used +' + +test_expect_success TTY 'git discards pager non-zero exit without SIGPIPE' ' + test_when_finished "rm pager-used trace.normal" && + test_config core.pager "wc >pager-used; exit 1" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test "$OUT" -eq 0 + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:1 " child-exits && + test_path_is_file pager-used +' + +test_expect_success TTY 'git discards nonexisting pager without SIGPIPE' ' + test_when_finished "rm pager-used trace.normal" && + test_config core.pager "wc >pager-used; does-not-exist" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test "$OUT" -eq 0 + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:127 " child-exits && + test_path_is_file pager-used +' + +test_expect_success TTY 'git attempts to page to nonexisting pager command, gets SIGPIPE' ' + test_when_finished "rm trace.normal" && + test_config core.pager "does-not-exist" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test_match_signal 13 "$OUT" + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:-1 " child-exits +' + +test_expect_success TTY 'git returns SIGPIPE on propagated signals from pager' ' + test_when_finished "rm pager-used trace.normal" && + test_config core.pager ">pager-used; test-tool sigchain" && + GIT_TRACE2="$(pwd)/trace.normal" && + export GIT_TRACE2 && + test_when_finished "unset GIT_TRACE2" && + + if test_have_prereq !MINGW + then + OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) && + test_match_signal 13 "$OUT" + else + test_terminal git log + fi && + + grep child_exit trace.normal >child-exits && + test_line_count = 1 child-exits && + grep " code:143 " child-exits && + test_path_is_file pager-used +' + test_done diff --git a/t/t7007-show.sh b/t/t7007-show.sh index 42d3db6246..d6cc69e0f2 100755 --- a/t/t7007-show.sh +++ b/t/t7007-show.sh @@ -38,6 +38,45 @@ test_expect_success 'showing two commits' ' test_cmp expect actual.filtered ' +test_expect_success 'showing a tree' ' + cat >expected <<-EOF && + tree main1: + + main1.t + EOF + git show main1: >actual && + test_cmp expected actual +' + +test_expect_success 'showing two trees' ' + cat >expected <<-EOF && + tree main1^{tree} + + main1.t + + tree main2^{tree} + + main1.t + main2.t + EOF + git show main1^{tree} main2^{tree} >actual && + test_cmp expected actual +' + +test_expect_success 'showing a trees is not recursive' ' + git worktree add not-recursive main1 && + mkdir not-recursive/a && + test_commit -C not-recursive a/file && + cat >expected <<-EOF && + tree HEAD^{tree} + + a/ + main1.t + EOF + git -C not-recursive show HEAD^{tree} >actual && + test_cmp expected actual +' + test_expect_success 'showing a range walks (linear)' ' cat >expect <<-EOF && commit $(git rev-parse main3) diff --git a/t/t7011-skip-worktree-reading.sh b/t/t7011-skip-worktree-reading.sh index 37525cae3a..1761a2b1b9 100755 --- a/t/t7011-skip-worktree-reading.sh +++ b/t/t7011-skip-worktree-reading.sh @@ -109,15 +109,6 @@ test_expect_success 'ls-files --modified' ' test -z "$(git ls-files -m)" ' -test_expect_success 'grep with skip-worktree file' ' - git update-index --no-skip-worktree 1 && - echo test > 1 && - git update-index 1 && - git update-index --skip-worktree 1 && - rm 1 && - test "$(git grep --no-ext-grep test)" = "1:test" -' - echo ":000000 100644 $ZERO_OID $EMPTY_BLOB A 1" > expected test_expect_success 'diff-index does not examine skip-worktree absent entries' ' setup_absent && @@ -141,11 +132,6 @@ test_expect_success 'diff-files does not examine skip-worktree dirty entries' ' test -z "$(git diff-files -- one)" ' -test_expect_success 'git-rm succeeds on skip-worktree absent entries' ' - setup_absent && - git rm 1 -' - test_expect_success 'commit on skip-worktree absent entries' ' git reset && setup_absent && diff --git a/t/t7012-skip-worktree-writing.sh b/t/t7012-skip-worktree-writing.sh index 7476781979..a1080b94e3 100755 --- a/t/t7012-skip-worktree-writing.sh +++ b/t/t7012-skip-worktree-writing.sh @@ -60,13 +60,6 @@ setup_absent() { git update-index --skip-worktree 1 } -test_absent() { - echo "100644 $EMPTY_BLOB 0 1" > expected && - git ls-files --stage 1 > result && - test_cmp expected result && - test ! -f 1 -} - setup_dirty() { git update-index --force-remove 1 && echo dirty > 1 && @@ -100,18 +93,6 @@ test_expect_success 'index setup' ' test_cmp expected result ' -test_expect_success 'git-add ignores worktree content' ' - setup_absent && - git add 1 && - test_absent -' - -test_expect_success 'git-add ignores worktree content' ' - setup_dirty && - git add 1 && - test_dirty -' - test_expect_success 'git-rm fails if worktree is dirty' ' setup_dirty && test_must_fail git rm 1 && @@ -125,13 +106,13 @@ EOF test_expect_success 'git-clean, absent case' ' setup_absent && git clean -n > result && - test_i18ncmp expected result + test_cmp expected result ' test_expect_success 'git-clean, dirty case' ' setup_dirty && git clean -n > result && - test_i18ncmp expected result + test_cmp expected result ' test_expect_success '--ignore-skip-worktree-entries leaves worktree alone' ' @@ -149,6 +130,94 @@ test_expect_success '--ignore-skip-worktree-entries leaves worktree alone' ' --diff-filter=D -- keep-me.t ' +test_expect_success 'stash restore in sparse checkout' ' + test_create_repo stash-restore && + ( + cd stash-restore && + + mkdir subdir && + echo A >subdir/A && + echo untouched >untouched && + echo removeme >removeme && + echo modified >modified && + git add . && + git commit -m Initial && + + echo AA >>subdir/A && + echo addme >addme && + echo tweaked >>modified && + rm removeme && + git add addme && + + git stash push && + + git sparse-checkout set subdir && + + # Ensure after sparse-checkout we only have expected files + cat >expect <<-EOF && + S modified + S removeme + H subdir/A + S untouched + EOF + git ls-files -t >actual && + test_cmp expect actual && + + test_path_is_missing addme && + test_path_is_missing modified && + test_path_is_missing removeme && + test_path_is_file subdir/A && + test_path_is_missing untouched && + + # Put a file in the working directory in the way + echo in the way >modified && + git stash apply && + + # Ensure stash vivifies modifies paths... + cat >expect <<-EOF && + H addme + H modified + H removeme + H subdir/A + S untouched + EOF + git ls-files -t >actual && + test_cmp expect actual && + + # ...and that the paths show up in status as changed... + cat >expect <<-EOF && + A addme + M modified + D removeme + M subdir/A + ?? actual + ?? expect + ?? modified.stash.XXXXXX + EOF + git status --porcelain | \ + sed -e s/stash......./stash.XXXXXX/ >actual && + test_cmp expect actual && + + # ...and that working directory reflects the files correctly + test_path_is_file addme && + test_path_is_file modified && + test_path_is_missing removeme && + test_path_is_file subdir/A && + test_path_is_missing untouched && + + # ...including that we have the expected "modified" file... + cat >expect <<-EOF && + modified + tweaked + EOF + test_cmp expect modified && + + # ...and that the other "modified" file is still present... + echo in the way >expect && + test_cmp expect modified.stash.* + ) +' + #TODO test_expect_failure 'git-apply adds file' false #TODO test_expect_failure 'git-apply updates file' false #TODO test_expect_failure 'git-apply removes file' false diff --git a/t/t7030-verify-tag.sh b/t/t7030-verify-tag.sh index 5c5bc32ccb..3cefde9602 100755 --- a/t/t7030-verify-tag.sh +++ b/t/t7030-verify-tag.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='signed tag tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" @@ -17,7 +20,7 @@ test_expect_success GPG 'create signed tags' ' echo 3 >elif && git add elif && test_tick && git commit -m "third on side" && - git checkout master && + git checkout main && test_tick && git merge -S side && git tag -s -m merge merge && diff --git a/t/t7060-wtstatus.sh b/t/t7060-wtstatus.sh index d5218743e9..0f4344c55e 100755 --- a/t/t7060-wtstatus.sh +++ b/t/t7060-wtstatus.sh @@ -2,6 +2,9 @@ test_description='basic work tree status reporting' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -51,11 +54,11 @@ EOF git checkout -b side HEAD^ && git rm foo && git commit -m delete && - test_must_fail git merge master && + test_must_fail git merge main && test_must_fail git commit --dry-run >../actual && - test_i18ncmp ../expect ../actual && + test_cmp ../expect ../actual && git status >../actual && - test_i18ncmp ../expect ../actual + test_cmp ../expect ../actual ) ' @@ -124,18 +127,18 @@ test_expect_success 'git diff-index --cached -C shows 2 copies + 1 unmerged' ' test_expect_success 'status when conflicts with add and rm advice (deleted by them)' ' git reset --hard && - git checkout master && + git checkout main && test_commit init main.txt init && git checkout -b second_branch && git rm main.txt && git commit -m "main.txt deleted on second_branch" && test_commit second conflict.txt second && - git checkout master && + git checkout main && test_commit on_second main.txt on_second && - test_commit master conflict.txt master && + test_commit main conflict.txt main && test_must_fail git merge second_branch && cat >expected <<\EOF && -On branch master +On branch main You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) @@ -148,7 +151,7 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -157,8 +160,8 @@ test_expect_success 'prepare for conflicts' ' git checkout -b conflict && test_commit one main.txt one && git branch conflict_second && - git mv main.txt sub_master.txt && - git commit -m "main.txt renamed in sub_master.txt" && + git mv main.txt sub_main.txt && + git commit -m "main.txt renamed in sub_main.txt" && git checkout conflict_second && git mv main.txt sub_second.txt && git commit -m "main.txt renamed in sub_second.txt" @@ -176,20 +179,20 @@ You have unmerged paths. Unmerged paths: (use "git add/rm <file>..." as appropriate to mark resolution) both deleted: main.txt - added by them: sub_master.txt + added by them: sub_main.txt added by us: sub_second.txt no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when conflicts with only rm advice (both deleted)' ' git reset --hard conflict_second && test_must_fail git merge conflict && - git add sub_master.txt && + git add sub_main.txt && git add sub_second.txt && cat >expected <<\EOF && On branch conflict_second @@ -198,7 +201,7 @@ You have unmerged paths. (use "git merge --abort" to abort the merge) Changes to be committed: - new file: sub_master.txt + new file: sub_main.txt Unmerged paths: (use "git rm <file>..." to mark resolution) @@ -207,14 +210,14 @@ Unmerged paths: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual && + test_cmp expected actual && git reset --hard && - git checkout master + git checkout main ' test_expect_success 'status --branch with detached HEAD' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && git status --branch --porcelain >actual && cat >expected <<-EOF && ## HEAD (no branch) @@ -224,13 +227,13 @@ test_expect_success 'status --branch with detached HEAD' ' ?? expected ?? mdconflict/ EOF - test_i18ncmp expected actual + test_cmp expected actual ' ## Duplicate the above test and verify --porcelain=v1 arg parsing. test_expect_success 'status --porcelain=v1 --branch with detached HEAD' ' git reset --hard && - git checkout master^0 && + git checkout main^0 && git status --branch --porcelain=v1 >actual && cat >expected <<-EOF && ## HEAD (no branch) @@ -240,7 +243,7 @@ test_expect_success 'status --porcelain=v1 --branch with detached HEAD' ' ?? expected ?? mdconflict/ EOF - test_i18ncmp expected actual + test_cmp expected actual ' ## Verify parser error on invalid --porcelain argument. diff --git a/t/t7063-status-untracked-cache.sh b/t/t7063-status-untracked-cache.sh index a682a3d826..a0c123b0a7 100755 --- a/t/t7063-status-untracked-cache.sh +++ b/t/t7063-status-untracked-cache.sh @@ -2,6 +2,9 @@ test_description='test untracked cache' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # On some filesystems (e.g. FreeBSD's ext2 and ufs) directory mtime @@ -54,6 +57,20 @@ iuc () { return $ret } +get_relevant_traces () { + # From the GIT_TRACE2_PERF data of the form + # $TIME $FILE:$LINE | d0 | main | data | r1 | ? | ? | read_directo | $RELEVANT_STAT + # extract the $RELEVANT_STAT fields. We don't care about region_enter + # or region_leave, or stats for things outside read_directory. + INPUT_FILE=$1 + OUTPUT_FILE=$2 + grep data.*read_directo $INPUT_FILE | + cut -d "|" -f 9 | + grep -v visited \ + >"$OUTPUT_FILE" +} + + test_lazy_prereq UNTRACKED_CACHE ' { git update-index --test-untracked-cache; ret=$?; } && test $ret -ne 1 @@ -126,19 +143,21 @@ EOF test_expect_success 'status first time (empty cache)' ' avoid_racy && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 3 -gitignore invalidation: 1 -directory invalidation: 0 -opendir: 4 + ....path: + ....node-creation:3 + ....gitignore-invalidation:1 + ....directory-invalidation:0 + ....opendir:4 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'untracked cache after first status' ' @@ -148,19 +167,21 @@ test_expect_success 'untracked cache after first status' ' test_expect_success 'status second time (fully populated cache)' ' avoid_racy && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 0 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:0 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'untracked cache after second status' ' @@ -171,8 +192,8 @@ test_expect_success 'untracked cache after second status' ' test_expect_success 'modify in root directory, one dir invalidation' ' avoid_racy && : >four && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -186,13 +207,15 @@ A two EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 1 -opendir: 1 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:1 + ....opendir:1 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' @@ -220,8 +243,8 @@ EOF test_expect_success 'new .gitignore invalidates recursively' ' avoid_racy && echo four >.gitignore && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -235,13 +258,15 @@ A two EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 1 -directory invalidation: 1 -opendir: 4 + ....path: + ....node-creation:0 + ....gitignore-invalidation:1 + ....directory-invalidation:1 + ....opendir:4 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' @@ -269,8 +294,8 @@ EOF test_expect_success 'new info/exclude invalidates everything' ' avoid_racy && echo three >>.git/info/exclude && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -282,13 +307,15 @@ A two EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 1 -directory invalidation: 0 -opendir: 4 + ....path: + ....node-creation:0 + ....gitignore-invalidation:1 + ....directory-invalidation:0 + ....opendir:4 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'verify untracked cache dump' ' @@ -327,8 +354,8 @@ EOF ' test_expect_success 'status after the move' ' - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -340,13 +367,15 @@ A one EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 1 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:1 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'verify untracked cache dump' ' @@ -386,8 +415,8 @@ EOF ' test_expect_success 'status after the move' ' - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -399,13 +428,15 @@ A two EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 1 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:1 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'verify untracked cache dump' ' @@ -435,8 +466,8 @@ test_expect_success 'set up for sparse checkout testing' ' ' test_expect_success 'status after commit' ' - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -445,13 +476,15 @@ test_expect_success 'status after commit' ' EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 2 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:2 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'untracked cache correct after commit' ' @@ -475,7 +508,7 @@ EOF test_expect_success 'set up sparse checkout' ' echo "done/[a-z]*" >.git/info/sparse-checkout && test_config core.sparsecheckout true && - git checkout master && + git checkout main && git update-index --force-untracked-cache && git status --porcelain >/dev/null && # prime the cache test_path_is_missing done/.gitignore && @@ -493,9 +526,9 @@ test_expect_success 'create/modify files, some of which are gitignored' ' ' test_expect_success 'test sparse status with untracked cache' ' - : >../trace && + : >../trace.output && avoid_racy && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -506,13 +539,15 @@ test_expect_success 'test sparse status with untracked cache' ' EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../status.actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 1 -directory invalidation: 2 -opendir: 2 + ....path: + ....node-creation:0 + ....gitignore-invalidation:1 + ....directory-invalidation:2 + ....opendir:2 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'untracked cache correct after status' ' @@ -536,8 +571,8 @@ EOF test_expect_success 'test sparse status again with untracked cache' ' avoid_racy && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -548,13 +583,15 @@ test_expect_success 'test sparse status again with untracked cache' ' EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../status.actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 0 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:0 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'set up for test of subdir and sparse checkouts' ' @@ -565,8 +602,8 @@ test_expect_success 'set up for test of subdir and sparse checkouts' ' test_expect_success 'test sparse status with untracked cache and subdir' ' avoid_racy && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && cat >../status.expect <<EOF && @@ -578,13 +615,15 @@ test_expect_success 'test sparse status with untracked cache and subdir' ' EOF test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../status.actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 2 -gitignore invalidation: 0 -directory invalidation: 1 -opendir: 3 + ....path: + ....node-creation:2 + ....gitignore-invalidation:0 + ....directory-invalidation:1 + ....opendir:3 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'verify untracked cache dump (sparse/subdirs)' ' @@ -613,19 +652,21 @@ EOF test_expect_success 'test sparse status again with untracked cache and subdir' ' avoid_racy && - : >../trace && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ + : >../trace.output && + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && test_cmp ../status.expect ../status.iuc && test_cmp ../status.expect ../status.actual && + get_relevant_traces ../trace.output ../trace.relevant && cat >../trace.expect <<EOF && -node creation: 0 -gitignore invalidation: 0 -directory invalidation: 0 -opendir: 0 + ....path: + ....node-creation:0 + ....gitignore-invalidation:0 + ....directory-invalidation:0 + ....opendir:0 EOF - test_cmp ../trace.expect ../trace + test_cmp ../trace.expect ../trace.relevant ' test_expect_success 'move entry in subdir from untracked to cached' ' @@ -728,19 +769,19 @@ test_expect_success 'test ident field is working' ' cp -R done dthree dtwo four three ../other_worktree && GIT_WORK_TREE=../other_worktree git status 2>../err && echo "warning: untracked cache is disabled on this system or location" >../expect && - test_i18ncmp ../expect ../err + test_cmp ../expect ../err ' test_expect_success 'untracked cache survives a checkout' ' git commit --allow-empty -m empty && test-tool dump-untracked-cache >../before && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout -b other_branch && test-tool dump-untracked-cache >../after && test_cmp ../before ../after && test_commit test && test-tool dump-untracked-cache >../before && - git checkout master && + git checkout main && test-tool dump-untracked-cache >../after && test_cmp ../before ../after ' @@ -775,7 +816,7 @@ test_expect_success SYMLINKS '"status" after symlink replacement should be clean git checkout HEAD~ && status_is_clean && status_is_clean && - git checkout master && + git checkout main && avoid_racy && status_is_clean && status_is_clean @@ -786,7 +827,7 @@ test_expect_success SYMLINKS '"status" after symlink replacement should be clean git checkout HEAD~ && status_is_clean && status_is_clean && - git checkout master && + git checkout main && avoid_racy && status_is_clean && status_is_clean @@ -810,7 +851,7 @@ test_expect_success '"status" after file replacement should be clean with UC=tru git checkout HEAD~ && status_is_clean && status_is_clean && - git checkout master && + git checkout main && avoid_racy && status_is_clean && test-tool dump-untracked-cache >../actual && @@ -828,7 +869,7 @@ test_expect_success '"status" after file replacement should be clean with UC=fal git checkout HEAD~ && status_is_clean && status_is_clean && - git checkout master && + git checkout main && avoid_racy && status_is_clean && status_is_clean diff --git a/t/t7064-wtstatus-pv2.sh b/t/t7064-wtstatus-pv2.sh index 537787e598..4613882caf 100755 --- a/t/t7064-wtstatus-pv2.sh +++ b/t/t7064-wtstatus-pv2.sh @@ -5,10 +5,14 @@ test_description='git status --porcelain=v2 This test exercises porcelain V2 output for git status.' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' + git checkout -f --orphan initial-branch && test_tick && git config core.autocrlf false && echo x >file_x && @@ -22,7 +26,7 @@ test_expect_success setup ' test_expect_success 'before initial commit, nothing added, only untracked' ' cat >expect <<-EOF && # branch.oid (initial) - # branch.head master + # branch.head initial-branch ? actual ? dir1/ ? expect @@ -45,7 +49,7 @@ test_expect_success 'before initial commit, things added' ' cat >expect <<-EOF && # branch.oid (initial) - # branch.head master + # branch.head initial-branch 1 A. N... 000000 100644 100644 $ZERO_OID $OID_A dir1/file_a 1 A. N... 000000 100644 100644 $ZERO_OID $OID_B dir1/file_b 1 A. N... 000000 100644 100644 $ZERO_OID $OID_X file_x @@ -62,7 +66,7 @@ test_expect_success 'before initial commit, things added' ' test_expect_success 'before initial commit, things added (-z)' ' lf_to_nul >expect <<-EOF && # branch.oid (initial) - # branch.head master + # branch.head initial-branch 1 A. N... 000000 100644 100644 $ZERO_OID $OID_A dir1/file_a 1 A. N... 000000 100644 100644 $ZERO_OID $OID_B dir1/file_b 1 A. N... 000000 100644 100644 $ZERO_OID $OID_X file_x @@ -81,7 +85,7 @@ test_expect_success 'make first commit, comfirm HEAD oid and branch' ' H0=$(git rev-parse HEAD) && cat >expect <<-EOF && # branch.oid $H0 - # branch.head master + # branch.head initial-branch ? actual ? expect EOF @@ -98,7 +102,7 @@ test_expect_success 'after first commit, create unstaged changes' ' cat >expect <<-EOF && # branch.oid $H0 - # branch.head master + # branch.head initial-branch 1 .M N... 100644 100644 100644 $OID_X $OID_X file_x 1 .D N... 100644 100644 000000 $OID_Z $OID_Z file_z ? actual @@ -126,7 +130,7 @@ test_expect_success 'after first commit, stage existing changes' ' cat >expect <<-EOF && # branch.oid $H0 - # branch.head master + # branch.head initial-branch 1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x 1 D. N... 100644 000000 000000 $OID_Z $ZERO_OID file_z ? actual @@ -143,7 +147,7 @@ test_expect_success 'rename causes 2 path lines' ' q_to_tab >expect <<-EOF && # branch.oid $H0 - # branch.head master + # branch.head initial-branch 1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x 1 D. N... 100644 000000 000000 $OID_Z $ZERO_OID file_z 2 R. N... 100644 100644 100644 $OID_Y $OID_Y R100 renamed_yQfile_y @@ -161,7 +165,7 @@ test_expect_success 'rename causes 2 path lines (-z)' ' ## Lines use NUL path separator and line terminator, so double transform here. q_to_nul <<-EOF | lf_to_nul >expect && # branch.oid $H0 - # branch.head master + # branch.head initial-branch 1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x 1 D. N... 100644 000000 000000 $OID_Z $ZERO_OID file_z 2 R. N... 100644 100644 100644 $OID_Y $OID_Y R100 renamed_yQfile_y @@ -179,7 +183,7 @@ test_expect_success 'make second commit, confirm clean and new HEAD oid' ' cat >expect <<-EOF && # branch.oid $H1 - # branch.head master + # branch.head initial-branch ? actual ? expect EOF @@ -231,7 +235,7 @@ test_expect_success 'create and commit permanent ignore file' ' cat >expect <<-EOF && # branch.oid $H1 - # branch.head master + # branch.head initial-branch EOF git status --porcelain=v2 --branch >actual && @@ -257,14 +261,14 @@ test_expect_success 'verify --intent-to-add output' ' test_expect_success 'verify AA (add-add) conflict' ' test_when_finished "git reset --hard" && - git branch AA_A master && + git branch AA_A initial-branch && git checkout AA_A && echo "Branch AA_A" >conflict.txt && OID_AA_A=$(git hash-object -t blob -- conflict.txt) && git add conflict.txt && git commit -m "branch aa_a" && - git branch AA_B master && + git branch AA_B initial-branch && git checkout AA_B && echo "Branch AA_B" >conflict.txt && OID_AA_B=$(git hash-object -t blob -- conflict.txt) && @@ -290,7 +294,7 @@ test_expect_success 'verify AA (add-add) conflict' ' test_expect_success 'verify UU (edit-edit) conflict' ' test_when_finished "git reset --hard" && - git branch UU_ANC master && + git branch UU_ANC initial-branch && git checkout UU_ANC && echo "Ancestor" >conflict.txt && OID_UU_ANC=$(git hash-object -t blob -- conflict.txt) && @@ -328,18 +332,18 @@ test_expect_success 'verify UU (edit-edit) conflict' ' ' test_expect_success 'verify upstream fields in branch header' ' - git checkout master && + git checkout initial-branch && test_when_finished "rm -rf sub_repo" && git clone . sub_repo && ( - ## Confirm local master tracks remote master. + ## Confirm local initial-branch tracks remote initial-branch. cd sub_repo && HUF=$(git rev-parse HEAD) && cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 EOF @@ -355,8 +359,8 @@ test_expect_success 'verify upstream fields in branch header' ' cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +1 -0 EOF @@ -367,9 +371,9 @@ test_expect_success 'verify upstream fields in branch header' ' git status --porcelain=v2 --untracked-files=all >actual && test_must_be_empty actual && - ## Test upstream-gone case. Fake this by pointing origin/master at - ## a non-existing commit. - OLD=$(git rev-parse origin/master) && + ## Test upstream-gone case. Fake this by pointing + ## origin/initial-branch at a non-existing commit. + OLD=$(git rev-parse origin/initial-branch) && NEW=$ZERO_OID && mv .git/packed-refs .git/old-packed-refs && sed "s/$OLD/$NEW/g" <.git/old-packed-refs >.git/packed-refs && @@ -378,8 +382,8 @@ test_expect_success 'verify upstream fields in branch header' ' cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch EOF git status --porcelain=v2 --branch --untracked-files=all >actual && @@ -388,19 +392,19 @@ test_expect_success 'verify upstream fields in branch header' ' ' test_expect_success 'verify --[no-]ahead-behind with V2 format' ' - git checkout master && + git checkout initial-branch && test_when_finished "rm -rf sub_repo" && git clone . sub_repo && ( - ## Confirm local master tracks remote master. + ## Confirm local initial-branch tracks remote initial-branch. cd sub_repo && HUF=$(git rev-parse HEAD) && # Confirm --no-ahead-behind reports traditional branch.ab with 0/0 for equal branches. cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 EOF @@ -410,8 +414,8 @@ test_expect_success 'verify --[no-]ahead-behind with V2 format' ' # Confirm --ahead-behind reports traditional branch.ab with 0/0. cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 EOF @@ -428,8 +432,8 @@ test_expect_success 'verify --[no-]ahead-behind with V2 format' ' # Confirm --no-ahead-behind reports branch.ab with ?/? for non-equal branches. cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +? -? EOF @@ -439,8 +443,8 @@ test_expect_success 'verify --[no-]ahead-behind with V2 format' ' # Confirm --ahead-behind reports traditional branch.ab with 1/0. cat >expect <<-EOF && # branch.oid $HUF - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +1 -0 EOF @@ -458,7 +462,7 @@ test_expect_success 'verify --[no-]ahead-behind with V2 format' ' ' test_expect_success 'create and add submodule, submodule appears clean (A. S...)' ' - git checkout master && + git checkout initial-branch && git clone . sub_repo && git clone . super_repo && ( cd super_repo && @@ -471,8 +475,8 @@ test_expect_success 'create and add submodule, submodule appears clean (A. S...) cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 A. S... 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -496,8 +500,8 @@ test_expect_success 'untracked changes in added submodule (AM S..U)' ' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 AM S..U 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -521,8 +525,8 @@ test_expect_success 'staged changes in added submodule (AM S.M.)' ' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 AM S.M. 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -548,8 +552,8 @@ test_expect_success 'staged and unstaged changes in added (AM S.M.)' ' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 AM S.M. 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -575,8 +579,8 @@ test_expect_success 'staged and untracked changes in added submodule (AM S.MU)' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 AM S.MU 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -602,8 +606,8 @@ test_expect_success 'commit within the submodule appears as new commit in super cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +0 -0 1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules 1 AM SC.. 000000 160000 160000 $ZERO_OID $HSUB sub1 @@ -625,8 +629,8 @@ test_expect_success 'stage submodule in super and commit' ' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +1 -0 EOF @@ -646,8 +650,8 @@ test_expect_success 'make unstaged changes in existing submodule (.M S.M.)' ' cat >expect <<-EOF && # branch.oid $HSUP - # branch.head master - # branch.upstream origin/master + # branch.head initial-branch + # branch.upstream origin/initial-branch # branch.ab +1 -0 1 .M S.M. 160000 160000 160000 $HSUB $HSUB sub1 EOF diff --git a/t/t7101-reset-empty-subdirs.sh b/t/t7101-reset-empty-subdirs.sh index 96e163f084..bfce05ac5d 100755 --- a/t/t7101-reset-empty-subdirs.sh +++ b/t/t7101-reset-empty-subdirs.sh @@ -6,16 +6,15 @@ test_description='git reset should cull empty subdirs' . ./test-lib.sh -test_expect_success \ - 'creating initial files' \ - 'mkdir path0 && +test_expect_success 'creating initial files' ' + mkdir path0 && cp "$TEST_DIRECTORY"/../COPYING path0/COPYING && git add path0/COPYING && - git commit -m add -a' + git commit -m add -a +' -test_expect_success \ - 'creating second files' \ - 'mkdir path1 && +test_expect_success 'creating second files' ' + mkdir path1 && mkdir path1/path2 && cp "$TEST_DIRECTORY"/../COPYING path1/path2/COPYING && cp "$TEST_DIRECTORY"/../COPYING path1/COPYING && @@ -25,39 +24,40 @@ test_expect_success \ git add path1/COPYING && git add COPYING && git add path0/COPYING-TOO && - git commit -m change -a' + git commit -m change -a +' -test_expect_success \ - 'resetting tree HEAD^' \ - 'git reset --hard HEAD^' +test_expect_success 'resetting tree HEAD^' ' + git reset --hard HEAD^ +' -test_expect_success \ - 'checking initial files exist after rewind' \ - 'test -d path0 && - test -f path0/COPYING' +test_expect_success 'checking initial files exist after rewind' ' + test -d path0 && + test -f path0/COPYING +' -test_expect_success \ - 'checking lack of path1/path2/COPYING' \ - '! test -f path1/path2/COPYING' +test_expect_success 'checking lack of path1/path2/COPYING' ' + ! test -f path1/path2/COPYING +' -test_expect_success \ - 'checking lack of path1/COPYING' \ - '! test -f path1/COPYING' +test_expect_success 'checking lack of path1/COPYING' ' + ! test -f path1/COPYING +' -test_expect_success \ - 'checking lack of COPYING' \ - '! test -f COPYING' +test_expect_success 'checking lack of COPYING' ' + ! test -f COPYING +' -test_expect_success \ - 'checking checking lack of path1/COPYING-TOO' \ - '! test -f path0/COPYING-TOO' +test_expect_success 'checking checking lack of path1/COPYING-TOO' ' + ! test -f path0/COPYING-TOO +' -test_expect_success \ - 'checking lack of path1/path2' \ - '! test -d path1/path2' +test_expect_success 'checking lack of path1/path2' ' + ! test -d path1/path2 +' -test_expect_success \ - 'checking lack of path1' \ - '! test -d path1' +test_expect_success 'checking lack of path1' ' + ! test -d path1 +' test_done diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh index 22161b3b2d..601b2bf97f 100755 --- a/t/t7102-reset.sh +++ b/t/t7102-reset.sh @@ -7,6 +7,9 @@ test_description='git reset Documented tests for git reset' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh commit_msg () { @@ -70,27 +73,27 @@ check_changes () { test_expect_success 'reset --hard message' ' hex=$(git log -1 --format="%h") && - git reset --hard > .actual && - echo HEAD is now at $hex $(commit_msg) > .expected && - test_i18ncmp .expected .actual + git reset --hard >.actual && + echo HEAD is now at $hex $(commit_msg) >.expected && + test_cmp .expected .actual ' test_expect_success 'reset --hard message (ISO8859-1 logoutputencoding)' ' hex=$(git log -1 --format="%h") && - git -c "i18n.logOutputEncoding=$test_encoding" reset --hard > .actual && - echo HEAD is now at $hex $(commit_msg $test_encoding) > .expected && - test_i18ncmp .expected .actual + git -c "i18n.logOutputEncoding=$test_encoding" reset --hard >.actual && + echo HEAD is now at $hex $(commit_msg $test_encoding) >.expected && + test_cmp .expected .actual ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF - test_expect_success 'giving a non existing revision should fail' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF + test_must_fail git reset aaaaaa && test_must_fail git reset --mixed aaaaaa && test_must_fail git reset --soft aaaaaa && @@ -107,8 +110,7 @@ test_expect_success 'reset --soft with unmerged index should fail' ' git rm --cached -- un ' -test_expect_success \ - 'giving paths with options different than --mixed should fail' ' +test_expect_success 'giving paths with options different than --mixed should fail' ' test_must_fail git reset --soft -- first && test_must_fail git reset --hard -- first && test_must_fail git reset --soft HEAD^ -- first && @@ -128,8 +130,7 @@ test_expect_success 'giving unrecognized options should fail' ' check_changes $head5 ' -test_expect_success \ - 'trying to do reset --soft with pending merge should fail' ' +test_expect_success 'trying to do reset --soft with pending merge should fail' ' git branch branch1 && git branch branch2 && @@ -147,13 +148,12 @@ test_expect_success \ printf "1st line 2nd file\n2nd line 2nd file\n3rd line" >secondfile && git commit -a -m "the change in branch2" && - git checkout master && + git checkout main && git branch -D branch1 branch2 && check_changes $head5 ' -test_expect_success \ - 'trying to do reset --soft with pending checkout merge should fail' ' +test_expect_success 'trying to do reset --soft with pending checkout merge should fail' ' git branch branch3 && git branch branch4 && @@ -170,13 +170,12 @@ test_expect_success \ printf "1st line 2nd file\n2nd line 2nd file\n3rd line" >secondfile && git commit -a -m "the line in branch3" && - git checkout master && + git checkout main && git branch -D branch3 branch4 && check_changes $head5 ' -test_expect_success \ - 'resetting to HEAD with no changes should succeed and do nothing' ' +test_expect_success 'resetting to HEAD with no changes should succeed and do nothing' ' git reset --hard && check_changes $head5 && git reset --hard HEAD && @@ -195,39 +194,38 @@ test_expect_success \ check_changes $head5 ' ->.diff_expect -cat >.cached_expect <<EOF -diff --git a/secondfile b/secondfile -index $head5p1s..$head5s 100644 ---- a/secondfile -+++ b/secondfile -@@ -1 +1,2 @@ --2nd file -+1st line 2nd file -+2nd line 2nd file -EOF -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF test_expect_success '--soft reset only should show changes in diff --cached' ' + >.diff_expect && + cat >.cached_expect <<-EOF && + diff --git a/secondfile b/secondfile + index $head5p1s..$head5s 100644 + --- a/secondfile + +++ b/secondfile + @@ -1 +1,2 @@ + -2nd file + +1st line 2nd file + +2nd line 2nd file + EOF + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF git reset --soft HEAD^ && check_changes $head5p1 && test "$(git rev-parse ORIG_HEAD)" = \ $head5 ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -3rd line 2nd file -EOF -test_expect_success \ - 'changing files and redo the last commit should succeed' ' +test_expect_success 'changing files and redo the last commit should succeed' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + 3rd line 2nd file + EOF echo "3rd line 2nd file" >>secondfile && git commit -a -C ORIG_HEAD && head4=$(git rev-parse --verify HEAD) && @@ -236,56 +234,54 @@ test_expect_success \ $head5 ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -first: -1st file -2nd line 1st file -second: -2nd file -EOF -test_expect_success \ - '--hard reset should change the files and undo commits permanently' ' +test_expect_success '--hard reset should change the files and undo commits permanently' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + first: + 1st file + 2nd line 1st file + second: + 2nd file + EOF git reset --hard HEAD~2 && check_changes $head5p2 && test "$(git rev-parse ORIG_HEAD)" = \ $head4 ' ->.diff_expect -cat >.cached_expect <<EOF -diff --git a/first b/first -deleted file mode 100644 -index $head5p2f..0000000 ---- a/first -+++ /dev/null -@@ -1,2 +0,0 @@ --1st file --2nd line 1st file -diff --git a/second b/second -deleted file mode 100644 -index $head5p1s..0000000 ---- a/second -+++ /dev/null -@@ -1 +0,0 @@ --2nd file -diff --git a/secondfile b/secondfile -new file mode 100644 -index 0000000..$head5s ---- /dev/null -+++ b/secondfile -@@ -0,0 +1,2 @@ -+1st line 2nd file -+2nd line 2nd file -EOF -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF -test_expect_success \ - 'redoing changes adding them without commit them should succeed' ' +test_expect_success 'redoing changes adding them without commit them should succeed' ' + >.diff_expect && + cat >.cached_expect <<-EOF && + diff --git a/first b/first + deleted file mode 100644 + index $head5p2f..0000000 + --- a/first + +++ /dev/null + @@ -1,2 +0,0 @@ + -1st file + -2nd line 1st file + diff --git a/second b/second + deleted file mode 100644 + index $head5p1s..0000000 + --- a/second + +++ /dev/null + @@ -1 +0,0 @@ + -2nd file + diff --git a/secondfile b/secondfile + new file mode 100644 + index 0000000..$head5s + --- /dev/null + +++ b/secondfile + @@ -0,0 +1,2 @@ + +1st line 2nd file + +2nd line 2nd file + EOF + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF git rm first && git mv second secondfile && @@ -295,46 +291,45 @@ test_expect_success \ check_changes $head5p2 ' -cat >.diff_expect <<EOF -diff --git a/first b/first -deleted file mode 100644 -index $head5p2f..0000000 ---- a/first -+++ /dev/null -@@ -1,2 +0,0 @@ --1st file --2nd line 1st file -diff --git a/second b/second -deleted file mode 100644 -index $head5p1s..0000000 ---- a/second -+++ /dev/null -@@ -1 +0,0 @@ --2nd file -EOF ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF test_expect_success '--mixed reset to HEAD should unadd the files' ' + cat >.diff_expect <<-EOF && + diff --git a/first b/first + deleted file mode 100644 + index $head5p2f..0000000 + --- a/first + +++ /dev/null + @@ -1,2 +0,0 @@ + -1st file + -2nd line 1st file + diff --git a/second b/second + deleted file mode 100644 + index $head5p1s..0000000 + --- a/second + +++ /dev/null + @@ -1 +0,0 @@ + -2nd file + EOF + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF git reset && check_changes $head5p2 && test "$(git rev-parse ORIG_HEAD)" = $head5p2 ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF test_expect_success 'redoing the last two commits should succeed' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF git add secondfile && git reset --hard $head5p2 && - git rm first && git mv second secondfile && git commit -a -m "remove 1st and rename 2nd" && @@ -347,15 +342,15 @@ test_expect_success 'redoing the last two commits should succeed' ' check_changes $head5 ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -3rd line in branch2 -EOF test_expect_success '--hard reset to HEAD should clear a failed merge' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + 3rd line in branch2 + EOF git branch branch1 && git branch branch2 && @@ -373,15 +368,14 @@ test_expect_success '--hard reset to HEAD should clear a failed merge' ' check_changes $head3 ' ->.diff_expect ->.cached_expect -cat >.cat_expect <<EOF -secondfile: -1st line 2nd file -2nd line 2nd file -EOF -test_expect_success \ - '--hard reset to ORIG_HEAD should clear a fast-forward merge' ' +test_expect_success '--hard reset to ORIG_HEAD should clear a fast-forward merge' ' + >.diff_expect && + >.cached_expect && + cat >.cat_expect <<-\EOF && + secondfile: + 1st line 2nd file + 2nd line 2nd file + EOF git reset --hard HEAD^ && check_changes $head5 && @@ -389,31 +383,31 @@ test_expect_success \ git reset --hard ORIG_HEAD && check_changes $head5 && - git checkout master && + git checkout main && git branch -D branch1 branch2 && check_changes $head5 ' test_expect_success 'test --mixed <paths>' ' - echo 1 > file1 && - echo 2 > file2 && + echo 1 >file1 && + echo 2 >file2 && git add file1 file2 && test_tick && git commit -m files && before1=$(git rev-parse --short HEAD:file1) && before2=$(git rev-parse --short HEAD:file2) && git rm file2 && - echo 3 > file3 && - echo 4 > file4 && - echo 5 > file1 && + echo 3 >file3 && + echo 4 >file4 && + echo 5 >file1 && after1=$(git rev-parse --short $(git hash-object file1)) && after4=$(git rev-parse --short $(git hash-object file4)) && git add file1 file3 file4 && git reset HEAD -- file1 file2 file3 && test_must_fail git diff --quiet && - git diff > output && + git diff >output && - cat > expect <<-EOF && + cat >expect <<-EOF && diff --git a/file1 b/file1 index $before1..$after1 100644 --- a/file1 @@ -431,9 +425,9 @@ test_expect_success 'test --mixed <paths>' ' EOF test_cmp expect output && - git diff --cached > output && + git diff --cached >output && - cat > cached_expect <<-EOF && + cat >cached_expect <<-EOF && diff --git a/file4 b/file4 new file mode 100644 index 0000000..$after4 @@ -447,7 +441,6 @@ test_expect_success 'test --mixed <paths>' ' ' test_expect_success 'test resetting the index at give paths' ' - mkdir sub && >sub/file1 && >sub/file2 && @@ -460,7 +453,6 @@ test_expect_success 'test resetting the index at give paths' ' echo "$U" && test_must_fail git diff-index --cached --exit-code "$T" && test "$T" != "$U" - ' test_expect_success 'resetting an unmodified path is a no-op' ' @@ -470,15 +462,14 @@ test_expect_success 'resetting an unmodified path is a no-op' ' git diff-index --cached --exit-code HEAD ' -cat > expect << EOF -Unstaged changes after reset: -M file2 -EOF - test_expect_success '--mixed refreshes the index' ' - echo 123 >> file2 && - git reset --mixed HEAD > output && - test_i18ncmp expect output + cat >expect <<-\EOF && + Unstaged changes after reset: + M file2 + EOF + echo 123 >>file2 && + git reset --mixed HEAD >output && + test_cmp expect output ' test_expect_success 'resetting specific path that is unmerged' ' @@ -498,7 +489,6 @@ test_expect_success 'resetting specific path that is unmerged' ' ' test_expect_success 'disambiguation (1)' ' - git reset --hard && >secondfile && git add secondfile && @@ -507,11 +497,9 @@ test_expect_success 'disambiguation (1)' ' test -z "$(git diff --cached --name-only)" && test -f secondfile && test_must_be_empty secondfile - ' test_expect_success 'disambiguation (2)' ' - git reset --hard && >secondfile && git add secondfile && @@ -519,11 +507,9 @@ test_expect_success 'disambiguation (2)' ' test_must_fail git reset secondfile && test -n "$(git diff --cached --name-only -- secondfile)" && test ! -f secondfile - ' test_expect_success 'disambiguation (3)' ' - git reset --hard && >secondfile && git add secondfile && @@ -532,11 +518,9 @@ test_expect_success 'disambiguation (3)' ' test_must_fail git diff --quiet && test -z "$(git diff --cached --name-only)" && test ! -f secondfile - ' test_expect_success 'disambiguation (4)' ' - git reset --hard && >secondfile && git add secondfile && diff --git a/t/t7104-reset-hard.sh b/t/t7104-reset-hard.sh index 16faa07813..7948ec392b 100755 --- a/t/t7104-reset-hard.sh +++ b/t/t7104-reset-hard.sh @@ -33,7 +33,7 @@ test_expect_success 'reset --hard should restore unmerged ones' ' ' -test_expect_success 'reset --hard did not corrupt index or cached-tree' ' +test_expect_success 'reset --hard did not corrupt index or cache-tree' ' T=$(git write-tree) && rm -f .git/index && diff --git a/t/t7113-post-index-change-hook.sh b/t/t7113-post-index-change-hook.sh index f011ad7eec..688fa995c9 100755 --- a/t/t7113-post-index-change-hook.sh +++ b/t/t7113-post-index-change-hook.sh @@ -2,6 +2,9 @@ test_description='post index change hook' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -85,7 +88,7 @@ test_expect_success 'test checkout and reset trigger the hook' ' EOF : force index to be dirty && test-tool chmtime +60 dir1/file1.txt && - git checkout master && + git checkout main && test_path_is_file testsuccess && rm -f testsuccess && test_path_is_missing testfailure && test-tool chmtime +60 dir1/file1.txt && diff --git a/t/t7201-co.sh b/t/t7201-co.sh index 4d62b9b00f..7f6e23a4bb 100755 --- a/t/t7201-co.sh +++ b/t/t7201-co.sh @@ -5,10 +5,10 @@ test_description='git checkout tests. -Creates master, forks renamer and side branches from it. +Creates main, forks renamer and side branches from it. Test switching across them. - ! [master] Initial A one, A two + ! [main] Initial A one, A two * [renamer] Renamer R one->uno, M two ! [side] Side M one, D two, A three ! [simple] Simple D one, M two @@ -16,10 +16,13 @@ Test switching across them. + [simple] Simple D one, M two + [side] Side M one, D two, A three * [renamer] Renamer R one->uno, M two - +*++ [master] Initial A one, A two + +*++ [main] Initial A one, A two ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_tick @@ -33,8 +36,7 @@ fill () { test_expect_success setup ' - - fill x y z > same && + fill x y z >same && fill 1 2 3 4 5 6 7 8 >one && fill a b c d e >two && git add same one two && @@ -47,32 +49,30 @@ test_expect_success setup ' fill a b c d e f >two && git commit -a -m "Renamer R one->uno, M two" && - git checkout -b side master && + git checkout -b side main && fill 1 2 3 4 5 6 7 >one && fill A B C D E >three && rm -f two && git update-index --add --remove one two three && git commit -m "Side M one, D two, A three" && - git checkout -b simple master && + git checkout -b simple main && rm -f one && - fill a c e > two && + fill a c e >two && git commit -a -m "Simple D one, M two" && - git checkout master + git checkout main ' -test_expect_success "checkout from non-existing branch" ' - - git checkout -b delete-me master && +test_expect_success 'checkout from non-existing branch' ' + git checkout -b delete-me main && git update-ref -d --no-deref refs/heads/delete-me && test refs/heads/delete-me = "$(git symbolic-ref HEAD)" && - git checkout master && - test refs/heads/master = "$(git symbolic-ref HEAD)" + git checkout main && + test refs/heads/main = "$(git symbolic-ref HEAD)" ' -test_expect_success "checkout with dirty tree without -m" ' - +test_expect_success 'checkout with dirty tree without -m' ' fill 0 1 2 3 4 5 6 7 8 >one && if git checkout side then @@ -81,12 +81,10 @@ test_expect_success "checkout with dirty tree without -m" ' else echo "happy - failed correctly" fi - ' -test_expect_success "checkout with unrelated dirty tree without -m" ' - - git checkout -f master && +test_expect_success 'checkout with unrelated dirty tree without -m' ' + git checkout -f main && fill 0 1 2 3 4 5 6 7 8 >same && cp same kept && git checkout side >messages && @@ -95,22 +93,21 @@ test_expect_success "checkout with unrelated dirty tree without -m" ' test_cmp messages.expect messages ' -test_expect_success "checkout -m with dirty tree" ' - - git checkout -f master && +test_expect_success 'checkout -m with dirty tree' ' + git checkout -f main && git clean -f && fill 0 1 2 3 4 5 6 7 8 >one && - git checkout -m side > messages && + git checkout -m side >messages && test "$(git symbolic-ref HEAD)" = "refs/heads/side" && printf "M\t%s\n" one >expect.messages && test_cmp expect.messages messages && - fill "M one" "A three" "D two" >expect.master && - git diff --name-status master >current.master && - test_cmp expect.master current.master && + fill "M one" "A three" "D two" >expect.main && + git diff --name-status main >current.main && + test_cmp expect.main current.main && fill "M one" >expect.side && git diff --name-status side >current.side && @@ -120,9 +117,8 @@ test_expect_success "checkout -m with dirty tree" ' test_must_be_empty current.index ' -test_expect_success "checkout -m with dirty tree, renamed" ' - - git checkout -f master && git clean -f && +test_expect_success 'checkout -m with dirty tree, renamed' ' + git checkout -f main && git clean -f && fill 1 2 3 4 5 7 8 >one && if git checkout renamer @@ -139,12 +135,10 @@ test_expect_success "checkout -m with dirty tree, renamed" ' ! test -f one && git diff --cached >current && test_must_be_empty current - ' test_expect_success 'checkout -m with merge conflict' ' - - git checkout -f master && git clean -f && + git checkout -f main && git clean -f && fill 1 T 3 4 5 6 S 8 >one && if git checkout renamer @@ -157,7 +151,7 @@ test_expect_success 'checkout -m with merge conflict' ' git checkout -m renamer && - git diff master:one :3:uno | + git diff main:one :3:uno | sed -e "1,/^@@/d" -e "/^ /d" -e "s/^-/d/" -e "s/^+/a/" >current && fill d2 aT d7 aS >expect && test_cmp expect current && @@ -166,10 +160,10 @@ test_expect_success 'checkout -m with merge conflict' ' ' test_expect_success 'format of merge conflict from checkout -m' ' + git checkout -f main && + git clean -f && - git checkout -f master && git clean -f && - - fill b d > two && + fill b d >two && git checkout -m simple && git ls-files >current && @@ -190,10 +184,11 @@ test_expect_success 'format of merge conflict from checkout -m' ' ' test_expect_success 'checkout --merge --conflict=diff3 <branch>' ' + git checkout -f main && + git reset --hard && + git clean -f && - git checkout -f master && git reset --hard && git clean -f && - - fill b d > two && + fill b d >two && git checkout --merge --conflict=diff3 simple && cat <<-EOF >expect && @@ -201,7 +196,7 @@ test_expect_success 'checkout --merge --conflict=diff3 <branch>' ' a c e - ||||||| master + ||||||| main a b c @@ -216,8 +211,9 @@ test_expect_success 'checkout --merge --conflict=diff3 <branch>' ' ' test_expect_success 'switch to another branch while carrying a deletion' ' - - git checkout -f master && git reset --hard && git clean -f && + git checkout -f main && + git reset --hard && + git clean -f && git rm two && test_must_fail git checkout simple 2>errs && @@ -228,15 +224,15 @@ test_expect_success 'switch to another branch while carrying a deletion' ' ' test_expect_success 'checkout to detach HEAD (with advice declined)' ' - git config advice.detachedHead false && rev=$(git rev-parse --short renamer^) && - git checkout -f renamer && git clean -f && + git checkout -f renamer && + git clean -f && git checkout renamer^ 2>messages && test_i18ngrep "HEAD is now at $rev" messages && test_line_count = 1 messages && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && if git symbolic-ref HEAD >/dev/null 2>&1 then @@ -250,12 +246,13 @@ test_expect_success 'checkout to detach HEAD (with advice declined)' ' test_expect_success 'checkout to detach HEAD' ' git config advice.detachedHead true && rev=$(git rev-parse --short renamer^) && - git checkout -f renamer && git clean -f && - GIT_TEST_GETTEXT_POISON=false git checkout renamer^ 2>messages && + git checkout -f renamer && + git clean -f && + git checkout renamer^ 2>messages && grep "HEAD is now at $rev" messages && test_line_count -gt 1 messages && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && if git symbolic-ref HEAD >/dev/null 2>&1 then @@ -267,11 +264,11 @@ test_expect_success 'checkout to detach HEAD' ' ' test_expect_success 'checkout to detach HEAD with branchname^' ' - - git checkout -f master && git clean -f && + git checkout -f main && + git clean -f && git checkout renamer^ && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && if git symbolic-ref HEAD >/dev/null 2>&1 then @@ -283,11 +280,11 @@ test_expect_success 'checkout to detach HEAD with branchname^' ' ' test_expect_success 'checkout to detach HEAD with :/message' ' - - git checkout -f master && git clean -f && + git checkout -f main && + git clean -f && git checkout ":/Initial" && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && if git symbolic-ref HEAD >/dev/null 2>&1 then @@ -299,11 +296,11 @@ test_expect_success 'checkout to detach HEAD with :/message' ' ' test_expect_success 'checkout to detach HEAD with HEAD^0' ' - - git checkout -f master && git clean -f && + git checkout -f main && + git clean -f && git checkout HEAD^0 && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && if git symbolic-ref HEAD >/dev/null 2>&1 then @@ -315,30 +312,27 @@ test_expect_success 'checkout to detach HEAD with HEAD^0' ' ' test_expect_success 'checkout with ambiguous tag/branch names' ' - git tag both side && - git branch both master && + git branch both main && git reset --hard && - git checkout master && + git checkout main && git checkout both && H=$(git rev-parse --verify HEAD) && - M=$(git show-ref -s --verify refs/heads/master) && + M=$(git show-ref -s --verify refs/heads/main) && test "z$H" = "z$M" && name=$(git symbolic-ref HEAD 2>/dev/null) && test "z$name" = zrefs/heads/both - ' test_expect_success 'checkout with ambiguous tag/branch names' ' - git reset --hard && - git checkout master && + git checkout main && git tag frotz side && - git branch frotz master && + git branch frotz main && git reset --hard && - git checkout master && + git checkout main && git checkout tags/frotz && H=$(git rev-parse --verify HEAD) && @@ -351,26 +345,19 @@ test_expect_success 'checkout with ambiguous tag/branch names' ' else : happy fi - ' test_expect_success 'switch branches while in subdirectory' ' - git reset --hard && - git checkout master && + git checkout main && mkdir subs && - ( - cd subs && - git checkout side - ) && + git -C subs checkout side && ! test -f subs/one && rm -fr subs - ' test_expect_success 'checkout specific path while in subdirectory' ' - git reset --hard && git checkout side && mkdir subs && @@ -378,65 +365,60 @@ test_expect_success 'checkout specific path while in subdirectory' ' git add subs/bero && git commit -m "add subs/bero" && - git checkout master && + git checkout main && mkdir -p subs && - ( - cd subs && - git checkout side -- bero - ) && + git -C subs checkout side -- bero && test -f subs/bero - ' -test_expect_success \ - 'checkout w/--track sets up tracking' ' +test_expect_success 'checkout w/--track sets up tracking' ' git config branch.autosetupmerge false && - git checkout master && + git checkout main && git checkout --track -b track1 && test "$(git config branch.track1.remote)" && - test "$(git config branch.track1.merge)"' + test "$(git config branch.track1.merge)" +' -test_expect_success \ - 'checkout w/autosetupmerge=always sets up tracking' ' +test_expect_success 'checkout w/autosetupmerge=always sets up tracking' ' test_when_finished git config branch.autosetupmerge false && git config branch.autosetupmerge always && - git checkout master && + git checkout main && git checkout -b track2 && test "$(git config branch.track2.remote)" && - test "$(git config branch.track2.merge)"' + test "$(git config branch.track2.merge)" +' test_expect_success 'checkout w/--track from non-branch HEAD fails' ' - git checkout master^0 && + git checkout main^0 && test_must_fail git symbolic-ref HEAD && test_must_fail git checkout --track -b track && test_must_fail git rev-parse --verify track && test_must_fail git symbolic-ref HEAD && - test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)" + test "z$(git rev-parse main^0)" = "z$(git rev-parse HEAD)" ' test_expect_success 'checkout w/--track from tag fails' ' - git checkout master^0 && + git checkout main^0 && test_must_fail git symbolic-ref HEAD && test_must_fail git checkout --track -b track frotz && test_must_fail git rev-parse --verify track && test_must_fail git symbolic-ref HEAD && - test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)" + test "z$(git rev-parse main^0)" = "z$(git rev-parse HEAD)" ' test_expect_success 'detach a symbolic link HEAD' ' - git checkout master && + git checkout main && git config --bool core.prefersymlinkrefs yes && git checkout side && - git checkout master && + git checkout main && it=$(git symbolic-ref HEAD) && - test "z$it" = zrefs/heads/master && - here=$(git rev-parse --verify refs/heads/master) && + test "z$it" = zrefs/heads/main && + here=$(git rev-parse --verify refs/heads/main) && git checkout side^ && - test "z$(git rev-parse --verify refs/heads/master)" = "z$here" + test "z$(git rev-parse --verify refs/heads/main)" = "z$here" ' -test_expect_success \ - 'checkout with --track fakes a sensible -b <name>' ' +test_expect_success 'checkout with --track fakes a sensible -b <name>' ' git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" && git update-ref refs/remotes/origin/koala/bear renamer && @@ -444,22 +426,22 @@ test_expect_success \ test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" && test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" && - git checkout master && git branch -D koala/bear && + git checkout main && git branch -D koala/bear && git checkout --track refs/remotes/origin/koala/bear && test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" && test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" && - git checkout master && git branch -D koala/bear && + git checkout main && git branch -D koala/bear && git checkout --track remotes/origin/koala/bear && test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" && test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" ' -test_expect_success \ - 'checkout with --track, but without -b, fails with too short tracked name' ' - test_must_fail git checkout --track renamer' +test_expect_success 'checkout with --track, but without -b, fails with too short tracked name' ' + test_must_fail git checkout --track renamer +' setup_conflicting_index () { rm -f .git/index && @@ -603,18 +585,17 @@ test_expect_success 'checkout --conflict=diff3' ' ' test_expect_success 'failing checkout -b should not break working tree' ' - git reset --hard master && - git symbolic-ref HEAD refs/heads/master && + git reset --hard main && + git symbolic-ref HEAD refs/heads/main && test_must_fail git checkout -b renamer side^ && - test $(git symbolic-ref HEAD) = refs/heads/master && + test $(git symbolic-ref HEAD) = refs/heads/main && git diff --exit-code && git diff --cached --exit-code - ' test_expect_success 'switch out of non-branch' ' - git reset --hard master && - git checkout master^0 && + git reset --hard main && + git checkout main^0 && echo modified >one && test_must_fail git checkout renamer 2>error.log && ! grep "^Previous HEAD" error.log diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh index cb5e34d94c..0399701e62 100755 --- a/t/t7300-clean.sh +++ b/t/t7300-clean.sh @@ -110,7 +110,7 @@ test_expect_success 'git clean with prefix' ' ' -test_expect_success C_LOCALE_OUTPUT 'git clean with relative prefix' ' +test_expect_success 'git clean with relative prefix' ' mkdir -p build docs && touch a.out src/part3.c docs/manual.txt obj.o build/lib.so && @@ -123,7 +123,7 @@ test_expect_success C_LOCALE_OUTPUT 'git clean with relative prefix' ' verbose test "$would_clean" = ../src/part3.c ' -test_expect_success C_LOCALE_OUTPUT 'git clean with absolute path' ' +test_expect_success 'git clean with absolute path' ' mkdir -p build docs && touch a.out src/part3.c docs/manual.txt obj.o build/lib.so && @@ -407,7 +407,7 @@ test_expect_success 'clean.requireForce and -f' ' ' -test_expect_success C_LOCALE_OUTPUT 'core.excludesfile' ' +test_expect_success 'core.excludesfile' ' echo excludes >excludes && echo included >included && @@ -746,4 +746,46 @@ test_expect_success 'clean untracked paths by pathspec' ' test_must_be_empty actual ' +test_expect_success 'avoid traversing into ignored directories' ' + test_when_finished rm -f output error trace.* && + test_create_repo avoid-traversing-deep-hierarchy && + ( + cd avoid-traversing-deep-hierarchy && + + mkdir -p untracked/subdir/with/a && + >untracked/subdir/with/a/random-file.txt && + + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ + git clean -ffdxn -e untracked + ) && + + # Make sure we only visited into the top-level directory, and did + # not traverse into the "untracked" subdirectory since it was excluded + grep data.*read_directo.*directories-visited trace.output | + cut -d "|" -f 9 >trace.relevant && + cat >trace.expect <<-EOF && + ..directories-visited:1 + EOF + test_cmp trace.expect trace.relevant +' + +test_expect_success 'traverse into directories that may have ignored entries' ' + test_when_finished rm -f output && + test_create_repo need-to-traverse-into-hierarchy && + ( + cd need-to-traverse-into-hierarchy && + mkdir -p modules/foobar/src/generated && + > modules/foobar/src/generated/code.c && + > modules/foobar/Makefile && + echo "/modules/**/src/generated/" >.gitignore && + + git clean -fX modules/foobar >../output && + + grep Removing ../output && + + test_path_is_missing modules/foobar/src/generated/code.c && + test_path_is_file modules/foobar/Makefile + ) +' + test_done diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index fec7e0299d..a924fdb7a6 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -9,6 +9,9 @@ This test tries to verify basic sanity of the init, update and status subcommands of git submodule. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'submodule deinit works on empty repository' ' @@ -52,7 +55,7 @@ test_expect_success 'add aborts on repository with no commits' ' EOF git init repo-no-commits && test_must_fail git submodule add ../a ./repo-no-commits 2>actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'status should ignore inner git repo when not added' ' @@ -124,7 +127,7 @@ inspect() { } test_expect_success 'submodule add' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -182,7 +185,7 @@ test_expect_success 'submodule add to .gitignored path fails' ' git add --force .gitignore && git commit -m"Ignore everything" && ! git submodule add "$submodurl" submod >actual 2>&1 && - test_i18ncmp expect actual + test_cmp expect actual ) ' @@ -223,7 +226,7 @@ test_expect_success 'submodule add --branch' ' echo "refs/heads/initial" >expect-head && cat <<-\EOF >expect-heads && refs/heads/initial - refs/heads/master + refs/heads/main EOF ( @@ -241,7 +244,7 @@ test_expect_success 'submodule add --branch' ' ' test_expect_success 'submodule add with ./ in path' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -257,7 +260,7 @@ test_expect_success 'submodule add with ./ in path' ' ' test_expect_success 'submodule add with /././ in path' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -273,7 +276,7 @@ test_expect_success 'submodule add with /././ in path' ' ' test_expect_success 'submodule add with // in path' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -289,7 +292,7 @@ test_expect_success 'submodule add with // in path' ' ' test_expect_success 'submodule add with /.. in path' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -305,7 +308,7 @@ test_expect_success 'submodule add with /.. in path' ' ' test_expect_success 'submodule add with ./, /.. and // in path' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && ( cd addtest && @@ -335,7 +338,7 @@ test_expect_success !CYGWIN 'submodule add with \\ in path' ' ' test_expect_success 'submodule add in subdirectory' ' - echo "refs/heads/master" >expect && + echo "refs/heads/main" >expect && mkdir addtest/sub && ( @@ -557,7 +560,7 @@ test_expect_success 'status should be "up-to-date" after update' ' test_expect_success 'checkout superproject with subproject already present' ' git checkout initial && - git checkout master + git checkout main ' test_expect_success 'apply submodule diff' ' @@ -574,7 +577,7 @@ test_expect_success 'apply submodule diff' ' git checkout second && git apply --index P.diff && - git diff --cached master >staged && + git diff --cached main >staged && test_must_be_empty staged ' diff --git a/t/t7401-submodule-summary.sh b/t/t7401-submodule-summary.sh index 7608814708..9c3cc4cf40 100755 --- a/t/t7401-submodule-summary.sh +++ b/t/t7401-submodule-summary.sh @@ -190,7 +190,7 @@ test_expect_success 'typechanged submodule(submodule->blob), --cached' " < Add foo5 EOF - test_i18ncmp expected actual + test_cmp expected actual " test_expect_success 'typechanged submodule(submodule->blob), --files' " @@ -200,7 +200,7 @@ test_expect_success 'typechanged submodule(submodule->blob), --files' " > Add foo5 EOF - test_i18ncmp expected actual + test_cmp expected actual " rm -rf sm1 && @@ -211,7 +211,7 @@ test_expect_success 'typechanged submodule(submodule->blob)' " * sm1 $head4(submodule)->$head5(blob): EOF - test_i18ncmp expected actual + test_cmp expected actual " rm -f sm1 && @@ -224,7 +224,7 @@ test_expect_success 'nonexistent commit' " Warn: sm1 doesn't contain commit $head4_full EOF - test_i18ncmp expected actual + test_cmp expected actual " commit_file @@ -235,7 +235,7 @@ test_expect_success 'typechanged submodule(blob->submodule)' " > Add foo7 EOF - test_i18ncmp expected actual + test_cmp expected actual " commit_file sm1 && @@ -292,7 +292,7 @@ test_expect_success 'given commit' " test_expect_success '--for-status' " git submodule summary --for-status HEAD^ >actual && - test_i18ncmp - actual <<-EOF + test_cmp - actual <<-EOF * sm1 $head6...0000000: * sm2 0000000...$head7 (2): diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh index 0726799e74..7d2ac3322b 100755 --- a/t/t7403-submodule-sync.sh +++ b/t/t7403-submodule-sync.sh @@ -8,6 +8,9 @@ test_description='git submodule sync These tests exercise the "git submodule sync" subcommand. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success setup ' @@ -78,7 +81,7 @@ test_expect_success 'change submodule url' ' ( cd super && cd submodule && - git checkout master && + git checkout main && git pull ) && mv submodule moved-submodule && @@ -112,7 +115,7 @@ test_expect_success '"git submodule sync" should update submodule URLs' ' )" && ( cd super-clone/submodule && - git checkout master && + git checkout main && git pull ) && ( @@ -140,7 +143,7 @@ test_expect_success '"git submodule sync --recursive" should update all submodul )" && ( cd super-clone/submodule/sub-submodule && - git checkout master && + git checkout main && git pull ) ' @@ -168,7 +171,7 @@ test_expect_success '"git submodule sync" should update submodule URLs - subdire )" && ( cd super-clone/submodule && - git checkout master && + git checkout main && git pull ) && ( @@ -199,7 +202,7 @@ test_expect_success '"git submodule sync --recursive" should update all submodul )" && ( cd super-clone/submodule/sub-submodule && - git checkout master && + git checkout main && git pull ) ' diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index aa19ff3a2e..f4f61fe554 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -9,15 +9,18 @@ This test verifies that "git submodule update" detaches the HEAD of the submodule and "git submodule update --rebase/--merge" does not detach the HEAD. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh compare_head() { - sha_master=$(git rev-list --max-count=1 master) + sha_main=$(git rev-list --max-count=1 main) sha_head=$(git rev-list --max-count=1 HEAD) - test "$sha_master" = "$sha_head" + test "$sha_main" = "$sha_head" } @@ -152,9 +155,9 @@ test_expect_success 'submodule update --init --recursive from subdirectory' ' cd tmp && git submodule update --init --recursive ../super >../../actual 2>../../actual2 ) && - test_i18ncmp expect actual && + test_cmp expect actual && sort actual2 >actual2.sorted && - test_i18ncmp expect2 actual2.sorted + test_cmp expect2 actual2.sorted ' cat <<EOF >expect2 @@ -171,7 +174,7 @@ test_expect_success 'submodule update --init from and of subdirectory' ' git submodule update --init sub 2>../../actual2 ) ) && - test_i18ncmp expect2 actual2 + test_cmp expect2 actual2 ' test_expect_success 'submodule update does not fetch already present commits' ' @@ -189,7 +192,7 @@ test_expect_success 'submodule update does not fetch already present commits' ' (cd super && git submodule update > ../actual 2> ../actual.err ) && - test_i18ncmp expected actual && + test_cmp expected actual && test_must_be_empty actual.err ' @@ -262,14 +265,14 @@ test_expect_success 'submodule update --remote should fetch upstream changes wit cd super && git submodule update --remote --force submodule && git -C submodule log -1 --oneline >actual && - git -C ../submodule log -1 --oneline master >expect && + git -C ../submodule log -1 --oneline main >expect && test_cmp expect actual && git checkout -b test-branch && git submodule update --remote --force submodule && git -C submodule log -1 --oneline >actual && git -C ../submodule log -1 --oneline test-branch >expect && test_cmp expect actual && - git checkout master && + git checkout main && git branch -d test-branch && git reset --hard HEAD^ ) @@ -282,7 +285,7 @@ test_expect_success 'local config should override .gitmodules branch' ' git add file && test_tick && git commit -m "upstream line5" && - git checkout master + git checkout main ) && (cd super && git config submodule.submodule.branch test-branch && @@ -292,9 +295,9 @@ test_expect_success 'local config should override .gitmodules branch' ' ) ' -test_expect_success 'submodule update --rebase staying on master' ' +test_expect_success 'submodule update --rebase staying on main' ' (cd super/submodule && - git checkout master + git checkout main ) && (cd super && (cd submodule && @@ -306,7 +309,7 @@ test_expect_success 'submodule update --rebase staying on master' ' ) ' -test_expect_success 'submodule update --merge staying on master' ' +test_expect_success 'submodule update --merge staying on main' ' (cd super/submodule && git reset --hard HEAD~1 ) && @@ -458,7 +461,7 @@ test_expect_success 'submodule update - command in .git/config catches failure' (cd super && test_must_fail git submodule update submodule 2>../actual ) && - test_i18ncmp actual expect + test_cmp actual expect ' cat << EOF >expect @@ -476,7 +479,7 @@ test_expect_success 'submodule update - command in .git/config catches failure - mkdir tmp && cd tmp && test_must_fail git submodule update ../submodule 2>../../actual ) && - test_i18ncmp actual expect + test_cmp actual expect ' test_expect_success 'submodule update - command run for initial population of submodule' ' @@ -485,7 +488,7 @@ test_expect_success 'submodule update - command run for initial population of su EOF rm -rf super/submodule && test_must_fail git -C super submodule update 2>actual && - test_i18ncmp expect actual && + test_cmp expect actual && git -C super submodule update --checkout ' @@ -506,7 +509,7 @@ test_expect_success 'recursive submodule update - command in .git/config catches mkdir -p tmp && cd tmp && test_must_fail git submodule update --recursive ../super 2>../../actual ) && - test_i18ncmp actual expect + test_cmp actual expect ' test_expect_success 'submodule init does not copy command into .git/config' ' @@ -609,7 +612,7 @@ test_expect_success 'submodule update - update=none in .git/config' ' (cd super && git config submodule.submodule.update none && (cd submodule && - git checkout master && + git checkout main && compare_head ) && git diff --name-only >out && @@ -629,7 +632,7 @@ test_expect_success 'submodule update - update=none in .git/config but --checkou (cd super && git config submodule.submodule.update none && (cd submodule && - git checkout master && + git checkout main && compare_head ) && git diff --name-only >out && @@ -689,7 +692,7 @@ test_expect_success 'submodule update continues after checkout error' ' test_expect_success 'submodule update continues after recursive checkout error' ' (cd super && git reset --hard HEAD && - git checkout master && + git checkout main && git submodule update && (cd submodule && git submodule add ../submodule subsubmodule && @@ -733,7 +736,7 @@ test_expect_success 'submodule update continues after recursive checkout error' test_expect_success 'submodule update exit immediately in case of merge conflict' ' (cd super && - git checkout master && + git checkout main && git reset --hard HEAD && (cd submodule && (cd subsubmodule && @@ -751,7 +754,7 @@ test_expect_success 'submodule update exit immediately in case of merge conflict git add submodule2 && git commit -m "two_new_submodule_commits" && (cd submodule && - git checkout master && + git checkout main && test_commit "conflict" file && echo "conflict" > file ) && @@ -770,7 +773,7 @@ test_expect_success 'submodule update exit immediately in case of merge conflict test_expect_success 'submodule update exit immediately after recursive rebase error' ' (cd super && - git checkout master && + git checkout main && git reset --hard HEAD && (cd submodule && git reset --hard HEAD && @@ -786,7 +789,7 @@ test_expect_success 'submodule update exit immediately after recursive rebase er git add submodule2 && git commit -m "two_new_submodule_commits" && (cd submodule && - git checkout master && + git checkout main && test_commit "conflict2" file && echo "conflict" > file ) && @@ -878,21 +881,21 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re git clone subsubsuper_update_r subsubsuper_update_r2 && (cd subsubsuper_update_r2 && test_commit "update_subsubsuper" file && - git push origin master + git push origin main ) && git clone subsuper_update_r subsuper_update_r2 && (cd subsuper_update_r2 && test_commit "update_subsuper" file && git submodule add ../subsubsuper_update_r subsubmodule && git commit -am "subsubmodule" && - git push origin master + git push origin main ) && git clone super_update_r super_update_r2 && (cd super_update_r2 && test_commit "update_super" file && git submodule add ../subsuper_update_r submodule && git commit -am "submodule" && - git push origin master + git push origin main ) && rm -rf super_update_r2 && git clone super_update_r super_update_r2 && @@ -911,7 +914,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re test_expect_success 'submodule add properly re-creates deeper level submodules' ' (cd super && - git reset --hard master && + git reset --hard main && rm -rf deeper/ && git submodule add --force ../submodule deeper/submodule ) @@ -1022,4 +1025,40 @@ test_expect_success 'git clone passes the parallel jobs config on to submodules' rm -rf super4 ' +test_expect_success 'submodule update --quiet passes quietness to merge/rebase' ' + (cd super && + test_commit -C rebasing message && + git submodule update --rebase --quiet >out 2>err && + test_must_be_empty out && + test_must_be_empty err && + git submodule update --rebase -v >out 2>err && + test_file_not_empty out && + test_must_be_empty err + ) +' + +test_expect_success 'submodule update --quiet passes quietness to fetch with a shallow clone' ' + test_when_finished "rm -rf super4 super5 super6" && + git clone . super4 && + (cd super4 && + git submodule add --quiet file://"$TRASH_DIRECTORY"/submodule submodule3 && + git commit -am "setup submodule3" + ) && + (cd submodule && + test_commit line6 file + ) && + git clone super4 super5 && + (cd super5 && + git submodule update --quiet --init --depth=1 submodule3 >out 2>err && + test_must_be_empty out && + test_must_be_empty err + ) && + git clone super4 super6 && + (cd super6 && + git submodule update --init --depth=1 submodule3 >out 2>err && + test_file_not_empty out && + test_file_not_empty err + ) +' + test_done diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index 6b2aa917e1..e2f110b786 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -9,6 +9,9 @@ This test verifies that "git submodule foreach" correctly visits all submodules that are currently checked out. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh @@ -77,7 +80,7 @@ test_expect_success 'test basic "submodule foreach" usage' ' git config foo.bar zar && git submodule foreach "git config --file \"\$toplevel/.git/config\" foo.bar" ) && - test_i18ncmp expect actual + test_cmp expect actual ' cat >expect <<EOF @@ -93,7 +96,7 @@ test_expect_success 'test "submodule foreach" from subdirectory' ' cd clone/sub && git submodule foreach "echo \$toplevel-\$name-\$sm_path-\$displaypath-\$sha1" >../../actual ) && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'setup nested submodules' ' @@ -174,7 +177,7 @@ test_expect_success 'test messages from "foreach --recursive"' ' cd clone2 && git submodule foreach --recursive "true" > ../actual ) && - test_i18ncmp expect actual + test_cmp expect actual ' cat > expect <<EOF @@ -194,7 +197,7 @@ test_expect_success 'test messages from "foreach --recursive" from subdirectory' cd untracked && git submodule foreach --recursive >../../actual ) && - test_i18ncmp expect actual + test_cmp expect actual ' sub1sha1=$(cd clone2/sub1 && git rev-parse HEAD) sub2sha1=$(cd clone2/sub2 && git rev-parse HEAD) @@ -226,7 +229,7 @@ test_expect_success 'test "submodule foreach --recursive" from subdirectory' ' cd clone2/untracked && git submodule foreach --recursive "echo toplevel: \$toplevel name: \$name path: \$sm_path displaypath: \$displaypath hash: \$sha1" >../../actual ) && - test_i18ncmp expect actual + test_cmp expect actual ' cat > expect <<EOF @@ -277,13 +280,13 @@ sub1sha1_short=$(cd clone3/sub1 && git rev-parse --short HEAD) sub2sha1_short=$(cd clone3/sub2 && git rev-parse --short HEAD) cat > expect <<EOF - $nested1sha1 nested1 (heads/master) - $nested2sha1 nested1/nested2 (heads/master) - $nested3sha1 nested1/nested2/nested3 (heads/master) - $submodulesha1 nested1/nested2/nested3/submodule (heads/master) + $nested1sha1 nested1 (heads/main) + $nested2sha1 nested1/nested2 (heads/main) + $nested3sha1 nested1/nested2/nested3 (heads/main) + $submodulesha1 nested1/nested2/nested3/submodule (heads/main) $sub1sha1 sub1 ($sub1sha1_short) $sub2sha1 sub2 ($sub2sha1_short) - $sub3sha1 sub3 (heads/master) + $sub3sha1 sub3 (heads/main) EOF test_expect_success 'test "status --recursive"' ' @@ -295,10 +298,10 @@ test_expect_success 'test "status --recursive"' ' ' cat > expect <<EOF - $nested1sha1 nested1 (heads/master) + $nested1sha1 nested1 (heads/main) +$nested2sha1 nested1/nested2 (file2~1) - $nested3sha1 nested1/nested2/nested3 (heads/master) - $submodulesha1 nested1/nested2/nested3/submodule (heads/master) + $nested3sha1 nested1/nested2/nested3 (heads/main) + $submodulesha1 nested1/nested2/nested3/submodule (heads/main) EOF test_expect_success 'ensure "status --cached --recursive" preserves the --cached flag' ' @@ -316,13 +319,13 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached nested2sha1=$(git -C clone3/nested1/nested2 rev-parse HEAD) cat > expect <<EOF - $nested1sha1 ../nested1 (heads/master) + $nested1sha1 ../nested1 (heads/main) +$nested2sha1 ../nested1/nested2 (file2) - $nested3sha1 ../nested1/nested2/nested3 (heads/master) - $submodulesha1 ../nested1/nested2/nested3/submodule (heads/master) + $nested3sha1 ../nested1/nested2/nested3 (heads/main) + $submodulesha1 ../nested1/nested2/nested3/submodule (heads/main) $sub1sha1 ../sub1 ($sub1sha1_short) $sub2sha1 ../sub2 ($sub2sha1_short) - $sub3sha1 ../sub3 (heads/master) + $sub3sha1 ../sub3 (heads/main) EOF test_expect_success 'test "status --recursive" from sub directory' ' diff --git a/t/t7409-submodule-detached-work-tree.sh b/t/t7409-submodule-detached-work-tree.sh index fc018e3638..e17ac81a89 100755 --- a/t/t7409-submodule-detached-work-tree.sh +++ b/t/t7409-submodule-detached-work-tree.sh @@ -10,6 +10,9 @@ on detached working trees ' TEST_NO_CREATE_REPO=1 +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'submodule on detached working tree' ' @@ -35,7 +38,7 @@ test_expect_success 'submodule on detached working tree' ' git rev-parse --verify HEAD >actual && test_cmp ../../../../expect actual ) && - git push origin master + git push origin main ) && mkdir home2 && ( @@ -44,7 +47,7 @@ test_expect_success 'submodule on detached working tree' ' GIT_WORK_TREE="$(pwd)" && GIT_DIR="$(pwd)/.dotfiles" && export GIT_WORK_TREE GIT_DIR && - git checkout master && + git checkout main && git submodule update --init && ( unset GIT_WORK_TREE GIT_DIR && @@ -64,10 +67,10 @@ test_expect_success 'submodule on detached working pointed by core.worktree' ' git clone --bare ../remote "$GIT_DIR" && git config core.bare false && git config core.worktree .. && - git checkout master && + git checkout main && git submodule add ../bundle1 .vim/bundle/dupe && test_commit "dupe" && - git push origin master + git push origin main ) && ( cd home && diff --git a/t/t7416-submodule-dash-url.sh b/t/t7416-submodule-dash-url.sh index eec96e0ba9..d21dc8b009 100755 --- a/t/t7416-submodule-dash-url.sh +++ b/t/t7416-submodule-dash-url.sh @@ -201,4 +201,19 @@ test_expect_success 'fsck rejects embedded newline in relative url' ' grep gitmodulesUrl err ' +test_expect_success 'fsck rejects embedded newline in git url' ' + git checkout --orphan git-newline && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = "git://example.com:1234/repo%0a.git" + EOF + git add .gitmodules && + git commit -m "git url with newline" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + test_done diff --git a/t/t7417-submodule-path-url.sh b/t/t7417-submodule-path-url.sh index f7e7e94d7b..f0f6b9fa9e 100755 --- a/t/t7417-submodule-path-url.sh +++ b/t/t7417-submodule-path-url.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='check handling of .gitmodule path with dash' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'create submodule with dash in path' ' @@ -36,7 +39,7 @@ test_expect_success MINGW 'submodule paths disallows trailing spaces' ' sed "s/sub/sub /" <tree >tree.new && tree=$(git -C super mktree <tree.new) && commit=$(echo with space | git -C super commit-tree $tree) && - git -C super update-ref refs/heads/master $commit && + git -C super update-ref refs/heads/main $commit && test_must_fail git clone --recurse-submodules super dst 2>err && test_i18ngrep "sub " err diff --git a/t/t7415-submodule-names.sh b/t/t7450-bad-git-dotfiles.sh index f70368bc2e..41706c1c9f 100755 --- a/t/t7415-submodule-names.sh +++ b/t/t7450-bad-git-dotfiles.sh @@ -1,9 +1,16 @@ #!/bin/sh -test_description='check handling of .. in submodule names +test_description='check broken or malicious patterns in .git* files -Exercise the name-checking function on a variety of names, and then give a -real-world setup that confirms we catch this in practice. +Such as: + + - presence of .. in submodule names; + Exercise the name-checking function on a variety of names, and then give a + real-world setup that confirms we catch this in practice. + + - nested submodule names + + - symlinked .gitmodules, etc ' . ./test-lib.sh . "$TEST_DIRECTORY"/lib-pack.sh @@ -132,31 +139,84 @@ test_expect_success 'index-pack --strict works for non-repo pack' ' grep gitmodulesName output ' -test_expect_success 'fsck detects symlinked .gitmodules file' ' - git init symlink && - ( - cd symlink && - - # Make the tree directly to avoid index restrictions. - # - # Because symlinks store the target as a blob, choose - # a pathname that could be parsed as a .gitmodules file - # to trick naive non-symlink-aware checking. - tricky="[foo]bar=true" && - content=$(git hash-object -w ../.gitmodules) && - target=$(printf "$tricky" | git hash-object -w --stdin) && - { - printf "100644 blob $content\t$tricky\n" && - printf "120000 blob $target\t.gitmodules\n" - } | git mktree && - - # Check not only that we fail, but that it is due to the - # symlink detector; this grep string comes from the config - # variable name and will not be translated. - test_must_fail git fsck 2>output && - test_i18ngrep gitmodulesSymlink output - ) -' +check_dotx_symlink () { + fsck_must_fail=test_must_fail + fsck_prefix=error + refuse_index=t + case "$1" in + --warning) + fsck_must_fail= + fsck_prefix=warning + refuse_index= + shift + ;; + esac + + name=$1 + type=$2 + path=$3 + dir=symlink-$name-$type + + test_expect_success "set up repo with symlinked $name ($type)" ' + git init $dir && + ( + cd $dir && + + # Make the tree directly to avoid index restrictions. + # + # Because symlinks store the target as a blob, choose + # a pathname that could be parsed as a .gitmodules file + # to trick naive non-symlink-aware checking. + tricky="[foo]bar=true" && + content=$(git hash-object -w ../.gitmodules) && + target=$(printf "$tricky" | git hash-object -w --stdin) && + { + printf "100644 blob $content\t$tricky\n" && + printf "120000 blob $target\t$path\n" + } >bad-tree + ) && + tree=$(git -C $dir mktree <$dir/bad-tree) + ' + + test_expect_success "fsck detects symlinked $name ($type)" ' + ( + cd $dir && + + # Check not only that we fail, but that it is due to the + # symlink detector + $fsck_must_fail git fsck 2>output && + grep "$fsck_prefix.*tree $tree: ${name}Symlink" output + ) + ' + + test -n "$refuse_index" && + test_expect_success "refuse to load symlinked $name into index ($type)" ' + test_must_fail \ + git -C $dir \ + -c core.protectntfs \ + -c core.protecthfs \ + read-tree $tree 2>err && + grep "invalid path.*$name" err && + git -C $dir ls-files -s >out && + test_must_be_empty out + ' +} + +check_dotx_symlink gitmodules vanilla .gitmodules +check_dotx_symlink gitmodules ntfs ".gitmodules ." +check_dotx_symlink gitmodules hfs ".${u200c}gitmodules" + +check_dotx_symlink --warning gitattributes vanilla .gitattributes +check_dotx_symlink --warning gitattributes ntfs ".gitattributes ." +check_dotx_symlink --warning gitattributes hfs ".${u200c}gitattributes" + +check_dotx_symlink --warning gitignore vanilla .gitignore +check_dotx_symlink --warning gitignore ntfs ".gitignore ." +check_dotx_symlink --warning gitignore hfs ".${u200c}gitignore" + +check_dotx_symlink --warning mailmap vanilla .mailmap +check_dotx_symlink --warning mailmap ntfs ".mailmap ." +check_dotx_symlink --warning mailmap hfs ".${u200c}mailmap" test_expect_success 'fsck detects non-blob .gitmodules' ' git init non-blob && @@ -191,7 +251,7 @@ test_expect_success 'fsck detects corrupt .gitmodules' ' ) ' -test_expect_success MINGW 'prevent git~1 squatting on Windows' ' +test_expect_success WINDOWS 'prevent git~1 squatting on Windows' ' git init squatting && ( cd squatting && @@ -219,10 +279,13 @@ test_expect_success MINGW 'prevent git~1 squatting on Windows' ' test_tick && git -c core.protectNTFS=false commit -m "module" ) && - test_must_fail git -c core.protectNTFS=false \ - clone --recurse-submodules squatting squatting-clone 2>err && - test_i18ngrep -e "directory not empty" -e "not an empty directory" err && - ! grep gitdir squatting-clone/d/a/git~2 + if test_have_prereq MINGW + then + test_must_fail git -c core.protectNTFS=false \ + clone --recurse-submodules squatting squatting-clone 2>err && + test_i18ngrep -e "directory not empty" -e "not an empty directory" err && + ! grep gitdir squatting-clone/d/a/git~2 + fi ' test_expect_success 'git dirs of sibling submodules must not be nested' ' diff --git a/t/t7500-commit-template-squash-signoff.sh b/t/t7500-commit-template-squash-signoff.sh index 6d19ece05d..54c2082acb 100755 --- a/t/t7500-commit-template-squash-signoff.sh +++ b/t/t7500-commit-template-squash-signoff.sh @@ -9,13 +9,15 @@ Tests for template, signoff, squash and -F functions.' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-rebase.sh + commit_msg_is () { expect=commit_msg_is.expect actual=commit_msg_is.actual printf "%s" "$(git log --pretty=format:%s%b -1)" >"$actual" && printf "%s" "$1" >"$expect" && - test_i18ncmp "$expect" "$actual" + test_cmp "$expect" "$actual" } # A sanity check to see if commit is working at all. @@ -279,6 +281,163 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +get_commit_msg () { + rev="$1" && + git log -1 --pretty=format:"%B" "$rev" +} + +test_expect_success 'commit --fixup=amend: creates amend! commit' ' + commit_for_rebase_autosquash_setup && + cat >expected <<-EOF && + amend! $(git log -1 --format=%s HEAD~) + + $(get_commit_msg HEAD~) + + edited + EOF + ( + set_fake_editor && + FAKE_COMMIT_AMEND="edited" \ + git commit --fixup=amend:HEAD~ + ) && + get_commit_msg HEAD >actual && + test_cmp expected actual +' + +test_expect_success '--fixup=amend: --only ignores staged changes' ' + commit_for_rebase_autosquash_setup && + cat >expected <<-EOF && + amend! $(git log -1 --format=%s HEAD~) + + $(get_commit_msg HEAD~) + + edited + EOF + ( + set_fake_editor && + FAKE_COMMIT_AMEND="edited" \ + git commit --fixup=amend:HEAD~ --only + ) && + get_commit_msg HEAD >actual && + test_cmp expected actual && + test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} && + test_cmp_rev HEAD@{1} HEAD^ && + test_expect_code 1 git diff --cached --exit-code && + git cat-file blob :foo >actual && + test_cmp foo actual +' + +test_expect_success '--fixup=reword: ignores staged changes' ' + commit_for_rebase_autosquash_setup && + cat >expected <<-EOF && + amend! $(git log -1 --format=%s HEAD~) + + $(get_commit_msg HEAD~) + + edited + EOF + ( + set_fake_editor && + FAKE_COMMIT_AMEND="edited" \ + git commit --fixup=reword:HEAD~ + ) && + get_commit_msg HEAD >actual && + test_cmp expected actual && + test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} && + test_cmp_rev HEAD@{1} HEAD^ && + test_expect_code 1 git diff --cached --exit-code && + git cat-file blob :foo >actual && + test_cmp foo actual +' + +test_expect_success '--fixup=reword: error out with -m option' ' + commit_for_rebase_autosquash_setup && + echo "fatal: cannot combine -m with --fixup:reword" >expect && + test_must_fail git commit --fixup=reword:HEAD~ -m "reword commit message" 2>actual && + test_cmp expect actual +' + +test_expect_success '--fixup=amend: error out with -m option' ' + commit_for_rebase_autosquash_setup && + echo "fatal: cannot combine -m with --fixup:amend" >expect && + test_must_fail git commit --fixup=amend:HEAD~ -m "amend commit message" 2>actual && + test_cmp expect actual +' + +test_expect_success 'consecutive amend! commits remove amend! line from commit msg body' ' + commit_for_rebase_autosquash_setup && + cat >expected <<-EOF && + amend! amend! $(git log -1 --format=%s HEAD~) + + $(get_commit_msg HEAD~) + + edited 1 + + edited 2 + EOF + echo "reword new commit message" >actual && + ( + set_fake_editor && + FAKE_COMMIT_AMEND="edited 1" \ + git commit --fixup=reword:HEAD~ && + FAKE_COMMIT_AMEND="edited 2" \ + git commit --fixup=reword:HEAD + ) && + get_commit_msg HEAD >actual && + test_cmp expected actual +' + +test_expect_success 'deny to create amend! commit if its commit msg body is empty' ' + commit_for_rebase_autosquash_setup && + echo "Aborting commit due to empty commit message body." >expected && + ( + set_fake_editor && + test_must_fail env FAKE_COMMIT_MESSAGE="amend! target message subject line" \ + git commit --fixup=amend:HEAD~ 2>actual + ) && + test_cmp expected actual +' + +test_expect_success 'amend! commit allows empty commit msg body with --allow-empty-message' ' + commit_for_rebase_autosquash_setup && + cat >expected <<-EOF && + amend! $(git log -1 --format=%s HEAD~) + EOF + ( + set_fake_editor && + FAKE_COMMIT_MESSAGE="amend! target message subject line" \ + git commit --fixup=amend:HEAD~ --allow-empty-message && + get_commit_msg HEAD >actual + ) && + test_cmp expected actual +' + +test_fixup_reword_opt () { + test_expect_success "--fixup=reword: incompatible with $1" " + echo 'fatal: reword option of --fixup is mutually exclusive with'\ + '--patch/--interactive/--all/--include/--only' >expect && + test_must_fail git commit --fixup=reword:HEAD~ $1 2>actual && + test_cmp expect actual + " +} + +for opt in --all --include --only --interactive --patch +do + test_fixup_reword_opt $opt +done + +test_expect_success '--fixup=reword: give error with pathsec' ' + commit_for_rebase_autosquash_setup && + echo "fatal: cannot combine reword option of --fixup with path '\''foo'\''" >expect && + test_must_fail git commit --fixup=reword:HEAD~ -- foo 2>actual && + test_cmp expect actual +' + +test_expect_success '--fixup=reword: -F give error message' ' + echo "fatal: Only one of -c/-C/-F/--fixup can be used." >expect && + test_must_fail git commit --fixup=reword:HEAD~ -F msg 2>actual && + test_cmp expect actual +' test_expect_success 'commit --squash works with -F' ' commit_for_rebase_autosquash_setup && @@ -339,7 +498,7 @@ test_expect_success 'invalid message options when using --fixup' ' cat >expected-template <<EOF # Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. +# with '#' will be ignored. # # Author: A U Thor <author@example.com> # @@ -356,7 +515,7 @@ test_expect_success 'new line found before status message in commit template' ' touch commit-template-check && git add commit-template-check && GIT_EDITOR="cat >editor-input" git commit --untracked-files=no --allow-empty-message && - test_i18ncmp expected-template editor-input + test_cmp expected-template editor-input ' test_expect_success 'setup empty commit with unstaged rename and copy' ' diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh index 110b4bf459..512ae2781f 100755 --- a/t/t7501-commit-basic-functionality.sh +++ b/t/t7501-commit-basic-functionality.sh @@ -7,8 +7,11 @@ # signoff test_description='git commit' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh -. "$TEST_DIRECTORY/diff-lib.sh" +. "$TEST_DIRECTORY/lib-diff.sh" author='The Real Author <someguy@his.email.org>' @@ -603,7 +606,7 @@ test_expect_success 'same tree (merge and amend merge)' ' echo zero >zero && git add zero && git commit -m "add zero" && - git checkout master && + git checkout main && git merge -s ours side -m "empty ok" && git diff HEAD^ HEAD >actual && diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh index 14c92e4c25..38a532d81c 100755 --- a/t/t7502-commit-porcelain.sh +++ b/t/t7502-commit-porcelain.sh @@ -2,6 +2,9 @@ test_description='git commit porcelain-ish' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh commit_msg_is () { @@ -10,7 +13,7 @@ commit_msg_is () { printf "%s" "$(git log --pretty=format:%s%b -1)" >$actual && printf "%s" "$1" >$expect && - test_i18ncmp $expect $actual + test_cmp $expect $actual } # Arguments: [<prefix] [<commit message>] [<commit options>] @@ -32,7 +35,17 @@ check_summary_oneline() { SUMMARY_POSTFIX="$(git log -1 --pretty='format:%h')" echo "[$SUMMARY_PREFIX $SUMMARY_POSTFIX] $2" >exp && - test_i18ncmp exp act + test_cmp exp act +} + +trailer_commit_base () { + echo "fun" >>file && + git add file && + git commit -s --trailer "Signed-off-by=C1 E1 " \ + --trailer "Helped-by:C2 E2 " \ + --trailer "Reported-by=C3 E3" \ + --trailer "Mentored-by:C4 E4" \ + -m "hello" } test_expect_success 'output summary format' ' @@ -76,7 +89,7 @@ test_expect_success 'output summary format for merges' ' output_tests_cleanup() { # this is needed for "do not fire editor in the presence of conflicts" - git checkout master && + git checkout main && # this is needed for the "partial removal" test to pass git rm file1 && @@ -151,6 +164,308 @@ test_expect_success 'sign off' ' ' +test_expect_success 'commit --trailer with "="' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + EOF + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "replace" as ifexists' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Helped-by: C3 E3 + EOF + git -c trailer.ifexists="replace" \ + commit --trailer "Mentored-by: C4 E4" \ + --trailer "Helped-by: C3 E3" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "add" as ifexists' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Reported-by: C3 E3 + Mentored-by: C4 E4 + EOF + git -c trailer.ifexists="add" \ + commit --trailer "Reported-by: C3 E3" \ + --trailer "Mentored-by: C4 E4" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "donothing" as ifexists' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Reviewed-by: C6 E6 + EOF + git -c trailer.ifexists="donothing" \ + commit --trailer "Mentored-by: C5 E5" \ + --trailer "Reviewed-by: C6 E6" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "addIfDifferent" as ifexists' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Mentored-by: C5 E5 + EOF + git -c trailer.ifexists="addIfDifferent" \ + commit --trailer "Reported-by: C3 E3" \ + --trailer "Mentored-by: C5 E5" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "addIfDifferentNeighbor" as ifexists' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Reported-by: C3 E3 + EOF + git -c trailer.ifexists="addIfDifferentNeighbor" \ + commit --trailer "Mentored-by: C4 E4" \ + --trailer "Reported-by: C3 E3" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "end" as where' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Reported-by: C3 E3 + Mentored-by: C4 E4 + EOF + git -c trailer.where="end" \ + commit --trailer "Reported-by: C3 E3" \ + --trailer "Mentored-by: C4 E4" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "start" as where' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C1 E1 + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + EOF + git -c trailer.where="start" \ + commit --trailer "Signed-off-by: C O Mitter <committer@example.com>" \ + --trailer "Signed-off-by: C1 E1" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "after" as where' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Mentored-by: C5 E5 + EOF + git -c trailer.where="after" \ + commit --trailer "Mentored-by: C4 E4" \ + --trailer "Mentored-by: C5 E5" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "before" as where' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C2 E2 + Mentored-by: C3 E3 + Mentored-by: C4 E4 + EOF + git -c trailer.where="before" \ + commit --trailer "Mentored-by: C3 E3" \ + --trailer "Mentored-by: C2 E2" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "donothing" as ifmissing' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Helped-by: C5 E5 + EOF + git -c trailer.ifmissing="donothing" \ + commit --trailer "Helped-by: C5 E5" \ + --trailer "Based-by: C6 E6" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and "add" as ifmissing' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Reported-by: C3 E3 + Mentored-by: C4 E4 + Helped-by: C5 E5 + Based-by: C6 E6 + EOF + git -c trailer.ifmissing="add" \ + commit --trailer "Helped-by: C5 E5" \ + --trailer "Based-by: C6 E6" \ + --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c ack.key ' ' + echo "fun" >>file1 && + git add file1 && + cat >expected <<-\EOF && + hello + + Acked-by: Peff + EOF + git -c trailer.ack.key="Acked-by" \ + commit --trailer "ack = Peff" -m "hello" && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and ":=#" as separators' ' + echo "fun" >>file1 && + git add file1 && + cat >expected <<-\EOF && + I hate bug + + Bug #42 + EOF + git -c trailer.separators=":=#" \ + -c trailer.bug.key="Bug #" \ + commit --trailer "bug = 42" -m "I hate bug" && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + +test_expect_success 'commit --trailer with -c and command' ' + trailer_commit_base && + cat >expected <<-\EOF && + hello + + Signed-off-by: C O Mitter <committer@example.com> + Signed-off-by: C1 E1 + Helped-by: C2 E2 + Mentored-by: C4 E4 + Reported-by: A U Thor <author@example.com> + EOF + git -c trailer.report.key="Reported-by: " \ + -c trailer.report.ifexists="replace" \ + -c trailer.report.command="NAME=\"\$ARG\"; test -n \"\$NAME\" && \ + git log --author=\"\$NAME\" -1 --format=\"format:%aN <%aE>\" || true" \ + commit --trailer "report = author" --amend && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + test_expect_success 'multiple -m' ' >negative && @@ -297,7 +612,7 @@ echo "sample # with '#' will be ignored, and an empty message aborts the commit." >expect test_expect_success 'cleanup commit messages (strip option,-F,-e): output' ' - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'cleanup commit message (fail on invalid cleanup mode option)' ' @@ -440,7 +755,7 @@ test_expect_success 'do not fire editor in the presence of conflicts' ' git add g && git commit -m "add g" && git branch second && - echo master >g && + echo main >g && echo g >h && git add g h && git commit -m "modify g and add h" && @@ -449,7 +764,7 @@ test_expect_success 'do not fire editor in the presence of conflicts' ' git add g && git commit -m second && # Must fail due to conflict - test_must_fail git cherry-pick -n master && + test_must_fail git cherry-pick -n main && echo "editor not started" >.git/result && ( GIT_EDITOR="\"$(pwd)/.git/FAKE_EDITOR\"" && @@ -478,9 +793,9 @@ git reset -q --hard test_expect_success 'Hand committing of a redundant merge removes dups' ' - git rev-parse second master >expect && - test_must_fail git merge second master && - git checkout master g && + git rev-parse second main >expect && + test_must_fail git merge second main && + git checkout main g && EDITOR=: git commit -a && git cat-file commit HEAD >raw && sed -n -e "s/^parent //p" -e "/^$/q" raw >actual && diff --git a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh index b3485450a2..606d8d0f08 100755 --- a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh +++ b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh @@ -2,6 +2,9 @@ test_description='pre-commit and pre-merge-commit hooks' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh HOOKDIR="$(git rev-parse --git-dir)/hooks" @@ -44,16 +47,16 @@ test_expect_success 'root commit' ' git add foo && git commit -m "make it non-ff" && git branch side-orig side && - git checkout master + git checkout main ' test_expect_success 'setup conflicting branches' ' - test_when_finished "git checkout master" && - git checkout -b conflicting-a master && + test_when_finished "git checkout main" && + git checkout -b conflicting-a main && echo a >conflicting && git add conflicting && git commit -m conflicting-a && - git checkout -b conflicting-b master && + git checkout -b conflicting-b main && echo b >conflicting && git add conflicting && git commit -m conflicting-b @@ -71,8 +74,8 @@ test_expect_success 'with no hook (merge)' ' test_when_finished "rm -f actual_hooks" && git branch -f side side-orig && git checkout side && - git merge -m "merge master" master && - git checkout master && + git merge -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' @@ -88,8 +91,8 @@ test_expect_success '--no-verify with no hook (merge)' ' test_when_finished "rm -f actual_hooks" && git branch -f side side-orig && git checkout side && - git merge --no-verify -m "merge master" master && - git checkout master && + git merge --no-verify -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' @@ -108,15 +111,15 @@ test_expect_success 'with succeeding hook (merge)' ' cp "$HOOKDIR/success.sample" "$PREMERGE" && echo "$PREMERGE" >expected_hooks && git checkout side && - git merge -m "merge master" master && - git checkout master && + git merge -m "merge main" main && + git checkout main && test_cmp expected_hooks actual_hooks ' test_expect_success 'automatic merge fails; both hooks are available' ' test_when_finished "rm -f \"$PREMERGE\" \"$PRECOMMIT\"" && test_when_finished "rm -f expected_hooks actual_hooks" && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && cp "$HOOKDIR/success.sample" "$PREMERGE" && cp "$HOOKDIR/success.sample" "$PRECOMMIT" && @@ -145,8 +148,8 @@ test_expect_success '--no-verify with succeeding hook (merge)' ' cp "$HOOKDIR/success.sample" "$PREMERGE" && git branch -f side side-orig && git checkout side && - git merge --no-verify -m "merge master" master && - git checkout master && + git merge --no-verify -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' @@ -174,8 +177,8 @@ test_expect_success 'with failing hook (merge)' ' cp "$HOOKDIR/fail.sample" "$PREMERGE" && echo "$PREMERGE" >expected_hooks && git checkout side && - test_must_fail git merge -m "merge master" master && - git checkout master && + test_must_fail git merge -m "merge main" main && + git checkout main && test_cmp expected_hooks actual_hooks ' @@ -184,8 +187,8 @@ test_expect_success '--no-verify with failing hook (merge)' ' cp "$HOOKDIR/fail.sample" "$PREMERGE" && git branch -f side side-orig && git checkout side && - git merge --no-verify -m "merge master" master && - git checkout master && + git merge --no-verify -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' @@ -212,8 +215,8 @@ test_expect_success POSIXPERM 'with non-executable hook (merge)' ' cp "$HOOKDIR/non-exec.sample" "$PREMERGE" && git branch -f side side-orig && git checkout side && - git merge -m "merge master" master && - git checkout master && + git merge -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' @@ -222,8 +225,8 @@ test_expect_success POSIXPERM '--no-verify with non-executable hook (merge)' ' cp "$HOOKDIR/non-exec.sample" "$PREMERGE" && git branch -f side side-orig && git checkout side && - git merge --no-verify -m "merge master" master && - git checkout master && + git merge --no-verify -m "merge main" main && + git checkout main && test_path_is_missing actual_hooks ' diff --git a/t/t7504-commit-msg-hook.sh b/t/t7504-commit-msg-hook.sh index 31b9c6a2c1..4e7592522a 100755 --- a/t/t7504-commit-msg-hook.sh +++ b/t/t7504-commit-msg-hook.sh @@ -2,6 +2,9 @@ test_description='commit-msg hook' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'with no hook' ' @@ -142,12 +145,12 @@ test_expect_success '--no-verify with failing hook (editor)' ' test_expect_success 'merge fails with failing hook' ' test_when_finished "git branch -D newbranch" && - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout --orphan newbranch && : >file2 && git add file2 && git commit --no-verify file2 -m in-side-branch && - test_must_fail git merge --allow-unrelated-histories master && + test_must_fail git merge --allow-unrelated-histories main && commit_msg_is "in-side-branch" # HEAD before merge ' @@ -155,14 +158,14 @@ test_expect_success 'merge fails with failing hook' ' test_expect_success 'merge bypasses failing hook with --no-verify' ' test_when_finished "git branch -D newbranch" && - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout --orphan newbranch && git rm -f file && : >file2 && git add file2 && git commit --no-verify file2 -m in-side-branch && - git merge --no-verify --allow-unrelated-histories master && - commit_msg_is "Merge branch '\''master'\'' into newbranch" + git merge --no-verify --allow-unrelated-histories main && + commit_msg_is "Merge branch '\''main'\'' into newbranch" ' @@ -248,28 +251,28 @@ test_expect_success "hook doesn't edit commit message (editor)" ' test_expect_success 'hook called in git-merge picks up commit message' ' test_when_finished "git branch -D newbranch" && - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout --orphan newbranch && git rm -f file && : >file2 && git add file2 && git commit --no-verify file2 -m in-side-branch && - git merge --allow-unrelated-histories master && + git merge --allow-unrelated-histories main && commit_msg_is "new message" ' test_expect_failure 'merge --continue remembers --no-verify' ' test_when_finished "git branch -D newbranch" && - test_when_finished "git checkout -f master" && - git checkout master && + test_when_finished "git checkout -f main" && + git checkout main && echo a >file2 && git add file2 && - git commit --no-verify -m "add file2 to master" && - git checkout -b newbranch master^ && + git commit --no-verify -m "add file2 to main" && + git checkout -b newbranch main^ && echo b >file2 && git add file2 && git commit --no-verify file2 -m in-side-branch && - git merge --no-verify -m not-rewritten-by-hook master && + git merge --no-verify -m not-rewritten-by-hook main && # resolve conflict: echo c >file2 && git add file2 && diff --git a/t/t7505-prepare-commit-msg-hook.sh b/t/t7505-prepare-commit-msg-hook.sh index 94f85cdf83..7a8194ce72 100755 --- a/t/t7505-prepare-commit-msg-hook.sh +++ b/t/t7505-prepare-commit-msg-hook.sh @@ -2,6 +2,9 @@ test_description='prepare-commit-msg hook' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'set up commits for rebasing' ' @@ -15,7 +18,7 @@ test_expect_success 'set up commits for rebasing' ' do test_commit rebase-$i c $i done && - git checkout master && + git checkout main && cat >rebase-todo <<-EOF pick $(git rev-parse rebase-a) @@ -190,7 +193,7 @@ test_expect_success 'with hook (-c)' ' test_expect_success 'with hook (merge)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout -B other HEAD@{1} && echo "more" >>file && git add file && @@ -202,7 +205,7 @@ test_expect_success 'with hook (merge)' ' test_expect_success 'with hook and editor (merge)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout -B other HEAD@{1} && echo "more" >>file && git add file && @@ -215,10 +218,10 @@ test_expect_success 'with hook and editor (merge)' ' test_rebase () { expect=$1 && mode=$2 && - test_expect_$expect C_LOCALE_OUTPUT "with hook (rebase ${mode:--i})" ' + test_expect_$expect "with hook (rebase ${mode:--i})" ' test_when_finished "\ git rebase --abort - git checkout -f master + git checkout -f main git branch -D tmp" && git checkout -b tmp rebase-me && GIT_SEQUENCE_EDITOR="cp rebase-todo" && @@ -250,14 +253,14 @@ test_rebase success test_have_prereq !REBASE_P || test_rebase success -p test_expect_success 'with hook (cherry-pick)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout -B other b && git cherry-pick rebase-1 && test "$(git log -1 --pretty=format:%s)" = "message (no editor)" ' test_expect_success 'with hook and editor (cherry-pick)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout -B other b && git cherry-pick -e rebase-1 && test "$(git log -1 --pretty=format:%s)" = merge @@ -270,7 +273,7 @@ EOF test_expect_success 'with failing hook' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && head=$(git rev-parse HEAD) && echo "more" >> file && git add file && @@ -280,7 +283,7 @@ test_expect_success 'with failing hook' ' test_expect_success 'with failing hook (--no-verify)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && head=$(git rev-parse HEAD) && echo "more" >> file && git add file && @@ -290,7 +293,7 @@ test_expect_success 'with failing hook (--no-verify)' ' test_expect_success 'with failing hook (merge)' ' - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git checkout -B other HEAD@{1} && echo "more" >> file && git add file && @@ -304,8 +307,8 @@ test_expect_success 'with failing hook (merge)' ' ' -test_expect_success C_LOCALE_OUTPUT 'with failing hook (cherry-pick)' ' - test_when_finished "git checkout -f master" && +test_expect_success 'with failing hook (cherry-pick)' ' + test_when_finished "git checkout -f main" && git checkout -B other b && test_must_fail git cherry-pick rebase-1 2>actual && test $(grep -c prepare-commit-msg actual) = 1 diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 45e1f6ff68..2b72451ba3 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -37,11 +37,11 @@ test_expect_success 'create upstream branch' ' git checkout -b upstream && test_commit upstream1 && test_commit upstream2 && - # leave the first commit on master as root because several + # leave the first commit on main as root because several # tests depend on this case; for our upstream we only # care about commit counts anyway, so a totally divergent # history is OK - git checkout --orphan master + git checkout --orphan main ' test_expect_success 'setup' ' @@ -88,7 +88,7 @@ EOF test_expect_success 'status --column' ' cat >expect <<\EOF && -# On branch master +# On branch main # Your branch and '\''upstream'\'' have diverged, # and have 1 and 2 different commits each, respectively. # (use "git pull" to merge the remote branch into yours) @@ -109,17 +109,17 @@ test_expect_success 'status --column' ' # EOF COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status --column status.displayCommentPrefix=false' ' strip_comments expect && COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<\EOF -# On branch master +# On branch main # Your branch and 'upstream' have diverged, # and have 1 and 2 different commits each, respectively. # (use "git pull" to merge the remote branch into yours) @@ -144,19 +144,19 @@ EOF test_expect_success 'status with status.displayCommentPrefix=true' ' git -c status.displayCommentPrefix=true status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status with status.displayCommentPrefix=false' ' strip_comments expect && git -c status.displayCommentPrefix=false status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status -v' ' (cat expect && git diff --cached) >expect-with-v && git status -v >output && - test_i18ncmp expect-with-v output + test_cmp expect-with-v output ' test_expect_success 'status -v -v' ' @@ -167,7 +167,7 @@ test_expect_success 'status -v -v' ' echo "Changes not staged for commit:" && git -c diff.mnemonicprefix=true diff) >expect-with-v && git status -v -v >output && - test_i18ncmp expect-with-v output + test_cmp expect-with-v output ' test_expect_success 'setup fake editor' ' @@ -193,7 +193,7 @@ test_expect_success 'commit ignores status.displayCommentPrefix=false in COMMIT_ ' cat >expect <<\EOF -On branch master +On branch main Your branch and 'upstream' have diverged, and have 1 and 2 different commits each, respectively. @@ -214,7 +214,7 @@ EOF test_expect_success 'status (advice.statusHints false)' ' test_config advice.statusHints false && git status >output && - test_i18ncmp expect output + test_cmp expect output ' @@ -266,7 +266,7 @@ test_expect_success 'status with gitignore' ' test_cmp expect output && cat >expect <<\EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -296,7 +296,7 @@ Ignored files: EOF git status --ignored >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status with gitignore (nothing untracked)' ' @@ -331,7 +331,7 @@ test_expect_success 'status with gitignore (nothing untracked)' ' test_cmp expect output && cat >expect <<\EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -358,7 +358,7 @@ Ignored files: EOF git status --ignored >output && - test_i18ncmp expect output + test_cmp expect output ' cat >.gitignore <<\EOF @@ -368,7 +368,7 @@ output* EOF cat >expect <<\EOF -## master...upstream [ahead 1, behind 2] +## main...upstream [ahead 1, behind 2] M dir1/modified A dir2/added ?? dir1/untracked @@ -380,7 +380,7 @@ EOF test_expect_success 'status -s -b' ' git status -s -b >output && - test_i18ncmp expect output + test_cmp expect output ' @@ -390,7 +390,7 @@ test_expect_success 'status -s -z -b' ' git status -s -z -b >output && nul_to_q <output >output.q && mv output.q output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'setup dir3' ' @@ -401,7 +401,7 @@ test_expect_success 'setup dir3' ' test_expect_success 'status -uno' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -418,18 +418,18 @@ Changes not staged for commit: Untracked files not listed (use -u option to show untracked files) EOF git status -uno >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status (status.showUntrackedFiles no)' ' test_config status.showuntrackedfiles no && git status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status -uno (advice.statusHints false)' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. @@ -443,7 +443,7 @@ Untracked files not listed EOF test_config advice.statusHints false && git status -uno >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect << EOF @@ -463,7 +463,7 @@ test_expect_success 'status -s (status.showUntrackedFiles no)' ' test_expect_success 'status -unormal' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -487,13 +487,13 @@ Untracked files: EOF git status -unormal >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status (status.showUntrackedFiles normal)' ' test_config status.showuntrackedfiles normal && git status >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<EOF @@ -518,7 +518,7 @@ test_expect_success 'status -s (status.showUntrackedFiles normal)' ' test_expect_success 'status -uall' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -543,13 +543,13 @@ Untracked files: EOF git status -uall >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status (status.showUntrackedFiles all)' ' test_config status.showuntrackedfiles all && git status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'teardown dir3' ' @@ -578,7 +578,7 @@ test_expect_success 'status -s (status.showUntrackedFiles all)' ' test_expect_success 'status with relative paths' ' cat >expect <<\EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -601,7 +601,7 @@ Untracked files: EOF (cd dir1 && git status) >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<\EOF @@ -646,7 +646,7 @@ test_expect_success 'setup unique colors' ' test_expect_success TTY 'status with color.ui' ' cat >expect <<\EOF && -On branch <GREEN>master<RESET> +On branch <GREEN>main<RESET> Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -670,13 +670,13 @@ Untracked files: EOF test_config color.ui auto && test_terminal git status | test_decode_color >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success TTY 'status with color.status' ' test_config color.status auto && test_terminal git status | test_decode_color >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<\EOF @@ -706,7 +706,7 @@ test_expect_success TTY 'status -s with color.status' ' ' cat >expect <<\EOF -## <YELLOW>master<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>] +## <YELLOW>main<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>] <RED>M<RESET> dir1/modified <GREEN>A<RESET> dir2/added <BLUE>??<RESET> dir1/untracked @@ -718,7 +718,7 @@ EOF test_expect_success TTY 'status -s -b with color.status' ' test_terminal git status -s -b | test_decode_color >output && - test_i18ncmp expect output + test_cmp expect output ' @@ -757,7 +757,7 @@ test_expect_success 'status --porcelain respects -b' ' git status --porcelain -b >output && { - echo "## master...upstream [ahead 1, behind 2]" && + echo "## main...upstream [ahead 1, behind 2]" && cat expect } >tmp && mv tmp expect && @@ -769,7 +769,7 @@ test_expect_success 'status --porcelain respects -b' ' test_expect_success 'status without relative paths' ' cat >expect <<\EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -793,7 +793,7 @@ Untracked files: EOF test_config status.relativePaths false && (cd dir1 && git status) >output && - test_i18ncmp expect output + test_cmp expect output ' @@ -814,9 +814,36 @@ test_expect_success 'status -s without relative paths' ' ' +cat >expect <<\EOF + M dir1/modified +A dir2/added +A "file with spaces" +?? dir1/untracked +?? dir2/modified +?? dir2/untracked +?? "file with spaces 2" +?? untracked +EOF + +test_expect_success 'status -s without relative paths' ' + test_when_finished "git rm --cached \"file with spaces\"; rm -f file*" && + >"file with spaces" && + >"file with spaces 2" && + >"expect with spaces" && + git add "file with spaces" && + + git status -s >output && + test_cmp expect output && + + git status -s --ignored >output && + grep "^!! \"expect with spaces\"$" output && + grep -v "^!! " output >output-wo-ignored && + test_cmp expect output-wo-ignored +' + test_expect_success 'dry-run of partial commit excluding new file in index' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -833,7 +860,7 @@ Untracked files: EOF git commit --dry-run dir1/modified >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<EOF @@ -870,7 +897,7 @@ test_expect_success 'setup status submodule summary' ' test_expect_success 'status submodule summary is disabled by default' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -894,13 +921,13 @@ Untracked files: EOF git status >output && - test_i18ncmp expect output + test_cmp expect output ' # we expect the same as the previous test test_expect_success 'status --untracked-files=all does not show submodule' ' git status --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<EOF @@ -927,7 +954,7 @@ head=$(cd sm && git rev-parse --short=7 --verify HEAD) test_expect_success 'status submodule summary' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 1 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -957,13 +984,13 @@ Untracked files: EOF git config status.submodulesummary 10 && git status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'status submodule summary with status.displayCommentPrefix=false' ' strip_comments expect && git -c status.displayCommentPrefix=false status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'commit with submodule summary ignores status.displayCommentPrefix' ' @@ -986,7 +1013,7 @@ test_expect_success 'status -s submodule summary' ' test_expect_success 'status submodule summary (clean submodule): commit' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1008,9 +1035,9 @@ EOF git commit -m "commit submodule" && git config status.submodulesummary 10 && test_must_fail git commit --dry-run >output && - test_i18ncmp expect output && + test_cmp expect output && git status >output && - test_i18ncmp expect output + test_cmp expect output ' cat >expect <<EOF @@ -1034,7 +1061,7 @@ test_expect_success 'status -z implies porcelain' ' test_expect_success 'commit --dry-run submodule summary (--amend)' ' cat >expect <<EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1064,7 +1091,7 @@ Untracked files: EOF git config status.submodulesummary 10 && git commit --dry-run --amend >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success POSIXPERM,SANITY 'status succeeds in a read-only repository' ' @@ -1086,7 +1113,7 @@ touch .gitmodules test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' ' cat > expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1116,17 +1143,17 @@ Untracked files: EOF echo modified sm/untracked && git status --ignore-submodules=untracked >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success '.gitmodules ignore=untracked suppresses submodules with untracked content' ' test_config diff.ignoreSubmodules dirty && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --add -f .gitmodules submodule.subname.ignore untracked && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1136,14 +1163,14 @@ test_expect_success '.git/config ignore=untracked suppresses submodules with unt git config --add submodule.subname.ignore untracked && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config --remove-section -f .gitmodules submodule.subname ' test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' ' git status --ignore-submodules=dirty >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success '.gitmodules ignore=dirty suppresses submodules with untracked content' ' @@ -1153,7 +1180,7 @@ test_expect_success '.gitmodules ignore=dirty suppresses submodules with untrack git config --add -f .gitmodules submodule.subname.ignore dirty && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1163,7 +1190,7 @@ test_expect_success '.git/config ignore=dirty suppresses submodules with untrack git config --add submodule.subname.ignore dirty && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' @@ -1171,14 +1198,14 @@ test_expect_success '.git/config ignore=dirty suppresses submodules with untrack test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' ' echo modified >sm/foo && git status --ignore-submodules=dirty >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success '.gitmodules ignore=dirty suppresses submodules with modified content' ' git config --add -f .gitmodules submodule.subname.ignore dirty && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1188,14 +1215,14 @@ test_expect_success '.git/config ignore=dirty suppresses submodules with modifie git config --add submodule.subname.ignore dirty && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" ' cat > expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1226,14 +1253,14 @@ Untracked files: EOF git status --ignore-submodules=untracked > output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success ".gitmodules ignore=untracked doesn't suppress submodules with modified content" ' git config --add -f .gitmodules submodule.subname.ignore untracked && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1243,7 +1270,7 @@ test_expect_success ".git/config ignore=untracked doesn't suppress submodules wi git config --add submodule.subname.ignore untracked && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' @@ -1252,7 +1279,7 @@ head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 -- test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" ' cat > expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1287,14 +1314,14 @@ Untracked files: EOF git status --ignore-submodules=untracked > output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success ".gitmodules ignore=untracked doesn't suppress submodule summary" ' git config --add -f .gitmodules submodule.subname.ignore untracked && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1304,20 +1331,20 @@ test_expect_success ".git/config ignore=untracked doesn't suppress submodule sum git config --add submodule.subname.ignore untracked && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" ' git status --ignore-submodules=dirty > output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success ".gitmodules ignore=dirty doesn't suppress submodule summary" ' git config --add -f .gitmodules submodule.subname.ignore dirty && git config --add -f .gitmodules submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1327,13 +1354,13 @@ test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary git config --add submodule.subname.ignore dirty && git config --add submodule.subname.path sm && git status >output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' cat > expect << EOF -; On branch master +; On branch main ; Your branch and 'upstream' have diverged, ; and have 2 and 2 different commits each, respectively. ; (use "git pull" to merge the remote branch into yours) @@ -1371,7 +1398,7 @@ EOF test_expect_success "status (core.commentchar with submodule summary)" ' test_config core.commentchar ";" && git -c status.displayCommentPrefix=true status >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success "status (core.commentchar with two chars with submodule summary)" ' @@ -1381,7 +1408,7 @@ test_expect_success "status (core.commentchar with two chars with submodule summ test_expect_success "--ignore-submodules=all suppresses submodule summary" ' cat > expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1402,12 +1429,12 @@ Untracked files: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --ignore-submodules=all > output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' ' cat > expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1433,7 +1460,7 @@ EOF git config --add -f .gitmodules submodule.subname.ignore all && git config --add -f .gitmodules submodule.subname.path sm && git status > output && - test_i18ncmp expect output && + test_cmp expect output && git config -f .gitmodules --remove-section submodule.subname ' @@ -1443,7 +1470,7 @@ test_expect_success '.git/config ignore=all suppresses unstaged submodule summar git config --add submodule.subname.ignore all && git config --add submodule.subname.path sm && git status > output && - test_i18ncmp expect output && + test_cmp expect output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' @@ -1527,7 +1554,7 @@ test_expect_success 'git commit --dry-run will show a staged but ignored submodu git reset HEAD^ && git add sm && cat >expect << EOF && -On branch master +On branch main Your branch and '\''upstream'\'' have diverged, and have 2 and 2 different commits each, respectively. (use "git pull" to merge the remote branch into yours) @@ -1544,7 +1571,7 @@ Changes not staged for commit: Untracked files not listed (use -u option to show untracked files) EOF git commit -uno --dry-run >output && - test_i18ncmp expect output && + test_cmp expect output && git status -s --ignore-submodules=dirty >output && test_i18ngrep "^M. sm" output ' diff --git a/t/t7509-commit-authorship.sh b/t/t7509-commit-authorship.sh index 500ab2fe72..d568593382 100755 --- a/t/t7509-commit-authorship.sh +++ b/t/t7509-commit-authorship.sh @@ -18,11 +18,8 @@ message_body () { } test_expect_success '-C option copies authorship and message' ' - echo "Initial" >foo && - git add foo && - test_tick && - git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> && - git tag Initial && + test_commit --author Frigate\ \<flying@over.world\> \ + "Initial Commit" foo Initial Initial && echo "Test 1" >>foo && test_tick && git commit -a -C Initial && @@ -150,7 +147,7 @@ test_expect_success 'commit respects CHERRY_PICK_HEAD and MERGE_MSG' ' test_tick && git commit -am "cherry-pick 1" --author="Cherry <cherry@pick.er>" && git tag cherry-pick-head && - git rev-parse cherry-pick-head >.git/CHERRY_PICK_HEAD && + git update-ref CHERRY_PICK_HEAD $(git rev-parse cherry-pick-head) && echo "This is a MERGE_MSG" >.git/MERGE_MSG && echo "cherry-pick 1b" >>foo && test_tick && @@ -165,7 +162,7 @@ test_expect_success 'commit respects CHERRY_PICK_HEAD and MERGE_MSG' ' ' test_expect_success '--reset-author with CHERRY_PICK_HEAD' ' - git rev-parse cherry-pick-head >.git/CHERRY_PICK_HEAD && + git update-ref CHERRY_PICK_HEAD $(git rev-parse cherry-pick-head) && echo "cherry-pick 2" >>foo && test_tick && git commit -am "cherry-pick 2" --reset-author && diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh index 6baaa1ad91..8df5a74f1d 100755 --- a/t/t7510-signed-commit.sh +++ b/t/t7510-signed-commit.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='signed commit tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh GNUPGHOME_NOT_USED=$GNUPGHOME . "$TEST_DIRECTORY/lib-gpg.sh" @@ -25,7 +28,7 @@ test_expect_success GPG 'create signed commits' ' echo 3 >elif && git add elif && test_tick && git commit -m "third on side" && - git checkout master && + git checkout main && test_tick && git merge -S side && git tag merge && @@ -172,7 +175,7 @@ test_expect_success GPG 'show signed commit with signature' ' git cat-file commit initial >cat && grep -v -e "gpg: " -e "Warning: " show >show.commit && grep -e "gpg: " -e "Warning: " show >show.gpg && - grep -v "^ " cat | grep -v "^$(test_oid header) " >cat.commit && + grep -v "^ " cat | grep -v "^gpgsig.* " >cat.commit && test_cmp show.commit commit && test_cmp show.gpg verify.2 && test_cmp cat.commit verify.1 @@ -334,4 +337,45 @@ test_expect_success GPG 'show double signature with custom format' ' test_cmp expect actual ' + +test_expect_success GPG 'verify-commit verifies multiply signed commits' ' + git init multiply-signed && + cd multiply-signed && + test_commit first && + echo 1 >second && + git add second && + tree=$(git write-tree) && + parent=$(git rev-parse HEAD^{commit}) && + git commit --gpg-sign -m second && + git cat-file commit HEAD && + # Avoid trailing whitespace. + sed -e "s/^Q//" -e "s/^Z/ /" >commit <<-EOF && + Qtree $tree + Qparent $parent + Qauthor A U Thor <author@example.com> 1112912653 -0700 + Qcommitter C O Mitter <committer@example.com> 1112912653 -0700 + Qgpgsig -----BEGIN PGP SIGNATURE----- + QZ + Q iHQEABECADQWIQRz11h0S+chaY7FTocTtvUezd5DDQUCX/uBDRYcY29tbWl0dGVy + Q QGV4YW1wbGUuY29tAAoJEBO29R7N3kMNd+8AoK1I8mhLHviPH+q2I5fIVgPsEtYC + Q AKCTqBh+VabJceXcGIZuF0Ry+udbBQ== + Q =tQ0N + Q -----END PGP SIGNATURE----- + Qgpgsig-sha256 -----BEGIN PGP SIGNATURE----- + QZ + Q iHQEABECADQWIQRz11h0S+chaY7FTocTtvUezd5DDQUCX/uBIBYcY29tbWl0dGVy + Q QGV4YW1wbGUuY29tAAoJEBO29R7N3kMN/NEAn0XO9RYSBj2dFyozi0JKSbssYMtO + Q AJwKCQ1BQOtuwz//IjU8TiS+6S4iUw== + Q =pIwP + Q -----END PGP SIGNATURE----- + Q + Qsecond + EOF + head=$(git hash-object -t commit -w commit) && + git reset --hard $head && + git verify-commit $head 2>actual && + grep "Good signature from" actual && + ! grep "BAD signature from" actual +' + test_done diff --git a/t/t7512-status-help.sh b/t/t7512-status-help.sh index 29518e0949..7f2956d77a 100755 --- a/t/t7512-status-help.sh +++ b/t/t7512-status-help.sh @@ -7,6 +7,9 @@ test_description='git status advice' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-rebase.sh @@ -17,14 +20,14 @@ test_expect_success 'prepare for conflicts' ' git config --global advice.statusuoption false && test_commit init main.txt init && git branch conflicts && - test_commit on_master main.txt on_master && + test_commit on_main main.txt on_main && git checkout conflicts && test_commit on_conflicts main.txt on_conflicts ' test_expect_success 'status when conflicts unresolved' ' - test_must_fail git merge master && + test_must_fail git merge main && cat >expected <<\EOF && On branch conflicts You have unmerged paths. @@ -38,13 +41,13 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when conflicts resolved before commit' ' git reset --hard conflicts && - test_must_fail git merge master && + test_must_fail git merge main && echo one >main.txt && git add main.txt && cat >expected <<\EOF && @@ -58,12 +61,12 @@ Changes to be committed: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare for rebase conflicts' ' - git reset --hard master && + git reset --hard main && git checkout -b rebase_conflicts && test_commit one_rebase main.txt one && test_commit two_rebase main.txt two && @@ -90,7 +93,7 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -113,16 +116,16 @@ Changes to be committed: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare for rebase_i_conflicts' ' - git reset --hard master && + git reset --hard main && git checkout -b rebase_i_conflicts && test_commit one_unmerge main.txt one_unmerge && git branch rebase_i_conflicts_second && - test_commit one_master main.txt one_master && + test_commit one_main main.txt one_main && git checkout rebase_i_conflicts_second && test_commit one_second main.txt one_second ' @@ -151,7 +154,7 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -177,12 +180,12 @@ Changes to be committed: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when rebasing -i in edit mode' ' - git reset --hard master && + git reset --hard main && git checkout -b rebase_i_edit && test_commit one_rebase_i main.txt one && test_commit two_rebase_i main.txt two && @@ -207,12 +210,12 @@ You are currently editing a commit while rebasing branch '\''rebase_i_edit'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when splitting a commit' ' - git reset --hard master && + git reset --hard main && git checkout -b split_commit && test_commit one_split main.txt one && test_commit two_split main.txt two && @@ -246,12 +249,12 @@ Changes not staged for commit: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status after editing the last commit with --amend during a rebase -i' ' - git reset --hard master && + git reset --hard main && git checkout -b amend_last && test_commit one_amend main.txt one && test_commit two_amend main.txt two && @@ -279,12 +282,12 @@ You are currently editing a commit while rebasing branch '\''amend_last'\'' on ' nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare for several edits' ' - git reset --hard master && + git reset --hard main && git checkout -b several_edits && test_commit one_edits main.txt one && test_commit two_edits main.txt two && @@ -318,7 +321,7 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -353,7 +356,7 @@ Changes not staged for commit: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -384,7 +387,7 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -415,7 +418,7 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -451,7 +454,7 @@ Changes not staged for commit: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -483,7 +486,7 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -516,7 +519,7 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -554,7 +557,7 @@ Changes not staged for commit: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -588,12 +591,12 @@ You are currently editing a commit while rebasing branch '\''several_edits'\'' o nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare am_session' ' - git reset --hard master && + git reset --hard main && git checkout -b am_session && test_commit one_am one.txt "one" && test_commit two_am two.txt "two" && @@ -616,7 +619,7 @@ You are in the middle of an am session. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -638,7 +641,7 @@ You are in the middle of an am session. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -661,12 +664,12 @@ The current patch is empty. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when bisecting' ' - git reset --hard master && + git reset --hard main && git checkout -b bisect && test_commit one_bisect main.txt one && test_commit two_bisect main.txt two && @@ -684,12 +687,12 @@ You are currently bisecting, started from branch '\''bisect'\''. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when rebase --apply conflicts with statushints disabled' ' - git reset --hard master && + git reset --hard main && git checkout -b statushints_disabled && test_when_finished "git config --local advice.statushints true" && git config --local advice.statushints false && @@ -709,12 +712,12 @@ Unmerged paths: no changes added to commit EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare for cherry-pick conflicts' ' - git reset --hard master && + git reset --hard main && git checkout -b cherry_branch && test_commit one_cherry main.txt one && test_commit two_cherries main.txt two && @@ -743,7 +746,7 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' @@ -767,7 +770,7 @@ Changes to be committed: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status when cherry-picking after committing conflict resolution' ' @@ -786,7 +789,7 @@ Cherry-pick currently in progress. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status shows cherry-pick with invalid oid' ' @@ -795,7 +798,7 @@ test_expect_success 'status shows cherry-pick with invalid oid' ' git status --untracked-files=no >actual 2>err && git cherry-pick --quit && test_must_be_empty err && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status does not show error if .git/sequencer is a file' ' @@ -813,7 +816,7 @@ HEAD detached at atag nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual && + test_cmp expected actual && git reset --hard HEAD^ && cat >expected <<\EOF && @@ -821,11 +824,11 @@ HEAD detached from atag nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status while reverting commit (conflicts)' ' - git checkout master && + git checkout main && echo before >to-revert.txt && test_commit before to-revert.txt && echo old >to-revert.txt && @@ -835,7 +838,7 @@ test_expect_success 'status while reverting commit (conflicts)' ' TO_REVERT=$(git rev-parse --short HEAD^) && test_must_fail git revert $TO_REVERT && cat >expected <<EOF && -On branch master +On branch main You are currently reverting commit $TO_REVERT. (fix conflicts and run "git revert --continue") (use "git revert --skip" to skip this patch) @@ -849,14 +852,14 @@ Unmerged paths: no changes added to commit (use "git add" and/or "git commit -a") EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status while reverting commit (conflicts resolved)' ' echo reverted >to-revert.txt && git add to-revert.txt && cat >expected <<EOF && -On branch master +On branch main You are currently reverting commit $TO_REVERT. (all conflicts fixed: run "git revert --continue") (use "git revert --skip" to skip this patch) @@ -869,17 +872,17 @@ Changes to be committed: Untracked files not listed (use -u option to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status after reverting commit' ' git revert --continue && cat >expected <<\EOF && -On branch master +On branch main nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status while reverting after committing conflict resolution' ' @@ -889,7 +892,7 @@ test_expect_success 'status while reverting after committing conflict resolution echo reverted >to-revert.txt && git commit -a && cat >expected <<EOF && -On branch master +On branch main Revert currently in progress. (run "git revert --continue" to continue) (use "git revert --skip" to skip this patch) @@ -898,11 +901,11 @@ Revert currently in progress. nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'prepare for different number of commits rebased' ' - git reset --hard master && + git reset --hard main && git checkout -b several_commits && test_commit one_commit main.txt one && test_commit two_commit main.txt two && @@ -928,7 +931,7 @@ You are currently editing a commit while rebasing branch '\''several_commits'\'' nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status: two commands done with some white lines in done file' ' @@ -956,7 +959,7 @@ You are currently editing a commit while rebasing branch '\''several_commits'\'' nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status: two remaining commands with some white lines in todo file' ' @@ -985,7 +988,7 @@ You are currently editing a commit while rebasing branch '\''several_commits'\'' nothing to commit (use -u to show untracked files) EOF git status --untracked-files=no >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_expect_success 'status: handle not-yet-started rebase -i gracefully' ' @@ -1004,7 +1007,7 @@ You are currently editing a commit while rebasing branch '\''several_commits'\'' nothing to commit (use -u to show untracked files) EOF - test_i18ncmp expected actual + test_cmp expected actual ' test_done diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 6602790b5f..04885d0a5e 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -51,6 +51,69 @@ test_expect_success 'setup' ' EOF ' +test_expect_success 'with cmd' ' + test_when_finished "git config --remove-section trailer.bug" && + git config trailer.bug.key "Bug-maker: " && + git config trailer.bug.ifExists "add" && + git config trailer.bug.cmd "echo \"maybe is\"" && + cat >expected2 <<-EOF && + + Bug-maker: maybe is him + Bug-maker: maybe is me + EOF + git interpret-trailers --trailer "bug: him" --trailer "bug:me" \ + >actual2 && + test_cmp expected2 actual2 +' + +test_expect_success 'with cmd and $1' ' + test_when_finished "git config --remove-section trailer.bug" && + git config trailer.bug.key "Bug-maker: " && + git config trailer.bug.ifExists "add" && + git config trailer.bug.cmd "echo \"\$1\" is" && + cat >expected2 <<-EOF && + + Bug-maker: him is him + Bug-maker: me is me + EOF + git interpret-trailers --trailer "bug: him" --trailer "bug:me" \ + >actual2 && + test_cmp expected2 actual2 +' + +test_expect_success 'with cmd and $1 with sh -c' ' + test_when_finished "git config --remove-section trailer.bug" && + git config trailer.bug.key "Bug-maker: " && + git config trailer.bug.ifExists "replace" && + git config trailer.bug.cmd "sh -c \"echo who is \"\$1\"\"" && + cat >expected2 <<-EOF && + + Bug-maker: who is me + EOF + git interpret-trailers --trailer "bug: him" --trailer "bug:me" \ + >actual2 && + test_cmp expected2 actual2 +' + +test_expect_success 'with cmd and $1 with shell script' ' + test_when_finished "git config --remove-section trailer.bug" && + git config trailer.bug.key "Bug-maker: " && + git config trailer.bug.ifExists "replace" && + git config trailer.bug.cmd "./echoscript" && + cat >expected2 <<-EOF && + + Bug-maker: who is me + EOF + cat >echoscript <<-EOF && + #!/bin/sh + echo who is "\$1" + EOF + chmod +x echoscript && + git interpret-trailers --trailer "bug: him" --trailer "bug:me" \ + >actual2 && + test_cmp expected2 actual2 +' + test_expect_success 'without config' ' sed -e "s/ Z\$/ /" >expected <<-\EOF && @@ -1274,6 +1337,27 @@ test_expect_success 'setup a commit' ' git commit -m "Add file a.txt" ' +test_expect_success 'cmd takes precedence over command' ' + test_when_finished "git config --unset trailer.fix.cmd" && + git config trailer.fix.ifExists "replace" && + git config trailer.fix.cmd "test -n \"\$1\" && git log -1 --oneline --format=\"%h (%aN)\" \ + --abbrev-commit --abbrev=14 \"\$1\" || true" && + git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" \ + --abbrev-commit --abbrev=14 \$ARG" && + FIXED=$(git log -1 --oneline --format="%h (%aN)" --abbrev-commit --abbrev=14 HEAD) && + cat complex_message_body >expected2 && + sed -e "s/ Z\$/ /" >>expected2 <<-EOF && + Fixes: $FIXED + Acked-by= Z + Reviewed-by: + Signed-off-by: Z + Signed-off-by: A U Thor <author@example.com> + EOF + git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \ + <complex_message >actual2 && + test_cmp expected2 actual2 +' + test_expect_success 'with command using $ARG' ' git config trailer.fix.ifExists "replace" && git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" && diff --git a/t/t7517-per-repo-email.sh b/t/t7517-per-repo-email.sh index b2401cec3e..405420ae4d 100755 --- a/t/t7517-per-repo-email.sh +++ b/t/t7517-per-repo-email.sh @@ -6,6 +6,9 @@ test_description='per-repo forced setting of email address' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup a likely user.useConfigOnly use case' ' @@ -47,24 +50,24 @@ test_expect_success 'set up rebase scenarios' ' test_expect_success 'fast-forward rebase does not care about ident' ' git checkout -B tmp side-without-commit && - git rebase master + git rebase main ' test_expect_success 'non-fast-forward rebase refuses to write commits' ' test_when_finished "git rebase --abort || true" && git checkout -B tmp side-with-commit && - test_must_fail git rebase master + test_must_fail git rebase main ' test_expect_success 'fast-forward rebase does not care about ident (interactive)' ' git checkout -B tmp side-without-commit && - git rebase -i master + git rebase -i main ' test_expect_success 'non-fast-forward rebase refuses to write commits (interactive)' ' test_when_finished "git rebase --abort || true" && git checkout -B tmp side-with-commit && - test_must_fail git rebase -i master + test_must_fail git rebase -i main ' test_expect_success 'noop interactive rebase does not care about ident' ' @@ -75,14 +78,14 @@ test_expect_success 'noop interactive rebase does not care about ident' ' test_expect_success REBASE_P \ 'fast-forward rebase does not care about ident (preserve)' ' git checkout -B tmp side-without-commit && - git rebase -p master + git rebase -p main ' test_expect_success REBASE_P \ 'non-fast-forward rebase refuses to write commits (preserve)' ' test_when_finished "git rebase --abort || true" && git checkout -B tmp side-with-commit && - test_must_fail git rebase -p master + test_must_fail git rebase -p main ' test_expect_success 'author.name overrides user.name' ' diff --git a/t/t7518-ident-corner-cases.sh b/t/t7518-ident-corner-cases.sh index dc3e9c8c88..905957bd0a 100755 --- a/t/t7518-ident-corner-cases.sh +++ b/t/t7518-ident-corner-cases.sh @@ -13,7 +13,7 @@ test_expect_success 'empty name and missing email' ' sane_unset GIT_AUTHOR_EMAIL && GIT_AUTHOR_NAME= && test_must_fail git commit --allow-empty -m foo 2>err && - test_i18ngrep ! null err + test_i18ngrep ! "(null)" err ) ' diff --git a/t/t7519-status-fsmonitor.sh b/t/t7519-status-fsmonitor.sh index fbfdcca000..637391c6ce 100755 --- a/t/t7519-status-fsmonitor.sh +++ b/t/t7519-status-fsmonitor.sh @@ -236,7 +236,7 @@ test_expect_success 'refresh_index() invalidates fsmonitor cache' ' git reset HEAD~1 && git status >actual && git -c core.fsmonitor= status >expect && - test_i18ncmp expect actual + test_cmp expect actual ' # test fsmonitor with and without preloadIndex @@ -273,7 +273,7 @@ do git add dir2/new && git status >actual && git -c core.fsmonitor= status >expect && - test_i18ncmp expect actual + test_cmp expect actual ' # Make sure it's actually skipping the check for modified and untracked @@ -334,7 +334,7 @@ test_expect_success UNTRACKED_CACHE 'ignore .git changes when invalidating UNTR' git config core.fsmonitor .git/hooks/fsmonitor-test && git update-index --untracked-cache && git update-index --fsmonitor && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace-before" \ + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace-before" \ git status && test-tool dump-untracked-cache >../before ) && @@ -346,12 +346,12 @@ test_expect_success UNTRACKED_CACHE 'ignore .git changes when invalidating UNTR' EOF ( cd dot-git && - GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace-after" \ + GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace-after" \ git status && test-tool dump-untracked-cache >../after ) && - grep "directory invalidation" trace-before >>before && - grep "directory invalidation" trace-after >>after && + grep "directory-invalidation" trace-before | cut -d"|" -f 9 >>before && + grep "directory-invalidation" trace-after | cut -d"|" -f 9 >>after && # UNTR extension unchanged, dir invalidation count unchanged test_cmp before after ' diff --git a/t/t7521-ignored-mode.sh b/t/t7521-ignored-mode.sh index 91790943c3..a88b02b06e 100755 --- a/t/t7521-ignored-mode.sh +++ b/t/t7521-ignored-mode.sh @@ -30,7 +30,7 @@ test_expect_success 'Verify behavior of status on directories with ignored files dir/ignored/ignored_1.ign dir/ignored/ignored_2.ign && git status --porcelain=v2 --ignored=matching --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify status behavior on directory with tracked & ignored files' ' @@ -55,7 +55,7 @@ test_expect_success 'Verify status behavior on directory with tracked & ignored git commit -m "commit tracked files" && git status --porcelain=v2 --ignored=matching --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify status behavior on directory with untracked and ignored files' ' @@ -80,7 +80,7 @@ test_expect_success 'Verify status behavior on directory with untracked and igno dir/untracked_ignored/ignored_1.ign dir/untracked_ignored/ignored_2.ign && git status --porcelain=v2 --ignored=matching --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify status matching ignored files on ignored directory' ' @@ -96,7 +96,7 @@ test_expect_success 'Verify status matching ignored files on ignored directory' ignored_dir/ignored_1.ign ignored_dir/ignored_2.ign && git status --porcelain=v2 --ignored=matching --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify status behavior on ignored directory containing tracked file' ' @@ -117,7 +117,7 @@ test_expect_success 'Verify status behavior on ignored directory containing trac git add -f ignored_dir/tracked && git commit -m "Force add file in ignored directory" && git status --porcelain=v2 --ignored=matching --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify matching ignored files with --untracked-files=normal' ' @@ -136,7 +136,7 @@ test_expect_success 'Verify matching ignored files with --untracked-files=normal ignored_files/ignored_1.ign ignored_files/ignored_2.ign \ untracked_dir/untracked && git status --porcelain=v2 --ignored=matching --untracked-files=normal >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify matching ignored files with --untracked-files=normal' ' @@ -155,7 +155,7 @@ test_expect_success 'Verify matching ignored files with --untracked-files=normal ignored_files/ignored_1.ign ignored_files/ignored_2.ign \ untracked_dir/untracked && git status --porcelain=v2 --ignored=matching --untracked-files=normal >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify status behavior on ignored directory containing tracked file' ' @@ -176,7 +176,7 @@ test_expect_success 'Verify status behavior on ignored directory containing trac git add -f ignored_dir/tracked && git commit -m "Force add file in ignored directory" && git status --porcelain=v2 --ignored=matching --untracked-files=normal >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify behavior of status with --ignored=no' ' @@ -191,7 +191,7 @@ test_expect_success 'Verify behavior of status with --ignored=no' ' dir/ignored/ignored_1.ign dir/ignored/ignored_2.ign && git status --porcelain=v2 --ignored=no --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify behavior of status with --ignored=traditional and --untracked-files=all' ' @@ -210,7 +210,7 @@ test_expect_success 'Verify behavior of status with --ignored=traditional and -- dir/ignored/ignored_1.ign dir/ignored/ignored_2.ign && git status --porcelain=v2 --ignored=traditional --untracked-files=all >output && - test_i18ncmp expect output + test_cmp expect output ' test_expect_success 'Verify behavior of status with --ignored=traditional and --untracked-files=normal' ' @@ -227,7 +227,7 @@ test_expect_success 'Verify behavior of status with --ignored=traditional and -- dir/ignored/ignored_1.ign dir/ignored/ignored_2.ign && git status --porcelain=v2 --ignored=traditional --untracked-files=normal >output && - test_i18ncmp expect output + test_cmp expect output ' test_done diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 1c85f75555..1cbc9715a8 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -14,9 +14,9 @@ Testing basic merge operations/option parsing. ! [c4] c4 ! [c5] c5 ! [c6] c6 - * [master] Merge commit 'c1' + * [main] Merge commit 'c1' -------- - - [master] Merge commit 'c1' + - [main] Merge commit 'c1' + * [c1] commit 1 + [c6] c6 + [c5] c5 @@ -26,6 +26,9 @@ Testing basic merge operations/option parsing. +++++++* [c0] commit 0 ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-gpg.sh @@ -203,13 +206,13 @@ test_expect_success 'merge c0 with c1 with --ff-only' ' test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'merge from unborn branch' ' - git checkout -f master && + git checkout -f main && test_might_fail git branch -D kid && echo "OBJID HEAD@{0}: initial pull" >reflog.expected && git checkout --orphan kid && - test_when_finished "git checkout -f master" && + test_when_finished "git checkout -f main" && git rm -fr . && test_tick && git merge --ff-only c1 && @@ -269,7 +272,7 @@ test_expect_success 'merge c3 with c7 with commit.cleanup = scissors' ' EOF git cat-file commit HEAD >raw && sed -e "1,/^$/d" raw >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_expect_success 'merge c3 with c7 with --squash commit.cleanup = scissors' ' @@ -293,7 +296,7 @@ test_expect_success 'merge c3 with c7 with --squash commit.cleanup = scissors' ' EOF git cat-file commit HEAD >raw && sed -e "1,/^$/d" raw >actual && - test_i18ncmp expect actual + test_cmp expect actual ' test_debug 'git log --graph --decorate --oneline --all' @@ -413,7 +416,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'merge c1 with c2 (no-commit in config)' ' git reset --hard c1 && - test_config branch.master.mergeoptions "--no-commit" && + test_config branch.main.mergeoptions "--no-commit" && git merge c2 && verify_merge file result.1-5 && verify_head $c1 && @@ -427,7 +430,7 @@ test_expect_success 'merge c1 with c2 (log in config)' ' git merge --log c2 && git show -s --pretty=tformat:%s%n%b >expect && - test_config branch.master.mergeoptions "--log" && + test_config branch.main.mergeoptions "--log" && git reset --hard c1 && git merge c2 && git show -s --pretty=tformat:%s%n%b >actual && @@ -440,7 +443,7 @@ test_expect_success 'merge c1 with c2 (log in config gets overridden)' ' git merge c2 && git show -s --pretty=tformat:%s%n%b >expect && - test_config branch.master.mergeoptions "--no-log" && + test_config branch.main.mergeoptions "--no-log" && test_config merge.log "true" && git reset --hard c1 && git merge c2 && @@ -451,7 +454,7 @@ test_expect_success 'merge c1 with c2 (log in config gets overridden)' ' test_expect_success 'merge c1 with c2 (squash in config)' ' git reset --hard c1 && - test_config branch.master.mergeoptions "--squash" && + test_config branch.main.mergeoptions "--squash" && git merge c2 && verify_merge file result.1-5 && verify_head $c1 && @@ -463,7 +466,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'override config option -n with --summary' ' git reset --hard c1 && - test_config branch.master.mergeoptions "-n" && + test_config branch.main.mergeoptions "-n" && test_tick && git merge --summary c2 >diffstat.txt && verify_merge file result.1-5 msg.1-5 && @@ -477,7 +480,7 @@ test_expect_success 'override config option -n with --summary' ' test_expect_success 'override config option -n with --stat' ' git reset --hard c1 && - test_config branch.master.mergeoptions "-n" && + test_config branch.main.mergeoptions "-n" && test_tick && git merge --stat c2 >diffstat.txt && verify_merge file result.1-5 msg.1-5 && @@ -493,7 +496,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'override config option --stat' ' git reset --hard c1 && - test_config branch.master.mergeoptions "--stat" && + test_config branch.main.mergeoptions "--stat" && test_tick && git merge -n c2 >diffstat.txt && verify_merge file result.1-5 msg.1-5 && @@ -509,7 +512,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'merge c1 with c2 (override --no-commit)' ' git reset --hard c1 && - test_config branch.master.mergeoptions "--no-commit" && + test_config branch.main.mergeoptions "--no-commit" && test_tick && git merge --commit c2 && verify_merge file result.1-5 msg.1-5 && @@ -520,7 +523,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'merge c1 with c2 (override --squash)' ' git reset --hard c1 && - test_config branch.master.mergeoptions "--squash" && + test_config branch.main.mergeoptions "--squash" && test_tick && git merge --no-squash c2 && verify_merge file result.1-5 msg.1-5 && @@ -549,9 +552,9 @@ test_expect_success 'merge c0 with c1 (merge.ff=false)' ' ' test_debug 'git log --graph --decorate --oneline --all' -test_expect_success 'combine branch.master.mergeoptions with merge.ff' ' +test_expect_success 'combine branch.main.mergeoptions with merge.ff' ' git reset --hard c0 && - test_config branch.master.mergeoptions "--ff" && + test_config branch.main.mergeoptions "--ff" && test_config merge.ff "false" && test_tick && git merge c1 && @@ -593,7 +596,7 @@ test_expect_success 'option --no-ff overrides merge.ff=only config' ' test_expect_success 'merge c0 with c1 (ff overrides no-ff)' ' git reset --hard c0 && - test_config branch.master.mergeoptions "--no-ff" && + test_config branch.main.mergeoptions "--no-ff" && git merge --ff c1 && verify_merge file result.1 && verify_head $c1 @@ -606,7 +609,7 @@ test_expect_success 'merge log message' ' test_must_be_empty msg.act && git reset --hard c0 && - test_config branch.master.mergeoptions "--no-ff" && + test_config branch.main.mergeoptions "--no-ff" && git merge --no-log c2 && git show -s --pretty=format:%b HEAD >msg.act && test_must_be_empty msg.act && @@ -950,10 +953,10 @@ test_expect_success 'set up mod-256 conflict scenario' ' git add file && git commit -m base && - # one side changes the first line of each to "master" - sed s/-1/-master/ file >tmp && + # one side changes the first line of each to "main" + sed s/-1/-main/ file >tmp && mv tmp file && - git commit -am master && + git commit -am main && # and the other to "side"; merging the two will # yield 256 separate conflicts @@ -965,12 +968,12 @@ test_expect_success 'set up mod-256 conflict scenario' ' test_expect_success 'merge detects mod-256 conflicts (recursive)' ' git reset --hard && - test_must_fail git merge -s recursive master + test_must_fail git merge -s recursive main ' test_expect_success 'merge detects mod-256 conflicts (resolve)' ' git reset --hard && - test_must_fail git merge -s resolve master + test_must_fail git merge -s resolve main ' test_expect_success 'merge nothing into void' ' diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh index 0f97828cd0..52e8ccc933 100755 --- a/t/t7601-merge-pull-config.sh +++ b/t/t7601-merge-pull-config.sh @@ -30,14 +30,21 @@ test_expect_success 'setup' ' test_expect_success 'pull.rebase not set' ' git reset --hard c0 && git pull . c1 2>err && - test_i18ngrep "Pulling without specifying how to reconcile" err + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and pull.ff=true' ' + git reset --hard c0 && + test_config pull.ff true && + git pull . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err ' test_expect_success 'pull.rebase not set and pull.ff=false' ' git reset --hard c0 && test_config pull.ff false && git pull . c1 2>err && - test_i18ngrep "Pulling without specifying how to reconcile" err + test_i18ngrep ! "Pulling without specifying how to reconcile" err ' test_expect_success 'pull.rebase not set and pull.ff=only' ' @@ -59,12 +66,83 @@ test_expect_success 'pull.rebase not set and --no-rebase given' ' test_i18ngrep ! "Pulling without specifying how to reconcile" err ' +test_expect_success 'pull.rebase not set and --ff given' ' + git reset --hard c0 && + git pull --ff . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --no-ff given' ' + git reset --hard c0 && + git pull --no-ff . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + test_expect_success 'pull.rebase not set and --ff-only given' ' git reset --hard c0 && git pull --ff-only . c1 2>err && test_i18ngrep ! "Pulling without specifying how to reconcile" err ' +test_expect_success 'pull.rebase not set (not-fast-forward)' ' + git reset --hard c2 && + git -c color.advice=always pull . c1 2>err && + test_decode_color <err >decoded && + test_i18ngrep "<YELLOW>hint: " decoded && + test_i18ngrep "Pulling without specifying how to reconcile" decoded +' + +test_expect_success 'pull.rebase not set and pull.ff=true (not-fast-forward)' ' + git reset --hard c2 && + test_config pull.ff true && + git pull . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and pull.ff=false (not-fast-forward)' ' + git reset --hard c2 && + test_config pull.ff false && + git pull . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and pull.ff=only (not-fast-forward)' ' + git reset --hard c2 && + test_config pull.ff only && + test_must_fail git pull . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --rebase given (not-fast-forward)' ' + git reset --hard c2 && + git pull --rebase . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --no-rebase given (not-fast-forward)' ' + git reset --hard c2 && + git pull --no-rebase . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --ff given (not-fast-forward)' ' + git reset --hard c2 && + git pull --ff . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --no-ff given (not-fast-forward)' ' + git reset --hard c2 && + git pull --no-ff . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + +test_expect_success 'pull.rebase not set and --ff-only given (not-fast-forward)' ' + git reset --hard c2 && + test_must_fail git pull --ff-only . c1 2>err && + test_i18ngrep ! "Pulling without specifying how to reconcile" err +' + test_expect_success 'merge c1 with c2' ' git reset --hard c1 && test -f c0.c && diff --git a/t/t7602-merge-octopus-many.sh b/t/t7602-merge-octopus-many.sh index 6abe441ae3..a9c816b47f 100755 --- a/t/t7602-merge-octopus-many.sh +++ b/t/t7602-merge-octopus-many.sh @@ -66,7 +66,7 @@ EOF test_expect_success 'merge output uses pretty names' ' git reset --hard c1 && git merge c2 c3 c4 >actual && - test_i18ncmp expected actual + test_cmp expected actual ' cat >expected <<\EOF @@ -77,8 +77,14 @@ Merge made by the 'recursive' strategy. EOF test_expect_success 'merge reduces irrelevant remote heads' ' + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + mv expected expected.tmp && + sed s/recursive/ort/ expected.tmp >expected && + rm expected.tmp + fi && GIT_MERGE_VERBOSITY=0 git merge c4 c5 >actual && - test_i18ncmp expected actual + test_cmp expected actual ' cat >expected <<\EOF @@ -95,7 +101,7 @@ EOF test_expect_success 'merge fast-forward output uses pretty names' ' git reset --hard c0 && git merge c1 c2 >actual && - test_i18ncmp expected actual + test_cmp expected actual ' test_done diff --git a/t/t7606-merge-custom.sh b/t/t7606-merge-custom.sh index 8e8c4d7246..81fb7c474c 100755 --- a/t/t7606-merge-custom.sh +++ b/t/t7606-merge-custom.sh @@ -4,7 +4,7 @@ test_description="git merge Testing a custom strategy. -* (HEAD, master) Merge commit 'c3' +* (HEAD, main) Merge commit 'c3' |\ | * (tag: c3) c3 * | (tag: c1) c1 diff --git a/t/t7608-merge-messages.sh b/t/t7608-merge-messages.sh index 8e7e0a5865..0b908ab2e7 100755 --- a/t/t7608-merge-messages.sh +++ b/t/t7608-merge-messages.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='test auto-generated merge messages' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh check_oneline() { @@ -10,51 +13,51 @@ check_oneline() { } test_expect_success 'merge local branch' ' - test_commit master-1 && + test_commit main-1 && git checkout -b local-branch && test_commit branch-1 && - git checkout master && - test_commit master-2 && + git checkout main && + test_commit main-2 && git merge local-branch && check_oneline "Merge branch Qlocal-branchQ" ' test_expect_success 'merge octopus branches' ' - git checkout -b octopus-a master && + git checkout -b octopus-a main && test_commit octopus-1 && - git checkout -b octopus-b master && + git checkout -b octopus-b main && test_commit octopus-2 && - git checkout master && + git checkout main && git merge octopus-a octopus-b && check_oneline "Merge branches Qoctopus-aQ and Qoctopus-bQ" ' test_expect_success 'merge tag' ' - git checkout -b tag-branch master && + git checkout -b tag-branch main && test_commit tag-1 && - git checkout master && - test_commit master-3 && + git checkout main && + test_commit main-3 && git merge tag-1 && check_oneline "Merge tag Qtag-1Q" ' test_expect_success 'ambiguous tag' ' - git checkout -b ambiguous master && + git checkout -b ambiguous main && test_commit ambiguous && - git checkout master && - test_commit master-4 && + git checkout main && + test_commit main-4 && git merge ambiguous && check_oneline "Merge tag QambiguousQ" ' test_expect_success 'remote-tracking branch' ' - git checkout -b remote master && + git checkout -b remote main && test_commit remote-1 && - git update-ref refs/remotes/origin/master remote && - git checkout master && - test_commit master-5 && - git merge origin/master && - check_oneline "Merge remote-tracking branch Qorigin/masterQ" + git update-ref refs/remotes/origin/main remote && + git checkout main && + test_commit main-5 && + git merge origin/main && + check_oneline "Merge remote-tracking branch Qorigin/mainQ" ' test_done diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index ad288ddc69..8cc64729ad 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -7,22 +7,25 @@ test_description='git mergetool Testing basic merge tool invocation' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # All the mergetool test work by checking out a temporary branch based -# off 'branch1' and then merging in master and checking the results of +# off 'branch1' and then merging in main and checking the results of # running mergetool test_expect_success 'setup' ' test_config rerere.enabled true && - echo master >file1 && - echo master spaced >"spaced name" && - echo master file11 >file11 && - echo master file12 >file12 && - echo master file13 >file13 && - echo master file14 >file14 && + echo main >file1 && + echo main spaced >"spaced name" && + echo main file11 >file11 && + echo main file12 >file12 && + echo main file13 >file13 && + echo main file14 >file14 && mkdir subdir && - echo master sub >subdir/file3 && + echo main sub >subdir/file3 && test_create_repo submod && ( cd submod && @@ -34,7 +37,7 @@ test_expect_success 'setup' ' git add file1 "spaced name" file1[1-4] subdir/file3 .gitmodules submod && git commit -m "add initial versions" && - git checkout -b branch1 master && + git checkout -b branch1 main && git submodule update -N && echo branch1 change >file1 && echo branch1 newfile >file2 && @@ -71,39 +74,39 @@ test_expect_success 'setup' ' test_write_lines one two 3 >c/c/file.txt && git commit -a -m"move to c" && - git checkout -b stash1 master && + git checkout -b stash1 main && echo stash1 change file11 >file11 && git add file11 && git commit -m "stash1 changes" && - git checkout -b stash2 master && + git checkout -b stash2 main && echo stash2 change file11 >file11 && git add file11 && git commit -m "stash2 changes" && - git checkout master && + git checkout main && git submodule update -N && - echo master updated >file1 && - echo master new >file2 && - echo master updated spaced >"spaced name" && - echo master both added >both && - echo master updated file12 >file12 && - echo master updated file14 >file14 && - echo master new sub >subdir/file3 && + echo main updated >file1 && + echo main new >file2 && + echo main updated spaced >"spaced name" && + echo main both added >both && + echo main updated file12 >file12 && + echo main updated file14 >file14 && + echo main new sub >subdir/file3 && ( cd submod && - echo master submodule >bar && + echo main submodule >bar && git add bar && - git commit -m "Add bar on master" && - git checkout -b submod-master + git commit -m "Add bar on main" && + git checkout -b submod-main ) && git add file1 "spaced name" file12 file14 file2 subdir/file3 submod && git add both && git rm file11 && - git commit -m "master updates" && + git commit -m "main updates" && git clean -fdx && - git checkout -b order-file-start master && + git checkout -b order-file-start main && echo start >a && echo start >b && git add a b && @@ -130,7 +133,7 @@ test_expect_success 'custom mergetool' ' test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool both && yes "" | git mergetool file1 file1 && yes "" | git mergetool file2 "spaced name" && @@ -138,11 +141,11 @@ test_expect_success 'custom mergetool' ' yes "d" | git mergetool file11 && yes "d" | git mergetool file12 && yes "l" | git mergetool submod && - echo "master updated" >expect && + echo "main updated" >expect && test_cmp expect file1 && - echo "master new" >expect && + echo "main new" >expect && test_cmp expect file2 && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect subdir/file3 && echo "branch1 submodule" >expect && test_cmp expect submod/bar && @@ -156,7 +159,7 @@ test_expect_success 'gui mergetool' ' test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool --gui both && yes "" | git mergetool -g file1 file1 && yes "" | git mergetool --gui file2 "spaced name" && @@ -164,11 +167,11 @@ test_expect_success 'gui mergetool' ' yes "d" | git mergetool --gui file11 && yes "d" | git mergetool --gui file12 && yes "l" | git mergetool --gui submod && - echo "gui master updated" >expect && + echo "gui main updated" >expect && test_cmp expect file1 && - echo "gui master new" >expect && + echo "gui main new" >expect && test_cmp expect file2 && - echo "gui master new sub" >expect && + echo "gui main new sub" >expect && test_cmp expect subdir/file3 && echo "branch1 submodule" >expect && test_cmp expect submod/bar && @@ -179,7 +182,7 @@ test_expect_success 'gui mergetool without merge.guitool set falls back to merge test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool --gui both && yes "" | git mergetool -g file1 file1 && yes "" | git mergetool --gui file2 "spaced name" && @@ -187,11 +190,11 @@ test_expect_success 'gui mergetool without merge.guitool set falls back to merge yes "d" | git mergetool --gui file11 && yes "d" | git mergetool --gui file12 && yes "l" | git mergetool --gui submod && - echo "master updated" >expect && + echo "main updated" >expect && test_cmp expect file1 && - echo "master new" >expect && + echo "main new" >expect && test_cmp expect file2 && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect subdir/file3 && echo "branch1 submodule" >expect && test_cmp expect submod/bar && @@ -206,7 +209,7 @@ test_expect_success 'mergetool crlf' ' # test_when_finished is LIFO.) test_config core.autocrlf true && git checkout -b test$test_count branch1 && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool file1 && yes "" | git mergetool file2 && yes "" | git mergetool "spaced name" && @@ -215,11 +218,11 @@ test_expect_success 'mergetool crlf' ' yes "d" | git mergetool file11 && yes "d" | git mergetool file12 && yes "r" | git mergetool submod && - test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" && - test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" && - test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" && + test "$(printf x | cat file1 -)" = "$(printf "main updated\r\nx")" && + test "$(printf x | cat file2 -)" = "$(printf "main new\r\nx")" && + test "$(printf x | cat subdir/file3 -)" = "$(printf "main new sub\r\nx")" && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && git commit -m "branch1 resolved with mergetool - autocrlf" ' @@ -230,9 +233,9 @@ test_expect_success 'mergetool in subdir' ' git submodule update -N && ( cd subdir && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool file3 && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect file3 ) ' @@ -243,7 +246,7 @@ test_expect_success 'mergetool on file in parent dir' ' git submodule update -N && ( cd subdir && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool file3 && yes "" | git mergetool ../file1 && yes "" | git mergetool ../file2 ../spaced\ name && @@ -251,9 +254,9 @@ test_expect_success 'mergetool on file in parent dir' ' yes "d" | git mergetool ../file11 && yes "d" | git mergetool ../file12 && yes "l" | git mergetool ../submod && - echo "master updated" >expect && + echo "main updated" >expect && test_cmp expect ../file1 && - echo "master new" >expect && + echo "main new" >expect && test_cmp expect ../file2 && echo "branch1 submodule" >expect && test_cmp expect ../submod/bar && @@ -265,7 +268,7 @@ test_expect_success 'mergetool skips autoresolved' ' test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "d" | git mergetool file11 && yes "d" | git mergetool file12 && @@ -280,17 +283,17 @@ test_expect_success 'mergetool merges all from subdir (rerere disabled)' ' test_config rerere.enabled false && ( cd subdir && - test_must_fail git merge master && + test_must_fail git merge main && yes "r" | git mergetool ../submod && yes "d" "d" | git mergetool --no-prompt && - echo "master updated" >expect && + echo "main updated" >expect && test_cmp expect ../file1 && - echo "master new" >expect && + echo "main new" >expect && test_cmp expect ../file2 && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect file3 && ( cd .. && git submodule update -N ) && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect ../submod/bar && git commit -m "branch2 resolved by mergetool from subdir" ) @@ -303,17 +306,17 @@ test_expect_success 'mergetool merges all from subdir (rerere enabled)' ' rm -rf .git/rr-cache && ( cd subdir && - test_must_fail git merge master && + test_must_fail git merge main && yes "r" | git mergetool ../submod && yes "d" "d" | git mergetool --no-prompt && - echo "master updated" >expect && + echo "main updated" >expect && test_cmp expect ../file1 && - echo "master new" >expect && + echo "main new" >expect && test_cmp expect ../file2 && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect file3 && ( cd .. && git submodule update -N ) && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect ../submod/bar && git commit -m "branch2 resolved by mergetool from subdir" ) @@ -325,7 +328,7 @@ test_expect_success 'mergetool skips resolved paths when rerere is active' ' rm -rf .git/rr-cache && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && yes "l" | git mergetool --no-prompt submod && yes "d" "d" | git mergetool --no-prompt && git submodule update -N && @@ -366,11 +369,11 @@ test_expect_success 'mergetool takes partial path' ' test_config rerere.enabled false && git checkout -b test$test_count branch1 && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && yes "" | git mergetool subdir && - echo "master new sub" >expect && + echo "main new sub" >expect && test_cmp expect subdir/file3 ' @@ -434,7 +437,7 @@ test_expect_success 'deleted vs modified submodule' ' git rm --cached submod && git commit -m "Submodule deleted from branch" && git checkout -b test$test_count.a test$test_count && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "" | git mergetool file1 file2 spaced\ name subdir/file3 && yes "" | git mergetool both && @@ -444,7 +447,7 @@ test_expect_success 'deleted vs modified submodule' ' echo "branch1 submodule" >expect && test_cmp expect submod/bar && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && output="$(git mergetool --no-prompt)" && test "$output" = "No files need merging" && @@ -453,7 +456,7 @@ test_expect_success 'deleted vs modified submodule' ' mv submod submod-movedaside && git checkout -b test$test_count.b test$test_count && git submodule update -N && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "" | git mergetool file1 file2 spaced\ name subdir/file3 && yes "" | git mergetool both && @@ -465,7 +468,7 @@ test_expect_success 'deleted vs modified submodule' ' git commit -m "Merge resolved by deleting module" && mv submod-movedaside submod && - git checkout -b test$test_count.c master && + git checkout -b test$test_count.c main && git submodule update -N && test_must_fail git merge test$test_count && test -n "$(git ls-files -u)" && @@ -481,7 +484,7 @@ test_expect_success 'deleted vs modified submodule' ' git commit -m "Merge resolved by deleting module" && mv submod.orig submod && - git checkout -b test$test_count.d master && + git checkout -b test$test_count.d main && git submodule update -N && test_must_fail git merge test$test_count && test -n "$(git ls-files -u)" && @@ -489,10 +492,10 @@ test_expect_success 'deleted vs modified submodule' ' yes "" | git mergetool both && yes "d" | git mergetool file11 file12 && yes "l" | git mergetool submod && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && output="$(git mergetool --no-prompt)" && test "$output" = "No files need merging" && @@ -509,7 +512,7 @@ test_expect_success 'file vs modified submodule' ' git add submod && git commit -m "Submodule path becomes file" && git checkout -b test$test_count.a branch1 && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "" | git mergetool file1 file2 spaced\ name subdir/file3 && yes "" | git mergetool both && @@ -519,7 +522,7 @@ test_expect_success 'file vs modified submodule' ' echo "branch1 submodule" >expect && test_cmp expect submod/bar && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && output="$(git mergetool --no-prompt)" && test "$output" = "No files need merging" && @@ -527,12 +530,19 @@ test_expect_success 'file vs modified submodule' ' mv submod submod-movedaside && git checkout -b test$test_count.b test$test_count && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "" | git mergetool file1 file2 spaced\ name subdir/file3 && yes "" | git mergetool both && yes "d" | git mergetool file11 file12 && - yes "l" | git mergetool submod && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + yes "c" | git mergetool submod~HEAD && + git rm submod && + git mv submod~HEAD submod + else + yes "l" | git mergetool submod + fi && git submodule update -N && echo "not a submodule" >expect && test_cmp expect submod && @@ -540,7 +550,7 @@ test_expect_success 'file vs modified submodule' ' test "$output" = "No files need merging" && git commit -m "Merge resolved by keeping file" && - git checkout -b test$test_count.c master && + git checkout -b test$test_count.c main && rmdir submod && mv submod-movedaside submod && test ! -e submod.orig && git submodule update -N && @@ -549,7 +559,15 @@ test_expect_success 'file vs modified submodule' ' yes "" | git mergetool file1 file2 spaced\ name subdir/file3 && yes "" | git mergetool both && yes "d" | git mergetool file11 file12 && - yes "r" | git mergetool submod && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + mv submod submod.orig && + git rm --cached submod && + yes "c" | git mergetool submod~test19 && + git mv submod~test19 submod + else + yes "r" | git mergetool submod + fi && test -d submod.orig && git submodule update -N && echo "not a submodule" >expect && @@ -558,7 +576,7 @@ test_expect_success 'file vs modified submodule' ' test "$output" = "No files need merging" && git commit -m "Merge resolved by keeping file" && - git checkout -b test$test_count.d master && + git checkout -b test$test_count.d main && rmdir submod && mv submod.orig submod && git submodule update -N && test_must_fail git merge test$test_count && @@ -567,10 +585,14 @@ test_expect_success 'file vs modified submodule' ' yes "" | git mergetool both && yes "d" | git mergetool file11 file12 && yes "l" | git mergetool submod && - echo "master submodule" >expect && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + yes "d" | git mergetool submod~test19 + fi && + echo "main submodule" >expect && test_cmp expect submod/bar && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && output="$(git mergetool --no-prompt)" && test "$output" = "No files need merging" && @@ -653,7 +675,7 @@ test_expect_success 'directory vs modified submodule' ' git add submod/file16 && git commit -m "Submodule path becomes directory" && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && yes "l" | git mergetool submod && echo "not a submodule" >expect && @@ -661,10 +683,17 @@ test_expect_success 'directory vs modified submodule' ' rm -rf submod.orig && git reset --hard && - test_must_fail git merge master && + test_must_fail git merge main && test -n "$(git ls-files -u)" && test ! -e submod.orig && - yes "r" | git mergetool submod && + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + yes "r" | git mergetool submod~main && + git mv submod submod.orig && + git mv submod~main submod + else + yes "r" | git mergetool submod + fi && test -d submod.orig && echo "not a submodule" >expect && test_cmp expect submod.orig/file16 && @@ -672,18 +701,18 @@ test_expect_success 'directory vs modified submodule' ' mv submod-movedaside/.git submod && ( cd submod && git clean -f && git reset --hard ) && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && git reset --hard && rm -rf submod-movedaside && - git checkout -b test$test_count.c master && + git checkout -b test$test_count.c main && git submodule update -N && test_must_fail git merge test$test_count && test -n "$(git ls-files -u)" && yes "l" | git mergetool submod && git submodule update -N && - echo "master submodule" >expect && + echo "main submodule" >expect && test_cmp expect submod/bar && git reset --hard && @@ -695,7 +724,7 @@ test_expect_success 'directory vs modified submodule' ' echo "not a submodule" >expect && test_cmp expect submod/file16 && - git reset --hard master && + git reset --hard main && ( cd submod && git clean -f && git reset --hard ) && git submodule update -N ' @@ -703,7 +732,7 @@ test_expect_success 'directory vs modified submodule' ' test_expect_success 'file with no base' ' test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && - test_must_fail git merge master && + test_must_fail git merge main && git mergetool --no-prompt --tool mybase -- both && test_must_be_empty both ' @@ -713,9 +742,9 @@ test_expect_success 'custom commands override built-ins' ' git checkout -b test$test_count branch1 && test_config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" && test_config mergetool.defaults.trustExitCode true && - test_must_fail git merge master && + test_must_fail git merge main && git mergetool --no-prompt --tool defaults -- both && - echo master both added >expected && + echo main both added >expected && test_cmp expected both ' @@ -725,7 +754,7 @@ test_expect_success 'filenames seen by tools start with ./' ' test_config mergetool.writeToTemp false && test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" && test_config mergetool.myecho.trustExitCode true && - test_must_fail git merge master && + test_must_fail git merge main && git mergetool --no-prompt --tool myecho -- both >actual && grep ^\./both_LOCAL_ actual ' @@ -742,7 +771,7 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT test_config mergetool.writeToTemp true && test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" && test_config mergetool.myecho.trustExitCode true && - test_must_fail git merge master && + test_must_fail git merge main && git mergetool --no-prompt --tool myecho -- both >actual && ! grep ^\./both_LOCAL_ actual && grep /both_LOCAL_ actual @@ -802,4 +831,33 @@ test_expect_success 'mergetool -Oorder-file is honored' ' test_cmp expect actual ' +test_expect_success 'mergetool --tool-help shows recognized tools' ' + # Check a few known tools are correctly shown + git mergetool --tool-help >mergetools && + grep vimdiff mergetools && + grep vimdiff3 mergetools && + grep gvimdiff2 mergetools && + grep araxis mergetools && + grep xxdiff mergetools && + grep meld mergetools +' + +test_expect_success 'mergetool hideResolved' ' + test_config mergetool.hideResolved true && + test_when_finished "git reset --hard" && + git checkout -b test${test_count}_b main && + test_write_lines >file1 base "" a && + git commit -a -m "base" && + test_write_lines >file1 base "" c && + git commit -a -m "remote update" && + git checkout -b test${test_count}_a HEAD~ && + test_write_lines >file1 local "" b && + git commit -a -m "local update" && + test_must_fail git merge test${test_count}_b && + yes "" | git mergetool file1 && + test_write_lines >expect local "" c && + test_cmp expect file1 && + git commit -m "test resolved with mergetool" +' + test_done diff --git a/t/t7611-merge-abort.sh b/t/t7611-merge-abort.sh index 7c84a518aa..c0e9425115 100755 --- a/t/t7611-merge-abort.sh +++ b/t/t7611-merge-abort.sh @@ -7,7 +7,7 @@ Set up repo with conflicting and non-conflicting branches: There are three files foo/bar/baz, and the following graph illustrates the content of these files in each commit: -# foo/bar/baz --- foo/bar/bazz <-- master +# foo/bar/baz --- foo/bar/bazz <-- main # \ # --- foo/barf/bazf <-- conflict_branch # \ @@ -22,6 +22,9 @@ Next, test git merge --abort with the following variables: - changed/unchanged worktree after merge - changed/unchanged index after merge ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -40,7 +43,7 @@ test_expect_success 'setup' ' git checkout -b clean_branch HEAD^ && echo bart > bar && git commit -a -m "clean" && - git checkout master + git checkout main ' pre_merge_head="$(git rev-parse HEAD)" diff --git a/t/t7612-merge-verify-signatures.sh b/t/t7612-merge-verify-signatures.sh index a426f3a89a..61330f71b1 100755 --- a/t/t7612-merge-verify-signatures.sh +++ b/t/t7612-merge-verify-signatures.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='merge signature verification tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh . "$TEST_DIRECTORY/lib-gpg.sh" @@ -31,7 +34,7 @@ test_expect_success GPG 'create signed commits' ' echo 3 >baz && git add baz && test_tick && git commit -SB7227189 -m "untrusted on side" && - git checkout master + git checkout main ' test_expect_success GPG 'merge unsigned commit with verification' ' diff --git a/t/t7614-merge-signoff.sh b/t/t7614-merge-signoff.sh index c1b8446f49..fee258d4f0 100755 --- a/t/t7614-merge-signoff.sh +++ b/t/t7614-merge-signoff.sh @@ -5,23 +5,26 @@ test_description='git merge --signoff This test runs git merge --signoff and makes sure that it works. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # Setup test files test_setup() { # Expected commit message after merge --signoff cat >expected-signed <<EOF && -Merge branch 'master' into other-branch +Merge branch 'main' into other-branch Signed-off-by: $(git var GIT_COMMITTER_IDENT | sed -e "s/>.*/>/") EOF # Expected commit message after merge without --signoff (or with --no-signoff) cat >expected-unsigned <<EOF && -Merge branch 'master' into other-branch +Merge branch 'main' into other-branch EOF - # Initial commit and feature branch to merge master into it. + # Initial commit and feature branch to merge main into it. git commit --allow-empty -m "Initial empty commit" && git checkout -b other-branch && test_commit other-branch file1 1 @@ -38,30 +41,30 @@ test_expect_success 'setup' ' # Test with --signoff flag test_expect_success 'git merge --signoff adds a sign-off line' ' - git checkout master && - test_commit master-branch-2 file2 2 && + git checkout main && + test_commit main-branch-2 file2 2 && git checkout other-branch && - git merge master --signoff --no-edit && + git merge main --signoff --no-edit && git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && test_cmp expected-signed actual ' # Test without --signoff flag test_expect_success 'git merge does not add a sign-off line' ' - git checkout master && - test_commit master-branch-3 file3 3 && + git checkout main && + test_commit main-branch-3 file3 3 && git checkout other-branch && - git merge master --no-edit && + git merge main --no-edit && git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && test_cmp expected-unsigned actual ' # Test for --no-signoff flag test_expect_success 'git merge --no-signoff flag cancels --signoff flag' ' - git checkout master && - test_commit master-branch-4 file4 4 && + git checkout main && + test_commit main-branch-4 file4 4 && git checkout other-branch && - git merge master --no-edit --signoff --no-signoff && + git merge main --no-edit --signoff --no-signoff && git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && test_cmp expected-unsigned actual ' diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh index 48261ba080..937f89ee8c 100755 --- a/t/t7701-repack-unpack-unreachable.sh +++ b/t/t7701-repack-unpack-unreachable.sh @@ -2,6 +2,9 @@ test_description='git repack works correctly' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh fsha1= @@ -22,7 +25,7 @@ test_expect_success '-A with -d option leaves unreachable objects unpacked' ' git commit -a -m more_content && csha1=$(git rev-parse HEAD^{commit}) && tsha1=$(git rev-parse HEAD^{tree}) && - git checkout master && + git checkout main && echo even more content >> file1 && test_tick && git commit -a -m even_more_content && diff --git a/t/t7703-repack-geometric.sh b/t/t7703-repack-geometric.sh new file mode 100755 index 0000000000..5ccaa440e0 --- /dev/null +++ b/t/t7703-repack-geometric.sh @@ -0,0 +1,183 @@ +#!/bin/sh + +test_description='git repack --geometric works correctly' + +. ./test-lib.sh + +GIT_TEST_MULTI_PACK_INDEX=0 + +objdir=.git/objects +midx=$objdir/pack/multi-pack-index + +test_expect_success '--geometric with no packs' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + git repack --geometric 2 >out && + test_i18ngrep "Nothing new to pack" out + ) +' + +test_expect_success '--geometric with one pack' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + test_commit "base" && + git repack -d && + + git repack --geometric 2 >out && + + test_i18ngrep "Nothing new to pack" out + ) +' + +test_expect_success '--geometric with an intact progression' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + # These packs already form a geometric progression. + test_commit_bulk --start=1 1 && # 3 objects + test_commit_bulk --start=2 2 && # 6 objects + test_commit_bulk --start=4 4 && # 12 objects + + find $objdir/pack -name "*.pack" | sort >expect && + git repack --geometric 2 -d && + find $objdir/pack -name "*.pack" | sort >actual && + + test_cmp expect actual + ) +' + +test_expect_success '--geometric with loose objects' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + # These packs already form a geometric progression. + test_commit_bulk --start=1 1 && # 3 objects + test_commit_bulk --start=2 2 && # 6 objects + # The loose objects are packed together, breaking the + # progression. + test_commit loose && # 3 objects + + find $objdir/pack -name "*.pack" | sort >before && + git repack --geometric 2 -d && + find $objdir/pack -name "*.pack" | sort >after && + + comm -13 before after >new && + comm -23 before after >removed && + + test_line_count = 1 new && + test_must_be_empty removed && + + git repack --geometric 2 -d && + find $objdir/pack -name "*.pack" | sort >after && + + # The progression (3, 3, 6) is combined into one new pack. + test_line_count = 1 after + ) +' + +test_expect_success '--geometric with small-pack rollup' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + test_commit_bulk --start=1 1 && # 3 objects + test_commit_bulk --start=2 1 && # 3 objects + find $objdir/pack -name "*.pack" | sort >small && + test_commit_bulk --start=3 4 && # 12 objects + test_commit_bulk --start=7 8 && # 24 objects + find $objdir/pack -name "*.pack" | sort >before && + + git repack --geometric 2 -d && + + # Three packs in total; two of the existing large ones, and one + # new one. + find $objdir/pack -name "*.pack" | sort >after && + test_line_count = 3 after && + comm -3 small before | tr -d "\t" >large && + grep -qFf large after + ) +' + +test_expect_success '--geometric with small- and large-pack rollup' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + # size(small1) + size(small2) > size(medium) / 2 + test_commit_bulk --start=1 1 && # 3 objects + test_commit_bulk --start=2 1 && # 3 objects + test_commit_bulk --start=2 3 && # 7 objects + test_commit_bulk --start=6 9 && # 27 objects && + + find $objdir/pack -name "*.pack" | sort >before && + + git repack --geometric 2 -d && + + find $objdir/pack -name "*.pack" | sort >after && + comm -12 before after >untouched && + + # Two packs in total; the largest pack from before running "git + # repack", and one new one. + test_line_count = 1 untouched && + test_line_count = 2 after + ) +' + +test_expect_success '--geometric ignores kept packs' ' + git init geometric && + test_when_finished "rm -fr geometric" && + ( + cd geometric && + + test_commit kept && # 3 objects + test_commit pack && # 3 objects + + KEPT=$(git pack-objects --revs $objdir/pack/pack <<-EOF + refs/tags/kept + EOF + ) && + PACK=$(git pack-objects --revs $objdir/pack/pack <<-EOF + refs/tags/pack + ^refs/tags/kept + EOF + ) && + + # neither pack contains more than twice the number of objects in + # the other, so they should be combined. but, marking one as + # .kept on disk will "freeze" it, so the pack structure should + # remain unchanged. + touch $objdir/pack/pack-$KEPT.keep && + + find $objdir/pack -name "*.pack" | sort >before && + git repack --geometric 2 -d && + find $objdir/pack -name "*.pack" | sort >after && + + # both packs should still exist + test_path_is_file $objdir/pack/pack-$KEPT.pack && + test_path_is_file $objdir/pack/pack-$PACK.pack && + + # and no new packs should be created + test_cmp before after && + + # Passing --pack-kept-objects causes packs with a .keep file to + # be repacked, too. + git repack --geometric 2 -d --pack-kept-objects && + + find $objdir/pack -name "*.pack" >after && + test_line_count = 1 after + ) +' + +test_done diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 524f30f7dc..a173f564bc 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -8,6 +8,9 @@ test_description='git-difftool Testing basic diff tool invocation ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh difftool_test_setup () @@ -35,23 +38,23 @@ test_expect_success 'basic usage requires no repo' ' test_i18ngrep ^usage: output ' -# Create a file on master and change it on branch +# Create a file on main and change it on branch test_expect_success 'setup' ' - echo master >file && + echo main >file && git add file && git commit -m "added file" && - git checkout -b branch master && + git checkout -b branch main && echo branch >file && git commit -a -m "branch changed file" && - git checkout master + git checkout main ' # Configure a custom difftool.<tool>.cmd and use it test_expect_success 'custom commands' ' difftool_test_setup && test_config difftool.test-tool.cmd "cat \"\$REMOTE\"" && - echo master >expect && + echo main >expect && git difftool --no-prompt branch >actual && test_cmp expect actual && @@ -63,7 +66,7 @@ test_expect_success 'custom commands' ' test_expect_success 'custom tool commands override built-ins' ' test_config difftool.vimdiff.cmd "cat \"\$REMOTE\"" && - echo master >expect && + echo main >expect && git difftool --tool vimdiff --no-prompt branch >actual && test_cmp expect actual ' @@ -311,21 +314,21 @@ test_expect_success 'difftool.<tool>.path' ' test_expect_success 'difftool --extcmd=cat' ' echo branch >expect && - echo master >>expect && + echo main >>expect && git difftool --no-prompt --extcmd=cat branch >actual && test_cmp expect actual ' test_expect_success 'difftool --extcmd cat' ' echo branch >expect && - echo master >>expect && + echo main >>expect && git difftool --no-prompt --extcmd=cat branch >actual && test_cmp expect actual ' test_expect_success 'difftool -x cat' ' echo branch >expect && - echo master >>expect && + echo main >>expect && git difftool --no-prompt -x cat branch >actual && test_cmp expect actual ' @@ -338,7 +341,7 @@ test_expect_success 'difftool --extcmd echo arg1' ' ' test_expect_success 'difftool --extcmd cat arg1' ' - echo master >expect && + echo main >expect && git difftool --no-prompt \ --extcmd sh\ -c\ \"cat\ \$1\" branch >actual && test_cmp expect actual @@ -351,7 +354,7 @@ test_expect_success 'difftool --extcmd cat arg2' ' test_cmp expect actual ' -# Create a second file on master and a different version on branch +# Create a second file on main and a different version on branch test_expect_success 'setup with 2 files different' ' echo m2 >file2 && git add file2 && @@ -361,7 +364,7 @@ test_expect_success 'setup with 2 files different' ' echo br2 >file2 && git add file2 && git commit -a -m "branch changed file2" && - git checkout master + git checkout main ' test_expect_success 'say no to the first file' ' @@ -369,14 +372,14 @@ test_expect_success 'say no to the first file' ' git difftool -x cat branch <input >output && grep m2 output && grep br2 output && - ! grep master output && + ! grep main output && ! grep branch output ' test_expect_success 'say no to the second file' ' (echo && echo n) >input && git difftool -x cat branch <input >output && - grep master output && + grep main output && grep branch output && ! grep m2 output && ! grep br2 output @@ -384,7 +387,7 @@ test_expect_success 'say no to the second file' ' test_expect_success 'ending prompt input with EOF' ' git difftool -x cat branch </dev/null >output && - ! grep master output && + ! grep main output && ! grep branch output && ! grep m2 output && ! grep br2 output @@ -396,9 +399,9 @@ test_expect_success 'difftool --tool-help' ' ' test_expect_success 'setup change in subdirectory' ' - git checkout master && + git checkout main && mkdir sub && - echo master >sub/sub && + echo main >sub/sub && git add sub/sub && git commit -m "added sub/sub" && git tag v1 && @@ -440,20 +443,20 @@ run_dir_diff_test () { run_dir_diff_test 'difftool -d' ' git difftool -d $symlinks --extcmd ls branch >output && - grep sub output && - grep file output + grep "^sub$" output && + grep "^file$" output ' run_dir_diff_test 'difftool --dir-diff' ' git difftool --dir-diff $symlinks --extcmd ls branch >output && - grep sub output && - grep file output + grep "^sub$" output && + grep "^file$" output ' run_dir_diff_test 'difftool --dir-diff ignores --prompt' ' git difftool --dir-diff $symlinks --prompt --extcmd ls branch >output && - grep sub output && - grep file output + grep "^sub$" output && + grep "^file$" output ' run_dir_diff_test 'difftool --dir-diff branch from subdirectory' ' @@ -462,11 +465,11 @@ run_dir_diff_test 'difftool --dir-diff branch from subdirectory' ' git difftool --dir-diff $symlinks --extcmd ls branch >output && # "sub" must only exist in "right" # "file" and "file2" must be listed in both "left" and "right" - grep sub output >sub-output && + grep "^sub$" output >sub-output && test_line_count = 1 sub-output && - grep file"$" output >file-output && + grep "^file$" output >file-output && test_line_count = 2 file-output && - grep file2 output >file2-output && + grep "^file2$" output >file2-output && test_line_count = 2 file2-output ) ' @@ -477,11 +480,11 @@ run_dir_diff_test 'difftool --dir-diff v1 from subdirectory' ' git difftool --dir-diff $symlinks --extcmd ls v1 >output && # "sub" and "file" exist in both v1 and HEAD. # "file2" is unchanged. - grep sub output >sub-output && + grep "^sub$" output >sub-output && test_line_count = 2 sub-output && - grep file output >file-output && + grep "^file$" output >file-output && test_line_count = 2 file-output && - ! grep file2 output + ! grep "^file2$" output ) ' @@ -491,9 +494,9 @@ run_dir_diff_test 'difftool --dir-diff branch from subdirectory w/ pathspec' ' git difftool --dir-diff $symlinks --extcmd ls branch -- .>output && # "sub" only exists in "right" # "file" and "file2" must not be listed - grep sub output >sub-output && + grep "^sub$" output >sub-output && test_line_count = 1 sub-output && - ! grep file output + ! grep "^file$" output ) ' @@ -503,9 +506,9 @@ run_dir_diff_test 'difftool --dir-diff v1 from subdirectory w/ pathspec' ' git difftool --dir-diff $symlinks --extcmd ls v1 -- .>output && # "sub" exists in v1 and HEAD # "file" is filtered out by the pathspec - grep sub output >sub-output && + grep "^sub$" output >sub-output && test_line_count = 2 sub-output && - ! grep file output + ! grep "^file$" output ) ' @@ -518,16 +521,16 @@ run_dir_diff_test 'difftool --dir-diff from subdirectory with GIT_DIR set' ' cd sub && git difftool --dir-diff $symlinks --extcmd ls \ branch -- sub >output && - grep sub output && - ! grep file output + grep "^sub$" output && + ! grep "^file$" output ) ' run_dir_diff_test 'difftool --dir-diff when worktree file is missing' ' test_when_finished git reset --hard && rm file2 && - git difftool --dir-diff $symlinks --extcmd ls branch master >output && - grep file2 output + git difftool --dir-diff $symlinks --extcmd ls branch main >output && + grep "^file2$" output ' run_dir_diff_test 'difftool --dir-diff with unmerged files' ' @@ -543,7 +546,7 @@ run_dir_diff_test 'difftool --dir-diff with unmerged files' ' echo b >>file && git add file && git commit -m conflict-b && - git checkout master && + git checkout main && git merge conflict-a && test_must_fail git merge conflict-b && cat >expect <<-EOF && @@ -728,6 +731,19 @@ test_expect_success 'add -N and difftool -d' ' git difftool --dir-diff --extcmd ls ' +test_expect_success 'difftool --cached with unmerged files' ' + test_when_finished git reset --hard && + + test_commit conflicting && + test_commit conflict-a conflict.t a && + git reset --hard conflicting && + test_commit conflict-b conflict.t b && + test_must_fail git merge conflict-a && + + git difftool --cached --no-prompt >output && + test_must_be_empty output +' + test_expect_success 'outside worktree' ' echo 1 >1 && echo 2 >2 && @@ -746,4 +762,36 @@ test_expect_success 'difftool --gui, --tool and --extcmd are mutually exclusive' test_must_fail git difftool --gui --tool=test-tool --extcmd=cat ' +test_expect_success 'difftool --rotate-to' ' + difftool_test_setup && + test_when_finished git reset --hard && + echo 1 >1 && + echo 2 >2 && + echo 4 >4 && + git add 1 2 4 && + git commit -a -m "124" && + git difftool --no-prompt --extcmd=cat --rotate-to="2" HEAD^ >output && + cat >expect <<-\EOF && + 2 + 4 + 1 + EOF + test_cmp output expect +' + +test_expect_success 'difftool --skip-to' ' + difftool_test_setup && + test_when_finished git reset --hard && + git difftool --no-prompt --extcmd=cat --skip-to="2" HEAD^ >output && + cat >expect <<-\EOF && + 2 + 4 + EOF + test_cmp output expect +' + +test_expect_success 'difftool --rotate/skip-to error condition' ' + test_must_fail git difftool --no-prompt --extcmd=cat --rotate-to="3" HEAD^ && + test_must_fail git difftool --no-prompt --extcmd=cat --skip-to="3" HEAD^ +' test_done diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index 991d5bd9c0..6b6423a07c 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -6,8 +6,18 @@ test_description='git grep various. ' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh +test_invalid_grep_expression() { + params="$@" && + test_expect_success "invalid expression: grep $params" ' + test_must_fail git grep $params -- nonexisting + ' +} + cat >hello.c <<EOF #include <assert.h> #include <stdio.h> @@ -86,6 +96,8 @@ test_expect_success 'grep should not segfault with a bad input' ' test_must_fail git grep "(" ' +test_invalid_grep_expression --and -e A + for H in HEAD '' do case "$H" in @@ -687,21 +699,9 @@ test_expect_success 'grep -C1 hunk mark between files' ' ' test_expect_success 'log grep setup' ' - echo a >>file && - test_tick && - GIT_AUTHOR_NAME="With * Asterisk" \ - GIT_AUTHOR_EMAIL="xyzzy@frotz.com" \ - git commit -a -m "second" && - - echo a >>file && - test_tick && - git commit -a -m "third" && - - echo a >>file && - test_tick && - GIT_AUTHOR_NAME="Night Fall" \ - GIT_AUTHOR_EMAIL="nitfol@frobozz.com" \ - git commit -a -m "fourth" + test_commit --append --author "With * Asterisk <xyzzy@frotz.com>" second file a && + test_commit --append third file a && + test_commit --append --author "Night Fall <nitfol@frobozz.com>" fourth file a ' test_expect_success 'log grep (1)' ' @@ -978,7 +978,8 @@ do " done -test_expect_success !PTHREADS,C_LOCALE_OUTPUT 'grep --threads=N or pack.threads=N warns when no pthreads' ' +test_expect_success !PTHREADS,!FAIL_PREREQS \ + 'grep --threads=N or pack.threads=N warns when no pthreads' ' git grep --threads=2 Hello hello_world 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && @@ -1206,19 +1207,19 @@ test_expect_success 'grep -e -- -- path' ' ' test_expect_success 'dashdash disambiguates rev as rev' ' - test_when_finished "rm -f master" && - echo content >master && - echo master:hello.c >expect && - git grep -l o master -- hello.c >actual && + test_when_finished "rm -f main" && + echo content >main && + echo main:hello.c >expect && + git grep -l o main -- hello.c >actual && test_cmp expect actual ' test_expect_success 'dashdash disambiguates pathspec as pathspec' ' - test_when_finished "git rm -f master" && - echo content >master && - git add master && - echo master:content >expect && - git grep o -- master >actual && + test_when_finished "git rm -f main" && + echo content >main && + git add main && + echo main:content >expect && + git grep o -- main >actual && test_cmp expect actual ' @@ -1254,15 +1255,15 @@ test_expect_success 'grep --no-index pattern -- path' ' ' test_expect_success 'grep --no-index complains of revs' ' - test_must_fail git grep --no-index o master -- 2>err && + test_must_fail git grep --no-index o main -- 2>err && test_i18ngrep "cannot be used with revs" err ' test_expect_success 'grep --no-index prefers paths to revs' ' - test_when_finished "rm -f master" && - echo content >master && - echo master:content >expect && - git grep --no-index o master >actual && + test_when_finished "rm -f main" && + echo content >main && + echo main:content >expect && + git grep --no-index o main >actual && test_cmp expect actual ' diff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh index 03dba6685a..e5d1e4ea68 100755 --- a/t/t7812-grep-icase-non-ascii.sh +++ b/t/t7812-grep-icase-non-ascii.sh @@ -57,7 +57,12 @@ test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: setup invalid UTF-8 data' printf "\\200\\n" >invalid-0x80 && echo "ævar" >expected && cat expected >>invalid-0x80 && - git add invalid-0x80 + git add invalid-0x80 && + + # Test for PCRE2_MATCH_INVALID_UTF bug + # https://bugs.exim.org/show_bug.cgi?id=2642 + printf "\\345Aæ\\n" >invalid-0xe5 && + git add invalid-0xe5 ' test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep ASCII from invalid UTF-8 data' ' @@ -67,6 +72,13 @@ test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep ASCII from invalid UT test_cmp expected actual ' +test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep ASCII from invalid UTF-8 data (PCRE2 bug #2642)' ' + git grep -h "Aæ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual && + git grep -h "(*NO_JIT)Aæ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual +' + test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep non-ASCII from invalid UTF-8 data' ' git grep -h "æ" invalid-0x80 >actual && test_cmp expected actual && @@ -74,14 +86,41 @@ test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep non-ASCII from invali test_cmp expected actual ' +test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep non-ASCII from invalid UTF-8 data (PCRE2 bug #2642)' ' + git grep -h "Aæ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual && + git grep -h "(*NO_JIT)Aæ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual +' + +test_lazy_prereq PCRE2_MATCH_INVALID_UTF ' + test-tool pcre2-config has-PCRE2_MATCH_INVALID_UTF +' + test_expect_success GETTEXT_LOCALE,LIBPCRE2 'PCRE v2: grep non-ASCII from invalid UTF-8 data with -i' ' test_might_fail git grep -hi "Æ" invalid-0x80 >actual && - if test -s actual - then - test_cmp expected actual - fi && - test_must_fail git grep -hi "(*NO_JIT)Æ" invalid-0x80 >actual && - ! test_cmp expected actual + test_might_fail git grep -hi "(*NO_JIT)Æ" invalid-0x80 >actual +' + +test_expect_success GETTEXT_LOCALE,LIBPCRE2,PCRE2_MATCH_INVALID_UTF 'PCRE v2: grep non-ASCII from invalid UTF-8 data with -i' ' + git grep -hi "Æ" invalid-0x80 >actual && + test_cmp expected actual && + git grep -hi "(*NO_JIT)Æ" invalid-0x80 >actual && + test_cmp expected actual +' + +test_expect_success GETTEXT_LOCALE,LIBPCRE2,PCRE2_MATCH_INVALID_UTF 'PCRE v2: grep non-ASCII from invalid UTF-8 data with -i (PCRE2 bug #2642)' ' + git grep -hi "Æ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual && + git grep -hi "(*NO_JIT)Æ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual && + + # Only the case of grepping the ASCII part in a way that + # relies on -i fails + git grep -hi "aÆ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual && + git grep -hi "(*NO_JIT)aÆ" invalid-0xe5 >actual && + test_cmp invalid-0xe5 actual ' test_done diff --git a/t/t7816-grep-binary-pattern.sh b/t/t7816-grep-binary-pattern.sh index 60bab291e4..9d67a5fc4c 100755 --- a/t/t7816-grep-binary-pattern.sh +++ b/t/t7816-grep-binary-pattern.sh @@ -59,7 +59,7 @@ test_expect_success 'setup' " git commit -m. " -# Simple fixed-string matching that can use kwset (no -i && non-ASCII) +# Simple fixed-string matching nul_match P P P '-F' 'yQf' nul_match P P P '-F' 'yQx' nul_match P P P '-Fi' 'YQf' @@ -78,7 +78,7 @@ nul_match P P P '-Fi' '[Y]QF' nul_match P P P '-F' 'æQ[ð]' nul_match P P P '-F' '[æ]Qð' -# The -F kwset codepath can't handle -i && non-ASCII... +# Matching pattern and subject case with -i nul_match P 1 1 '-i' '[æ]Qð' # ...PCRE v2 only matches non-ASCII with -i casefolding under UTF-8 diff --git a/t/t7817-grep-sparse-checkout.sh b/t/t7817-grep-sparse-checkout.sh new file mode 100755 index 0000000000..590b99bbb6 --- /dev/null +++ b/t/t7817-grep-sparse-checkout.sh @@ -0,0 +1,174 @@ +#!/bin/sh + +test_description='grep in sparse checkout + +This test creates a repo with the following structure: + +. +|-- a +|-- b +|-- dir +| `-- c +|-- sub +| |-- A +| | `-- a +| `-- B +| `-- b +`-- sub2 + `-- a + +Where the outer repository has non-cone mode sparsity patterns, sub is a +submodule with cone mode sparsity patterns and sub2 is a submodule that is +excluded by the superproject sparsity patterns. The resulting sparse checkout +should leave the following structure in the working tree: + +. +|-- a +|-- sub +| `-- B +| `-- b +`-- sub2 + `-- a + +But note that sub2 should have the SKIP_WORKTREE bit set. +' + +. ./test-lib.sh + +test_expect_success 'setup' ' + echo "text" >a && + echo "text" >b && + mkdir dir && + echo "text" >dir/c && + + git init sub && + ( + cd sub && + mkdir A B && + echo "text" >A/a && + echo "text" >B/b && + git add A B && + git commit -m sub && + git sparse-checkout init --cone && + git sparse-checkout set B + ) && + + git init sub2 && + ( + cd sub2 && + echo "text" >a && + git add a && + git commit -m sub2 + ) && + + git submodule add ./sub && + git submodule add ./sub2 && + git add a b dir && + git commit -m super && + git sparse-checkout init --no-cone && + git sparse-checkout set "/*" "!b" "!/*/" "sub" && + + git tag -am tag-to-commit tag-to-commit HEAD && + tree=$(git rev-parse HEAD^{tree}) && + git tag -am tag-to-tree tag-to-tree $tree && + + test_path_is_missing b && + test_path_is_missing dir && + test_path_is_missing sub/A && + test_path_is_file a && + test_path_is_file sub/B/b && + test_path_is_file sub2/a && + git branch -m main +' + +# The test below covers a special case: the sparsity patterns exclude '/b' and +# sparse checkout is enabled, but the path exists in the working tree (e.g. +# manually created after `git sparse-checkout init`). git grep should skip it. +test_expect_success 'working tree grep honors sparse checkout' ' + cat >expect <<-EOF && + a:text + EOF + test_when_finished "rm -f b" && + echo "new-text" >b && + git grep "text" >actual && + test_cmp expect actual +' + +test_expect_success 'grep searches unmerged file despite not matching sparsity patterns' ' + cat >expect <<-EOF && + b:modified-b-in-branchX + b:modified-b-in-branchY + EOF + test_when_finished "test_might_fail git merge --abort && \ + git checkout main && git sparse-checkout init" && + + git sparse-checkout disable && + git checkout -b branchY main && + test_commit modified-b-in-branchY b && + git checkout -b branchX main && + test_commit modified-b-in-branchX b && + + git sparse-checkout init && + test_path_is_missing b && + test_must_fail git merge branchY && + git grep "modified-b" >actual && + test_cmp expect actual +' + +test_expect_success 'grep --cached searches entries with the SKIP_WORKTREE bit' ' + cat >expect <<-EOF && + a:text + b:text + dir/c:text + EOF + git grep --cached "text" >actual && + test_cmp expect actual +' + +# Note that sub2/ is present in the worktree but it is excluded by the sparsity +# patterns, so grep should not recurse into it. +test_expect_success 'grep --recurse-submodules honors sparse checkout in submodule' ' + cat >expect <<-EOF && + a:text + sub/B/b:text + EOF + git grep --recurse-submodules "text" >actual && + test_cmp expect actual +' + +test_expect_success 'grep --recurse-submodules --cached searches entries with the SKIP_WORKTREE bit' ' + cat >expect <<-EOF && + a:text + b:text + dir/c:text + sub/A/a:text + sub/B/b:text + sub2/a:text + EOF + git grep --recurse-submodules --cached "text" >actual && + test_cmp expect actual +' + +test_expect_success 'working tree grep does not search the index with CE_VALID and SKIP_WORKTREE' ' + cat >expect <<-EOF && + a:text + EOF + test_when_finished "git update-index --no-assume-unchanged b" && + git update-index --assume-unchanged b && + git grep text >actual && + test_cmp expect actual +' + +test_expect_success 'grep --cached searches index entries with both CE_VALID and SKIP_WORKTREE' ' + cat >expect <<-EOF && + a:text + b:text + dir/c:text + EOF + test_when_finished "git update-index --no-assume-unchanged b" && + git update-index --assume-unchanged b && + git grep --cached text >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh new file mode 100755 index 0000000000..58f46c77e6 --- /dev/null +++ b/t/t7900-maintenance.sh @@ -0,0 +1,652 @@ +#!/bin/sh + +test_description='git maintenance builtin' + +. ./test-lib.sh + +GIT_TEST_COMMIT_GRAPH=0 +GIT_TEST_MULTI_PACK_INDEX=0 + +test_lazy_prereq XMLLINT ' + xmllint --version +' + +test_xmllint () { + if test_have_prereq XMLLINT + then + xmllint --noout "$@" + else + true + fi +} + +test_expect_success 'help text' ' + test_expect_code 129 git maintenance -h 2>err && + test_i18ngrep "usage: git maintenance <subcommand>" err && + test_expect_code 128 git maintenance barf 2>err && + test_i18ngrep "invalid subcommand: barf" err && + test_expect_code 129 git maintenance 2>err && + test_i18ngrep "usage: git maintenance" err +' + +test_expect_success 'run [--auto|--quiet]' ' + GIT_TRACE2_EVENT="$(pwd)/run-no-auto.txt" \ + git maintenance run 2>/dev/null && + GIT_TRACE2_EVENT="$(pwd)/run-auto.txt" \ + git maintenance run --auto 2>/dev/null && + GIT_TRACE2_EVENT="$(pwd)/run-no-quiet.txt" \ + git maintenance run --no-quiet 2>/dev/null && + test_subcommand git gc --quiet <run-no-auto.txt && + test_subcommand ! git gc --auto --quiet <run-auto.txt && + test_subcommand git gc --no-quiet <run-no-quiet.txt +' + +test_expect_success 'maintenance.auto config option' ' + GIT_TRACE2_EVENT="$(pwd)/default" git commit --quiet --allow-empty -m 1 && + test_subcommand git maintenance run --auto --quiet <default && + GIT_TRACE2_EVENT="$(pwd)/true" \ + git -c maintenance.auto=true \ + commit --quiet --allow-empty -m 2 && + test_subcommand git maintenance run --auto --quiet <true && + GIT_TRACE2_EVENT="$(pwd)/false" \ + git -c maintenance.auto=false \ + commit --quiet --allow-empty -m 3 && + test_subcommand ! git maintenance run --auto --quiet <false +' + +test_expect_success 'maintenance.<task>.enabled' ' + git config maintenance.gc.enabled false && + git config maintenance.commit-graph.enabled true && + GIT_TRACE2_EVENT="$(pwd)/run-config.txt" git maintenance run 2>err && + test_subcommand ! git gc --quiet <run-config.txt && + test_subcommand git commit-graph write --split --reachable --no-progress <run-config.txt +' + +test_expect_success 'run --task=<task>' ' + GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \ + git maintenance run --task=commit-graph 2>/dev/null && + GIT_TRACE2_EVENT="$(pwd)/run-gc.txt" \ + git maintenance run --task=gc 2>/dev/null && + GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \ + git maintenance run --task=commit-graph 2>/dev/null && + GIT_TRACE2_EVENT="$(pwd)/run-both.txt" \ + git maintenance run --task=commit-graph --task=gc 2>/dev/null && + test_subcommand ! git gc --quiet <run-commit-graph.txt && + test_subcommand git gc --quiet <run-gc.txt && + test_subcommand git gc --quiet <run-both.txt && + test_subcommand git commit-graph write --split --reachable --no-progress <run-commit-graph.txt && + test_subcommand ! git commit-graph write --split --reachable --no-progress <run-gc.txt && + test_subcommand git commit-graph write --split --reachable --no-progress <run-both.txt +' + +test_expect_success 'core.commitGraph=false prevents write process' ' + GIT_TRACE2_EVENT="$(pwd)/no-commit-graph.txt" \ + git -c core.commitGraph=false maintenance run \ + --task=commit-graph 2>/dev/null && + test_subcommand ! git commit-graph write --split --reachable --no-progress \ + <no-commit-graph.txt +' + +test_expect_success 'commit-graph auto condition' ' + COMMAND="maintenance run --task=commit-graph --auto --quiet" && + + GIT_TRACE2_EVENT="$(pwd)/cg-no.txt" \ + git -c maintenance.commit-graph.auto=1 $COMMAND && + GIT_TRACE2_EVENT="$(pwd)/cg-negative-means-yes.txt" \ + git -c maintenance.commit-graph.auto="-1" $COMMAND && + + test_commit first && + + GIT_TRACE2_EVENT="$(pwd)/cg-zero-means-no.txt" \ + git -c maintenance.commit-graph.auto=0 $COMMAND && + GIT_TRACE2_EVENT="$(pwd)/cg-one-satisfied.txt" \ + git -c maintenance.commit-graph.auto=1 $COMMAND && + + git commit --allow-empty -m "second" && + git commit --allow-empty -m "third" && + + GIT_TRACE2_EVENT="$(pwd)/cg-two-satisfied.txt" \ + git -c maintenance.commit-graph.auto=2 $COMMAND && + + COMMIT_GRAPH_WRITE="git commit-graph write --split --reachable --no-progress" && + test_subcommand ! $COMMIT_GRAPH_WRITE <cg-no.txt && + test_subcommand $COMMIT_GRAPH_WRITE <cg-negative-means-yes.txt && + test_subcommand ! $COMMIT_GRAPH_WRITE <cg-zero-means-no.txt && + test_subcommand $COMMIT_GRAPH_WRITE <cg-one-satisfied.txt && + test_subcommand $COMMIT_GRAPH_WRITE <cg-two-satisfied.txt +' + +test_expect_success 'run --task=bogus' ' + test_must_fail git maintenance run --task=bogus 2>err && + test_i18ngrep "is not a valid task" err +' + +test_expect_success 'run --task duplicate' ' + test_must_fail git maintenance run --task=gc --task=gc 2>err && + test_i18ngrep "cannot be selected multiple times" err +' + +test_expect_success 'run --task=prefetch with no remotes' ' + git maintenance run --task=prefetch 2>err && + test_must_be_empty err +' + +test_expect_success 'prefetch multiple remotes' ' + git clone . clone1 && + git clone . clone2 && + git remote add remote1 "file://$(pwd)/clone1" && + git remote add remote2 "file://$(pwd)/clone2" && + git -C clone1 switch -c one && + git -C clone2 switch -c two && + test_commit -C clone1 one && + test_commit -C clone2 two && + GIT_TRACE2_EVENT="$(pwd)/run-prefetch.txt" git maintenance run --task=prefetch 2>/dev/null && + fetchargs="--prefetch --prune --no-tags --no-write-fetch-head --recurse-submodules=no --quiet" && + test_subcommand git fetch remote1 $fetchargs <run-prefetch.txt && + test_subcommand git fetch remote2 $fetchargs <run-prefetch.txt && + test_path_is_missing .git/refs/remotes && + git log prefetch/remotes/remote1/one && + git log prefetch/remotes/remote2/two && + git fetch --all && + test_cmp_rev refs/remotes/remote1/one refs/prefetch/remotes/remote1/one && + test_cmp_rev refs/remotes/remote2/two refs/prefetch/remotes/remote2/two && + + test_cmp_config refs/prefetch/ log.excludedecoration && + git log --oneline --decorate --all >log && + ! grep "prefetch" log && + + test_when_finished git config --unset remote.remote1.skipFetchAll && + git config remote.remote1.skipFetchAll true && + GIT_TRACE2_EVENT="$(pwd)/skip-remote1.txt" git maintenance run --task=prefetch 2>/dev/null && + test_subcommand ! git fetch remote1 $fetchargs <skip-remote1.txt && + test_subcommand git fetch remote2 $fetchargs <skip-remote1.txt +' + +test_expect_success 'prefetch and existing log.excludeDecoration values' ' + git config --unset-all log.excludeDecoration && + git config log.excludeDecoration refs/remotes/remote1/ && + git maintenance run --task=prefetch && + + git config --get-all log.excludeDecoration >out && + grep refs/remotes/remote1/ out && + grep refs/prefetch/ out && + + git log --oneline --decorate --all >log && + ! grep "prefetch" log && + ! grep "remote1" log && + grep "remote2" log && + + # a second run does not change the config + git maintenance run --task=prefetch && + git log --oneline --decorate --all >log2 && + test_cmp log log2 +' + +test_expect_success 'loose-objects task' ' + # Repack everything so we know the state of the object dir + git repack -adk && + + # Hack to stop maintenance from running during "git commit" + echo in use >.git/objects/maintenance.lock && + + # Assuming that "git commit" creates at least one loose object + test_commit create-loose-object && + rm .git/objects/maintenance.lock && + + ls .git/objects >obj-dir-before && + test_file_not_empty obj-dir-before && + ls .git/objects/pack/*.pack >packs-before && + test_line_count = 1 packs-before && + + # The first run creates a pack-file + # but does not delete loose objects. + git maintenance run --task=loose-objects && + ls .git/objects >obj-dir-between && + test_cmp obj-dir-before obj-dir-between && + ls .git/objects/pack/*.pack >packs-between && + test_line_count = 2 packs-between && + ls .git/objects/pack/loose-*.pack >loose-packs && + test_line_count = 1 loose-packs && + + # The second run deletes loose objects + # but does not create a pack-file. + git maintenance run --task=loose-objects && + ls .git/objects >obj-dir-after && + cat >expect <<-\EOF && + info + pack + EOF + test_cmp expect obj-dir-after && + ls .git/objects/pack/*.pack >packs-after && + test_cmp packs-between packs-after +' + +test_expect_success 'maintenance.loose-objects.auto' ' + git repack -adk && + GIT_TRACE2_EVENT="$(pwd)/trace-lo1.txt" \ + git -c maintenance.loose-objects.auto=1 maintenance \ + run --auto --task=loose-objects 2>/dev/null && + test_subcommand ! git prune-packed --quiet <trace-lo1.txt && + printf data-A | git hash-object -t blob --stdin -w && + GIT_TRACE2_EVENT="$(pwd)/trace-loA" \ + git -c maintenance.loose-objects.auto=2 \ + maintenance run --auto --task=loose-objects 2>/dev/null && + test_subcommand ! git prune-packed --quiet <trace-loA && + printf data-B | git hash-object -t blob --stdin -w && + GIT_TRACE2_EVENT="$(pwd)/trace-loB" \ + git -c maintenance.loose-objects.auto=2 \ + maintenance run --auto --task=loose-objects 2>/dev/null && + test_subcommand git prune-packed --quiet <trace-loB && + GIT_TRACE2_EVENT="$(pwd)/trace-loC" \ + git -c maintenance.loose-objects.auto=2 \ + maintenance run --auto --task=loose-objects 2>/dev/null && + test_subcommand git prune-packed --quiet <trace-loC +' + +test_expect_success 'incremental-repack task' ' + packDir=.git/objects/pack && + for i in $(test_seq 1 5) + do + test_commit $i || return 1 + done && + + # Create three disjoint pack-files with size BIG, small, small. + echo HEAD~2 | git pack-objects --revs $packDir/test-1 && + test_tick && + git pack-objects --revs $packDir/test-2 <<-\EOF && + HEAD~1 + ^HEAD~2 + EOF + test_tick && + git pack-objects --revs $packDir/test-3 <<-\EOF && + HEAD + ^HEAD~1 + EOF + + # Delete refs that have not been repacked in these packs. + git for-each-ref --format="delete %(refname)" \ + refs/prefetch refs/tags >refs && + git update-ref --stdin <refs && + + # Replace the object directory with this pack layout. + rm -f $packDir/pack-* && + rm -f $packDir/loose-* && + ls $packDir/*.pack >packs-before && + test_line_count = 3 packs-before && + + # the job repacks the two into a new pack, but does not + # delete the old ones. + git maintenance run --task=incremental-repack && + ls $packDir/*.pack >packs-between && + test_line_count = 4 packs-between && + + # the job deletes the two old packs, and does not write + # a new one because the batch size is not high enough to + # pack the largest pack-file. + git maintenance run --task=incremental-repack && + ls .git/objects/pack/*.pack >packs-after && + test_line_count = 2 packs-after +' + +test_expect_success EXPENSIVE 'incremental-repack 2g limit' ' + test_config core.compression 0 && + + for i in $(test_seq 1 5) + do + test-tool genrandom foo$i $((512 * 1024 * 1024 + 1)) >>big || + return 1 + done && + git add big && + git commit -qm "Add big file (1)" && + + # ensure any possible loose objects are in a pack-file + git maintenance run --task=loose-objects && + + rm big && + for i in $(test_seq 6 10) + do + test-tool genrandom foo$i $((512 * 1024 * 1024 + 1)) >>big || + return 1 + done && + git add big && + git commit -qm "Add big file (2)" && + + # ensure any possible loose objects are in a pack-file + git maintenance run --task=loose-objects && + + # Now run the incremental-repack task and check the batch-size + GIT_TRACE2_EVENT="$(pwd)/run-2g.txt" git maintenance run \ + --task=incremental-repack 2>/dev/null && + test_subcommand git multi-pack-index repack \ + --no-progress --batch-size=2147483647 <run-2g.txt +' + +test_expect_success 'maintenance.incremental-repack.auto' ' + git repack -adk && + git config core.multiPackIndex true && + git multi-pack-index write && + GIT_TRACE2_EVENT="$(pwd)/midx-init.txt" git \ + -c maintenance.incremental-repack.auto=1 \ + maintenance run --auto --task=incremental-repack 2>/dev/null && + test_subcommand ! git multi-pack-index write --no-progress <midx-init.txt && + test_commit A && + git pack-objects --revs .git/objects/pack/pack <<-\EOF && + HEAD + ^HEAD~1 + EOF + GIT_TRACE2_EVENT=$(pwd)/trace-A git \ + -c maintenance.incremental-repack.auto=2 \ + maintenance run --auto --task=incremental-repack 2>/dev/null && + test_subcommand ! git multi-pack-index write --no-progress <trace-A && + test_commit B && + git pack-objects --revs .git/objects/pack/pack <<-\EOF && + HEAD + ^HEAD~1 + EOF + GIT_TRACE2_EVENT=$(pwd)/trace-B git \ + -c maintenance.incremental-repack.auto=2 \ + maintenance run --auto --task=incremental-repack 2>/dev/null && + test_subcommand git multi-pack-index write --no-progress <trace-B +' + +test_expect_success 'pack-refs task' ' + for n in $(test_seq 1 5) + do + git branch -f to-pack/$n HEAD || return 1 + done && + GIT_TRACE2_EVENT="$(pwd)/pack-refs.txt" \ + git maintenance run --task=pack-refs && + test_subcommand git pack-refs --all --prune <pack-refs.txt +' + +test_expect_success '--auto and --schedule incompatible' ' + test_must_fail git maintenance run --auto --schedule=daily 2>err && + test_i18ngrep "at most one" err +' + +test_expect_success 'invalid --schedule value' ' + test_must_fail git maintenance run --schedule=annually 2>err && + test_i18ngrep "unrecognized --schedule" err +' + +test_expect_success '--schedule inheritance weekly -> daily -> hourly' ' + git config maintenance.loose-objects.enabled true && + git config maintenance.loose-objects.schedule hourly && + git config maintenance.commit-graph.enabled true && + git config maintenance.commit-graph.schedule daily && + git config maintenance.incremental-repack.enabled true && + git config maintenance.incremental-repack.schedule weekly && + + GIT_TRACE2_EVENT="$(pwd)/hourly.txt" \ + git maintenance run --schedule=hourly 2>/dev/null && + test_subcommand git prune-packed --quiet <hourly.txt && + test_subcommand ! git commit-graph write --split --reachable \ + --no-progress <hourly.txt && + test_subcommand ! git multi-pack-index write --no-progress <hourly.txt && + + GIT_TRACE2_EVENT="$(pwd)/daily.txt" \ + git maintenance run --schedule=daily 2>/dev/null && + test_subcommand git prune-packed --quiet <daily.txt && + test_subcommand git commit-graph write --split --reachable \ + --no-progress <daily.txt && + test_subcommand ! git multi-pack-index write --no-progress <daily.txt && + + GIT_TRACE2_EVENT="$(pwd)/weekly.txt" \ + git maintenance run --schedule=weekly 2>/dev/null && + test_subcommand git prune-packed --quiet <weekly.txt && + test_subcommand git commit-graph write --split --reachable \ + --no-progress <weekly.txt && + test_subcommand git multi-pack-index write --no-progress <weekly.txt +' + +test_expect_success 'maintenance.strategy inheritance' ' + for task in commit-graph loose-objects incremental-repack + do + git config --unset maintenance.$task.schedule || return 1 + done && + + test_when_finished git config --unset maintenance.strategy && + git config maintenance.strategy incremental && + + GIT_TRACE2_EVENT="$(pwd)/incremental-hourly.txt" \ + git maintenance run --schedule=hourly --quiet && + GIT_TRACE2_EVENT="$(pwd)/incremental-daily.txt" \ + git maintenance run --schedule=daily --quiet && + GIT_TRACE2_EVENT="$(pwd)/incremental-weekly.txt" \ + git maintenance run --schedule=weekly --quiet && + + test_subcommand git commit-graph write --split --reachable \ + --no-progress <incremental-hourly.txt && + test_subcommand ! git prune-packed --quiet <incremental-hourly.txt && + test_subcommand ! git multi-pack-index write --no-progress \ + <incremental-hourly.txt && + test_subcommand ! git pack-refs --all --prune \ + <incremental-hourly.txt && + + test_subcommand git commit-graph write --split --reachable \ + --no-progress <incremental-daily.txt && + test_subcommand git prune-packed --quiet <incremental-daily.txt && + test_subcommand git multi-pack-index write --no-progress \ + <incremental-daily.txt && + test_subcommand ! git pack-refs --all --prune \ + <incremental-daily.txt && + + test_subcommand git commit-graph write --split --reachable \ + --no-progress <incremental-weekly.txt && + test_subcommand git prune-packed --quiet <incremental-weekly.txt && + test_subcommand git multi-pack-index write --no-progress \ + <incremental-weekly.txt && + test_subcommand git pack-refs --all --prune \ + <incremental-weekly.txt && + + # Modify defaults + git config maintenance.commit-graph.schedule daily && + git config maintenance.loose-objects.schedule hourly && + git config maintenance.incremental-repack.enabled false && + + GIT_TRACE2_EVENT="$(pwd)/modified-hourly.txt" \ + git maintenance run --schedule=hourly --quiet && + GIT_TRACE2_EVENT="$(pwd)/modified-daily.txt" \ + git maintenance run --schedule=daily --quiet && + + test_subcommand ! git commit-graph write --split --reachable \ + --no-progress <modified-hourly.txt && + test_subcommand git prune-packed --quiet <modified-hourly.txt && + test_subcommand ! git multi-pack-index write --no-progress \ + <modified-hourly.txt && + + test_subcommand git commit-graph write --split --reachable \ + --no-progress <modified-daily.txt && + test_subcommand git prune-packed --quiet <modified-daily.txt && + test_subcommand ! git multi-pack-index write --no-progress \ + <modified-daily.txt +' + +test_expect_success 'register and unregister' ' + test_when_finished git config --global --unset-all maintenance.repo && + git config --global --add maintenance.repo /existing1 && + git config --global --add maintenance.repo /existing2 && + git config --global --get-all maintenance.repo >before && + + git maintenance register && + test_cmp_config false maintenance.auto && + git config --global --get-all maintenance.repo >between && + cp before expect && + pwd >>expect && + test_cmp expect between && + + git maintenance unregister && + git config --global --get-all maintenance.repo >actual && + test_cmp before actual +' + +test_expect_success !MINGW 'register and unregister with regex metacharacters' ' + META="a+b*c" && + git init "$META" && + git -C "$META" maintenance register && + git config --get-all --show-origin maintenance.repo && + git config --get-all --global --fixed-value \ + maintenance.repo "$(pwd)/$META" && + git -C "$META" maintenance unregister && + test_must_fail git config --get-all --global --fixed-value \ + maintenance.repo "$(pwd)/$META" +' + +test_expect_success 'start from empty cron table' ' + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance start && + + # start registers the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + grep "for-each-repo --config=maintenance.repo maintenance run --schedule=daily" cron.txt && + grep "for-each-repo --config=maintenance.repo maintenance run --schedule=hourly" cron.txt && + grep "for-each-repo --config=maintenance.repo maintenance run --schedule=weekly" cron.txt +' + +test_expect_success 'stop from existing schedule' ' + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop && + + # stop does not unregister the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + # Operation is idempotent + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop && + test_must_be_empty cron.txt +' + +test_expect_success 'start preserves existing schedule' ' + echo "Important information!" >cron.txt && + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance start && + grep "Important information!" cron.txt +' + +test_expect_success 'magic markers are correct' ' + grep "GIT MAINTENANCE SCHEDULE" cron.txt >actual && + cat >expect <<-\EOF && + # BEGIN GIT MAINTENANCE SCHEDULE + # END GIT MAINTENANCE SCHEDULE + EOF + test_cmp actual expect +' + +test_expect_success 'stop preserves surrounding schedule' ' + echo "Crucial information!" >>cron.txt && + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop && + grep "Important information!" cron.txt && + grep "Crucial information!" cron.txt +' + +test_expect_success 'start and stop macOS maintenance' ' + # ensure $HOME can be compared against hook arguments on all platforms + pfx=$(cd "$HOME" && pwd) && + + write_script print-args <<-\EOF && + echo $* | sed "s:gui/[0-9][0-9]*:gui/[UID]:" >>args + EOF + + rm -f args && + GIT_TEST_MAINT_SCHEDULER=launchctl:./print-args git maintenance start && + + # start registers the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + ls "$HOME/Library/LaunchAgents" >actual && + cat >expect <<-\EOF && + org.git-scm.git.daily.plist + org.git-scm.git.hourly.plist + org.git-scm.git.weekly.plist + EOF + test_cmp expect actual && + + rm -f expect && + for frequency in hourly daily weekly + do + PLIST="$pfx/Library/LaunchAgents/org.git-scm.git.$frequency.plist" && + test_xmllint "$PLIST" && + grep schedule=$frequency "$PLIST" && + echo "bootout gui/[UID] $PLIST" >>expect && + echo "bootstrap gui/[UID] $PLIST" >>expect || return 1 + done && + test_cmp expect args && + + rm -f args && + GIT_TEST_MAINT_SCHEDULER=launchctl:./print-args git maintenance stop && + + # stop does not unregister the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + printf "bootout gui/[UID] $pfx/Library/LaunchAgents/org.git-scm.git.%s.plist\n" \ + hourly daily weekly >expect && + test_cmp expect args && + ls "$HOME/Library/LaunchAgents" >actual && + test_line_count = 0 actual +' + +test_expect_success 'start and stop Windows maintenance' ' + write_script print-args <<-\EOF && + echo $* >>args + while test $# -gt 0 + do + case "$1" in + /xml) shift; xmlfile=$1; break ;; + *) shift ;; + esac + done + test -z "$xmlfile" || cp "$xmlfile" "$xmlfile.xml" + EOF + + rm -f args && + GIT_TEST_MAINT_SCHEDULER="schtasks:./print-args" git maintenance start && + + # start registers the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + for frequency in hourly daily weekly + do + grep "/create /tn Git Maintenance ($frequency) /f /xml" args && + file=$(ls .git/schedule_${frequency}*.xml) && + test_xmllint "$file" || return 1 + done && + + rm -f args && + GIT_TEST_MAINT_SCHEDULER="schtasks:./print-args" git maintenance stop && + + # stop does not unregister the repo + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + + printf "/delete /tn Git Maintenance (%s) /f\n" \ + hourly daily weekly >expect && + test_cmp expect args +' + +test_expect_success 'register preserves existing strategy' ' + git config maintenance.strategy none && + git maintenance register && + test_config maintenance.strategy none && + git config --unset maintenance.strategy && + git maintenance register && + test_config maintenance.strategy incremental +' + +test_expect_success 'fails when running outside of a repository' ' + nongit test_must_fail git maintenance run && + nongit test_must_fail git maintenance stop && + nongit test_must_fail git maintenance start && + nongit test_must_fail git maintenance register && + nongit test_must_fail git maintenance unregister +' + +test_expect_success 'register and unregister bare repo' ' + test_when_finished "git config --global --unset-all maintenance.repo || :" && + test_might_fail git config --global --unset-all maintenance.repo && + git init --bare barerepo && + ( + cd barerepo && + git maintenance register && + git config --get --global --fixed-value maintenance.repo "$(pwd)" && + git maintenance unregister && + test_must_fail git config --global --get-all maintenance.repo + ) +' + +test_done diff --git a/t/t8001-annotate.sh b/t/t8001-annotate.sh index 72176e42c1..a536a621b2 100755 --- a/t/t8001-annotate.sh +++ b/t/t8001-annotate.sh @@ -1,13 +1,16 @@ #!/bin/sh test_description='git annotate' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh PROG='git annotate' . "$TEST_DIRECTORY"/annotate-tests.sh test_expect_success 'annotate old revision' ' - git annotate file master >actual && + git annotate file main >actual && awk "{ print \$3; }" <actual >authors && test 2 = $(grep A <authors | wc -l) && test 2 = $(grep B <authors | wc -l) diff --git a/t/t8002-blame.sh b/t/t8002-blame.sh index 015973e8fe..5bb302b1ba 100755 --- a/t/t8002-blame.sh +++ b/t/t8002-blame.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git blame' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh PROG='git blame -c' diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh index ba8013b002..da80f815ce 100755 --- a/t/t8003-blame-corner-cases.sh +++ b/t/t8003-blame-corner-cases.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git blame corner cases' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh pick_fc='s/^[0-9a-f^]* *\([^ ]*\) *(\([^ ]*\) .*/\1-\2/' @@ -161,13 +164,13 @@ test_expect_success 'blame wholesale copy and more in the index' ' test_expect_success 'blame during cherry-pick with file rename conflict' ' - test_when_finished "git reset --hard && git checkout master" && + test_when_finished "git reset --hard && git checkout main" && git checkout HEAD~3 && echo MOUSE >> mouse && git mv mouse rodent && git add rodent && GIT_AUTHOR_NAME=Rodent git commit -m "rodent" && - git checkout --detach master && + git checkout --detach main && (git cherry-pick HEAD@{1} || test $? -eq 1) && git show HEAD@{1}:rodent > rodent && git add rodent && diff --git a/t/t8004-blame-with-conflicts.sh b/t/t8004-blame-with-conflicts.sh index 9c353ab222..35414a5336 100755 --- a/t/t8004-blame-with-conflicts.sh +++ b/t/t8004-blame-with-conflicts.sh @@ -3,6 +3,9 @@ # Based on a test case submitted by Björn Steinbrink. test_description='git blame on conflicted files' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup first case' ' @@ -21,16 +24,16 @@ test_expect_success 'setup first case' ' git add file2 && git commit --author "U Gly <ug@localhost>" -m ugly && - # Back to master and change something - git checkout master && + # Back to main and change something + git checkout main && echo " bla" >> file1 && git commit --author "Old Line <ol@localhost>" -a -m file1.b && - # Back to foo and merge master + # Back to foo and merge main git checkout foo && - if git merge master; then + if git merge main; then echo needed conflict here exit 1 else @@ -44,8 +47,8 @@ Even more" > file2 && git rm file1 && git commit --author "M Result <mr@localhost>" -a -m merged && - # Back to master and change file1 again - git checkout master && + # Back to main and change file1 again + git checkout main && sed s/bla/foo/ <file1 >X && rm file1 && mv X file1 && @@ -53,7 +56,7 @@ Even more" > file2 && # Try to merge into foo again git checkout foo && - if git merge master; then + if git merge main; then echo needed conflict here exit 1 else diff --git a/t/t8012-blame-colors.sh b/t/t8012-blame-colors.sh index ed38f74de9..90c75dbb28 100755 --- a/t/t8012-blame-colors.sh +++ b/t/t8012-blame-colors.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='colored git blame' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh PROG='git blame -c' diff --git a/t/t8013-blame-ignore-revs.sh b/t/t8013-blame-ignore-revs.sh index 36dc31eb39..b18633dee1 100755 --- a/t/t8013-blame-ignore-revs.sh +++ b/t/t8013-blame-ignore-revs.sh @@ -21,6 +21,7 @@ test_expect_success setup ' test_tick && git commit -m X && git tag X && + git tag -a -m "X (annotated)" XT && git blame --line-porcelain file >blame_raw && @@ -31,20 +32,36 @@ test_expect_success setup ' grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && git rev-parse X >expect && test_cmp expect actual +' + +# Ensure bogus --ignore-rev requests are caught +test_expect_success 'validate --ignore-rev' ' + test_must_fail git blame --ignore-rev X^{tree} file +' + +# Ensure bogus --ignore-revs-file requests are silently accepted +test_expect_success 'validate --ignore-revs-file' ' + git rev-parse X^{tree} >ignore_x && + git blame --ignore-revs-file ignore_x file +' + +for I in X XT +do + # Ignore X (or XT), make sure A is blamed for line 1 and B for line 2. + # Giving X (i.e. commit) and XT (i.e. annotated tag to commit) should + # produce the same result. + test_expect_success "ignore_rev_changing_lines ($I)" ' + git blame --line-porcelain --ignore-rev $I file >blame_raw && + + grep -E "^[0-9a-f]+ [0-9]+ 1" blame_raw | sed -e "s/ .*//" >actual && + git rev-parse A >expect && + test_cmp expect actual && + + grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && + git rev-parse B >expect && + test_cmp expect actual ' - -# Ignore X, make sure A is blamed for line 1 and B for line 2. -test_expect_success ignore_rev_changing_lines ' - git blame --line-porcelain --ignore-rev X file >blame_raw && - - grep -E "^[0-9a-f]+ [0-9]+ 1" blame_raw | sed -e "s/ .*//" >actual && - git rev-parse A >expect && - test_cmp expect actual && - - grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && - git rev-parse B >expect && - test_cmp expect actual - ' +done # For ignored revs that have added 'unblamable' lines, attribute those to the # ignored commit. @@ -67,7 +84,7 @@ test_expect_success ignore_rev_adding_unblamable_lines ' grep -E "^[0-9a-f]+ [0-9]+ 4" blame_raw | sed -e "s/ .*//" >actual && test_cmp expect actual - ' +' # Ignore X and Y, both in separate files. Lines 1 == A, 2 == B. test_expect_success ignore_revs_from_files ' @@ -82,7 +99,7 @@ test_expect_success ignore_revs_from_files ' grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && git rev-parse B >expect && test_cmp expect actual - ' +' # Ignore X from the config option, Y from a file. test_expect_success ignore_revs_from_configs_and_files ' @@ -96,7 +113,7 @@ test_expect_success ignore_revs_from_configs_and_files ' grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && git rev-parse B >expect && test_cmp expect actual - ' +' # Override blame.ignoreRevsFile (ignore_x) with an empty string. X should be # blamed now for lines 1 and 2, since we are no longer ignoring X. @@ -120,7 +137,7 @@ test_expect_success bad_files_and_revs ' echo NOREV >ignore_norev && test_must_fail git blame file --ignore-revs-file ignore_norev 2>err && test_i18ngrep "invalid object name: NOREV" err - ' +' # For ignored revs that have added 'unblamable' lines, mark those lines with a # '*' @@ -138,7 +155,7 @@ test_expect_success mark_unblamable_lines ' sed -n "4p" blame_raw | cut -c1 >actual && test_cmp expect actual - ' +' # Commit Z will touch the first two lines. Y touched all four. # A--B--X--Y--Z @@ -171,7 +188,7 @@ test_expect_success mark_ignored_lines ' sed -n "4p" blame_raw | cut -c1 >actual && ! test_cmp expect actual - ' +' # For ignored revs that added 'unblamable' lines and more recent commits changed # the blamable lines, mark the unblamable lines with a @@ -190,7 +207,7 @@ test_expect_success mark_unblamable_lines_intermediate ' sed -n "4p" blame_raw | cut -c1 >actual && test_cmp expect actual - ' +' # The heuristic called by guess_line_blames() tries to find the size of a # blame_entry 'e' in the parent's address space. Those calculations need to @@ -227,7 +244,7 @@ test_expect_success ignored_chunk_negative_parent_size ' git tag C && git blame file --ignore-rev B >blame_raw - ' +' # Resetting the repo and creating: # @@ -269,6 +286,6 @@ test_expect_success ignore_merge ' grep -E "^[0-9a-f]+ [0-9]+ 9" blame_raw | sed -e "s/ .*//" >actual && git rev-parse C >expect && test_cmp expect actual - ' +' test_done diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index a08f72596a..57fc10e7f8 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git send-email' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh # May be altered later in the test @@ -412,15 +415,23 @@ test_expect_success $PREREQ 'reject long lines' ' z512=$z64$z64$z64$z64$z64$z64$z64$z64 && clean_fake_sendmail && cp $patches longline.patch && - echo $z512$z512 >>longline.patch && + cat >>longline.patch <<-EOF && + $z512$z512 + not a long line + $z512$z512 + EOF test_must_fail git send-email \ --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --smtp-server="$(pwd)/fake.sendmail" \ --transfer-encoding=8bit \ $patches longline.patch \ - 2>errors && - grep longline.patch errors + 2>actual && + cat >expect <<-\EOF && + fatal: longline.patch:35 is longer than 998 characters + warning: no patches were sent + EOF + test_cmp expect actual ' test_expect_success $PREREQ 'no patch was sent' ' @@ -510,6 +521,49 @@ do done +test_expect_success $PREREQ "--validate respects relative core.hooksPath path" ' + clean_fake_sendmail && + mkdir my-hooks && + test_when_finished "rm my-hooks.ran" && + write_script my-hooks/sendemail-validate <<-\EOF && + >my-hooks.ran + exit 1 + EOF + test_config core.hooksPath "my-hooks" && + test_must_fail git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + --validate \ + longline.patch 2>actual && + test_path_is_file my-hooks.ran && + cat >expect <<-EOF && + fatal: longline.patch: rejected by sendemail-validate hook + fatal: command '"'"'my-hooks/sendemail-validate'"'"' died with exit code 1 + warning: no patches were sent + EOF + test_cmp expect actual +' + +test_expect_success $PREREQ "--validate respects absolute core.hooksPath path" ' + hooks_path="$(pwd)/my-hooks" && + test_config core.hooksPath "$hooks_path" && + test_when_finished "rm my-hooks.ran" && + test_must_fail git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + --validate \ + longline.patch 2>actual && + test_path_is_file my-hooks.ran && + cat >expect <<-EOF && + fatal: longline.patch: rejected by sendemail-validate hook + fatal: command '"'"'$hooks_path/sendemail-validate'"'"' died with exit code 1 + warning: no patches were sent + EOF + test_cmp expect actual +' + for enc in 7bit 8bit quoted-printable base64 do test_expect_success $PREREQ "--transfer-encoding=$enc produces correct header" ' @@ -590,14 +644,33 @@ test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' ' test_cmp expect actual ' +test_set_editor "$(pwd)/fake-editor" + +test_expect_success $PREREQ 'setup erroring fake editor' ' + write_script fake-editor <<-\EOF + echo >&2 "I am about to error" + exit 1 + EOF +' + +test_expect_success $PREREQ 'fake editor dies with error' ' + clean_fake_sendmail && + test_must_fail git send-email \ + --compose --subject foo \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + $patches 2>err && + grep "I am about to error" err && + grep "the editor exited uncleanly, aborting everything" err +' + test_expect_success $PREREQ 'setup fake editor' ' write_script fake-editor <<-\EOF echo fake edit >>"$1" EOF ' -test_set_editor "$(pwd)/fake-editor" - test_expect_success $PREREQ '--compose works' ' clean_fake_sendmail && git send-email \ @@ -1168,10 +1241,10 @@ test_expect_success $PREREQ '--compose-encoding adds correct MIME for subject' ' ' test_expect_success $PREREQ 'detects ambiguous reference/file conflict' ' - echo master >master && - git add master && - git commit -m"add master" && - test_must_fail git send-email --dry-run master 2>errors && + echo main >main && + git add main && + git commit -m"add main" && + test_must_fail git send-email --dry-run main 2>errors && grep disambiguate errors ' @@ -1185,7 +1258,7 @@ test_expect_success $PREREQ 'feed two files' ' outdir/000?-*.patch 2>errors >out && grep "^Subject: " out >subjects && test "z$(sed -n -e 1p subjects)" = "zSubject: [PATCH 1/2] Second." && - test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master" + test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add main" ' test_expect_success $PREREQ 'in-reply-to but no threading' ' @@ -1295,6 +1368,16 @@ test_expect_success $PREREQ 'sendemail.identity: bool variable fallback' ' ! grep "X-Mailer" stdout ' +test_expect_success $PREREQ 'sendemail.identity: bool variable without a value' ' + git -c sendemail.xmailer \ + send-email \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: default@example.com" stdout && + grep "X-Mailer" stdout +' + test_expect_success $PREREQ '--no-to overrides sendemail.to' ' git send-email \ --dry-run \ @@ -1756,7 +1839,7 @@ test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' ' grep "^!somebody@example\.org!$" commandline1 ' -test_expect_success $PREREQ 'sendemail.aliasfile=~/.mailrc' ' +test_expect_success $PREREQ 'sendemail.aliasesfile=~/.mailrc' ' clean_fake_sendmail && echo "alias sbd someone@example.org" >"$HOME/.mailrc" && git config --replace-all sendemail.aliasesfile "~/.mailrc" && @@ -2019,6 +2102,18 @@ test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=true' ' do_xmailer_test 1 "--xmailer" ' +test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer' ' + test_when_finished "test_unconfig sendemail.xmailer" && + cat >>.git/config <<-\EOF && + [sendemail] + xmailer + EOF + test_config sendemail.xmailer true && + do_xmailer_test 1 "" && + do_xmailer_test 0 "--no-xmailer" && + do_xmailer_test 1 "--xmailer" +' + test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=false' ' test_config sendemail.xmailer false && do_xmailer_test 0 "" && @@ -2026,6 +2121,13 @@ test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=false' ' do_xmailer_test 1 "--xmailer" ' +test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=' ' + test_config sendemail.xmailer "" && + do_xmailer_test 0 "" && + do_xmailer_test 0 "--no-xmailer" && + do_xmailer_test 1 "--xmailer" +' + test_expect_success $PREREQ 'setup expected-list' ' git send-email \ --dry-run \ @@ -2037,7 +2139,7 @@ test_expect_success $PREREQ 'setup expected-list' ' --cc="Cc2 <cc2@example.com>" \ --bcc="bcc1@example.com" \ --bcc="bcc2@example.com" \ - 0001-add-master.patch | replace_variable_fields \ + 0001-add-main.patch | replace_variable_fields \ >expected-list ' @@ -2049,7 +2151,7 @@ test_expect_success $PREREQ 'use email list in --cc --to and --bcc' ' --to="to3@example.com" \ --cc="Cc 1 <cc1@example.com>, Cc2 <cc2@example.com>" \ --bcc="bcc1@example.com, bcc2@example.com" \ - 0001-add-master.patch | replace_variable_fields \ + 0001-add-main.patch | replace_variable_fields \ >actual-list && test_cmp expected-list actual-list ' @@ -2065,7 +2167,7 @@ test_expect_success $PREREQ 'aliases work with email list' ' --to="To 1 <to1@example.com>, to2, to3@example.com" \ --cc="cc1, Cc2 <cc2@example.com>" \ --bcc="bcc1@example.com, bcc2@example.com" \ - 0001-add-master.patch | replace_variable_fields \ + 0001-add-main.patch | replace_variable_fields \ >actual-list && test_cmp expected-list actual-list ' @@ -2089,11 +2191,42 @@ test_expect_success $PREREQ 'leading and trailing whitespaces are removed' ' --cc="Cc2 <cc2@example.com>" \ --bcc="$BCC1" \ --bcc="bcc2@example.com" \ - 0001-add-master.patch | replace_variable_fields \ + 0001-add-main.patch | replace_variable_fields \ >actual-list && test_cmp expected-list actual-list ' +test_expect_success $PREREQ 'test using command name with --sendmail-cmd' ' + clean_fake_sendmail && + PATH="$(pwd):$PATH" \ + git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --sendmail-cmd="fake.sendmail" \ + HEAD^ && + test_path_is_file commandline1 +' + +test_expect_success $PREREQ 'test using arguments with --sendmail-cmd' ' + clean_fake_sendmail && + git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --sendmail-cmd='\''"$(pwd)/fake.sendmail" -f nobody@example.com'\'' \ + HEAD^ && + test_path_is_file commandline1 +' + +test_expect_success $PREREQ 'test shell expression with --sendmail-cmd' ' + clean_fake_sendmail && + git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --sendmail-cmd='\''f() { "$(pwd)/fake.sendmail" "$@"; };f'\'' \ + HEAD^ && + test_path_is_file commandline1 +' + test_expect_success $PREREQ 'invoke hook' ' mkdir -p .git/hooks && @@ -2108,8 +2241,8 @@ test_expect_success $PREREQ 'invoke hook' ' false ;; esac && - test -f 0001-add-master.patch && - grep "add master" "$1" + test -f 0001-add-main.patch && + grep "add main" "$1" EOF mkdir subdir && @@ -2121,10 +2254,10 @@ test_expect_success $PREREQ 'invoke hook' ' --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --smtp-server="$(pwd)/../fake.sendmail" \ - ../0001-add-master.patch && + ../0001-add-main.patch && # Verify error message when a patch is rejected by the hook - sed -e "s/add master/x/" ../0001-add-master.patch >../another.patch && + sed -e "s/add main/x/" ../0001-add-main.patch >../another.patch && test_must_fail git send-email \ --from="Example <nobody@example.com>" \ --to=nobody@example.com \ @@ -2139,7 +2272,7 @@ test_expect_success $PREREQ 'test that send-email works outside a repo' ' --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --smtp-server="$(pwd)/fake.sendmail" \ - "$(pwd)/0001-add-master.patch" + "$(pwd)/0001-add-main.patch" ' test_expect_success $PREREQ 'test that sendmail config is rejected' ' diff --git a/t/t9003-help-autocorrect.sh b/t/t9003-help-autocorrect.sh index b1c7919c4a..f00deaf381 100755 --- a/t/t9003-help-autocorrect.sh +++ b/t/t9003-help-autocorrect.sh @@ -37,16 +37,27 @@ test_expect_success 'autocorrect showing candidates' ' grep "^ distimdistim" actual ' -test_expect_success 'autocorrect running commands' ' - git config help.autocorrect -1 && +for immediate in -1 immediate +do + test_expect_success 'autocorrect running commands' ' + git config help.autocorrect $immediate && - git lfg >actual && - echo "a single log entry" >expect && - test_cmp expect actual && + git lfg >actual && + echo "a single log entry" >expect && + test_cmp expect actual && - git distimdist >actual && - echo "distimdistim was called" >expect && - test_cmp expect actual + git distimdist >actual && + echo "distimdistim was called" >expect && + test_cmp expect actual + ' +done + +test_expect_success 'autocorrect can be declined altogether' ' + git config help.autocorrect never && + + test_must_fail git lfg 2>actual && + grep "is not a git command" actual && + test_line_count = 1 actual ' test_done diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh index e4bb22034e..fea41b3c36 100755 --- a/t/t9100-git-svn-basic.sh +++ b/t/t9100-git-svn-basic.sh @@ -4,18 +4,13 @@ # test_description='git svn basic tests' -GIT_SVN_LC_ALL=${LC_ALL:-$LANG} + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./lib-git-svn.sh -case "$GIT_SVN_LC_ALL" in -*.UTF-8) - test_set_prereq UTF8 - ;; -*) - say "# UTF-8 locale not set, some tests skipped ($GIT_SVN_LC_ALL)" - ;; -esac +prepare_utf8_locale test_expect_success 'git svn --version works anywhere' ' nongit git svn --version @@ -184,8 +179,8 @@ test_expect_success POSIXPERM,SYMLINKS "$name" ' test ! -h "$SVN_TREE"/exec-2.sh && test_cmp help "$SVN_TREE"/exec-2.sh' -name="commit with UTF-8 message: locale: $GIT_SVN_LC_ALL" -LC_ALL="$GIT_SVN_LC_ALL" +name="commit with UTF-8 message: locale: $GIT_TEST_UTF8_LOCALE" +LC_ALL="$GIT_TEST_UTF8_LOCALE" export LC_ALL # This test relies on the previous test, hence requires POSIXPERM,SYMLINKS test_expect_success UTF8,POSIXPERM,SYMLINKS "$name" " @@ -275,7 +270,7 @@ test_expect_success 'dcommit $rev does not clobber current branch' ' test refs/heads/my-bar = $(git symbolic-ref HEAD) && git log refs/remotes/bar | grep "change 1" && ! git log refs/remotes/bar | grep "change 2" && - git checkout master && + git checkout main && git branch -D my-bar ' @@ -327,7 +322,7 @@ test_expect_success 'git-svn works in a bare repository' ' git svn fetch ) && rm -rf bare-repo ' -test_expect_success 'git-svn works in in a repository with a gitdir: link' ' +test_expect_success 'git-svn works in a repository with a gitdir: link' ' mkdir worktree gitdir && ( cd worktree && git svn init "$svnrepo" && diff --git a/t/t9115-git-svn-dcommit-funky-renames.sh b/t/t9115-git-svn-dcommit-funky-renames.sh index 9b44a44bc1..743fbe1fe4 100755 --- a/t/t9115-git-svn-dcommit-funky-renames.sh +++ b/t/t9115-git-svn-dcommit-funky-renames.sh @@ -93,9 +93,9 @@ test_expect_success 'git svn rebase works inside a fresh-cloned repository' ' # > ... All of the above characters, except for the backslash, are converted # > to special UNICODE characters in the range 0xf000 to 0xf0ff (the # > "Private use area") when creating or accessing files. -prepare_a_utf8_locale +prepare_utf8_locale test_expect_success UTF8,!MINGW,!UTF8_NFD_TO_NFC 'svn.pathnameencoding=cp932 new file on dcommit' ' - LC_ALL=$a_utf8_locale && + LC_ALL=$GIT_TEST_UTF8_LOCALE && export LC_ALL && neq=$(printf "\201\202") && git config svn.pathnameencoding cp932 && @@ -107,7 +107,7 @@ test_expect_success UTF8,!MINGW,!UTF8_NFD_TO_NFC 'svn.pathnameencoding=cp932 new # See the comment on the above test for setting of LC_ALL. test_expect_success !MINGW,!UTF8_NFD_TO_NFC 'svn.pathnameencoding=cp932 rename on dcommit' ' - LC_ALL=$a_utf8_locale && + LC_ALL=$GIT_TEST_UTF8_LOCALE && export LC_ALL && inf=$(printf "\201\207") && git config svn.pathnameencoding cp932 && diff --git a/t/t9117-git-svn-init-clone.sh b/t/t9117-git-svn-init-clone.sh index 044f65e916..62de819a44 100755 --- a/t/t9117-git-svn-init-clone.sh +++ b/t/t9117-git-svn-init-clone.sh @@ -7,12 +7,6 @@ test_description='git svn init/clone tests' . ./lib-git-svn.sh -# setup, run inside tmp so we don't have any conflicts with $svnrepo -set -e -rm -r .git -mkdir tmp -cd tmp - test_expect_success 'setup svnrepo' ' mkdir project project/trunk project/branches project/tags && echo foo > project/trunk/foo && diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh index 2c213ae654..01e1e8a8f7 100755 --- a/t/t9129-git-svn-i18n-commitencoding.sh +++ b/t/t9129-git-svn-i18n-commitencoding.sh @@ -14,12 +14,12 @@ compare_git_head_with () { test_cmp current "$1" } -prepare_a_utf8_locale +prepare_utf8_locale compare_svn_head_with () { # extract just the log message and strip out committer info. # don't use --limit here since svn 1.1.x doesn't have it, - LC_ALL="$a_utf8_locale" svn log $(git svn info --url) | perl -w -e ' + LC_ALL="$GIT_TEST_UTF8_LOCALE" svn log $(git svn info --url) | perl -w -e ' use bytes; $/ = ("-"x72) . "\n"; my @x = <STDIN>; diff --git a/t/t9145-git-svn-master-branch.sh b/t/t9145-git-svn-master-branch.sh index 3bbf341f6a..f863e437f7 100755 --- a/t/t9145-git-svn-master-branch.sh +++ b/t/t9145-git-svn-master-branch.sh @@ -2,7 +2,10 @@ # # Copyright (c) 2009 Eric Wong # -test_description='git svn initial master branch is "trunk" if possible' +test_description='git svn initial main branch is "trunk" if possible' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh test_expect_success 'setup test repository' ' @@ -13,12 +16,12 @@ test_expect_success 'setup test repository' ' svn_cmd import -m b/b i "$svnrepo/branches/b" ' -test_expect_success 'git svn clone --stdlayout sets up trunk as master' ' +test_expect_success 'git svn clone --stdlayout sets up trunk as main' ' git svn clone -s "$svnrepo" g && ( cd g && test x$(git rev-parse --verify refs/remotes/origin/trunk^0) = \ - x$(git rev-parse --verify refs/heads/master^0) + x$(git rev-parse --verify refs/heads/main^0) ) ' diff --git a/t/t9148-git-svn-propset.sh b/t/t9148-git-svn-propset.sh index 102639090c..aebb28995e 100755 --- a/t/t9148-git-svn-propset.sh +++ b/t/t9148-git-svn-propset.sh @@ -7,19 +7,22 @@ test_description='git svn propset tests' . ./lib-git-svn.sh -foo_subdir2="subdir/subdir2/foo_subdir2" +test_expect_success 'setup propset via import' ' + test_when_finished "rm -rf import" && -set -e -mkdir import && -(set -e ; cd import - mkdir subdir - mkdir subdir/subdir2 - touch foo # for 'add props top level' - touch subdir/foo_subdir # for 'add props relative' - touch "$foo_subdir2" # for 'add props subdir' - svn_cmd import -m 'import for git svn' . "$svnrepo" >/dev/null -) -rm -rf import + foo_subdir2="subdir/subdir2/foo_subdir2" && + mkdir -p import/subdir/subdir2 && + ( + cd import && + # for "add props top level" + >foo && + # for "add props relative" + >subdir/foo_subdir && + # for "add props subdir" + >"$foo_subdir2" && + svn_cmd import -m "import for git svn" . "$svnrepo" + ) +' test_expect_success 'initialize git svn' ' git svn init "$svnrepo" diff --git a/t/t9151-svn-mergeinfo.sh b/t/t9151-svn-mergeinfo.sh index 4f6c06ecb2..1fbe84feb1 100755 --- a/t/t9151-svn-mergeinfo.sh +++ b/t/t9151-svn-mergeinfo.sh @@ -5,53 +5,53 @@ test_description='git-svn svn mergeinfo properties' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh test_expect_success 'load svn dump' " svnadmin load -q '$rawsvnrepo' \ - < '$TEST_DIRECTORY/t9151/svn-mergeinfo.dump' && + <'$TEST_DIRECTORY/t9151/svn-mergeinfo.dump' && git svn init --minimize-url -R svnmerge \ --rewrite-root=http://svn.example.org \ -T trunk -b branches '$svnrepo' && git svn fetch --all - " +" test_expect_success 'all svn merges became git merge commits' ' - unmarked=$(git rev-list --parents --all --grep=Merge | - grep -v " .* " | cut -f1 -d" ") && - [ -z "$unmarked" ] - ' + git rev-list --all --no-merges --grep=Merge >unmarked && + test_must_be_empty unmarked +' test_expect_success 'cherry picks did not become git merge commits' ' - bad_cherries=$(git rev-list --parents --all --grep=Cherry | - grep " .* " | cut -f1 -d" ") && - [ -z "$bad_cherries" ] - ' + git rev-list --all --merges --grep=Cherry >bad-cherries && + test_must_be_empty bad-cherries +' test_expect_success 'svn non-merge merge commits did not become git merge commits' ' - bad_non_merges=$(git rev-list --parents --all --grep=non-merge | - grep " .* " | cut -f1 -d" ") && - [ -z "$bad_non_merges" ] - ' + git rev-list --all --merges --grep=non-merge >bad-non-merges && + test_must_be_empty bad-non-merges +' test_expect_success 'commit made to merged branch is reachable from the merge' ' before_commit=$(git rev-list --all --grep="trunk commit before merging trunk to b2") && merge_commit=$(git rev-list --all --grep="Merge trunk to b2") && - not_reachable=$(git rev-list -1 $before_commit --not $merge_commit) && - [ -z "$not_reachable" ] - ' + git rev-list -1 $before_commit --not $merge_commit >not-reachable && + test_must_be_empty not-reachable +' test_expect_success 'merging two branches in one commit is detected correctly' ' f1_commit=$(git rev-list --all --grep="make f1 branch from trunk") && f2_commit=$(git rev-list --all --grep="make f2 branch from trunk") && merge_commit=$(git rev-list --all --grep="Merge f1 and f2 to trunk") && - not_reachable=$(git rev-list -1 $f1_commit $f2_commit --not $merge_commit) && - [ -z "$not_reachable" ] - ' + git rev-list -1 $f1_commit $f2_commit --not $merge_commit >not-reachable && + test_must_be_empty not-reachable +' test_expect_failure 'everything got merged in the end' ' - unmerged=$(git rev-list --all --not master) && - [ -z "$unmerged" ] - ' + git rev-list --all --not main >unmerged && + test_must_be_empty unmerged +' test_done diff --git a/t/t9155-git-svn-fetch-deleted-tag.sh b/t/t9155-git-svn-fetch-deleted-tag.sh index 184336f346..3258374c13 100755 --- a/t/t9155-git-svn-fetch-deleted-tag.sh +++ b/t/t9155-git-svn-fetch-deleted-tag.sh @@ -2,6 +2,9 @@ test_description='git svn fetch deleted tag' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh test_expect_success 'setup svn repo' ' @@ -36,7 +39,7 @@ test_expect_success 'fetch deleted tags from same revision with checksum error' git svn fetch && git diff --exit-code origin/mybranch:trunk/subdir/file origin/tags/mytag:file && - git diff --exit-code master:subdir/file origin/tags/mytag^:file + git diff --exit-code main:subdir/file origin/tags/mytag^:file ' test_done diff --git a/t/t9156-git-svn-fetch-deleted-tag-2.sh b/t/t9156-git-svn-fetch-deleted-tag-2.sh index 7a6e33ba3c..2b75c403e3 100755 --- a/t/t9156-git-svn-fetch-deleted-tag-2.sh +++ b/t/t9156-git-svn-fetch-deleted-tag-2.sh @@ -2,6 +2,9 @@ test_description='git svn fetch deleted tag 2' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh test_expect_success 'setup svn repo' ' @@ -36,9 +39,9 @@ test_expect_success 'fetch deleted tags from same revision with no checksum erro cd git_project && git svn fetch && - git diff --exit-code master:subdir3/file origin/tags/mytag:file && - git diff --exit-code master:subdir2/file origin/tags/mytag^:file && - git diff --exit-code master:subdir1/file origin/tags/mytag^^:file + git diff --exit-code main:subdir3/file origin/tags/mytag:file && + git diff --exit-code main:subdir2/file origin/tags/mytag^:file && + git diff --exit-code main:subdir1/file origin/tags/mytag^^:file ' test_done diff --git a/t/t9163-git-svn-reset-clears-caches.sh b/t/t9163-git-svn-reset-clears-caches.sh index d6245cee08..978eb62ff4 100755 --- a/t/t9163-git-svn-reset-clears-caches.sh +++ b/t/t9163-git-svn-reset-clears-caches.sh @@ -4,6 +4,9 @@ # test_description='git svn reset clears memoized caches' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh svn_ver="$(svn --version --quiet)" @@ -59,7 +62,7 @@ test_expect_success 'fetch to merge-base (a)' ' test_expect_success 'rebase looses SVN merge (m)' ' git svn rebase && git svn fetch && - test 1 = $(git cat-file -p master|grep parent|wc -l) + test 1 = $(git cat-file -p main|grep parent|wc -l) ' # git svn fetch creates correct history with merge commit diff --git a/t/t9169-git-svn-dcommit-crlf.sh b/t/t9169-git-svn-dcommit-crlf.sh index 54b1f61a2a..7080b5d24f 100755 --- a/t/t9169-git-svn-dcommit-crlf.sh +++ b/t/t9169-git-svn-dcommit-crlf.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git svn dcommit CRLF' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-svn.sh test_expect_success 'setup commit repository' ' @@ -14,7 +17,7 @@ test_expect_success 'setup commit repository' ' p=$(git rev-parse HEAD) && t=$(git write-tree) && cmt=$(git commit-tree -p $p $t <cmt) && - git update-ref refs/heads/master $cmt && + git update-ref refs/heads/main $cmt && git cat-file commit HEAD | tail -n4 >out && test_cmp cmt out && git svn dcommit && diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 308c1ef42c..aa55b41b9a 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -4,8 +4,11 @@ # test_description='test git fast-import utility' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh -. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash +. "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash verify_packs () { for p in .git/objects/pack/*.pack @@ -62,7 +65,7 @@ test_expect_success 'A: create pack from stdin' ' mark :4 data $file4_len $file4_data - commit refs/heads/master + commit refs/heads/main mark :5 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT @@ -117,7 +120,7 @@ test_expect_success 'A: create pack from stdin' ' INPUT_END git fast-import --export-marks=marks.out <input && - git whatchanged master + git whatchanged main ' test_expect_success 'A: verify pack' ' @@ -131,7 +134,7 @@ test_expect_success 'A: verify commit' ' initial EOF - git cat-file commit master | sed 1d >actual && + git cat-file commit main | sed 1d >actual && test_cmp expect actual ' @@ -141,31 +144,31 @@ test_expect_success 'A: verify tree' ' 100644 blob file3 100755 blob file4 EOF - git cat-file -p master^{tree} | sed "s/ [0-9a-f]* / /" >actual && + git cat-file -p main^{tree} | sed "s/ [0-9a-f]* / /" >actual && test_cmp expect actual ' test_expect_success 'A: verify file2' ' echo "$file2_data" >expect && - git cat-file blob master:file2 >actual && + git cat-file blob main:file2 >actual && test_cmp expect actual ' test_expect_success 'A: verify file3' ' echo "$file3_data" >expect && - git cat-file blob master:file3 >actual && + git cat-file blob main:file3 >actual && test_cmp expect actual ' test_expect_success 'A: verify file4' ' printf "$file4_data" >expect && - git cat-file blob master:file4 >actual && + git cat-file blob main:file4 >actual && test_cmp expect actual ' test_expect_success 'A: verify tag/series-A' ' cat >expect <<-EOF && - object $(git rev-parse refs/heads/master) + object $(git rev-parse refs/heads/main) type commit tag series-A @@ -177,7 +180,7 @@ test_expect_success 'A: verify tag/series-A' ' test_expect_success 'A: verify tag/series-A-blob' ' cat >expect <<-EOF && - object $(git rev-parse refs/heads/master:file3) + object $(git rev-parse refs/heads/main:file3) type blob tag series-A-blob @@ -193,13 +196,13 @@ test_expect_success 'A: verify tag deletion is successful' ' test_expect_success 'A: verify marks output' ' cat >expect <<-EOF && - :2 $(git rev-parse --verify master:file2) - :3 $(git rev-parse --verify master:file3) - :4 $(git rev-parse --verify master:file4) - :5 $(git rev-parse --verify master^0) + :2 $(git rev-parse --verify main:file2) + :3 $(git rev-parse --verify main:file3) + :4 $(git rev-parse --verify main:file4) + :5 $(git rev-parse --verify main^0) :6 $(git cat-file tag nested | grep object | cut -d" " -f 2) :7 $(git rev-parse --verify nested) - :8 $(git rev-parse --verify master^0) + :8 $(git rev-parse --verify main^0) EOF test_cmp expect marks.out ' @@ -217,7 +220,7 @@ test_expect_success 'A: tag blob by sha1' ' new_blob=$(echo testing | git hash-object --stdin) && cat >input <<-INPUT_END && tag series-A-blob-2 - from $(git rev-parse refs/heads/master:file3) + from $(git rev-parse refs/heads/main:file3) data <<EOF Tag blob by sha1. EOF @@ -243,7 +246,7 @@ test_expect_success 'A: tag blob by sha1' ' INPUT_END cat >expect <<-EOF && - object $(git rev-parse refs/heads/master:file3) + object $(git rev-parse refs/heads/main:file3) type blob tag series-A-blob-2 @@ -284,13 +287,13 @@ test_expect_success 'A: verify pack' ' ' test_expect_success 'A: verify diff' ' - copy=$(git rev-parse --verify master:file2) && + copy=$(git rev-parse --verify main:file2) && cat >expect <<-EOF && :000000 100755 $ZERO_OID $copy A copy-of-file2 EOF - git diff-tree -M -r master verify--import-marks >actual && + git diff-tree -M -r main verify--import-marks >actual && compare_diff_raw expect actual && - test $(git rev-parse --verify master:file2) \ + test $(git rev-parse --verify main:file2) \ = $(git rev-parse --verify verify--import-marks:copy-of-file2) ' @@ -364,7 +367,7 @@ test_expect_success 'B: fail on invalid blob sha1' ' corrupt COMMIT - from refs/heads/master + from refs/heads/main M 755 $(echo $ZERO_OID | sed -e "s/0$/1/") zero1 INPUT_END @@ -381,7 +384,7 @@ test_expect_success 'B: accept branch name "TEMP_TAG"' ' tag base COMMIT - from refs/heads/master + from refs/heads/main INPUT_END @@ -389,8 +392,8 @@ test_expect_success 'B: accept branch name "TEMP_TAG"' ' git gc git prune" && git fast-import <input && - test -f .git/TEMP_TAG && - test $(git rev-parse master) = $(git rev-parse TEMP_TAG^) + test $(test-tool ref-store main resolve-ref TEMP_TAG 0 | cut -f1 -d " " ) != "$ZERO_OID" && + test $(git rev-parse main) = $(git rev-parse TEMP_TAG^) ' test_expect_success 'B: accept empty committer' ' @@ -528,8 +531,8 @@ test_expect_success 'B: fail on invalid committer (5)' ' test_expect_success 'C: incremental import create pack from stdin' ' newf=$(echo hi newf | git hash-object -w --stdin) && - oldf=$(git rev-parse --verify master:file2) && - thrf=$(git rev-parse --verify master:file3) && + oldf=$(git rev-parse --verify main:file2) && + thrf=$(git rev-parse --verify main:file3) && test_tick && cat >input <<-INPUT_END && commit refs/heads/branch @@ -538,7 +541,7 @@ test_expect_success 'C: incremental import create pack from stdin' ' second COMMIT - from refs/heads/master + from refs/heads/main M 644 $oldf file2/oldf M 755 $newf file2/newf D file3 @@ -560,7 +563,7 @@ test_expect_success 'C: validate reuse existing blob' ' test_expect_success 'C: verify commit' ' cat >expect <<-EOF && - parent $(git rev-parse --verify master^0) + parent $(git rev-parse --verify main^0) author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE @@ -578,7 +581,7 @@ test_expect_success 'C: validate rename result' ' :100644 100644 $oldf $oldf R100 file2 file2/oldf :100644 000000 $thrf $zero D file3 EOF - git diff-tree -M -r master branch >actual && + git diff-tree -M -r main branch >actual && compare_diff_raw expect actual ' @@ -1535,7 +1538,6 @@ test_expect_success 'O: comments are all skipped' ' commit refs/heads/O1 # -- ignore all of this text committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE - # $GIT_COMMITTER_NAME has inserted here for his benefit. data <<COMMIT dirty directory copy COMMIT @@ -1629,7 +1631,10 @@ test_expect_success 'O: blank lines not necessary after other commands' ' INPUT_END git fast-import <input && - test 8 = $(find .git/objects/pack -type f | grep -v multi-pack-index | wc -l) && + ls -la .git/objects/pack/pack-*.pack >packlist && + ls -la .git/objects/pack/pack-*.pack >idxlist && + test_line_count = 4 idxlist && + test_line_count = 4 packlist && test $(git rev-parse refs/tags/O3-2nd) = $(git rev-parse O3^) && git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual && test_cmp expect actual @@ -1698,7 +1703,7 @@ test_expect_success 'P: superproject & submodule mix' ' committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data 8 initial - from refs/heads/master + from refs/heads/main M 100644 :3 .gitmodules M 160000 :2 sub @@ -1733,8 +1738,8 @@ test_expect_success 'P: superproject & submodule mix' ' ( cd sub && git init && - git fetch --update-head-ok .. refs/heads/sub:refs/heads/master && - git checkout master + git fetch --update-head-ok .. refs/heads/sub:refs/heads/main && + git checkout main ) && git submodule init && git submodule update @@ -1758,7 +1763,7 @@ test_expect_success 'P: verbatim SHA gitlinks' ' committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data 8 initial - from refs/heads/master + from refs/heads/main M 100644 :1 .gitmodules M 160000 $SUBPREV sub @@ -3429,8 +3434,8 @@ mark :1 data 4 foo -reset refs/heads/master -commit refs/heads/master +reset refs/heads/main +commit refs/heads/main mark :2 author Full Name <user@company.tld> 1000000000 +0100 committer Full Name <user@company.tld> 1000000000 +0100 @@ -3444,7 +3449,7 @@ data 8 foo bar -commit refs/heads/master +commit refs/heads/main mark :4 author Full Name <user@company.tld> 1000000001 +0100 committer Full Name <user@company.tld> 1000000001 +0100 @@ -3461,8 +3466,8 @@ mark :1 data 4 foo -reset refs/heads/master -commit refs/heads/master +reset refs/heads/main +commit refs/heads/main mark :2 author Full Name <user@company.tld> 2000000000 +0100 committer Full Name <user@company.tld> 2000000000 +0100 @@ -3477,7 +3482,7 @@ data 73 path = sub1 url = https://void.example.com/main.git -commit refs/heads/master +commit refs/heads/main mark :4 author Full Name <user@company.tld> 2000000001 +0100 committer Full Name <user@company.tld> 2000000001 +0100 @@ -3493,7 +3498,7 @@ data 8 foo bar -commit refs/heads/master +commit refs/heads/main mark :6 author Full Name <user@company.tld> 2000000002 +0100 committer Full Name <user@company.tld> 2000000002 +0100 @@ -3511,8 +3516,8 @@ Y_INPUT_END test_expect_success 'Y: setup' ' test_oid_cache <<-EOF - Ymaster sha1:9afed2f9161ddf416c0a1863b8b0725b00070504 - Ymaster sha256:c0a1010da1df187b2e287654793df01b464bd6f8e3f17fc1481a7dadf84caee3 + Ymain sha1:9afed2f9161ddf416c0a1863b8b0725b00070504 + Ymain sha256:c0a1010da1df187b2e287654793df01b464bd6f8e3f17fc1481a7dadf84caee3 EOF ' @@ -3524,7 +3529,7 @@ test_expect_success 'Y: rewrite submodules' ' git -C sub2 fast-import --export-marks=../sub2-marks <../Y-sub-input && git fast-import --rewrite-submodules-from=sub:../Y-marks \ --rewrite-submodules-to=sub:sub2-marks <../Y-main-input && - test "$(git rev-parse master)" = "$(test_oid Ymaster)" + test "$(git rev-parse main)" = "$(test_oid Ymain)" ) ' diff --git a/t/t9301-fast-import-notes.sh b/t/t9301-fast-import-notes.sh index 14c1baa739..1ae4d7c0d3 100755 --- a/t/t9301-fast-import-notes.sh +++ b/t/t9301-fast-import-notes.sh @@ -4,12 +4,15 @@ # test_description='test git fast-import of notes objects' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_tick cat >input <<INPUT_END -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT first commit @@ -30,7 +33,7 @@ data <<EOF file baz/xyzzy in first commit EOF -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT second commit @@ -46,7 +49,7 @@ data <<EOF file baz/xyzzy in second commit EOF -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT third commit @@ -57,7 +60,7 @@ data <<EOF file foo in third commit EOF -commit refs/heads/master +commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT fourth commit @@ -70,13 +73,13 @@ EOF INPUT_END -test_expect_success 'set up master branch' ' +test_expect_success 'set up main branch' ' git fast-import <input && - git whatchanged master + git whatchanged main ' -commit4=$(git rev-parse refs/heads/master) +commit4=$(git rev-parse refs/heads/main) commit3=$(git rev-parse "$commit4^") commit2=$(git rev-parse "$commit4~2") commit1=$(git rev-parse "$commit4~3") diff --git a/t/t9302-fast-import-unpack-limit.sh b/t/t9302-fast-import-unpack-limit.sh index bb1c39cfcc..f519e4f1bf 100755 --- a/t/t9302-fast-import-unpack-limit.sh +++ b/t/t9302-fast-import-unpack-limit.sh @@ -5,7 +5,7 @@ test_description='test git fast-import unpack limit' test_expect_success 'create loose objects on import' ' test_tick && cat >input <<-INPUT_END && - commit refs/heads/master + commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT initial @@ -23,12 +23,12 @@ test_expect_success 'create loose objects on import' ' test_expect_success 'bigger packs are preserved' ' test_tick && cat >input <<-INPUT_END && - commit refs/heads/master + commit refs/heads/main committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE data <<COMMIT incremental should create a pack COMMIT - from refs/heads/master^0 + from refs/heads/main^0 commit refs/heads/branch committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE @@ -48,7 +48,7 @@ test_expect_success 'bigger packs are preserved' ' test_expect_success 'lookups after checkpoint works' ' hello_id=$(echo hello | git hash-object --stdin -t blob) && id="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE" && - before=$(git rev-parse refs/heads/master^0) && + before=$(git rev-parse refs/heads/main^0) && ( cat <<-INPUT_END && blob @@ -56,13 +56,13 @@ test_expect_success 'lookups after checkpoint works' ' data 6 hello - commit refs/heads/master + commit refs/heads/main mark :2 committer $id data <<COMMIT checkpoint after this COMMIT - from refs/heads/master^0 + from refs/heads/main^0 M 100644 :1 hello # pre-checkpoint @@ -86,10 +86,10 @@ test_expect_success 'lookups after checkpoint works' ' n=$(($n + 1)) fi && sleep 1 && - from=$(git rev-parse refs/heads/master^0) + from=$(git rev-parse refs/heads/main^0) done && cat <<-INPUT_END && - commit refs/heads/master + commit refs/heads/main committer $id data <<COMMIT make sure from "unpacked sha1 reference" works, too diff --git a/t/t9303-fast-import-compression.sh b/t/t9303-fast-import-compression.sh index 5045f02a53..57d916524e 100755 --- a/t/t9303-fast-import-compression.sh +++ b/t/t9303-fast-import-compression.sh @@ -3,12 +3,6 @@ test_description='compression setting of fast-import utility' . ./test-lib.sh -# This should be moved to test-lib.sh together with the -# copy in t0021 after both topics have graduated to 'master'. -file_size () { - test-tool path-utils file-size "$1" -} - import_large () { ( echo blob @@ -24,7 +18,7 @@ do test_when_finished "rm -f .git/objects/pack/pack-*.*" && test_when_finished "rm -rf .git/objects/??" && import_large -c fastimport.unpacklimit=0 $config && - sz=$(file_size .git/objects/pack/pack-*.pack) && + sz=$(test_file_size .git/objects/pack/pack-*.pack) && case "$expect" in small) test "$sz" -le 100000 ;; large) test "$sz" -ge 100000 ;; @@ -47,7 +41,7 @@ do test_when_finished "rm -f .git/objects/pack/pack-*.*" && test_when_finished "rm -rf .git/objects/??" && import_large -c fastimport.unpacklimit=9 $config && - sz=$(file_size .git/objects/??/????*) && + sz=$(test_file_size .git/objects/??/????*) && case "$expect" in small) test "$sz" -le 100000 ;; large) test "$sz" -ge 100000 ;; diff --git a/t/t9304-fast-import-marks.sh b/t/t9304-fast-import-marks.sh new file mode 100755 index 0000000000..d4359dba21 --- /dev/null +++ b/t/t9304-fast-import-marks.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +test_description='test exotic situations with marks' +. ./test-lib.sh + +test_expect_success 'setup dump of basic history' ' + test_commit one && + git fast-export --export-marks=marks HEAD >dump +' + +test_expect_success 'setup large marks file' ' + # normally a marks file would have a lot of useful, unique + # marks. But for our purposes, just having a lot of nonsense + # ones is fine. Start at 1024 to avoid clashing with marks + # legitimately used in our tiny dump. + blob=$(git rev-parse HEAD:one.t) && + for i in $(test_seq 1024 16384) + do + echo ":$i $blob" + done >>marks +' + +test_expect_success 'import with large marks file' ' + git fast-import --import-marks=marks <dump +' + +test_expect_success 'setup dump with submodule' ' + git submodule add "$PWD" sub && + git commit -m "add submodule" && + git fast-export HEAD >dump +' + +test_expect_success 'setup submodule mapping with large id' ' + old=$(git rev-parse HEAD:sub) && + new=$(echo $old | sed s/./a/g) && + echo ":12345 $old" >from && + echo ":12345 $new" >to +' + +test_expect_success 'import with submodule mapping' ' + git init dst && + git -C dst fast-import \ + --rewrite-submodules-from=sub:../from \ + --rewrite-submodules-to=sub:../to \ + <dump && + git -C dst rev-parse HEAD:sub >actual && + echo "$new" >expect && + test_cmp expect actual +' + +test_done diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 1372842559..409b48e244 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -4,6 +4,9 @@ # test_description='git fast-export' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -31,13 +34,13 @@ test_expect_success 'setup' ' git commit -m sitzt file2 && test_tick && git tag -a -m valentin muss && - git merge -s ours master + git merge -s ours main ' test_expect_success 'fast-export | fast-import' ' - MASTER=$(git rev-parse --verify master) && + MAIN=$(git rev-parse --verify main) && REIN=$(git rev-parse --verify rein) && WER=$(git rev-parse --verify wer) && MUSS=$(git rev-parse --verify muss) && @@ -46,7 +49,7 @@ test_expect_success 'fast-export | fast-import' ' git fast-export --all >actual && (cd new && git fast-import && - test $MASTER = $(git rev-parse --verify refs/heads/master) && + test $MAIN = $(git rev-parse --verify refs/heads/main) && test $REIN = $(git rev-parse --verify refs/tags/rein) && test $WER = $(git rev-parse --verify refs/heads/wer) && test $MUSS = $(git rev-parse --verify refs/tags/muss)) <actual @@ -80,35 +83,35 @@ test_expect_success 'fast-export --mark-tags ^muss^{commit} muss' ' test_cmp expected actual ' -test_expect_success 'fast-export master~2..master' ' +test_expect_success 'fast-export main~2..main' ' - git fast-export master~2..master >actual && - sed "s/master/partial/" actual | + git fast-export main~2..main >actual && + sed "s/main/partial/" actual | (cd new && git fast-import && - test $MASTER != $(git rev-parse --verify refs/heads/partial) && - git diff --exit-code master partial && - git diff --exit-code master^ partial^ && + test $MAIN != $(git rev-parse --verify refs/heads/partial) && + git diff --exit-code main partial && + git diff --exit-code main^ partial^ && test_must_fail git rev-parse partial~2) ' -test_expect_success 'fast-export --reference-excluded-parents master~2..master' ' +test_expect_success 'fast-export --reference-excluded-parents main~2..main' ' - git fast-export --reference-excluded-parents master~2..master >actual && - grep commit.refs/heads/master actual >commit-count && + git fast-export --reference-excluded-parents main~2..main >actual && + grep commit.refs/heads/main actual >commit-count && test_line_count = 2 commit-count && - sed "s/master/rewrite/" actual | + sed "s/main/rewrite/" actual | (cd new && git fast-import && - test $MASTER = $(git rev-parse --verify refs/heads/rewrite)) + test $MAIN = $(git rev-parse --verify refs/heads/rewrite)) ' test_expect_success 'fast-export --show-original-ids' ' - git fast-export --show-original-ids master >output && + git fast-export --show-original-ids main >output && grep ^original-oid output| sed -e s/^original-oid.// | sort >actual && - git rev-list --objects master muss >objects-and-names && + git rev-list --objects main muss >objects-and-names && awk "{print \$1}" objects-and-names | sort >commits-trees-blobs && comm -23 actual commits-trees-blobs >unfound && test_must_be_empty unfound @@ -116,8 +119,8 @@ test_expect_success 'fast-export --show-original-ids' ' test_expect_success 'fast-export --show-original-ids | git fast-import' ' - git fast-export --show-original-ids master muss | git fast-import --quiet && - test $MASTER = $(git rev-parse --verify refs/heads/master) && + git fast-export --show-original-ids main muss | git fast-import --quiet && + test $MAIN = $(git rev-parse --verify refs/heads/main) && test $MUSS = $(git rev-parse --verify refs/tags/muss) ' @@ -200,7 +203,7 @@ test_expect_success 'encoding preserved if reencoding fails' ' test_expect_success 'import/export-marks' ' - git checkout -b marks master && + git checkout -b marks main && git fast-export --export-marks=tmp-marks HEAD && test -s tmp-marks && test_line_count = 3 tmp-marks && @@ -265,7 +268,7 @@ test_expect_success 'signed-tags=warn-strip' ' test_expect_success 'setup submodule' ' - git checkout -f master && + git checkout -f main && mkdir sub && ( cd sub && @@ -290,17 +293,17 @@ test_expect_success 'setup submodule' ' test_expect_success 'submodule fast-export | fast-import' ' - SUBENT1=$(git ls-tree master^ sub) && - SUBENT2=$(git ls-tree master sub) && + SUBENT1=$(git ls-tree main^ sub) && + SUBENT2=$(git ls-tree main sub) && rm -rf new && mkdir new && git --git-dir=new/.git init && git fast-export --signed-tags=strip --all >actual && (cd new && git fast-import && - test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" && - test "$SUBENT2" = "$(git ls-tree refs/heads/master sub)" && - git checkout master && + test "$SUBENT1" = "$(git ls-tree refs/heads/main^ sub)" && + test "$SUBENT2" = "$(git ls-tree refs/heads/main sub)" && + git checkout main && git submodule init && git submodule update && cmp sub/file ../sub/file) <actual @@ -352,7 +355,7 @@ test_expect_success 'fast-export -C -C | fast-import' ' ' -test_expect_success 'fast-export | fast-import when master is tagged' ' +test_expect_success 'fast-export | fast-import when main is tagged' ' git tag -m msg last && git fast-export -C -C --signed-tags=strip --all > output && @@ -467,8 +470,8 @@ mark :2 data 3 hi -reset refs/heads/master -commit refs/heads/master +reset refs/heads/main +commit refs/heads/main mark :3 author A U Thor <author@example.com> 1112912713 -0700 committer C O Mitter <committer@example.com> 1112912713 -0700 @@ -482,7 +485,7 @@ EOF test_expect_failure 'no exact-ref revisions included' ' ( cd limit-by-paths && - git fast-export master~2..master~1 > output && + git fast-export main~2..main~1 > output && test_cmp expected output ) ' @@ -524,7 +527,7 @@ test_expect_success 'full-tree re-shows unmodified files' ' ' test_expect_success 'set-up a few more tags for tag export tests' ' - git checkout -f master && + git checkout -f main && HEAD_TREE=$(git show -s --pretty=raw HEAD | grep tree | sed "s/tree //") && git tag tree_tag -m "tagging a tree" $HEAD_TREE && git tag -a tree_tag-obj -m "tagging a tree" $HEAD_TREE && @@ -549,7 +552,7 @@ test_expect_success 'tag-obj_tag' 'git fast-export tag-obj_tag' test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj' test_expect_success 'handling tags of blobs' ' - git tag -a -m "Tag of a blob" blobtag $(git rev-parse master:file) && + git tag -a -m "Tag of a blob" blobtag $(git rev-parse main:file) && git fast-export blobtag >actual && cat >expect <<-EOF && blob @@ -592,10 +595,10 @@ test_expect_success 'directory becomes symlink' ' ) && ( cd dirtosymlink && - git fast-export master -- foo | + git fast-export main -- foo | (cd ../result && git fast-import --quiet) ) && - (cd result && git show master:foo) + (cd result && git show main:foo) ' test_expect_success 'fast-export quotes pathnames' ' @@ -643,7 +646,7 @@ mark :13 data 5 bump -commit refs/heads/master +commit refs/heads/main mark :14 author A U Thor <author@example.com> 1112912773 -0700 committer C O Mitter <committer@example.com> 1112912773 -0700 @@ -657,18 +660,18 @@ EOF test_expect_success 'avoid uninteresting refs' ' > tmp-marks && git fast-export --import-marks=tmp-marks \ - --export-marks=tmp-marks master > /dev/null && + --export-marks=tmp-marks main > /dev/null && git tag v1.0 && git branch uninteresting && echo bump > file && git commit -a -m bump && git fast-export --import-marks=tmp-marks \ - --export-marks=tmp-marks ^uninteresting ^v1.0 master > actual && + --export-marks=tmp-marks ^uninteresting ^v1.0 main > actual && test_cmp expected actual ' cat > expected << EOF -reset refs/heads/master +reset refs/heads/main from :14 EOF @@ -676,14 +679,14 @@ EOF test_expect_success 'refs are updated even if no commits need to be exported' ' > tmp-marks && git fast-export --import-marks=tmp-marks \ - --export-marks=tmp-marks master > /dev/null && + --export-marks=tmp-marks main > /dev/null && git fast-export --import-marks=tmp-marks \ - --export-marks=tmp-marks master > actual && + --export-marks=tmp-marks main > actual && test_cmp expected actual ' test_expect_success 'use refspec' ' - git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 && + git fast-export --refspec refs/heads/main:refs/heads/foobar main >actual2 && grep "^commit " actual2 | sort | uniq >actual && echo "commit refs/heads/foobar" > expected && test_cmp expected actual @@ -736,13 +739,13 @@ test_expect_success 'merge commit gets exported with --import-marks' ' test_commit initial && git checkout -b topic && test_commit on-topic && - git checkout master && - test_commit on-master && + git checkout main && + test_commit on-main && test_tick && git merge --no-ff -m Yeah topic && echo ":1 $(git rev-parse HEAD^^)" >marks && - git fast-export --import-marks=marks master >out && + git fast-export --import-marks=marks main >out && grep Yeah out ) ' diff --git a/t/t9351-fast-export-anonymize.sh b/t/t9351-fast-export-anonymize.sh index 5ac2c3b5ee..1c6e6fcdaf 100755 --- a/t/t9351-fast-export-anonymize.sh +++ b/t/t9351-fast-export-anonymize.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='basic tests for fast-export --anonymize' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup simple repo' ' @@ -51,7 +54,7 @@ test_expect_success 'stream retains other as refname' ' ' test_expect_success 'stream omits other refnames' ' - ! grep master stream && + ! grep main stream && ! grep mytag stream ' @@ -85,7 +88,7 @@ test_expect_success 'repo has original shape and timestamps' ' shape () { git log --format="%m %ct" --left-right --boundary "$@" } && - (cd .. && shape master...other) >expect && + (cd .. && shape main...other) >expect && shape $main_branch...$other_branch >actual && test_cmp expect actual ' diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh index 4a46f31c41..2d29d486ee 100755 --- a/t/t9400-git-cvsserver-server.sh +++ b/t/t9400-git-cvsserver-server.sh @@ -8,6 +8,9 @@ test_description='git-cvsserver access tests read access to a git repository with the cvs CLI client via git-cvsserver server' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh if ! test_have_prereq PERL; then @@ -45,7 +48,7 @@ test_expect_success 'setup' ' touch secondrootfile && git add secondrootfile && git commit -m "second root") && - git fetch secondroot master && + git fetch secondroot main && git merge --allow-unrelated-histories FETCH_HEAD && git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 && GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true && @@ -57,7 +60,7 @@ test_expect_success 'setup' ' # note that cvs doesn't accept absolute pathnames # as argument to co -d test_expect_success 'basic checkout' \ - 'GIT_CONFIG="$git_config" cvs -Q co -d cvswork master && + 'GIT_CONFIG="$git_config" cvs -Q co -d cvswork main && test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | head -n 1))" = "empty/1.1/" && test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | sed -ne \$p))" = "secondrootfile/1.1/"' @@ -226,7 +229,7 @@ GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true || exit 1 test_expect_success 'gitcvs.enabled = false' \ 'GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false && - if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 + if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 then echo unexpected cvs success false @@ -240,14 +243,14 @@ rm -fr cvswork2 test_expect_success 'gitcvs.ext.enabled = true' \ 'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true && GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 && test_cmp cvswork cvswork2' rm -fr cvswork2 test_expect_success 'gitcvs.ext.enabled = false' \ 'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled false && GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true && - if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 + if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 then echo unexpected cvs success false @@ -261,21 +264,21 @@ rm -fr cvswork2 test_expect_success 'gitcvs.dbname' \ 'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true && GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs.%a.%m.sqlite && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 && test_cmp cvswork cvswork2 && - test -f "$SERVERDIR/gitcvs.ext.master.sqlite" && - cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs.ext.master.sqlite"' + test -f "$SERVERDIR/gitcvs.ext.main.sqlite" && + cmp "$SERVERDIR/gitcvs.main.sqlite" "$SERVERDIR/gitcvs.ext.main.sqlite"' rm -fr cvswork2 test_expect_success 'gitcvs.ext.dbname' \ 'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true && GIT_DIR="$SERVERDIR" git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite && GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 && test_cmp cvswork cvswork2 && - test -f "$SERVERDIR/gitcvs1.ext.master.sqlite" && - test ! -f "$SERVERDIR/gitcvs2.ext.master.sqlite" && - cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs1.ext.master.sqlite"' + test -f "$SERVERDIR/gitcvs1.ext.main.sqlite" && + test ! -f "$SERVERDIR/gitcvs2.ext.main.sqlite" && + cmp "$SERVERDIR/gitcvs.main.sqlite" "$SERVERDIR/gitcvs1.ext.main.sqlite"' #------------ @@ -457,7 +460,7 @@ cd "$WORKDIR" test_expect_success 'cvs update (module list supports packed refs)' ' GIT_DIR="$SERVERDIR" git pack-refs --all && GIT_CONFIG="$git_config" cvs -n up -d 2> out && - grep "cvs update: New directory \`master'\''" < out + grep "cvs update: New directory \`main'\''" < out ' #------------ @@ -499,8 +502,8 @@ test_expect_success 'cvs status (no subdirs in header)' ' cd "$WORKDIR" test_expect_success 'cvs co -c (shows module database)' ' GIT_CONFIG="$git_config" cvs co -c > out && - grep "^master[ ][ ]*master$" <out && - ! grep -v "^master[ ][ ]*master$" <out + grep "^main[ ][ ]*main$" <out && + ! grep -v "^main[ ][ ]*main$" <out ' #------------ @@ -526,7 +529,7 @@ test_expect_success 'cvs co -c (shows module database)' ' sed -e 's/^x//' -e 's/SP$/ /' > "$WORKDIR/expect" <<EOF x -xRCS file: $WORKDIR/gitcvs.git/master/merge,v +xRCS file: $WORKDIR/gitcvs.git/main/merge,v xWorking file: merge xhead: 1.4 xbranch: diff --git a/t/t9401-git-cvsserver-crlf.sh b/t/t9401-git-cvsserver-crlf.sh index c7a0dd84a4..a34805acdc 100755 --- a/t/t9401-git-cvsserver-crlf.sh +++ b/t/t9401-git-cvsserver-crlf.sh @@ -9,6 +9,9 @@ test_description='git-cvsserver -kb modes tests -kb mode for binary files when accessing a git repository using cvs CLI client via git-cvsserver server' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh marked_as () { @@ -105,14 +108,14 @@ test_expect_success 'setup' ' ' test_expect_success 'cvs co (default crlf)' ' - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && test x"$(grep '/-k' cvswork/CVS/Entries cvswork/subdir/CVS/Entries)" = x"" ' rm -rf cvswork test_expect_success 'cvs co (allbinary)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary true && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && marked_as cvswork textfile.c -kb && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes -kb && @@ -125,7 +128,7 @@ test_expect_success 'cvs co (allbinary)' ' rm -rf cvswork cvs.log test_expect_success 'cvs co (use attributes/allbinary)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr true && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes -kb && @@ -138,7 +141,7 @@ test_expect_success 'cvs co (use attributes/allbinary)' ' rm -rf cvswork test_expect_success 'cvs co (use attributes)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary false && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && @@ -194,7 +197,7 @@ test_expect_success 'updating' ' rm -rf cvswork test_expect_success 'cvs co (use attributes/guess)' ' GIT_DIR="$SERVERDIR" git config gitcvs.allbinary guess && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && @@ -224,7 +227,7 @@ test_expect_success 'setup multi-line files' ' rm -rf cvswork test_expect_success 'cvs co (guess)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr false && - GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork main >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && @@ -239,7 +242,7 @@ test_expect_success 'cvs co (guess)' ' ' test_expect_success 'cvs co another copy (guess)' ' - GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 && + GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 main >cvs.log 2>&1 && marked_as cvswork2 textfile.c "" && marked_as cvswork2 binfile.bin -kb && marked_as cvswork2 .gitattributes "" && @@ -335,7 +338,7 @@ test_expect_success 'update subdir of other copy (guess)' ' echo "starting update/merge" >> "${WORKDIR}/marked.log" test_expect_success 'update/merge full other copy (guess)' ' - git pull gitcvs.git master && + git pull gitcvs.git main && sed "s/3/replaced_3/" < multilineTxt.c > ml.temp && mv ml.temp multilineTxt.c && git add multilineTxt.c && diff --git a/t/t9402-git-cvsserver-refs.sh b/t/t9402-git-cvsserver-refs.sh index 6436c91a3c..2ee41f9443 100755 --- a/t/t9402-git-cvsserver-refs.sh +++ b/t/t9402-git-cvsserver-refs.sh @@ -5,6 +5,9 @@ test_description='git-cvsserver and git refspecs tests ability for git-cvsserver to switch between and compare tags, branches and other git refspecs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh ######### @@ -115,7 +118,7 @@ test_expect_success 'setup v1, b1' ' rm -rf cvswork test_expect_success 'cvs co v1' ' - cvs -f -Q co -r v1 -d cvswork master >cvs.log 2>&1 && + cvs -f -Q co -r v1 -d cvswork main >cvs.log 2>&1 && check_start_tree cvswork && check_file cvswork textfile.c v1 && check_file cvswork t2 v1 && @@ -128,7 +131,7 @@ test_expect_success 'cvs co v1' ' rm -rf cvswork test_expect_success 'cvs co b1' ' - cvs -f co -r b1 -d cvswork master >cvs.log 2>&1 && + cvs -f co -r b1 -d cvswork main >cvs.log 2>&1 && check_start_tree cvswork && check_file cvswork textfile.c v1 && check_file cvswork t2 v1 && @@ -140,7 +143,7 @@ test_expect_success 'cvs co b1' ' ' test_expect_success 'cvs co b1 [cvswork3]' ' - cvs -f co -r b1 -d cvswork3 master >cvs.log 2>&1 && + cvs -f co -r b1 -d cvswork3 main >cvs.log 2>&1 && check_start_tree cvswork3 && check_file cvswork3 textfile.c v1 && check_file cvswork3 t2 v1 && @@ -265,7 +268,7 @@ test_expect_success 'setup simple b2' ' ' test_expect_success 'cvs co b2 [into cvswork2]' ' - cvs -f co -r b2 -d cvswork2 master >cvs.log 2>&1 && + cvs -f co -r b2 -d cvswork2 main >cvs.log 2>&1 && check_start_tree cvswork && check_file cvswork textfile.c v1 && check_file cvswork t2 v1 && diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh index b484e3e250..0333065d4d 100755 --- a/t/t9500-gitweb-standalone-no-errors.sh +++ b/t/t9500-gitweb-standalone-no-errors.sh @@ -10,7 +10,10 @@ commandline, and checks that it would not write any errors or warnings to log.' -. ./gitweb-lib.sh +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./lib-gitweb.sh # ---------------------------------------------------------------------- # no commits (empty, just initialized repository) @@ -327,7 +330,7 @@ test_expect_success \ echo "Branch" >>b && git add b && git commit -a -m "On branch" && - git checkout master && + git checkout main && git merge b && git tag merge_commit' @@ -364,7 +367,7 @@ test_expect_success \ echo "Changed and have mode changed" >07-change-mode-change && test_chmod +x 07-change-mode-change && git commit -a -m "Large commit" && - git checkout master' + git checkout main' test_expect_success \ 'commit(1): large commit' \ @@ -402,7 +405,7 @@ test_expect_success 'side-by-side: merge commit' ' test_expect_success \ 'tags: list of different types of tags' \ - 'git checkout master && + 'git checkout main && git tag -a -m "Tag commit object" tag-commit HEAD && git tag -a -m "" tag-commit-nomessage HEAD && git tag -a -m "Tag tag object" tag-tag tag-commit && @@ -443,7 +446,7 @@ test_expect_success \ test_expect_success \ 'logs: history (implicit HEAD, deleted file)' \ - 'git checkout master && + 'git checkout main && echo "to be deleted" >deleted_file && git add deleted_file && git commit -m "Add file to be deleted" && @@ -463,11 +466,11 @@ test_expect_success \ test_expect_success \ 'path_info: project/branch:file' \ - 'gitweb_run "" "/.git/master:file"' + 'gitweb_run "" "/.git/main:file"' test_expect_success \ 'path_info: project/branch:dir/' \ - 'gitweb_run "" "/.git/master:foo/"' + 'gitweb_run "" "/.git/main:foo/"' test_expect_success \ 'path_info: project/branch (non-existent)' \ @@ -479,16 +482,16 @@ test_expect_success \ test_expect_success \ 'path_info: project/branch:file (non-existent)' \ - 'gitweb_run "" "/.git/master:non-existent"' + 'gitweb_run "" "/.git/main:non-existent"' test_expect_success \ 'path_info: project/branch:dir/ (non-existent)' \ - 'gitweb_run "" "/.git/master:non-existent/"' + 'gitweb_run "" "/.git/main:non-existent/"' test_expect_success \ 'path_info: project/branch:/file' \ - 'gitweb_run "" "/.git/master:/file"' + 'gitweb_run "" "/.git/main:/file"' test_expect_success \ 'path_info: project/:/file (implicit HEAD)' \ @@ -801,7 +804,7 @@ test_expect_success \ git checkout orphan_branch || git checkout --orphan orphan_branch } && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && gitweb_run "p=.git;a=summary"' test_done diff --git a/t/t9501-gitweb-standalone-http-status.sh b/t/t9501-gitweb-standalone-http-status.sh index 2a0ffed870..32814e75df 100755 --- a/t/t9501-gitweb-standalone-http-status.sh +++ b/t/t9501-gitweb-standalone-http-status.sh @@ -10,7 +10,10 @@ commandline, and checks that it returns the expected HTTP status code and message.' -. ./gitweb-lib.sh +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./lib-gitweb.sh # # Gitweb only provides the functionality tested by the 'modification times' @@ -85,7 +88,7 @@ test_debug 'cat gitweb.headers' # snapshot hash ids test_expect_success 'snapshots: good tree-ish id' ' - gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + gitweb_run "p=.git;a=snapshot;h=main;sf=tgz" && grep "Status: 200 OK" gitweb.output ' test_debug 'cat gitweb.headers' @@ -123,7 +126,7 @@ test_debug 'cat gitweb.output' # modification times (Last-Modified and If-Modified-Since) test_expect_success DATE_PARSER 'modification: feed last-modified' ' - gitweb_run "p=.git;a=atom;h=master" && + gitweb_run "p=.git;a=atom;h=main" && grep "Status: 200 OK" gitweb.headers && grep "Last-modified: Thu, 7 Apr 2005 22:14:13 +0000" gitweb.headers ' @@ -133,7 +136,7 @@ test_expect_success DATE_PARSER 'modification: feed if-modified-since (modified) HTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" && export HTTP_IF_MODIFIED_SINCE && test_when_finished "unset HTTP_IF_MODIFIED_SINCE" && - gitweb_run "p=.git;a=atom;h=master" && + gitweb_run "p=.git;a=atom;h=main" && grep "Status: 200 OK" gitweb.headers ' test_debug 'cat gitweb.headers' @@ -142,13 +145,13 @@ test_expect_success DATE_PARSER 'modification: feed if-modified-since (unmodifie HTTP_IF_MODIFIED_SINCE="Thu, 7 Apr 2005 22:14:13 +0000" && export HTTP_IF_MODIFIED_SINCE && test_when_finished "unset HTTP_IF_MODIFIED_SINCE" && - gitweb_run "p=.git;a=atom;h=master" && + gitweb_run "p=.git;a=atom;h=main" && grep "Status: 304 Not Modified" gitweb.headers ' test_debug 'cat gitweb.headers' test_expect_success DATE_PARSER 'modification: snapshot last-modified' ' - gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + gitweb_run "p=.git;a=snapshot;h=main;sf=tgz" && grep "Status: 200 OK" gitweb.headers && grep "Last-modified: Thu, 7 Apr 2005 22:14:13 +0000" gitweb.headers ' @@ -158,7 +161,7 @@ test_expect_success DATE_PARSER 'modification: snapshot if-modified-since (modif HTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" && export HTTP_IF_MODIFIED_SINCE && test_when_finished "unset HTTP_IF_MODIFIED_SINCE" && - gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + gitweb_run "p=.git;a=snapshot;h=main;sf=tgz" && grep "Status: 200 OK" gitweb.headers ' test_debug 'cat gitweb.headers' @@ -167,7 +170,7 @@ test_expect_success DATE_PARSER 'modification: snapshot if-modified-since (unmod HTTP_IF_MODIFIED_SINCE="Thu, 7 Apr 2005 22:14:13 +0000" && export HTTP_IF_MODIFIED_SINCE && test_when_finished "unset HTTP_IF_MODIFIED_SINCE" && - gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + gitweb_run "p=.git;a=snapshot;h=main;sf=tgz" && grep "Status: 304 Not Modified" gitweb.headers ' test_debug 'cat gitweb.headers' diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh index e38cbc97d3..3167473b30 100755 --- a/t/t9502-gitweb-standalone-parse-output.sh +++ b/t/t9502-gitweb-standalone-parse-output.sh @@ -10,7 +10,10 @@ commandline, and checks that it produces the correct output, either in the HTTP header or the actual script output.' -. ./gitweb-lib.sh +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./lib-gitweb.sh # ---------------------------------------------------------------------- # snapshot file name and prefix @@ -79,10 +82,10 @@ test_expect_success 'snapshot: HEAD' ' ' test_debug 'cat gitweb.headers && cat file_list' -test_expect_success 'snapshot: short branch name (master)' ' - gitweb_run "p=.git;a=snapshot;h=master;sf=tar" && - ID=$(git rev-parse --verify --short=7 master) && - check_snapshot ".git-master-$ID" +test_expect_success 'snapshot: short branch name (main)' ' + gitweb_run "p=.git;a=snapshot;h=main;sf=tar" && + ID=$(git rev-parse --verify --short=7 main) && + check_snapshot ".git-main-$ID" ' test_debug 'cat gitweb.headers && cat file_list' @@ -93,10 +96,10 @@ test_expect_success 'snapshot: short tag name (first)' ' ' test_debug 'cat gitweb.headers && cat file_list' -test_expect_success 'snapshot: full branch name (refs/heads/master)' ' - gitweb_run "p=.git;a=snapshot;h=refs/heads/master;sf=tar" && - ID=$(git rev-parse --verify --short=7 master) && - check_snapshot ".git-master-$ID" +test_expect_success 'snapshot: full branch name (refs/heads/main)' ' + gitweb_run "p=.git;a=snapshot;h=refs/heads/main;sf=tar" && + ID=$(git rev-parse --verify --short=7 main) && + check_snapshot ".git-main-$ID" ' test_debug 'cat gitweb.headers && cat file_list' diff --git a/t/t9600-cvsimport.sh b/t/t9600-cvsimport.sh index 251fdd66c4..5680849218 100755 --- a/t/t9600-cvsimport.sh +++ b/t/t9600-cvsimport.sh @@ -1,6 +1,9 @@ #!/bin/sh test_description='git cvsimport basic tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-cvs.sh if ! test_have_prereq NOT_ROOT; then @@ -159,6 +162,6 @@ test_expect_success PERL 'no .git/cvs-revisions created by default' ' ' -test_expect_success PERL 'test entire HEAD' 'test_cmp_branch_tree master' +test_expect_success PERL 'test entire HEAD' 'test_cmp_branch_tree main' test_done diff --git a/t/t9601-cvsimport-vendor-branch.sh b/t/t9601-cvsimport-vendor-branch.sh index 827d39f5bf..116cddba3a 100755 --- a/t/t9601-cvsimport-vendor-branch.sh +++ b/t/t9601-cvsimport-vendor-branch.sh @@ -32,6 +32,9 @@ # tag has been removed. test_description='git cvsimport handling of vendor branches' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-cvs.sh setup_cvs_test_repository t9601 @@ -42,43 +45,43 @@ test_expect_success PERL 'import a module with a vendor branch' ' ' -test_expect_success PERL 'check HEAD out of cvs repository' 'test_cvs_co master' +test_expect_success PERL 'check HEAD out of cvs repository' 'test_cvs_co main' -test_expect_success PERL 'check master out of git repository' 'test_git_co master' +test_expect_success PERL 'check main out of git repository' 'test_git_co main' test_expect_success PERL 'check a file that was imported once' ' - test_cmp_branch_file master imported-once.txt + test_cmp_branch_file main imported-once.txt ' test_expect_failure PERL 'check a file that was imported twice' ' - test_cmp_branch_file master imported-twice.txt + test_cmp_branch_file main imported-twice.txt ' test_expect_success PERL 'check a file that was imported then modified on HEAD' ' - test_cmp_branch_file master imported-modified.txt + test_cmp_branch_file main imported-modified.txt ' test_expect_success PERL 'check a file that was imported, modified, then imported again' ' - test_cmp_branch_file master imported-modified-imported.txt + test_cmp_branch_file main imported-modified-imported.txt ' test_expect_success PERL 'check a file that was added to HEAD then imported' ' - test_cmp_branch_file master added-imported.txt + test_cmp_branch_file main added-imported.txt ' test_expect_success PERL 'a vendor branch whose tag has been removed' ' - test_cmp_branch_file master imported-anonymously.txt + test_cmp_branch_file main imported-anonymously.txt ' diff --git a/t/t9602-cvsimport-branches-tags.sh b/t/t9602-cvsimport-branches-tags.sh index e1db323f54..e5266c9a87 100755 --- a/t/t9602-cvsimport-branches-tags.sh +++ b/t/t9602-cvsimport-branches-tags.sh @@ -4,6 +4,9 @@ # t9602/README. test_description='git cvsimport handling of branches and tags' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-cvs.sh setup_cvs_test_repository t9602 @@ -14,9 +17,9 @@ test_expect_success PERL 'import module' ' ' -test_expect_success PERL 'test branch master' ' +test_expect_success PERL 'test branch main' ' - test_cmp_branch_tree master + test_cmp_branch_tree main ' diff --git a/t/t9603-cvsimport-patchsets.sh b/t/t9603-cvsimport-patchsets.sh index 3e64b11eac..0e9daa5768 100755 --- a/t/t9603-cvsimport-patchsets.sh +++ b/t/t9603-cvsimport-patchsets.sh @@ -12,28 +12,31 @@ # bug. test_description='git cvsimport testing for correct patchset estimation' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-cvs.sh setup_cvs_test_repository t9603 test_expect_failure PERL 'import with criss cross times on revisions' ' - - git cvsimport -p"-x" -C module-git module && - (cd module-git && - git log --pretty=format:%s > ../actual-master && - git log A~2..A --pretty="format:%s %ad" -- > ../actual-A && - echo "" >> ../actual-master && - echo "" >> ../actual-A - ) && - echo "Rev 4 + git cvsimport -p"-x" -C module-git module && + ( + cd module-git && + git log --pretty=format:%s > ../actual-main && + git log A~2..A --pretty="format:%s %ad" -- > ../actual-A && + echo "" >> ../actual-main && + echo "" >> ../actual-A + ) && + echo "Rev 4 Rev 3 Rev 2 -Rev 1" > expect-master && - test_cmp expect-master actual-master && +Rev 1" > expect-main && + test_cmp expect-main actual-main && - echo "Rev 5 Branch A Wed Mar 11 19:09:10 2009 +0000 + echo "Rev 5 Branch A Wed Mar 11 19:09:10 2009 +0000 Rev 4 Branch A Wed Mar 11 19:03:52 2009 +0000" > expect-A && - test_cmp expect-A actual-A + test_cmp expect-A actual-A ' test_done diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh index c98c1dfc23..81bc8e8da1 100755 --- a/t/t9800-git-p4-basic.sh +++ b/t/t9800-git-p4-basic.sh @@ -2,6 +2,9 @@ test_description='git p4 tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-p4.sh test_expect_success 'start p4d' ' @@ -226,7 +229,7 @@ test_expect_success 'clone --bare should make a bare repository' ' git config --get --bool core.bare true && git rev-parse --verify refs/remotes/p4/master && git rev-parse --verify refs/remotes/p4/HEAD && - git rev-parse --verify refs/heads/master && + git rev-parse --verify refs/heads/main && git rev-parse --verify HEAD ) ' diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh index 67ff2711f5..50a6f8bad5 100755 --- a/t/t9801-git-p4-branch.sh +++ b/t/t9801-git-p4-branch.sh @@ -2,6 +2,9 @@ test_description='git p4 tests for p4 branches' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-p4.sh test_expect_success 'start p4d' ' @@ -67,7 +70,7 @@ test_expect_success 'import main, no branch detection' ' ( cd "$git" && git log --oneline --graph --decorate --all && - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 4 wc ) ' @@ -78,7 +81,7 @@ test_expect_success 'import branch1, no branch detection' ' ( cd "$git" && git log --oneline --graph --decorate --all && - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 2 wc ) ' @@ -89,7 +92,7 @@ test_expect_success 'import branch2, no branch detection' ' ( cd "$git" && git log --oneline --graph --decorate --all && - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 2 wc ) ' @@ -100,7 +103,7 @@ test_expect_success 'import depot, no branch detection' ' ( cd "$git" && git log --oneline --graph --decorate --all && - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 8 wc ) ' @@ -114,7 +117,7 @@ test_expect_success 'import depot, branch detection' ' git log --oneline --graph --decorate --all && # 4 main commits - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 4 wc && # 3 main, 1 integrate, 1 on branch2 @@ -137,7 +140,7 @@ test_expect_success 'import depot, branch detection, branchList branch definitio git log --oneline --graph --decorate --all && # 4 main commits - git rev-list master >wc && + git rev-list main -- >wc && test_line_count = 4 wc && # 3 main, 1 integrate, 1 on branch2 @@ -200,19 +203,19 @@ test_expect_success 'git p4 clone simple branches' ' git p4 clone --dest=. --detect-branches //depot@all && git log --all --graph --decorate --stat && git reset --hard p4/depot/branch1 && - test -f file1 && - test -f file2 && - test -f file3 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && grep update file2 && git reset --hard p4/depot/branch2 && - test -f file1 && - test -f file2 && + test_path_is_file file1 && + test_path_is_file file2 && test ! -f file3 && ! grep update file2 && git reset --hard p4/depot/branch3 && - test -f file1 && - test -f file2 && - test -f file3 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && grep update file2 && cd "$cli" && cd branch1 && @@ -291,11 +294,13 @@ test_expect_success 'git p4 clone complex branches' ' test_path_is_file file3 && grep update file2 && git reset --hard p4/depot/branch4 && + git diff-tree --quiet HEAD && test_path_is_file file1 && test_path_is_file file2 && test_path_is_missing file3 && ! grep update file2 && git reset --hard p4/depot/branch5 && + git diff-tree --quiet HEAD && test_path_is_file file1 && test_path_is_file file2 && test_path_is_file file3 && @@ -484,7 +489,7 @@ test_expect_success 'use-client-spec detect-branches files in top-level' ' ( cd "$git" && git p4 sync --detect-branches --use-client-spec //depot/usecs@all && - git checkout -b master p4/usecs/b1 && + git checkout -b main p4/usecs/b1 && test_path_is_file b1-file1 && test_path_is_missing b2-file2 && test_path_is_missing b1 && @@ -537,7 +542,7 @@ test_expect_success 'use-client-spec detect-branches skips files in branches' ' ( cd "$git" && git p4 sync --detect-branches --use-client-spec //depot/usecs@all && - git checkout -b master p4/usecs/b3 && + git checkout -b main p4/usecs/b3 && test_path_is_file b1-file1 && test_path_is_file b3-file3_2 && test_path_is_missing b3-file3_1 @@ -603,22 +608,22 @@ test_expect_success 'git p4 clone simple branches with base folder on server sid git p4 clone --dest=. --use-client-spec --detect-branches //depot@all && git log --all --graph --decorate --stat && git reset --hard p4/depot/branch1 && - test -f file1 && - test -f file2 && - test -f file3 && - test -f sub_file1 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + test_path_is_file sub_file1 && grep update file2 && git reset --hard p4/depot/branch2 && - test -f file1 && - test -f file2 && + test_path_is_file file1 && + test_path_is_file file2 && test ! -f file3 && - test -f sub_file1 && + test_path_is_file sub_file1 && ! grep update file2 && git reset --hard p4/depot/branch3 && - test -f file1 && - test -f file2 && - test -f file3 && - test -f sub_file1 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + test_path_is_file sub_file1 && grep update file2 && cd "$cli" && cd branch1 && diff --git a/t/t9802-git-p4-filetype.sh b/t/t9802-git-p4-filetype.sh index 94edebe272..19073c6e9f 100755 --- a/t/t9802-git-p4-filetype.sh +++ b/t/t9802-git-p4-filetype.sh @@ -263,7 +263,7 @@ test_expect_success SYMLINKS 'ensure p4 symlink parsed correctly' ' ( cd "$git" && test -L symlink && - test $(readlink symlink) = symlink-target + test $(test_readlink symlink) = symlink-target ) ' @@ -329,7 +329,7 @@ test_expect_success SYMLINKS 'empty symlink target' ' git p4 clone --dest="$git" //depot@all && ( cd "$git" && - test $(readlink empty-symlink) = target2 + test $(test_readlink empty-symlink) = target2 ) ' diff --git a/t/t9806-git-p4-options.sh b/t/t9806-git-p4-options.sh index 4e794a01bf..c26d297433 100755 --- a/t/t9806-git-p4-options.sh +++ b/t/t9806-git-p4-options.sh @@ -2,6 +2,9 @@ test_description='git p4 options' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-p4.sh test_expect_success 'start p4d' ' @@ -27,14 +30,14 @@ test_expect_success 'clone no --git-dir' ' test_must_fail git p4 clone --git-dir=xx //depot ' -test_expect_success 'clone --branch should checkout master' ' +test_expect_success 'clone --branch should checkout main' ' git p4 clone --branch=refs/remotes/p4/sb --dest="$git" //depot && test_when_finished cleanup_git && ( cd "$git" && git rev-parse refs/remotes/p4/sb >sb && - git rev-parse refs/heads/master >master && - test_cmp sb master && + git rev-parse refs/heads/main >main && + test_cmp sb main && git rev-parse HEAD >head && test_cmp sb head ) @@ -147,22 +150,22 @@ test_expect_success 'clone --changesfile, @all' ' test_must_fail git p4 clone --changesfile="$TRASH_DIRECTORY/cf" --dest="$git" //depot@all ' -# imports both master and p4/master in refs/heads +# imports both main and p4/master in refs/heads # requires --import-local on sync to find p4 refs/heads -# does not update master on sync, just p4/master +# does not update main on sync, just p4/master test_expect_success 'clone/sync --import-local' ' git p4 clone --import-local --dest="$git" //depot@1,2 && test_when_finished cleanup_git && ( cd "$git" && - git log --oneline refs/heads/master >lines && + git log --oneline refs/heads/main >lines && test_line_count = 2 lines && git log --oneline refs/heads/p4/master >lines && test_line_count = 2 lines && test_must_fail git p4 sync && git p4 sync --import-local && - git log --oneline refs/heads/master >lines && + git log --oneline refs/heads/main >lines && test_line_count = 2 lines && git log --oneline refs/heads/p4/master >lines && test_line_count = 3 lines @@ -174,7 +177,7 @@ test_expect_success 'clone --max-changes' ' test_when_finished cleanup_git && ( cd "$git" && - git log --oneline refs/heads/master >lines && + git log --oneline refs/heads/main >lines && test_line_count = 2 lines ) ' @@ -237,7 +240,7 @@ test_expect_success 'clone --use-client-spec' ' git init && git config git-p4.useClientSpec true && git p4 sync //depot/... && - git checkout -b master p4/master && + git checkout -b main p4/master && test_path_is_file bus/dir/f4 && test_path_is_missing file1 ) diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index eaaae414a1..7d4109f29d 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -2,6 +2,9 @@ test_description='git p4 submit' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-p4.sh test_expect_success 'start p4d' ' @@ -114,7 +117,7 @@ test_expect_success 'submit with allowSubmit' ' git config git-p4.skipSubmitEdit true && git config git-p4.allowSubmit "nobranch" && test_must_fail git p4 submit && - git config git-p4.allowSubmit "nobranch,master" && + git config git-p4.allowSubmit "nobranch,main" && git p4 submit ) ' diff --git a/t/t9811-git-p4-label-import.sh b/t/t9811-git-p4-label-import.sh index c1446f26ab..5ac5383fb7 100755 --- a/t/t9811-git-p4-label-import.sh +++ b/t/t9811-git-p4-label-import.sh @@ -2,6 +2,9 @@ test_description='git p4 label tests' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-git-p4.sh test_expect_success 'start p4d' ' @@ -185,7 +188,7 @@ test_expect_success 'tag that cannot be exported' ' git add main/f12 && git commit -m "adding f12" && git tag -m "tag on a_branch" GIT_TAG_ON_A_BRANCH && - git checkout master && + git checkout main && git p4 submit --export-labels ) && ( diff --git a/t/t9832-unshelve.sh b/t/t9832-unshelve.sh index e9276c48f4..6b3cb0414a 100755 --- a/t/t9832-unshelve.sh +++ b/t/t9832-unshelve.sh @@ -29,8 +29,11 @@ test_expect_success 'init depot' ' ) ' +# Create an initial clone, with a commit unrelated to the P4 change +# on HEAD test_expect_success 'initial clone' ' - git p4 clone --dest="$git" //depot/@all + git p4 clone --dest="$git" //depot/@all && + test_commit -C "$git" "unrelated" ' test_expect_success 'create shelved changelist' ' @@ -65,7 +68,8 @@ EOF cd "$git" && change=$(last_shelved_change) && git p4 unshelve $change && - git show refs/remotes/p4-unshelved/$change | grep -q "Further description" && + git show refs/remotes/p4-unshelved/$change >actual && + grep -q "Further description" actual && git cherry-pick refs/remotes/p4-unshelved/$change && test_path_is_file file2 && test_cmp file1 "$cli"/file1 && diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 8425b9a531..cb057ef161 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1,10 +1,13 @@ #!/bin/sh # -# Copyright (c) 2012 Felipe Contreras +# Copyright (c) 2012-2020 Felipe Contreras # test_description='test bash completion' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-bash.sh complete () @@ -136,7 +139,7 @@ fi test_expect_success 'setup for __git_find_repo_path/__gitdir tests' ' mkdir -p subdir/subsubdir && mkdir -p non-repo && - git init otherrepo + git init -b main otherrepo ' test_expect_success '__git_find_repo_path - from command line (through $__git_dir)' ' @@ -542,37 +545,37 @@ test_expect_success '__gitcomp - doesnt fail because of invalid variable name' ' ' read -r -d "" refs <<-\EOF +main maint -master next seen EOF test_expect_success '__gitcomp_nl - trailing space' ' test_gitcomp_nl "m" "$refs" <<-EOF + main Z maint Z - master Z EOF ' test_expect_success '__gitcomp_nl - prefix' ' test_gitcomp_nl "--fixup=m" "$refs" "--fixup=" "m" <<-EOF + --fixup=main Z --fixup=maint Z - --fixup=master Z EOF ' test_expect_success '__gitcomp_nl - suffix' ' test_gitcomp_nl "branch.ma" "$refs" "branch." "ma" "." <<-\EOF + branch.main.Z branch.maint.Z - branch.master.Z EOF ' test_expect_success '__gitcomp_nl - no suffix' ' test_gitcomp_nl "ma" "$refs" "" "ma" "" <<-\EOF + mainZ maintZ - masterZ EOF ' @@ -614,12 +617,13 @@ test_expect_success '__git_is_configured_remote' ' test_expect_success 'setup for ref completion' ' git commit --allow-empty -m initial && + git branch -M main && git branch matching-branch && git tag matching-tag && ( cd otherrepo && git commit --allow-empty -m initial && - git branch -m master master-in-other && + git branch -m main main-in-other && git branch branch-in-other && git tag tag-in-other ) && @@ -632,10 +636,10 @@ test_expect_success 'setup for ref completion' ' test_expect_success '__git_refs - simple' ' cat >expected <<-EOF && HEAD - master + main matching-branch other/branch-in-other - other/master-in-other + other/main-in-other matching-tag EOF ( @@ -647,10 +651,10 @@ test_expect_success '__git_refs - simple' ' test_expect_success '__git_refs - full refs' ' cat >expected <<-EOF && - refs/heads/master + refs/heads/main refs/heads/matching-branch refs/remotes/other/branch-in-other - refs/remotes/other/master-in-other + refs/remotes/other/main-in-other refs/tags/matching-tag EOF ( @@ -664,7 +668,7 @@ test_expect_success '__git_refs - repo given on the command line' ' cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other tag-in-other EOF ( @@ -679,7 +683,7 @@ test_expect_success '__git_refs - remote on local file system' ' cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other tag-in-other EOF ( @@ -692,7 +696,7 @@ test_expect_success '__git_refs - remote on local file system' ' test_expect_success '__git_refs - remote on local file system - full refs' ' cat >expected <<-EOF && refs/heads/branch-in-other - refs/heads/master-in-other + refs/heads/main-in-other refs/tags/tag-in-other EOF ( @@ -706,7 +710,7 @@ test_expect_success '__git_refs - configured remote' ' cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other EOF ( cur= && @@ -719,7 +723,7 @@ test_expect_success '__git_refs - configured remote - full refs' ' cat >expected <<-EOF && HEAD refs/heads/branch-in-other - refs/heads/master-in-other + refs/heads/main-in-other refs/tags/tag-in-other EOF ( @@ -733,7 +737,7 @@ test_expect_success '__git_refs - configured remote - repo given on the command cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other EOF ( cd thirdrepo && @@ -748,7 +752,7 @@ test_expect_success '__git_refs - configured remote - full refs - repo given on cat >expected <<-EOF && HEAD refs/heads/branch-in-other - refs/heads/master-in-other + refs/heads/main-in-other refs/tags/tag-in-other EOF ( @@ -764,7 +768,7 @@ test_expect_success '__git_refs - configured remote - remote name matches a dire cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other EOF mkdir other && test_when_finished "rm -rf other" && @@ -779,7 +783,7 @@ test_expect_success '__git_refs - URL remote' ' cat >expected <<-EOF && HEAD branch-in-other - master-in-other + main-in-other tag-in-other EOF ( @@ -793,7 +797,7 @@ test_expect_success '__git_refs - URL remote - full refs' ' cat >expected <<-EOF && HEAD refs/heads/branch-in-other - refs/heads/master-in-other + refs/heads/main-in-other refs/tags/tag-in-other EOF ( @@ -849,23 +853,23 @@ test_expect_success '__git_refs - not in a git repository' ' test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' ' cat >expected <<-EOF && HEAD - master + main matching-branch other/ambiguous other/branch-in-other - other/master-in-other + other/main-in-other remote/ambiguous remote/branch-in-remote matching-tag branch-in-other branch-in-remote - master-in-other + main-in-other EOF for remote_ref in refs/remotes/other/ambiguous \ refs/remotes/remote/ambiguous \ refs/remotes/remote/branch-in-remote do - git update-ref $remote_ref master && + git update-ref $remote_ref main && test_when_finished "git update-ref -d $remote_ref" done && ( @@ -878,10 +882,10 @@ test_expect_success '__git_refs - unique remote branches for git checkout DWIMer test_expect_success '__git_refs - after --opt=' ' cat >expected <<-EOF && HEAD - master + main matching-branch other/branch-in-other - other/master-in-other + other/main-in-other matching-tag EOF ( @@ -893,10 +897,10 @@ test_expect_success '__git_refs - after --opt=' ' test_expect_success '__git_refs - after --opt= - full refs' ' cat >expected <<-EOF && - refs/heads/master + refs/heads/main refs/heads/matching-branch refs/remotes/other/branch-in-other - refs/remotes/other/master-in-other + refs/remotes/other/main-in-other refs/tags/matching-tag EOF ( @@ -906,13 +910,13 @@ test_expect_success '__git_refs - after --opt= - full refs' ' test_cmp expected "$actual" ' -test_expect_success '__git refs - exluding refs' ' +test_expect_success '__git refs - excluding refs' ' cat >expected <<-EOF && ^HEAD - ^master + ^main ^matching-branch ^other/branch-in-other - ^other/master-in-other + ^other/main-in-other ^matching-tag EOF ( @@ -922,12 +926,12 @@ test_expect_success '__git refs - exluding refs' ' test_cmp expected "$actual" ' -test_expect_success '__git refs - exluding full refs' ' +test_expect_success '__git refs - excluding full refs' ' cat >expected <<-EOF && - ^refs/heads/master + ^refs/heads/main ^refs/heads/matching-branch ^refs/remotes/other/branch-in-other - ^refs/remotes/other/master-in-other + ^refs/remotes/other/main-in-other ^refs/tags/matching-tag EOF ( @@ -948,17 +952,17 @@ test_expect_success 'setup for filtering matching refs' ' test_expect_success '__git_refs - do not filter refs unless told so' ' cat >expected <<-EOF && HEAD - master + main matching-branch matching/branch other/branch-in-other - other/master-in-other + other/main-in-other other/matching/branch-in-other matching-tag matching/tag EOF ( - cur=master && + cur=main && __git_refs >"$actual" ) && test_cmp expected "$actual" @@ -992,7 +996,7 @@ test_expect_success '__git_refs - only matching refs - full refs' ' test_expect_success '__git_refs - only matching refs - remote on local file system' ' cat >expected <<-EOF && - master-in-other + main-in-other matching/branch-in-other EOF ( @@ -1004,7 +1008,7 @@ test_expect_success '__git_refs - only matching refs - remote on local file syst test_expect_success '__git_refs - only matching refs - configured remote' ' cat >expected <<-EOF && - master-in-other + main-in-other matching/branch-in-other EOF ( @@ -1016,7 +1020,7 @@ test_expect_success '__git_refs - only matching refs - configured remote' ' test_expect_success '__git_refs - only matching refs - remote - full refs' ' cat >expected <<-EOF && - refs/heads/master-in-other + refs/heads/main-in-other refs/heads/matching/branch-in-other EOF ( @@ -1038,7 +1042,7 @@ test_expect_success '__git_refs - only matching refs - checkout DWIMery' ' refs/remotes/remote/ambiguous \ refs/remotes/remote/branch-in-remote do - git update-ref $remote_ref master && + git update-ref $remote_ref main && test_when_finished "git update-ref -d $remote_ref" done && ( @@ -1057,11 +1061,11 @@ test_expect_success 'teardown after filtering matching refs' ' test_expect_success '__git_refs - for-each-ref format specifiers in prefix' ' cat >expected <<-EOF && - evil-%%-%42-%(refname)..master + evil-%%-%42-%(refname)..main EOF ( - cur="evil-%%-%42-%(refname)..mas" && - __git_refs "" "" "evil-%%-%42-%(refname).." mas >"$actual" + cur="evil-%%-%42-%(refname)..mai" && + __git_refs "" "" "evil-%%-%42-%(refname).." mai >"$actual" ) && test_cmp expected "$actual" ' @@ -1069,10 +1073,10 @@ test_expect_success '__git_refs - for-each-ref format specifiers in prefix' ' test_expect_success '__git_complete_refs - simple' ' sed -e "s/Z$//" >expected <<-EOF && HEAD Z - master Z + main Z matching-branch Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z matching-tag Z EOF ( @@ -1100,7 +1104,7 @@ test_expect_success '__git_complete_refs - remote' ' sed -e "s/Z$//" >expected <<-EOF && HEAD Z branch-in-other Z - master-in-other Z + main-in-other Z EOF ( cur= && @@ -1113,13 +1117,13 @@ test_expect_success '__git_complete_refs - remote' ' test_expect_success '__git_complete_refs - track' ' sed -e "s/Z$//" >expected <<-EOF && HEAD Z - master Z + main Z matching-branch Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z matching-tag Z branch-in-other Z - master-in-other Z + main-in-other Z EOF ( cur= && @@ -1158,10 +1162,10 @@ test_expect_success '__git_complete_refs - prefix' ' test_expect_success '__git_complete_refs - suffix' ' cat >expected <<-EOF && HEAD. - master. + main. matching-branch. other/branch-in-other. - other/master-in-other. + other/main-in-other. matching-tag. EOF ( @@ -1176,7 +1180,7 @@ test_expect_success '__git_complete_fetch_refspecs - simple' ' sed -e "s/Z$//" >expected <<-EOF && HEAD:HEAD Z branch-in-other:branch-in-other Z - master-in-other:master-in-other Z + main-in-other:main-in-other Z EOF ( cur= && @@ -1202,7 +1206,7 @@ test_expect_success '__git_complete_fetch_refspecs - prefix' ' sed -e "s/Z$//" >expected <<-EOF && +HEAD:HEAD Z +branch-in-other:branch-in-other Z - +master-in-other:master-in-other Z + +main-in-other:main-in-other Z EOF ( cur="+" && @@ -1215,7 +1219,7 @@ test_expect_success '__git_complete_fetch_refspecs - prefix' ' test_expect_success '__git_complete_fetch_refspecs - fully qualified' ' sed -e "s/Z$//" >expected <<-EOF && refs/heads/branch-in-other:refs/heads/branch-in-other Z - refs/heads/master-in-other:refs/heads/master-in-other Z + refs/heads/main-in-other:refs/heads/main-in-other Z refs/tags/tag-in-other:refs/tags/tag-in-other Z EOF ( @@ -1229,7 +1233,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified' ' test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' ' sed -e "s/Z$//" >expected <<-EOF && +refs/heads/branch-in-other:refs/heads/branch-in-other Z - +refs/heads/master-in-other:refs/heads/master-in-other Z + +refs/heads/main-in-other:refs/heads/main-in-other Z +refs/tags/tag-in-other:refs/tags/tag-in-other Z EOF ( @@ -1243,8 +1247,8 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' ' test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' ' test_completion "git switch " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' @@ -1253,25 +1257,25 @@ test_expect_success 'git checkout - completes refs and unique remote branches fo test_completion "git checkout " <<-\EOF HEAD Z branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with --no-guess, complete only local branches' ' test_completion "git switch --no-guess " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git switch - with GIT_COMPLETION_CHECKOUT_NO_GUESS=1, complete only local branches' ' GIT_COMPLETION_CHECKOUT_NO_GUESS=1 test_completion "git switch " <<-\EOF - master Z + main Z matching-branch Z EOF ' @@ -1279,8 +1283,8 @@ test_expect_success 'git switch - with GIT_COMPLETION_CHECKOUT_NO_GUESS=1, compl test_expect_success 'git switch - --guess overrides GIT_COMPLETION_CHECKOUT_NO_GUESS=1, complete local branches and unique remote names for DWIM logic' ' GIT_COMPLETION_CHECKOUT_NO_GUESS=1 test_completion "git switch --guess " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' @@ -1288,15 +1292,15 @@ test_expect_success 'git switch - --guess overrides GIT_COMPLETION_CHECKOUT_NO_G test_expect_success 'git switch - a later --guess overrides previous --no-guess, complete local and remote unique branches for DWIM' ' test_completion "git switch --no-guess --guess " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' test_expect_success 'git switch - a later --no-guess overrides previous --guess, complete only local branches' ' test_completion "git switch --guess --no-guess " <<-\EOF - master Z + main Z matching-branch Z EOF ' @@ -1304,11 +1308,11 @@ test_expect_success 'git switch - a later --no-guess overrides previous --guess, test_expect_success 'git checkout - with GIT_COMPLETION_NO_GUESS=1 only completes refs' ' GIT_COMPLETION_CHECKOUT_NO_GUESS=1 test_completion "git checkout " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' @@ -1316,23 +1320,23 @@ test_expect_success 'git checkout - --guess overrides GIT_COMPLETION_NO_GUESS=1, GIT_COMPLETION_CHECKOUT_NO_GUESS=1 test_completion "git checkout --guess " <<-\EOF HEAD Z branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with --no-guess, only completes refs' ' test_completion "git checkout --no-guess " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' @@ -1340,87 +1344,139 @@ test_expect_success 'git checkout - a later --guess overrides previous --no-gues test_completion "git checkout --no-guess --guess " <<-\EOF HEAD Z branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - a later --no-guess overrides previous --guess, complete only refs' ' test_completion "git checkout --guess --no-guess " <<-\EOF HEAD Z - master Z + main Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/main-in-other Z + EOF +' + +test_expect_success 'git checkout - with checkout.guess = false, only completes refs' ' + test_config checkout.guess false && + test_completion "git checkout " <<-\EOF + HEAD Z + main Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/main-in-other Z + EOF +' + +test_expect_success 'git checkout - with checkout.guess = true, completes refs and unique remote branches for DWIM' ' + test_config checkout.guess true && + test_completion "git checkout " <<-\EOF + HEAD Z + branch-in-other Z + main Z + main-in-other Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/main-in-other Z + EOF +' + +test_expect_success 'git checkout - a later --guess overrides previous checkout.guess = false, complete refs and unique remote branches for DWIM' ' + test_config checkout.guess false && + test_completion "git checkout --guess " <<-\EOF + HEAD Z + branch-in-other Z + main Z + main-in-other Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/main-in-other Z + EOF +' + +test_expect_success 'git checkout - a later --no-guess overrides previous checkout.guess = true, complete only refs' ' + test_config checkout.guess true && + test_completion "git checkout --no-guess " <<-\EOF + HEAD Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with --detach, complete all references' ' test_completion "git switch --detach " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with --detach, complete only references' ' test_completion "git checkout --detach " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -d, complete all references' ' test_completion "git switch -d " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -d, complete only references' ' test_completion "git checkout -d " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with --track, complete only remote branches' ' test_completion "git switch --track " <<-\EOF other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with --track, complete only remote branches' ' test_completion "git checkout --track " <<-\EOF other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with --no-track, complete only local branch names' ' test_completion "git switch --no-track " <<-\EOF - master Z + main Z matching-branch Z EOF ' @@ -1428,151 +1484,151 @@ test_expect_success 'git switch - with --no-track, complete only local branch na test_expect_success 'git checkout - with --no-track, complete only local references' ' test_completion "git checkout --no-track " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -c, complete all references' ' test_completion "git switch -c new-branch " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -C, complete all references' ' test_completion "git switch -C new-branch " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -c and --track, complete all references' ' test_completion "git switch -c new-branch --track " <<-EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -C and --track, complete all references' ' test_completion "git switch -C new-branch --track " <<-EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -c and --no-track, complete all references' ' test_completion "git switch -c new-branch --no-track " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - with -C and --no-track, complete all references' ' test_completion "git switch -C new-branch --no-track " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -b, complete all references' ' test_completion "git checkout -b new-branch " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -B, complete all references' ' test_completion "git checkout -B new-branch " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -b and --track, complete all references' ' test_completion "git checkout -b new-branch --track " <<-EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -B and --track, complete all references' ' test_completion "git checkout -B new-branch --track " <<-EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -b and --no-track, complete all references' ' test_completion "git checkout -b new-branch --no-track " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git checkout - with -B and --no-track, complete all references' ' test_completion "git checkout -B new-branch --no-track " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' test_expect_success 'git switch - for -c, complete local branches and unique remote branches' ' test_completion "git switch -c " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' @@ -1580,36 +1636,36 @@ test_expect_success 'git switch - for -c, complete local branches and unique rem test_expect_success 'git switch - for -C, complete local branches and unique remote branches' ' test_completion "git switch -C " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' test_expect_success 'git switch - for -c with --no-guess, complete local branches only' ' test_completion "git switch --no-guess -c " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git switch - for -C with --no-guess, complete local branches only' ' test_completion "git switch --no-guess -C " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git switch - for -c with --no-track, complete local branches only' ' test_completion "git switch --no-track -c " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git switch - for -C with --no-track, complete local branches only' ' test_completion "git switch --no-track -C " <<-\EOF - master Z + main Z matching-branch Z EOF ' @@ -1617,8 +1673,8 @@ test_expect_success 'git switch - for -C with --no-track, complete local branche test_expect_success 'git checkout - for -b, complete local branches and unique remote branches' ' test_completion "git checkout -b " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' @@ -1626,36 +1682,36 @@ test_expect_success 'git checkout - for -b, complete local branches and unique r test_expect_success 'git checkout - for -B, complete local branches and unique remote branches' ' test_completion "git checkout -B " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' test_expect_success 'git checkout - for -b with --no-guess, complete local branches only' ' test_completion "git checkout --no-guess -b " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git checkout - for -B with --no-guess, complete local branches only' ' test_completion "git checkout --no-guess -B " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git checkout - for -b with --no-track, complete local branches only' ' test_completion "git checkout --no-track -b " <<-\EOF - master Z + main Z matching-branch Z EOF ' test_expect_success 'git checkout - for -B with --no-track, complete local branches only' ' test_completion "git checkout --no-track -B " <<-\EOF - master Z + main Z matching-branch Z EOF ' @@ -1663,14 +1719,14 @@ test_expect_success 'git checkout - for -B with --no-track, complete local branc test_expect_success 'git switch - with --orphan completes local branch names and unique remote branch names' ' test_completion "git switch --orphan " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' test_expect_success 'git switch - --orphan with branch already provided completes nothing else' ' - test_completion "git switch --orphan master " <<-\EOF + test_completion "git switch --orphan main " <<-\EOF EOF ' @@ -1678,20 +1734,20 @@ test_expect_success 'git switch - --orphan with branch already provided complete test_expect_success 'git checkout - with --orphan completes local branch names and unique remote branch names' ' test_completion "git checkout --orphan " <<-\EOF branch-in-other Z - master Z - master-in-other Z + main Z + main-in-other Z matching-branch Z EOF ' test_expect_success 'git checkout - --orphan with branch already provided completes local refs for a start-point' ' - test_completion "git checkout --orphan master " <<-\EOF + test_completion "git checkout --orphan main " <<-\EOF HEAD Z - master Z + main Z matching-branch Z matching-tag Z other/branch-in-other Z - other/master-in-other Z + other/main-in-other Z EOF ' @@ -1823,6 +1879,7 @@ test_expect_success '__git_find_on_cmdline - single match' ' ( words=(git command --opt list) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline "add list remove" >actual ) && test_cmp expect actual @@ -1833,6 +1890,7 @@ test_expect_success '__git_find_on_cmdline - multiple matches' ' ( words=(git command -o --opt remove list add) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline "add list remove" >actual ) && test_cmp expect actual @@ -1842,6 +1900,7 @@ test_expect_success '__git_find_on_cmdline - no match' ' ( words=(git command --opt branch) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline "add list remove" >actual ) && test_must_be_empty actual @@ -1852,6 +1911,7 @@ test_expect_success '__git_find_on_cmdline - single match with index' ' ( words=(git command --opt list) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline --show-idx "add list remove" >actual ) && test_cmp expect actual @@ -1862,6 +1922,7 @@ test_expect_success '__git_find_on_cmdline - multiple matches with index' ' ( words=(git command -o --opt remove list add) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline --show-idx "add list remove" >actual ) && test_cmp expect actual @@ -1871,11 +1932,23 @@ test_expect_success '__git_find_on_cmdline - no match with index' ' ( words=(git command --opt branch) && cword=${#words[@]} && + __git_cmd_idx=1 && __git_find_on_cmdline --show-idx "add list remove" >actual ) && test_must_be_empty actual ' +test_expect_success '__git_find_on_cmdline - ignores matches before command with index' ' + echo "6 remove" >expect && + ( + words=(git -C remove command -o --opt remove list add) && + cword=${#words[@]} && + __git_cmd_idx=3 && + __git_find_on_cmdline --show-idx "add list remove" >actual + ) && + test_cmp expect actual +' + test_expect_success '__git_get_config_variables' ' cat >expect <<-EOF && name-1 @@ -2015,7 +2088,7 @@ test_expect_success 'setup for integration tests' ' test_expect_success 'checkout completes ref names' ' test_completion "git checkout m" <<-\EOF - master Z + main Z mybranch Z mytag Z EOF @@ -2029,7 +2102,7 @@ test_expect_success 'git -C <path> checkout uses the right repo' ' test_expect_success 'show completes all refs' ' test_completion "git show m" <<-\EOF - master Z + main Z mybranch Z mytag Z EOF @@ -2066,7 +2139,7 @@ test_expect_success PERL 'send-email' ' --cover-from-description=Z --cover-letter Z EOF - test_completion "git send-email ma" "master " + test_completion "git send-email ma" "main " ' test_expect_success 'complete files' ' @@ -2143,10 +2216,29 @@ test_expect_success 'complete files' ' test_completion "git add mom" "momified" ' +test_expect_success "simple alias" ' + test_config alias.co checkout && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + +test_expect_success "recursive alias" ' + test_config alias.co checkout && + test_config alias.cod "co --detached" && + test_completion "git cod m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" ' test_config alias.co "!sh -c '"'"'git checkout ...'"'"'" && test_completion "git co m" <<-\EOF - master Z + main Z mybranch Z mytag Z EOF @@ -2155,7 +2247,7 @@ test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cm test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' ' test_config alias.co "!f () { VAR=val git checkout ... ; } f" && test_completion "git co m" <<-\EOF - master Z + main Z mybranch Z mytag Z EOF @@ -2164,7 +2256,7 @@ test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' ' test_config alias.co "!f() { : git checkout ; if ... } f" && test_completion "git co m" <<-\EOF - master Z + main Z mybranch Z mytag Z EOF @@ -2195,11 +2287,12 @@ for flag in -d --delete do test_expect_success "__git_complete_remote_or_refspec - push $flag other" ' sed -e "s/Z$//" >expected <<-EOF && - master-in-other Z + main-in-other Z EOF ( words=(git push '$flag' other ma) && cword=${#words[@]} cur=${words[cword-1]} && + __git_cmd_idx=1 && __git_complete_remote_or_refspec && print_comp ) && @@ -2208,11 +2301,12 @@ do test_expect_failure "__git_complete_remote_or_refspec - push other $flag" ' sed -e "s/Z$//" >expected <<-EOF && - master-in-other Z + main-in-other Z EOF ( words=(git push other '$flag' ma) && cword=${#words[@]} cur=${words[cword-1]} && + __git_cmd_idx=1 && __git_complete_remote_or_refspec && print_comp ) && @@ -2231,6 +2325,7 @@ test_expect_success 'git config - variable name' ' test_completion "git config log.d" <<-\EOF log.date Z log.decorate Z + log.diffMerges Z EOF ' @@ -2252,6 +2347,7 @@ test_expect_success 'git -c - variable name' ' test_completion "git -c log.d" <<-\EOF log.date=Z log.decorate=Z + log.diffMerges=Z EOF ' @@ -2273,6 +2369,7 @@ test_expect_success 'git clone --config= - variable name' ' test_completion "git clone --config=log.d" <<-\EOF log.date=Z log.decorate=Z + log.diffMerges=Z EOF ' @@ -2291,7 +2388,6 @@ test_expect_success 'sourcing the completion script clears cached commands' ' ' test_expect_success 'sourcing the completion script clears cached merge strategies' ' - GIT_TEST_GETTEXT_POISON=false && __git_compute_merge_strategies && verbose test -n "$__git_merge_strategies" && . "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" && @@ -2308,4 +2404,24 @@ test_expect_success 'sourcing the completion script clears cached --options' ' verbose test -z "$__gitcomp_builtin_notes_edit" ' +test_expect_success '__git_complete' ' + unset -f __git_wrap__git_main && + + __git_complete foo __git_main && + __git_have_func __git_wrap__git_main && + unset -f __git_wrap__git_main && + + __git_complete gf _git_fetch && + __git_have_func __git_wrap_git_fetch && + + __git_complete foo git && + __git_have_func __git_wrap__git_main && + unset -f __git_wrap__git_main && + + __git_complete gd git_diff && + __git_have_func __git_wrap_git_diff && + + test_must_fail __git_complete ga missing +' + test_done diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh index ab5da2cabc..bbd513bab0 100755 --- a/t/t9903-bash-prompt.sh +++ b/t/t9903-bash-prompt.sh @@ -5,6 +5,9 @@ test_description='test git-specific bash prompt functions' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./lib-bash.sh . "$GIT_BUILD_DIR/contrib/completion/git-prompt.sh" @@ -28,7 +31,7 @@ test_expect_success 'setup for prompt tests' ' echo 3 >file && git commit -m "third b1" file && git tag -a -m msg2 t2 && - git checkout -b b2 master && + git checkout -b b2 main && echo 0 >file && git commit -m "second b2" file && echo 00 >file && @@ -37,20 +40,20 @@ test_expect_success 'setup for prompt tests' ' git commit -m "yet another b2" file && mkdir ignored_dir && echo "ignored_dir/" >>.gitignore && - git checkout master + git checkout main ' test_expect_success 'prompt - branch name' ' - printf " (master)" >expected && + printf " (main)" >expected && __git_ps1 >"$actual" && test_cmp expected "$actual" ' test_expect_success SYMLINKS 'prompt - branch name - symlink symref' ' - printf " (master)" >expected && - test_when_finished "git checkout master" && + printf " (main)" >expected && + test_when_finished "git checkout main" && test_config core.preferSymlinkRefs true && - git checkout master && + git checkout main && __git_ps1 >"$actual" && test_cmp expected "$actual" ' @@ -58,7 +61,7 @@ test_expect_success SYMLINKS 'prompt - branch name - symlink symref' ' test_expect_success 'prompt - unborn branch' ' printf " (unborn)" >expected && git checkout --orphan unborn && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && __git_ps1 >"$actual" && test_cmp expected "$actual" ' @@ -72,7 +75,7 @@ test_expect_success FUNNYNAMES 'prompt - with newline in path' ' with newline" && mkdir "$repo_with_newline" && - printf " (master)" >expected && + printf " (main)" >expected && git init "$repo_with_newline" && test_when_finished "rm -rf \"$repo_with_newline\"" && mkdir "$repo_with_newline"/subdir && @@ -87,7 +90,7 @@ test_expect_success 'prompt - detached head' ' printf " ((%s...))" $(git log -1 --format="%h" --abbrev=13 b1^) >expected && test_config core.abbrev 13 && git checkout b1^ && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && __git_ps1 >"$actual" && test_cmp expected "$actual" ' @@ -95,7 +98,7 @@ test_expect_success 'prompt - detached head' ' test_expect_success 'prompt - describe detached head - contains' ' printf " ((t2~1))" >expected && git checkout b1^ && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && ( GIT_PS1_DESCRIBE_STYLE=contains && __git_ps1 >"$actual" @@ -106,7 +109,7 @@ test_expect_success 'prompt - describe detached head - contains' ' test_expect_success 'prompt - describe detached head - branch' ' printf " ((tags/t2~1))" >expected && git checkout b1^ && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && ( GIT_PS1_DESCRIBE_STYLE=branch && __git_ps1 >"$actual" @@ -117,7 +120,7 @@ test_expect_success 'prompt - describe detached head - branch' ' test_expect_success 'prompt - describe detached head - describe' ' printf " ((t1-1-g%s))" $(git log -1 --format="%h" b1^) >expected && git checkout b1^ && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && ( GIT_PS1_DESCRIBE_STYLE=describe && __git_ps1 >"$actual" @@ -128,7 +131,7 @@ test_expect_success 'prompt - describe detached head - describe' ' test_expect_success 'prompt - describe detached head - default' ' printf " ((t2))" >expected && git checkout --detach b1 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && __git_ps1 >"$actual" && test_cmp expected "$actual" ' @@ -152,7 +155,7 @@ test_expect_success 'prompt - deep inside .git directory' ' ' test_expect_success 'prompt - inside bare repository' ' - printf " (BARE:master)" >expected && + printf " (BARE:main)" >expected && git init --bare bare.git && test_when_finished "rm -rf bare.git" && ( @@ -172,7 +175,7 @@ test_expect_success 'prompt - interactive rebase' ' test_when_finished "rm -f fake_editor.sh" && test_set_editor "$TRASH_DIRECTORY/fake_editor.sh" && git checkout b1 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git rebase -i HEAD^ && test_when_finished "git rebase --abort" && __git_ps1 >"$actual" && @@ -182,7 +185,7 @@ test_expect_success 'prompt - interactive rebase' ' test_expect_success 'prompt - rebase merge' ' printf " (b2|REBASE 1/3)" >expected && git checkout b2 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && test_must_fail git rebase --merge b1 b2 && test_when_finished "git rebase --abort" && __git_ps1 >"$actual" && @@ -192,7 +195,7 @@ test_expect_success 'prompt - rebase merge' ' test_expect_success 'prompt - rebase am' ' printf " (b2|REBASE 1/3)" >expected && git checkout b2 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && test_must_fail git rebase --apply b1 b2 && test_when_finished "git rebase --abort" && __git_ps1 >"$actual" && @@ -202,7 +205,7 @@ test_expect_success 'prompt - rebase am' ' test_expect_success 'prompt - merge' ' printf " (b1|MERGING)" >expected && git checkout b1 && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && test_must_fail git merge b2 && test_when_finished "git reset --hard" && __git_ps1 >"$actual" && @@ -210,7 +213,7 @@ test_expect_success 'prompt - merge' ' ' test_expect_success 'prompt - cherry-pick' ' - printf " (master|CHERRY-PICKING)" >expected && + printf " (main|CHERRY-PICKING)" >expected && test_must_fail git cherry-pick b1 b1^ && test_when_finished "git cherry-pick --abort" && __git_ps1 >"$actual" && @@ -222,7 +225,7 @@ test_expect_success 'prompt - cherry-pick' ' ' test_expect_success 'prompt - revert' ' - printf " (master|REVERTING)" >expected && + printf " (main|REVERTING)" >expected && test_must_fail git revert b1^ b1 && test_when_finished "git revert --abort" && __git_ps1 >"$actual" && @@ -234,7 +237,7 @@ test_expect_success 'prompt - revert' ' ' test_expect_success 'prompt - bisect' ' - printf " (master|BISECTING)" >expected && + printf " (main|BISECTING)" >expected && git bisect start && test_when_finished "git bisect reset" && __git_ps1 >"$actual" && @@ -242,7 +245,7 @@ test_expect_success 'prompt - bisect' ' ' test_expect_success 'prompt - dirty status indicator - clean' ' - printf " (master)" >expected && + printf " (main)" >expected && ( GIT_PS1_SHOWDIRTYSTATE=y && __git_ps1 >"$actual" @@ -251,7 +254,7 @@ test_expect_success 'prompt - dirty status indicator - clean' ' ' test_expect_success 'prompt - dirty status indicator - dirty worktree' ' - printf " (master *)" >expected && + printf " (main *)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && ( @@ -262,7 +265,7 @@ test_expect_success 'prompt - dirty status indicator - dirty worktree' ' ' test_expect_success 'prompt - dirty status indicator - dirty index' ' - printf " (master +)" >expected && + printf " (main +)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && git add -u && @@ -274,7 +277,7 @@ test_expect_success 'prompt - dirty status indicator - dirty index' ' ' test_expect_success 'prompt - dirty status indicator - dirty index and worktree' ' - printf " (master *+)" >expected && + printf " (main *+)" >expected && echo "dirty index" >file && test_when_finished "git reset --hard" && git add -u && @@ -288,7 +291,7 @@ test_expect_success 'prompt - dirty status indicator - dirty index and worktree' test_expect_success 'prompt - dirty status indicator - orphan branch - clean' ' printf " (orphan #)" >expected && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout --orphan orphan && git reset --hard && ( @@ -300,7 +303,7 @@ test_expect_success 'prompt - dirty status indicator - orphan branch - clean' ' test_expect_success 'prompt - dirty status indicator - orphan branch - dirty index' ' printf " (orphan +)" >expected && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout --orphan orphan && ( GIT_PS1_SHOWDIRTYSTATE=y && @@ -311,7 +314,7 @@ test_expect_success 'prompt - dirty status indicator - orphan branch - dirty ind test_expect_success 'prompt - dirty status indicator - orphan branch - dirty index and worktree' ' printf " (orphan *+)" >expected && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && git checkout --orphan orphan && >file && ( @@ -322,7 +325,7 @@ test_expect_success 'prompt - dirty status indicator - orphan branch - dirty ind ' test_expect_success 'prompt - dirty status indicator - shell variable unset with config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && test_config bash.showDirtyState false && @@ -334,7 +337,7 @@ test_expect_success 'prompt - dirty status indicator - shell variable unset with ' test_expect_success 'prompt - dirty status indicator - shell variable unset with config enabled' ' - printf " (master)" >expected && + printf " (main)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && test_config bash.showDirtyState true && @@ -346,7 +349,7 @@ test_expect_success 'prompt - dirty status indicator - shell variable unset with ' test_expect_success 'prompt - dirty status indicator - shell variable set with config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && test_config bash.showDirtyState false && @@ -358,7 +361,7 @@ test_expect_success 'prompt - dirty status indicator - shell variable set with c ' test_expect_success 'prompt - dirty status indicator - shell variable set with config enabled' ' - printf " (master *)" >expected && + printf " (main *)" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && test_config bash.showDirtyState true && @@ -382,7 +385,7 @@ test_expect_success 'prompt - dirty status indicator - not shown inside .git dir ' test_expect_success 'prompt - stash status indicator - no stash' ' - printf " (master)" >expected && + printf " (main)" >expected && ( GIT_PS1_SHOWSTASHSTATE=y && __git_ps1 >"$actual" @@ -391,7 +394,7 @@ test_expect_success 'prompt - stash status indicator - no stash' ' ' test_expect_success 'prompt - stash status indicator - stash' ' - printf " (master $)" >expected && + printf " (main $)" >expected && echo 2 >file && git stash && test_when_finished "git stash drop" && @@ -417,7 +420,7 @@ test_expect_success 'prompt - stash status indicator - not shown inside .git dir ' test_expect_success 'prompt - untracked files status indicator - no untracked files' ' - printf " (master)" >expected && + printf " (main)" >expected && ( GIT_PS1_SHOWUNTRACKEDFILES=y && cd otherrepo && @@ -427,7 +430,7 @@ test_expect_success 'prompt - untracked files status indicator - no untracked fi ' test_expect_success 'prompt - untracked files status indicator - untracked files' ' - printf " (master %%)" >expected && + printf " (main %%)" >expected && ( GIT_PS1_SHOWUNTRACKEDFILES=y && __git_ps1 >"$actual" @@ -436,7 +439,7 @@ test_expect_success 'prompt - untracked files status indicator - untracked files ' test_expect_success 'prompt - untracked files status indicator - empty untracked dir' ' - printf " (master)" >expected && + printf " (main)" >expected && mkdir otherrepo/untracked-dir && test_when_finished "rm -rf otherrepo/untracked-dir" && ( @@ -448,7 +451,7 @@ test_expect_success 'prompt - untracked files status indicator - empty untracked ' test_expect_success 'prompt - untracked files status indicator - non-empty untracked dir' ' - printf " (master %%)" >expected && + printf " (main %%)" >expected && mkdir otherrepo/untracked-dir && test_when_finished "rm -rf otherrepo/untracked-dir" && >otherrepo/untracked-dir/untracked-file && @@ -461,7 +464,7 @@ test_expect_success 'prompt - untracked files status indicator - non-empty untra ' test_expect_success 'prompt - untracked files status indicator - untracked files outside cwd' ' - printf " (master %%)" >expected && + printf " (main %%)" >expected && ( mkdir -p ignored_dir && cd ignored_dir && @@ -472,7 +475,7 @@ test_expect_success 'prompt - untracked files status indicator - untracked files ' test_expect_success 'prompt - untracked files status indicator - shell variable unset with config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && test_config bash.showUntrackedFiles false && ( sane_unset GIT_PS1_SHOWUNTRACKEDFILES && @@ -482,7 +485,7 @@ test_expect_success 'prompt - untracked files status indicator - shell variable ' test_expect_success 'prompt - untracked files status indicator - shell variable unset with config enabled' ' - printf " (master)" >expected && + printf " (main)" >expected && test_config bash.showUntrackedFiles true && ( sane_unset GIT_PS1_SHOWUNTRACKEDFILES && @@ -492,7 +495,7 @@ test_expect_success 'prompt - untracked files status indicator - shell variable ' test_expect_success 'prompt - untracked files status indicator - shell variable set with config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && test_config bash.showUntrackedFiles false && ( GIT_PS1_SHOWUNTRACKEDFILES=y && @@ -502,7 +505,7 @@ test_expect_success 'prompt - untracked files status indicator - shell variable ' test_expect_success 'prompt - untracked files status indicator - shell variable set with config enabled' ' - printf " (master %%)" >expected && + printf " (main %%)" >expected && test_config bash.showUntrackedFiles true && ( GIT_PS1_SHOWUNTRACKEDFILES=y && @@ -522,13 +525,13 @@ test_expect_success 'prompt - untracked files status indicator - not shown insid ' test_expect_success 'prompt - format string starting with dash' ' - printf -- "-master" >expected && + printf -- "-main" >expected && __git_ps1 "-%s" >"$actual" && test_cmp expected "$actual" ' test_expect_success 'prompt - pc mode' ' - printf "BEFORE: (\${__git_ps1_branch_name}):AFTER\\nmaster" >expected && + printf "BEFORE: (\${__git_ps1_branch_name}):AFTER\\nmain" >expected && ( __git_ps1 "BEFORE:" ":AFTER" >"$actual" && test_must_be_empty "$actual" && @@ -538,7 +541,7 @@ test_expect_success 'prompt - pc mode' ' ' test_expect_success 'prompt - bash color pc mode - branch name' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nmain" >expected && ( GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" >"$actual" && @@ -550,7 +553,7 @@ test_expect_success 'prompt - bash color pc mode - branch name' ' test_expect_success 'prompt - bash color pc mode - detached head' ' printf "BEFORE: (${c_red}\${__git_ps1_branch_name}${c_clear}):AFTER\\n(%s...)" $(git log -1 --format="%h" b1^) >expected && git checkout b1^ && - test_when_finished "git checkout master" && + test_when_finished "git checkout main" && ( GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && @@ -560,7 +563,7 @@ test_expect_success 'prompt - bash color pc mode - detached head' ' ' test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty worktree' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_clear}):AFTER\\nmain" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && ( @@ -573,7 +576,7 @@ test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirt ' test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}+${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}+${c_clear}):AFTER\\nmain" >expected && echo "dirty" >file && test_when_finished "git reset --hard" && git add -u && @@ -587,7 +590,7 @@ test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirt ' test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index and worktree' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\nmain" >expected && echo "dirty index" >file && test_when_finished "git reset --hard" && git add -u && @@ -602,7 +605,7 @@ test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirt ' test_expect_success 'prompt - bash color pc mode - dirty status indicator - before root commit' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}#${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}#${c_clear}):AFTER\\nmain" >expected && ( GIT_PS1_SHOWDIRTYSTATE=y && GIT_PS1_SHOWCOLORHINTS=y && @@ -628,7 +631,7 @@ test_expect_success 'prompt - bash color pc mode - inside .git directory' ' ' test_expect_success 'prompt - bash color pc mode - stash status indicator' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_lblue}\$${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_lblue}\$${c_clear}):AFTER\\nmain" >expected && echo 2 >file && git stash && test_when_finished "git stash drop" && @@ -642,7 +645,7 @@ test_expect_success 'prompt - bash color pc mode - stash status indicator' ' ' test_expect_success 'prompt - bash color pc mode - untracked files status indicator' ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}%%${c_clear}):AFTER\\nmaster" >expected && + printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}%%${c_clear}):AFTER\\nmain" >expected && ( GIT_PS1_SHOWUNTRACKEDFILES=y && GIT_PS1_SHOWCOLORHINTS=y && @@ -653,7 +656,7 @@ test_expect_success 'prompt - bash color pc mode - untracked files status indica ' test_expect_success 'prompt - zsh color pc mode' ' - printf "BEFORE: (%%F{green}master%%f):AFTER" >expected && + printf "BEFORE: (%%F{green}main%%f):AFTER" >expected && ( ZSH_VERSION=5.0.0 && GIT_PS1_SHOWCOLORHINTS=y && @@ -664,7 +667,7 @@ test_expect_success 'prompt - zsh color pc mode' ' ' test_expect_success 'prompt - hide if pwd ignored - env var unset, config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && test_config bash.hideIfPwdIgnored false && ( cd ignored_dir && @@ -685,7 +688,7 @@ test_expect_success 'prompt - hide if pwd ignored - env var unset, config disabl ' test_expect_success 'prompt - hide if pwd ignored - env var unset, config unset' ' - printf " (master)" >expected && + printf " (main)" >expected && ( cd ignored_dir && __git_ps1 >"$actual" @@ -704,7 +707,7 @@ test_expect_success 'prompt - hide if pwd ignored - env var unset, config unset, ' test_expect_success 'prompt - hide if pwd ignored - env var set, config disabled' ' - printf " (master)" >expected && + printf " (main)" >expected && test_config bash.hideIfPwdIgnored false && ( cd ignored_dir && diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index f9904066fe..ce41596514 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -32,11 +32,6 @@ test_set_editor () { export EDITOR } -test_set_index_version () { - GIT_INDEX_VERSION="$1" - export GIT_INDEX_VERSION -} - test_decode_color () { awk ' function name(n) { @@ -116,13 +111,6 @@ remove_cr () { tr '\015' Q | sed -e 's/Q$//' } -# Generate an output of $1 bytes of all zeroes (NULs, not ASCII zeroes). -# If $1 is 'infinity', output forever or until the receiving pipe stops reading, -# whichever comes first. -generate_zero_bytes () { - test-tool genzeros "$@" -} - # In some bourne shell implementations, the "unset" builtin returns # nonzero status when a variable to be unset was not set in the first # place. @@ -178,34 +166,78 @@ debug () { GIT_DEBUGGER="${GIT_DEBUGGER}" "$@" <&6 >&5 2>&7 } -# Call test_commit with the arguments -# [-C <directory>] <message> [<file> [<contents> [<tag>]]]" +# Usage: test_commit [options] <message> [<file> [<contents> [<tag>]]] +# -C <dir>: +# Run all git commands in directory <dir> +# --notick +# Do not call test_tick before making a commit +# --append +# Use ">>" instead of ">" when writing "<contents>" to "<file>" +# --printf +# Use "printf" instead of "echo" when writing "<contents>" to +# "<file>", use this to write escape sequences such as "\0", a +# trailing "\n" won't be added automatically. This option +# supports nothing but the FORMAT of printf(1), i.e. no custom +# ARGUMENT(s). +# --signoff +# Invoke "git commit" with --signoff +# --author <author> +# Invoke "git commit" with --author <author> +# --no-tag +# Do not tag the resulting commit +# --annotate +# Create an annotated tag with "--annotate -m <message>". Calls +# test_tick between making the commit and tag, unless --notick +# is given. # # This will commit a file with the given contents and the given commit # message, and tag the resulting commit with the given tag name. # # <file>, <contents>, and <tag> all default to <message>. -# -# If the first argument is "-C", the second argument is used as a path for -# the git invocations. test_commit () { notick= && + echo=echo && + append= && + author= && signoff= && indir= && + tag=light && while test $# != 0 do case "$1" in --notick) notick=yes ;; + --printf) + echo=printf + ;; + --append) + append=yes + ;; + --author) + author="$2" + shift + ;; --signoff) signoff="$1" ;; + --date) + notick=yes + GIT_COMMITTER_DATE="$2" + GIT_AUTHOR_DATE="$2" + shift + ;; -C) indir="$2" shift ;; + --no-tag) + tag=none + ;; + --annotate) + tag=annotate + ;; *) break ;; @@ -214,14 +246,34 @@ test_commit () { done && indir=${indir:+"$indir"/} && file=${2:-"$1.t"} && - echo "${3-$1}" > "$indir$file" && + if test -n "$append" + then + $echo "${3-$1}" >>"$indir$file" + else + $echo "${3-$1}" >"$indir$file" + fi && git ${indir:+ -C "$indir"} add "$file" && if test -z "$notick" then test_tick fi && - git ${indir:+ -C "$indir"} commit $signoff -m "$1" && - git ${indir:+ -C "$indir"} tag "${4:-$1}" + git ${indir:+ -C "$indir"} commit \ + ${author:+ --author "$author"} \ + $signoff -m "$1" && + case "$tag" in + none) + ;; + light) + git ${indir:+ -C "$indir"} tag "${4:-$1}" + ;; + annotate) + if test -z "$notick" + then + test_tick + fi && + git ${indir:+ -C "$indir"} tag -a -m "$1" "${4:-$1}" + ;; + esac } # Call test_merge with the arguments "<message> <commit>", where <commit> @@ -367,9 +419,14 @@ test_chmod () { git update-index --add "--chmod=$@" } -# Get the modebits from a file. +# Get the modebits from a file or directory, ignoring the setgid bit (g+s). +# This bit is inherited by subdirectories at their creation. So we remove it +# from the returning string to prevent callers from having to worry about the +# state of the bit in the test directory. +# test_modebits () { - ls -l "$1" | sed -e 's|^\(..........\).*|\1|' + ls -ld "$1" | sed -e 's|^\(..........\).*|\1|' \ + -e 's|^\(......\)S|\1-|' -e 's|^\(......\)s|\1x|' } # Unset a configuration variable, but don't fail if it doesn't exist. @@ -423,7 +480,7 @@ write_script () { # - Explicitly using test_have_prereq. # # - Implicitly by specifying the prerequisite tag in the calls to -# test_expect_{success,failure,code}. +# test_expect_{success,failure} and test_external{,_without_stderr}. # # The single parameter is the prerequisite tag (a simple word, in all # capital letters by convention). @@ -474,15 +531,15 @@ test_lazy_prereq () { test_run_lazy_prereq_ () { script=' -mkdir -p "$TRASH_DIRECTORY/prereq-test-dir" && +mkdir -p "$TRASH_DIRECTORY/prereq-test-dir-'"$1"'" && ( - cd "$TRASH_DIRECTORY/prereq-test-dir" &&'"$2"' + cd "$TRASH_DIRECTORY/prereq-test-dir-'"$1"'" &&'"$2"' )' say >&3 "checking prerequisite: $1" say >&3 "$script" test_eval_ "$script" eval_ret=$? - rm -rf "$TRASH_DIRECTORY/prereq-test-dir" + rm -rf "$TRASH_DIRECTORY/prereq-test-dir-$1" if test "$eval_ret" = 0; then say >&3 "prerequisite $1 ok" else @@ -701,34 +758,37 @@ test_external_without_stderr () { } # debugging-friendly alternatives to "test [-f|-d|-e]" -# The commands test the existence or non-existence of $1. $2 can be -# given to provide a more precise diagnosis. +# The commands test the existence or non-existence of $1 test_path_is_file () { + test "$#" -ne 1 && BUG "1 param" if ! test -f "$1" then - echo "File $1 doesn't exist. $2" + echo "File $1 doesn't exist" false fi } test_path_is_dir () { + test "$#" -ne 1 && BUG "1 param" if ! test -d "$1" then - echo "Directory $1 doesn't exist. $2" + echo "Directory $1 doesn't exist" false fi } test_path_exists () { + test "$#" -ne 1 && BUG "1 param" if ! test -e "$1" then - echo "Path $1 doesn't exist. $2" + echo "Path $1 doesn't exist" false fi } # Check if the directory exists and is empty as expected, barf otherwise. test_dir_is_empty () { + test "$#" -ne 1 && BUG "1 param" test_path_is_dir "$1" && if test -n "$(ls -a1 "$1" | egrep -v '^\.\.?$')" then @@ -740,6 +800,7 @@ test_dir_is_empty () { # Check if the file exists and has a size greater than zero test_file_not_empty () { + test "$#" = 2 && BUG "2 param" if ! test -s "$1" then echo "'$1' is not a non-empty file." @@ -748,6 +809,7 @@ test_file_not_empty () { } test_path_is_missing () { + test "$#" -ne 1 && BUG "1 param" if test -e "$1" then echo "Path exists:" @@ -783,6 +845,37 @@ test_line_count () { fi } +# SYNOPSIS: +# test_stdout_line_count <bin-ops> <value> <cmd> [<args>...] +# +# test_stdout_line_count checks that the output of a command has the number +# of lines it ought to. For example: +# +# test_stdout_line_count = 3 git ls-files -u +# test_stdout_line_count -gt 10 ls +test_stdout_line_count () { + local ops val trashdir && + if test "$#" -le 3 + then + BUG "expect 3 or more arguments" + fi && + ops="$1" && + val="$2" && + shift 2 && + if ! trashdir="$(git rev-parse --git-dir)/trash"; then + BUG "expect to be run inside a worktree" + fi && + mkdir -p "$trashdir" && + "$@" >"$trashdir/output" && + test_line_count "$ops" "$val" "$trashdir/output" +} + + +test_file_size () { + test "$#" -ne 1 && BUG "1 param" + test-tool path-utils file-size "$1" +} + # Returns success if a comma separated string of keywords ($1) contains a # given keyword ($2). # Examples: @@ -951,14 +1044,9 @@ test_expect_code () { # - cmp's output is not nearly as easy to read as diff -u # - not all diff versions understand "-u" -test_cmp() { - test $# -eq 2 || BUG "test_cmp requires two arguments" - if ! eval "$GIT_TEST_CMP" '"$@"' - then - test "x$1" = x- || test -e "$1" || BUG "test_cmp '$1' missing" - test "x$2" = x- || test -e "$2" || BUG "test_cmp '$2' missing" - return 1 - fi +test_cmp () { + test "$#" -ne 2 && BUG "2 param" + eval "$GIT_TEST_CMP" '"$@"' } # Check that the given config key has the expected value. @@ -970,7 +1058,7 @@ test_cmp() { # # test_cmp_config foo core.bar # -test_cmp_config() { +test_cmp_config () { local GD && if test "$1" = "-C" then @@ -986,29 +1074,14 @@ test_cmp_config() { # test_cmp_bin - helper to compare binary files -test_cmp_bin() { - test $# -eq 2 || BUG "test_cmp_bin requires two arguments" - if ! cmp "$@" - then - test "x$1" = x- || test -e "$1" || BUG "test_cmp_bin '$1' missing" - test "x$2" = x- || test -e "$2" || BUG "test_cmp_bin '$2' missing" - return 1 - fi -} - -# Use this instead of test_cmp to compare files that contain expected and -# actual output from git commands that can be translated. When running -# under GIT_TEST_GETTEXT_POISON this pretends that the command produced expected -# results. -test_i18ncmp () { - ! test_have_prereq C_LOCALE_OUTPUT || test_cmp "$@" +test_cmp_bin () { + test "$#" -ne 2 && BUG "2 param" + cmp "$@" } -# Use this instead of "grep expected-string actual" to see if the -# output from a git command that can be translated either contains an -# expected string, or does not contain an unwanted one. When running -# under GIT_TEST_GETTEXT_POISON this pretends that the command produced expected -# results. +# Wrapper for grep which used to be used for +# GIT_TEST_GETTEXT_POISON=false. Only here as a shim for other +# in-flight changes. Should not be used and will be removed soon. test_i18ngrep () { eval "last_arg=\${$#}" @@ -1021,12 +1094,6 @@ test_i18ngrep () { BUG "too few parameters to test_i18ngrep" fi - if test_have_prereq !C_LOCALE_OUTPUT - then - # pretend success - return 0 - fi - if test "x!" = "x$1" then shift @@ -1062,6 +1129,7 @@ verbose () { # otherwise. test_must_be_empty () { + test "$#" -ne 1 && BUG "1 param" test_path_is_file "$1" && if test -s "$1" then @@ -1085,7 +1153,7 @@ test_cmp_rev () { fi if test $# != 2 then - error "bug in the test script: test_cmp_rev requires two revisions, but got $#" + BUG "test_cmp_rev requires two revisions, but got $#" else local r1 r2 r1=$(git rev-parse --verify "$1") && @@ -1196,25 +1264,15 @@ test_atexit () { # doing so on Bash is better than nothing (the test will # silently pass on other shells). test "${BASH_SUBSHELL-0}" = 0 || - error "bug in test script: test_atexit does nothing in a subshell" + BUG "test_atexit does nothing in a subshell" test_atexit_cleanup="{ $* } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_atexit_cleanup" } -# Most tests can use the created repository, but some may need to create more. +# Deprecated wrapper for "git init", use "git init" directly instead # Usage: test_create_repo <directory> test_create_repo () { - test "$#" = 1 || - BUG "not 1 parameter to test-create-repo" - repo="$1" - mkdir -p "$repo" - ( - cd "$repo" || error "Cannot setup test environment" - "${GIT_TEST_INSTALLED:-$GIT_EXEC_PATH}/git$X" init \ - "--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 || - error "cannot run git init -- have you built things yet?" - mv .git/hooks .git/hooks-disabled - ) || exit + git init "$@" } # This function helps on symlink challenged file systems when it is not @@ -1426,7 +1484,7 @@ nongit () { # whitespace and put in a single packet. Note that data containing NULs must be # given on stdin, and that empty input becomes an empty packet, not a flush # packet (for that you can just print 0000 yourself). -packetize() { +packetize () { if test $# -gt 0 then packet="$*" @@ -1592,39 +1650,93 @@ test_set_port () { eval $var=$port } -# Compare a file containing rev-list bitmap traversal output to its non-bitmap -# counterpart. You can't just use test_cmp for this, because the two produce -# subtly different output: +# Tests for the hidden file attribute on Windows +test_path_is_hidden () { + test_have_prereq MINGW || + BUG "test_path_is_hidden can only be used on Windows" + + # Use the output of `attrib`, ignore the absolute path + case "$("$SYSTEMROOT"/system32/attrib "$1")" in *H*?:*) return 0;; esac + return 1 +} + +# Check that the given command was invoked as part of the +# trace2-format trace on stdin. +# +# test_subcommand [!] <command> <args>... < <trace> # -# - regular output is in traversal order, whereas bitmap is split by type, -# with non-packed objects at the end +# For example, to look for an invocation of "git upload-pack +# /path/to/repo" # -# - regular output has a space and the pathname appended to non-commit -# objects; bitmap output omits this +# GIT_TRACE2_EVENT=event.log git fetch ... && +# test_subcommand git upload-pack "$PATH" <event.log # -# This function normalizes and compares the two. The second file should -# always be the bitmap output. -test_bitmap_traversal () { - if test "$1" = "--no-confirm-bitmaps" +# If the first parameter passed is !, this instead checks that +# the given command was not called. +# +test_subcommand () { + local negate= + if test "$1" = "!" then + negate=t shift - elif cmp "$1" "$2" + fi + + local expr=$(printf '"%s",' "$@") + expr="${expr%,}" + + if test -n "$negate" then - echo >&2 "identical raw outputs; are you sure bitmaps were used?" - return 1 - fi && - cut -d' ' -f1 "$1" | sort >"$1.normalized" && - sort "$2" >"$2.normalized" && - test_cmp "$1.normalized" "$2.normalized" && - rm -f "$1.normalized" "$2.normalized" + ! grep "\[$expr\]" + else + grep "\[$expr\]" + fi } -# Tests for the hidden file attribute on Windows -test_path_is_hidden () { - test_have_prereq MINGW || - BUG "test_path_is_hidden can only be used on Windows" +# Check that the given command was invoked as part of the +# trace2-format trace on stdin. +# +# test_region [!] <category> <label> git <command> <args>... +# +# For example, to look for trace2_region_enter("index", "do_read_index", repo) +# in an invocation of "git checkout HEAD~1", run +# +# GIT_TRACE2_EVENT="$(pwd)/trace.txt" GIT_TRACE2_EVENT_NESTING=10 \ +# git checkout HEAD~1 && +# test_region index do_read_index <trace.txt +# +# If the first parameter passed is !, this instead checks that +# the given region was not entered. +# +test_region () { + local expect_exit=0 + if test "$1" = "!" + then + expect_exit=1 + shift + fi - # Use the output of `attrib`, ignore the absolute path - case "$("$SYSTEMROOT"/system32/attrib "$1")" in *H*?:*) return 0;; esac - return 1 + grep -e '"region_enter".*"category":"'"$1"'","label":"'"$2"\" "$3" + exitcode=$? + + if test $exitcode != $expect_exit + then + return 1 + fi + + grep -e '"region_leave".*"category":"'"$1"'","label":"'"$2"\" "$3" + exitcode=$? + + if test $exitcode != $expect_exit + then + return 1 + fi + + return 0 +} + +# Print the destination of symlink(s) provided as arguments. Basically +# the same as the readlink command, but it's not available everywhere. +test_readlink () { + perl -le 'print readlink($_) for @ARGV' "$@" } diff --git a/t/test-lib.sh b/t/test-lib.sh index ef31f40037..9e26860544 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -64,6 +64,11 @@ then export GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS fi +# Explicitly set the default branch name for testing, to avoid the +# transitory "git init" warning under --verbose. +: ${GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME:=master} +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + ################################################################ # It appears that people try to run tests without building... "${GIT_TEST_INSTALLED:-$GIT_BUILD_DIR}/git$X" >/dev/null @@ -163,8 +168,8 @@ parse_option () { ;; --stress-jobs=*) stress=t; - stress=${opt#--*=} - case "$stress" in + stress_jobs=${opt#--*=} + case "$stress_jobs" in *[!0-9]*|0*|"") echo "error: --stress-jobs=<N> requires the number of jobs to run" >&2 exit 1 @@ -262,9 +267,9 @@ then : # Don't stress test again. elif test -n "$stress" then - if test "$stress" != t + if test -n "$stress_jobs" then - job_count=$stress + job_count=$stress_jobs elif test -n "$GIT_TEST_STRESS_LOAD" then job_count="$GIT_TEST_STRESS_LOAD" @@ -401,23 +406,15 @@ LANG=C LC_ALL=C PAGER=cat TZ=UTC -export LANG LC_ALL PAGER TZ +COLUMNS=80 +export LANG LC_ALL PAGER TZ COLUMNS EDITOR=: -# GIT_TEST_GETTEXT_POISON should not influence git commands executed -# during initialization of test-lib and the test repo. Back it up, -# unset and then restore after initialization is finished. -if test -n "$GIT_TEST_GETTEXT_POISON" -then - GIT_TEST_GETTEXT_POISON_ORIG=$GIT_TEST_GETTEXT_POISON - unset GIT_TEST_GETTEXT_POISON -fi - # A call to "unset" with no arguments causes at least Solaris 10 # /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets # deriving from the command substitution clustered with the other # ones. -unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e ' +unset VISUAL EMAIL LANGUAGE $("$PERL_PATH" -e ' my @env = keys %ENV; my $ok = join("|", qw( TRACE @@ -457,41 +454,13 @@ export EDITOR GIT_DEFAULT_HASH="${GIT_TEST_DEFAULT_HASH:-sha1}" export GIT_DEFAULT_HASH +GIT_TEST_MERGE_ALGORITHM="${GIT_TEST_MERGE_ALGORITHM:-ort}" +export GIT_TEST_MERGE_ALGORITHM # Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output GIT_TRACE_BARE=1 export GIT_TRACE_BARE -check_var_migration () { - # the warnings and hints given from this helper depends - # on end-user settings, which will disrupt the self-test - # done on the test framework itself. - case "$GIT_TEST_FRAMEWORK_SELFTEST" in - t) return ;; - esac - - old_name=$1 new_name=$2 - eval "old_isset=\${${old_name}:+isset}" - eval "new_isset=\${${new_name}:+isset}" - - case "$old_isset,$new_isset" in - isset,) - echo >&2 "warning: $old_name is now $new_name" - echo >&2 "hint: set $new_name too during the transition period" - eval "$new_name=\$$old_name" - ;; - isset,isset) - # do this later - # echo >&2 "warning: $old_name is now $new_name" - # echo >&2 "hint: remove $old_name" - ;; - esac -} - -check_var_migration GIT_FSMONITOR_TEST GIT_TEST_FSMONITOR -check_var_migration TEST_GIT_INDEX_VERSION GIT_TEST_INDEX_VERSION -check_var_migration GIT_FORCE_PRELOAD_TEST GIT_TEST_PRELOAD_INDEX - # Use specific version of the index file format if test -n "${GIT_TEST_INDEX_VERSION:+isset}" then @@ -499,6 +468,12 @@ then export GIT_INDEX_VERSION fi +if test -n "$GIT_TEST_PERL_FATAL_WARNINGS" +then + GIT_PERL_FATAL_WARNINGS=1 + export GIT_PERL_FATAL_WARNINGS +fi + # Add libc MALLOC and MALLOC_PERTURB test # only if we are not executing the test with valgrind if test -n "$valgrind" || @@ -758,26 +733,38 @@ match_pattern_list () { arg="$1" shift test -z "$*" && return 1 - for pattern_ - do - case "$arg" in - $pattern_) - return 0 - esac - done - return 1 + # We need to use "$*" to get field-splitting, but we want to + # disable globbing, since we are matching against an arbitrary + # $arg, not what's in the filesystem. Using "set -f" accomplishes + # that, but we must do it in a subshell to avoid impacting the + # rest of the script. The exit value of the subshell becomes + # the function's return value. + ( + set -f + for pattern_ in $* + do + case "$arg" in + $pattern_) + exit 0 + ;; + esac + done + exit 1 + ) } match_test_selector_list () { + operation="$1" + shift title="$1" shift arg="$1" shift test -z "$1" && return 0 - # Both commas and whitespace are accepted as separators. + # Commas are accepted as separators. OLDIFS=$IFS - IFS=' ,' + IFS=',' set -- $1 IFS=$OLDIFS @@ -805,13 +792,13 @@ match_test_selector_list () { *-*) if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null then - echo "error: $title: invalid non-numeric in range" \ + echo "error: $operation: invalid non-numeric in range" \ "start: '$orig_selector'" >&2 exit 1 fi if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null then - echo "error: $title: invalid non-numeric in range" \ + echo "error: $operation: invalid non-numeric in range" \ "end: '$orig_selector'" >&2 exit 1 fi @@ -819,9 +806,11 @@ match_test_selector_list () { *) if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null then - echo "error: $title: invalid non-numeric in test" \ - "selector: '$orig_selector'" >&2 - exit 1 + case "$title" in *${selector}*) + include=$positive + ;; + esac + continue fi esac @@ -870,7 +859,7 @@ maybe_teardown_verbose () { last_verbose=t maybe_setup_verbose () { test -z "$verbose_only" && return - if match_pattern_list $test_count $verbose_only + if match_pattern_list $test_count "$verbose_only" then exec 4>&2 3>&1 # Emit a delimiting blank line when going from @@ -900,7 +889,7 @@ maybe_setup_valgrind () { return fi GIT_VALGRIND_ENABLED= - if match_pattern_list $test_count $valgrind_only + if match_pattern_list $test_count "$valgrind_only" then GIT_VALGRIND_ENABLED=t fi @@ -974,8 +963,11 @@ test_run_ () { trace= # 117 is magic because it is unlikely to match the exit # code of other programs - if $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!') || - test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" + if test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)" || + { + test "${GIT_TEST_CHAIN_LINT_HARDER:-${GIT_TEST_CHAIN_LINT_HARDER_DEFAULT:-1}}" != 0 && + $(printf '%s\n' "$1" | sed -f "$GIT_BUILD_DIR/t/chainlint.sed" | grep -q '?![A-Z][A-Z]*?!') + } then BUG "broken &&-chain or run-away HERE-DOC: $1" fi @@ -1025,13 +1017,13 @@ test_finish_ () { test_skip () { to_skip= skipped_reason= - if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS + if match_pattern_list $this_test.$test_count "$GIT_SKIP_TESTS" then to_skip=t skipped_reason="GIT_SKIP_TESTS" fi if test -z "$to_skip" && test -n "$run_list" && - ! match_test_selector_list '--run' $test_count "$run_list" + ! match_test_selector_list '--run' "$1" $test_count "$run_list" then to_skip=t skipped_reason="--run" @@ -1058,7 +1050,6 @@ test_skip () { " <skipped message=\"$message\" />" fi - say_color skip >&3 "skipping test: $@" say_color skip "ok $test_count # skip $1 ($skipped_reason)" : true ;; @@ -1197,7 +1188,7 @@ test_done () { esac fi - if test -z "$debug" + if test -z "$debug" && test -n "$remove_trash" then test -d "$TRASH_DIRECTORY" || error "Tests passed but trash directory already removed before test cleanup; aborting" @@ -1362,6 +1353,22 @@ then exit 1 fi +# Are we running this test at all? +remove_trash= +this_test=${0##*/} +this_test=${this_test%%-*} +if match_pattern_list "$this_test" "$GIT_SKIP_TESTS" +then + say_color info >&3 "skipping test $this_test altogether" + skip_all="skip all tests in $this_test" + test_done +fi + +# Last-minute variable setup +HOME="$TRASH_DIRECTORY" +GNUPGHOME="$HOME/gnupg-home-not-used" +export HOME GNUPGHOME + # Test repository rm -fr "$TRASH_DIRECTORY" || { GIT_EXIT_OK=t @@ -1369,13 +1376,11 @@ rm -fr "$TRASH_DIRECTORY" || { exit 1 } -HOME="$TRASH_DIRECTORY" -GNUPGHOME="$HOME/gnupg-home-not-used" -export HOME GNUPGHOME - +remove_trash=t if test -z "$TEST_NO_CREATE_REPO" then - test_create_repo "$TRASH_DIRECTORY" + git init "$TRASH_DIRECTORY" >&3 2>&4 || + error "cannot run git init" else mkdir -p "$TRASH_DIRECTORY" fi @@ -1384,15 +1389,6 @@ fi # in subprocesses like git equals our $PWD (for pathname comparisons). cd -P "$TRASH_DIRECTORY" || exit 1 -this_test=${0##*/} -this_test=${this_test%%-*} -if match_pattern_list "$this_test" $GIT_SKIP_TESTS -then - say_color info >&3 "skipping test $this_test altogether" - skip_all="skip all tests in $this_test" - test_done -fi - if test -n "$write_junit_xml" then junit_xml_dir="$TEST_OUTPUT_DIRECTORY/out" @@ -1487,6 +1483,7 @@ case $uname_s in test_set_prereq NATIVE_CRLF test_set_prereq SED_STRIPS_CR test_set_prereq GREP_STRIPS_CR + test_set_prereq WINDOWS GIT_TEST_CMP=mingw_test_cmp ;; *CYGWIN*) @@ -1495,6 +1492,7 @@ case $uname_s in test_set_prereq CYGWIN test_set_prereq SED_STRIPS_CR test_set_prereq GREP_STRIPS_CR + test_set_prereq WINDOWS ;; *) test_set_prereq POSIXPERM @@ -1511,26 +1509,16 @@ parisc* | hppa*) ;; esac +test_set_prereq REFFILES + ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1 test -z "$NO_PERL" && test_set_prereq PERL test -z "$NO_PTHREADS" && test_set_prereq PTHREADS test -z "$NO_PYTHON" && test_set_prereq PYTHON -test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE -test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE1 +test -n "$USE_LIBPCRE2" && test_set_prereq PCRE test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2 test -z "$NO_GETTEXT" && test_set_prereq GETTEXT -if test -n "$GIT_TEST_GETTEXT_POISON_ORIG" -then - GIT_TEST_GETTEXT_POISON=$GIT_TEST_GETTEXT_POISON_ORIG - export GIT_TEST_GETTEXT_POISON - unset GIT_TEST_GETTEXT_POISON_ORIG -fi - -test_lazy_prereq C_LOCALE_OUTPUT ' - ! test_bool_env GIT_TEST_GETTEXT_POISON false -' - if test -z "$GIT_TEST_CHECK_CACHE_TREE" then GIT_TEST_CHECK_CACHE_TREE=true @@ -1702,3 +1690,10 @@ test_lazy_prereq SHA1 ' test_lazy_prereq REBASE_P ' test -z "$GIT_TEST_SKIP_REBASE_P" ' + +# Ensure that no test accidentally triggers a Git command +# that runs the actual maintenance scheduler, affecting a user's +# system permanently. +# Tests that verify the scheduler integration must set this locally +# to avoid errors. +GIT_TEST_MAINT_SCHEDULER="none:exit 1" diff --git a/t/test-terminal.perl b/t/test-terminal.perl index 46bf618479..1bcf01a9a4 100755 --- a/t/test-terminal.perl +++ b/t/test-terminal.perl @@ -81,24 +81,24 @@ if ($#ARGV < 1) { die "usage: test-terminal program args"; } $ENV{TERM} = 'vt100'; -my $master_in = new IO::Pty; -my $master_out = new IO::Pty; -my $master_err = new IO::Pty; -$master_in->set_raw(); -$master_out->set_raw(); -$master_err->set_raw(); -$master_in->slave->set_raw(); -$master_out->slave->set_raw(); -$master_err->slave->set_raw(); -my $pid = start_child(\@ARGV, $master_in->slave, $master_out->slave, $master_err->slave); -close $master_in->slave; -close $master_out->slave; -close $master_err->slave; -my $in_pid = copy_stdin($master_in); -copy_stdio($master_out, $master_err); +my $parent_in = new IO::Pty; +my $parent_out = new IO::Pty; +my $parent_err = new IO::Pty; +$parent_in->set_raw(); +$parent_out->set_raw(); +$parent_err->set_raw(); +$parent_in->slave->set_raw(); +$parent_out->slave->set_raw(); +$parent_err->slave->set_raw(); +my $pid = start_child(\@ARGV, $parent_in->slave, $parent_out->slave, $parent_err->slave); +close $parent_in->slave; +close $parent_out->slave; +close $parent_err->slave; +my $in_pid = copy_stdin($parent_in); +copy_stdio($parent_out, $parent_err); my $ret = finish_child($pid); # If the child process terminates before our copy_stdin() process is able to -# write all of its data to $master_in, the copy_stdin() process could stall. +# write all of its data to $parent_in, the copy_stdin() process could stall. # Send SIGTERM to it to ensure it terminates. kill 'TERM', $in_pid; finish_child($in_pid); |