2016-02-06 14:23:36 +08:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2016 Dan Aloni
|
|
|
|
# Copyright (c) 2016 Jeff King
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='per-repo forced setting of email address'
|
|
|
|
|
2020-11-19 07:44:40 +08:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2022-11-09 02:17:48 +08:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2016-02-06 14:23:36 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'setup a likely user.useConfigOnly use case' '
|
|
|
|
# we want to make sure a reflog is written, since that needs
|
|
|
|
# a non-strict ident. So be sure we have an actual commit.
|
|
|
|
test_commit foo &&
|
|
|
|
|
|
|
|
sane_unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
|
|
|
|
sane_unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL &&
|
|
|
|
git config user.name "test" &&
|
|
|
|
git config --global user.useConfigOnly true
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fails committing if clone email is not set' '
|
|
|
|
test_must_fail git commit --allow-empty -m msg
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fails committing if clone email is not set, but EMAIL set' '
|
|
|
|
test_must_fail env EMAIL=test@fail.com git commit --allow-empty -m msg
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'succeeds committing if clone email is set' '
|
|
|
|
test_config user.email "test@ok.com" &&
|
|
|
|
git commit --allow-empty -m msg
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'succeeds cloning if global email is not set' '
|
|
|
|
git clone . clone
|
|
|
|
'
|
|
|
|
|
rebase-interactive: drop early check for valid ident
Since the very inception of interactive-rebase in 1b1dce4
(Teach rebase an interactive mode, 2007-06-25), there has
been a preemptive check, before looking at any commits, to
see whether the user has a valid name/email combination.
This is convenient, because it means that we abort the
operation before even beginning (rather than just
complaining that we are unable to pick a particular commit).
However, it does the wrong thing when the rebase does not
actually need to generate any new commits (e.g., a
fast-forward with no commits to pick, or one where the base
stays the same, and we just pick the same commits without
rewriting anything). In this case it may complain about the
lack of ident, even though one would not be needed to
complete the operation.
This may seem like mere nit-picking, but because interactive
rebase underlies the "preserve-merges" rebase, somebody who
has set "pull.rebase" to "preserve" cannot make even a
fast-forward pull without a valid ident, as we bail before
even realizing the fast-forward nature.
This commit drops the extra ident check entirely. This means
we rely on individual commands that generate commit objects
to complain. So we will continue to notice and prevent cases
that actually do create commits, but with one important
difference: we fail while actually executing the "pick"
operations, and leave the rebase in a conflicted, half-done
state.
In some ways this is less convenient, but in some ways it is
more so; the user can then manually commit or even "git
rebase --continue" after setting up their ident (or
providing it as a one-off on the command line).
Reported-by: Dakota Hawkins <dakotahawkins@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-30 06:31:35 +08:00
|
|
|
test_expect_success 'set up rebase scenarios' '
|
|
|
|
# temporarily enable an actual ident for this setup
|
|
|
|
test_config user.email foo@example.com &&
|
|
|
|
test_commit new &&
|
|
|
|
git branch side-without-commit HEAD^ &&
|
|
|
|
git checkout -b side-with-commit HEAD^ &&
|
|
|
|
test_commit side
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fast-forward rebase does not care about ident' '
|
|
|
|
git checkout -B tmp side-without-commit &&
|
2020-11-19 07:44:40 +08:00
|
|
|
git rebase main
|
rebase-interactive: drop early check for valid ident
Since the very inception of interactive-rebase in 1b1dce4
(Teach rebase an interactive mode, 2007-06-25), there has
been a preemptive check, before looking at any commits, to
see whether the user has a valid name/email combination.
This is convenient, because it means that we abort the
operation before even beginning (rather than just
complaining that we are unable to pick a particular commit).
However, it does the wrong thing when the rebase does not
actually need to generate any new commits (e.g., a
fast-forward with no commits to pick, or one where the base
stays the same, and we just pick the same commits without
rewriting anything). In this case it may complain about the
lack of ident, even though one would not be needed to
complete the operation.
This may seem like mere nit-picking, but because interactive
rebase underlies the "preserve-merges" rebase, somebody who
has set "pull.rebase" to "preserve" cannot make even a
fast-forward pull without a valid ident, as we bail before
even realizing the fast-forward nature.
This commit drops the extra ident check entirely. This means
we rely on individual commands that generate commit objects
to complain. So we will continue to notice and prevent cases
that actually do create commits, but with one important
difference: we fail while actually executing the "pick"
operations, and leave the rebase in a conflicted, half-done
state.
In some ways this is less convenient, but in some ways it is
more so; the user can then manually commit or even "git
rebase --continue" after setting up their ident (or
providing it as a one-off on the command line).
Reported-by: Dakota Hawkins <dakotahawkins@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-30 06:31:35 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
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 &&
|
2020-11-19 07:44:40 +08:00
|
|
|
test_must_fail git rebase main
|
rebase-interactive: drop early check for valid ident
Since the very inception of interactive-rebase in 1b1dce4
(Teach rebase an interactive mode, 2007-06-25), there has
been a preemptive check, before looking at any commits, to
see whether the user has a valid name/email combination.
This is convenient, because it means that we abort the
operation before even beginning (rather than just
complaining that we are unable to pick a particular commit).
However, it does the wrong thing when the rebase does not
actually need to generate any new commits (e.g., a
fast-forward with no commits to pick, or one where the base
stays the same, and we just pick the same commits without
rewriting anything). In this case it may complain about the
lack of ident, even though one would not be needed to
complete the operation.
This may seem like mere nit-picking, but because interactive
rebase underlies the "preserve-merges" rebase, somebody who
has set "pull.rebase" to "preserve" cannot make even a
fast-forward pull without a valid ident, as we bail before
even realizing the fast-forward nature.
This commit drops the extra ident check entirely. This means
we rely on individual commands that generate commit objects
to complain. So we will continue to notice and prevent cases
that actually do create commits, but with one important
difference: we fail while actually executing the "pick"
operations, and leave the rebase in a conflicted, half-done
state.
In some ways this is less convenient, but in some ways it is
more so; the user can then manually commit or even "git
rebase --continue" after setting up their ident (or
providing it as a one-off on the command line).
Reported-by: Dakota Hawkins <dakotahawkins@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-30 06:31:35 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fast-forward rebase does not care about ident (interactive)' '
|
|
|
|
git checkout -B tmp side-without-commit &&
|
2020-11-19 07:44:40 +08:00
|
|
|
git rebase -i main
|
rebase-interactive: drop early check for valid ident
Since the very inception of interactive-rebase in 1b1dce4
(Teach rebase an interactive mode, 2007-06-25), there has
been a preemptive check, before looking at any commits, to
see whether the user has a valid name/email combination.
This is convenient, because it means that we abort the
operation before even beginning (rather than just
complaining that we are unable to pick a particular commit).
However, it does the wrong thing when the rebase does not
actually need to generate any new commits (e.g., a
fast-forward with no commits to pick, or one where the base
stays the same, and we just pick the same commits without
rewriting anything). In this case it may complain about the
lack of ident, even though one would not be needed to
complete the operation.
This may seem like mere nit-picking, but because interactive
rebase underlies the "preserve-merges" rebase, somebody who
has set "pull.rebase" to "preserve" cannot make even a
fast-forward pull without a valid ident, as we bail before
even realizing the fast-forward nature.
This commit drops the extra ident check entirely. This means
we rely on individual commands that generate commit objects
to complain. So we will continue to notice and prevent cases
that actually do create commits, but with one important
difference: we fail while actually executing the "pick"
operations, and leave the rebase in a conflicted, half-done
state.
In some ways this is less convenient, but in some ways it is
more so; the user can then manually commit or even "git
rebase --continue" after setting up their ident (or
providing it as a one-off on the command line).
Reported-by: Dakota Hawkins <dakotahawkins@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-30 06:31:35 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
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 &&
|
2020-11-19 07:44:40 +08:00
|
|
|
test_must_fail git rebase -i main
|
rebase-interactive: drop early check for valid ident
Since the very inception of interactive-rebase in 1b1dce4
(Teach rebase an interactive mode, 2007-06-25), there has
been a preemptive check, before looking at any commits, to
see whether the user has a valid name/email combination.
This is convenient, because it means that we abort the
operation before even beginning (rather than just
complaining that we are unable to pick a particular commit).
However, it does the wrong thing when the rebase does not
actually need to generate any new commits (e.g., a
fast-forward with no commits to pick, or one where the base
stays the same, and we just pick the same commits without
rewriting anything). In this case it may complain about the
lack of ident, even though one would not be needed to
complete the operation.
This may seem like mere nit-picking, but because interactive
rebase underlies the "preserve-merges" rebase, somebody who
has set "pull.rebase" to "preserve" cannot make even a
fast-forward pull without a valid ident, as we bail before
even realizing the fast-forward nature.
This commit drops the extra ident check entirely. This means
we rely on individual commands that generate commit objects
to complain. So we will continue to notice and prevent cases
that actually do create commits, but with one important
difference: we fail while actually executing the "pick"
operations, and leave the rebase in a conflicted, half-done
state.
In some ways this is less convenient, but in some ways it is
more so; the user can then manually commit or even "git
rebase --continue" after setting up their ident (or
providing it as a one-off on the command line).
Reported-by: Dakota Hawkins <dakotahawkins@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-30 06:31:35 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'noop interactive rebase does not care about ident' '
|
|
|
|
git checkout -B tmp side-with-commit &&
|
|
|
|
git rebase -i HEAD^
|
|
|
|
'
|
|
|
|
|
2019-02-05 02:48:50 +08:00
|
|
|
test_expect_success 'author.name overrides user.name' '
|
|
|
|
test_config user.name user &&
|
|
|
|
test_config user.email user@example.com &&
|
|
|
|
test_config author.name author &&
|
|
|
|
test_commit author-name-override-user &&
|
|
|
|
echo author user@example.com > expected-author &&
|
|
|
|
echo user user@example.com > expected-committer &&
|
|
|
|
git log --format="%an %ae" -1 > actual-author &&
|
|
|
|
git log --format="%cn %ce" -1 > actual-committer &&
|
|
|
|
test_cmp expected-author actual-author &&
|
|
|
|
test_cmp expected-committer actual-committer
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'author.email overrides user.email' '
|
|
|
|
test_config user.name user &&
|
|
|
|
test_config user.email user@example.com &&
|
|
|
|
test_config author.email author@example.com &&
|
|
|
|
test_commit author-email-override-user &&
|
|
|
|
echo user author@example.com > expected-author &&
|
|
|
|
echo user user@example.com > expected-committer &&
|
|
|
|
git log --format="%an %ae" -1 > actual-author &&
|
|
|
|
git log --format="%cn %ce" -1 > actual-committer &&
|
|
|
|
test_cmp expected-author actual-author &&
|
|
|
|
test_cmp expected-committer actual-committer
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'committer.name overrides user.name' '
|
|
|
|
test_config user.name user &&
|
|
|
|
test_config user.email user@example.com &&
|
|
|
|
test_config committer.name committer &&
|
|
|
|
test_commit committer-name-override-user &&
|
|
|
|
echo user user@example.com > expected-author &&
|
|
|
|
echo committer user@example.com > expected-committer &&
|
|
|
|
git log --format="%an %ae" -1 > actual-author &&
|
|
|
|
git log --format="%cn %ce" -1 > actual-committer &&
|
|
|
|
test_cmp expected-author actual-author &&
|
|
|
|
test_cmp expected-committer actual-committer
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'committer.email overrides user.email' '
|
|
|
|
test_config user.name user &&
|
|
|
|
test_config user.email user@example.com &&
|
|
|
|
test_config committer.email committer@example.com &&
|
|
|
|
test_commit committer-email-override-user &&
|
|
|
|
echo user user@example.com > expected-author &&
|
|
|
|
echo user committer@example.com > expected-committer &&
|
|
|
|
git log --format="%an %ae" -1 > actual-author &&
|
|
|
|
git log --format="%cn %ce" -1 > actual-committer &&
|
|
|
|
test_cmp expected-author actual-author &&
|
|
|
|
test_cmp expected-committer actual-committer
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'author and committer environment variables override config settings' '
|
|
|
|
test_config user.name user &&
|
|
|
|
test_config user.email user@example.com &&
|
|
|
|
test_config author.name author &&
|
|
|
|
test_config author.email author@example.com &&
|
|
|
|
test_config committer.name committer &&
|
|
|
|
test_config committer.email committer@example.com &&
|
|
|
|
GIT_AUTHOR_NAME=env_author && export GIT_AUTHOR_NAME &&
|
|
|
|
GIT_AUTHOR_EMAIL=env_author@example.com && export GIT_AUTHOR_EMAIL &&
|
|
|
|
GIT_COMMITTER_NAME=env_commit && export GIT_COMMITTER_NAME &&
|
|
|
|
GIT_COMMITTER_EMAIL=env_commit@example.com && export GIT_COMMITTER_EMAIL &&
|
|
|
|
test_commit env-override-conf &&
|
|
|
|
echo env_author env_author@example.com > expected-author &&
|
|
|
|
echo env_commit env_commit@example.com > expected-committer &&
|
|
|
|
git log --format="%an %ae" -1 > actual-author &&
|
|
|
|
git log --format="%cn %ce" -1 > actual-committer &&
|
|
|
|
sane_unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
|
|
|
|
sane_unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL &&
|
|
|
|
test_cmp expected-author actual-author &&
|
|
|
|
test_cmp expected-committer actual-committer
|
|
|
|
'
|
|
|
|
|
2016-02-06 14:23:36 +08:00
|
|
|
test_done
|