Show 86 quoted lines
>
> So gently deprecate this usage: remove its description from the
> documentation and emit a warning if it is found. But for reasons of
> backwards compatibility, continue to accept it.
>
> Helped-by: Brad King <brad.king@kitware.com>
> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
> ---
> Documentation/git-update-ref.txt | 18 ++++++++++++------
> builtin/update-ref.c | 2 ++
> t/t1400-update-ref.sh | 5 +++--
> 3 files changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt
> index 0a0a551..c8f5ae5 100644
> --- a/Documentation/git-update-ref.txt
> +++ b/Documentation/git-update-ref.txt
> @@ -68,7 +68,12 @@ performs all modifications together. Specify commands of the form:
> option SP <opt> LF
>
> Quote fields containing whitespace as if they were strings in C source
> -code. Alternatively, use `-z` to specify commands without quoting:
> +code; i.e., surrounded by double-quotes and with backslash escapes.
> +Use 40 "0" characters or the empty string to specify a zero value. To
> +specify a missing value, omit the value and its preceding SP entirely.
> +
> +Alternatively, use `-z` to specify in NUL-terminated format, without
> +quoting:
>
> update SP <ref> NUL <newvalue> NUL [<oldvalue>] NUL
> create SP <ref> NUL <newvalue> NUL
> @@ -76,8 +81,12 @@ code. Alternatively, use `-z` to specify commands without quoting:
> verify SP <ref> NUL [<oldvalue>] NUL
> option SP <opt> NUL
>
> -Lines of any other format or a repeated <ref> produce an error.
> -Command meanings are:
> +In this format, use 40 "0" to specify a zero value, and use the empty
> +string to specify a missing value.
> +
> +In either format, values can be specified in any form that Git
> +recognizes as an object name. Commands in any other format or a
> +repeated <ref> produce an error. Command meanings are:
>
> update::
> Set <ref> to <newvalue> after verifying <oldvalue>, if given.
> @@ -102,9 +111,6 @@ option::
> The only valid option is `no-deref` to avoid dereferencing
> a symbolic ref.
>
> -Use 40 "0" or the empty string to specify a zero value, except that
> -with `-z` an empty <oldvalue> is considered missing.
> -
> If all <ref>s can be locked with matching <oldvalue>s
> simultaneously, all modifications are performed. Otherwise, no
> modifications are performed. Note that while each individual
> diff --git a/builtin/update-ref.c b/builtin/update-ref.c
> index 6462b2f..eef7537 100644
> --- a/builtin/update-ref.c
> +++ b/builtin/update-ref.c
> @@ -154,6 +154,8 @@ static int parse_next_sha1(struct strbuf *input, const char **next,
> goto invalid;
> } else if (flags & PARSE_SHA1_ALLOW_EMPTY) {
> /* With -z, treat an empty value as all zeros: */
> + warning("%s %s: missing <newvalue>, treating as zero",
> + command, refname);
> hashclr(sha1);
> } else {
> /*
> diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
> index 15f5bfd..2d61cce 100755
> --- a/t/t1400-update-ref.sh
> +++ b/t/t1400-update-ref.sh
> @@ -730,10 +730,11 @@ test_expect_success 'stdin -z fails update with bad ref name' '
> grep "fatal: invalid ref format: ~a" err
> '
>
> -test_expect_success 'stdin -z treats empty new value as zeros' '
> +test_expect_success 'stdin -z emits warning with empty new value' '
> git update-ref $a $m &&
> printf $F "update $a" "" "" >stdin &&
> - git update-ref -z --stdin <stdin &&
> + git update-ref -z --stdin <stdin 2>err &&
> + grep "warning: update $a: missing <newvalue>, treating as zero" err &&
> test_must_fail git rev-parse --verify -q $a
> '