On Sat, Dec 09, 2017 at 09:05:30AM +0000, Hans Jerry Illikainen wrote:
> Verify the signature of the tip commit when `pull.verifySignatures` is
> true.  This option overrides `merge.verifySignatures` on pull, and can
> be disabled with the option `--no-verify-signatures`.

Is there a reason why git pull would need a different behaviour from git
merge? Pull itself is just a convenience command for fetch +
merge/rebase.

One precedent for having a separate configuration option for pull
however is 'pull.ff', so there might be a usecase for it.

I guess your commit message could use a motivation on why you want to
set this differently from 'merge.verifySignature'.

> 
> Signed-off-by: Hans Jerry Illikainen <h...@dyntopia.com>
> ---
>  Documentation/config.txt          |  8 ++++++++
>  builtin/pull.c                    | 25 +++++++++++++++++++++++++
>  t/t5520-pull.sh                   | 18 ++++++++++++++++++
>  t/t5573-pull-verify-signatures.sh | 32 ++++++++++++++++++++++++++++++++
>  4 files changed, 83 insertions(+)
> 
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index c1598ee70..0cd2bc597 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -2596,6 +2596,14 @@ pull.ff::
>       allowed (equivalent to giving the `--ff-only` option from the
>       command line). This setting overrides `merge.ff` when pulling.
>  
> +pull.verifySignatures::
> +     Verify that the tip commit of the side branch being merged is
> +     signed with a valid key, i.e. a key that has a valid uid: in the
> +     default trust model, this means the signing key has been signed
> +     by a trusted key. If the tip commit of the side branch is not
> +     signed with a valid key, the merge is aborted. This setting
> +     overrides `merge.verifySignatures` when pulling.
> +
>  pull.rebase::
>       When true, rebase branches on top of the fetched branch, instead
>       of merging the default branch from the default remote when "git
> diff --git a/builtin/pull.c b/builtin/pull.c
> index 166b777ed..791365915 100644
> --- a/builtin/pull.c
> +++ b/builtin/pull.c
> @@ -300,6 +300,28 @@ static const char *config_get_ff(void)
>  }
>  
>  /**
> + * If pull.verifySignatures is unset, returns NULL. If pull.verifySignatures 
> is
> + * "true", returns "--verify-signatures". If pull.verifySignatures is 
> "false",
> + * returns "--no-verify-signatures". Otherwise, die with an error.
> + */
> +static const char *config_get_verify_signatures(void)
> +{
> +     const char *value;
> +
> +     if (git_config_get_value("pull.verifysignatures", &value))
> +             return NULL;
> +
> +     switch (git_parse_maybe_bool(value)) {
> +     case 0:
> +             return "--no-verify-signatures";
> +     case 1:
> +             return "--verify-signatures";
> +     default:
> +             die(_("Invalid value for pull.verifysignatures: %s"), value);
> +     }
> +}
> +
> +/**
>   * Returns the default configured value for --rebase. It first looks for the
>   * value of "branch.$curr_branch.rebase", where $curr_branch is the current
>   * branch, and if HEAD is detached or the configuration key does not exist,
> @@ -849,6 +871,9 @@ int cmd_pull(int argc, const char **argv, const char 
> *prefix)
>       if (!opt_ff)
>               opt_ff = xstrdup_or_null(config_get_ff());
>  
> +     if (!opt_verify_signatures)
> +             opt_verify_signatures = 
> xstrdup_or_null(config_get_verify_signatures());
> +
>       if (opt_rebase < 0)
>               opt_rebase = config_get_rebase();
>  
> diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
> index 59c4b778d..cdf1fd213 100755
> --- a/t/t5520-pull.sh
> +++ b/t/t5520-pull.sh
> @@ -416,6 +416,15 @@ test_expect_success "pull --rebase warns on 
> --verify-signatures" '
>       test_i18ngrep "ignoring --verify-signatures for rebase" err
>  '
>  
> +test_expect_success "pull --rebase warns on pull.verifySignatures=true" '
> +     test_config pull.verifySignatures true &&
> +     git reset --hard before-rebase &&
> +     git pull --rebase . copy 2>err &&
> +     test "$(git rev-parse HEAD^)" = "$(git rev-parse copy)" &&
> +     test new = "$(git show HEAD:file2)" &&
> +     test_i18ngrep "ignoring --verify-signatures for rebase" err
> +'
> +
>  test_expect_success "pull --rebase does not warn on --no-verify-signatures" '
>       git reset --hard before-rebase &&
>       git pull --rebase --no-verify-signatures . copy 2>err &&
> @@ -424,6 +433,15 @@ test_expect_success "pull --rebase does not warn on 
> --no-verify-signatures" '
>       test_i18ngrep ! "verify-signatures" err
>  '
>  
> +test_expect_success "pull --rebase does not warn on 
> pull.verifySignatures=false" '
> +     test_config pull.verifySignatures false &&
> +     git reset --hard before-rebase &&
> +     git pull --rebase . copy 2>err &&
> +     test "$(git rev-parse HEAD^)" = "$(git rev-parse copy)" &&
> +     test new = "$(git show HEAD:file2)" &&
> +     test_i18ngrep ! "verify-signatures" err
> +'
> +
>  # add a feature branch, keep-merge, that is merged into master, so the
>  # test can try preserving the merge commit (or not) with various
>  # --rebase flags/pull.rebase settings.
> diff --git a/t/t5573-pull-verify-signatures.sh 
> b/t/t5573-pull-verify-signatures.sh
> index 700247910..d1e8263d9 100755
> --- a/t/t5573-pull-verify-signatures.sh
> +++ b/t/t5573-pull-verify-signatures.sh
> @@ -47,22 +47,54 @@ test_expect_success GPG 'pull unsigned commit with 
> --verify-signatures' '
>       test_i18ngrep "does not have a GPG signature" pullerror
>  '
>  
> +test_expect_success GPG 'pull unsigned commit with 
> pull.verifySignatures=true' '
> +     test_config pull.verifySignatures true &&
> +     test_must_fail git pull --ff-only unsigned 2>pullerror &&
> +     test_i18ngrep "does not have a GPG signature" pullerror
> +'
> +
>  test_expect_success GPG 'pull commit with bad signature with 
> --verify-signatures' '
>       test_must_fail git pull --ff-only --verify-signatures bad 2>pullerror &&
>       test_i18ngrep "has a bad GPG signature" pullerror
>  '
>  
> +test_expect_success GPG 'pull commit with bad signature with 
> pull.verifySignatures=true' '
> +     test_config pull.verifySignatures true &&
> +     test_must_fail git pull --ff-only bad 2>pullerror &&
> +     test_i18ngrep "has a bad GPG signature" pullerror
> +'
> +
>  test_expect_success GPG 'pull commit with untrusted signature with 
> --verify-signatures' '
>       test_must_fail git pull --ff-only --verify-signatures untrusted 
> 2>pullerror &&
>       test_i18ngrep "has an untrusted GPG signature" pullerror
>  '
>  
> +test_expect_success GPG 'pull commit with untrusted signature with 
> pull.verifySignatures=true' '
> +     test_config pull.verifySignatures true &&
> +     test_must_fail git pull --ff-only untrusted 2>pullerror &&
> +     test_i18ngrep "has an untrusted GPG signature" pullerror
> +'
> +
> +test_expect_success GPG 'pull commit with untrusted signature with 
> pull.verifySignatures=true and merge.verifySignatures=false' '
> +     test_config merge.verifySignatures false &&
> +     test_config pull.verifySignatures true &&
> +     test_must_fail git pull --ff-only untrusted 2>pullerror &&
> +     test_i18ngrep "has an untrusted GPG signature" pullerror
> +'
> +
>  test_expect_success GPG 'pull signed commit with --verify-signatures' '
>       git pull --verify-signatures signed >pulloutput &&
>       test_i18ngrep "has a good GPG signature" pulloutput &&
>       git checkout initial
>  '
>  
> +test_expect_success GPG 'pull signed commit with pull.verifySignatures=true' 
> '
> +     test_config pull.verifySignatures true &&
> +     git pull signed >pulloutput &&
> +     test_i18ngrep "has a good GPG signature" pulloutput &&
> +     git checkout initial
> +'
> +
>  test_expect_success GPG 'pull commit with bad signature without 
> verification' '
>       git pull --ff-only bad 2>pullerror &&
>       git checkout initial
> -- 
> 2.11.0
> 

Reply via email to