mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
update-ref: allow --no-deref with --stdin
If passed both --no-deref and --stdin, update-ref would error out with a general usage message that did not at all suggest these options were incompatible. The manpage for update-ref did suggest through its synopsis line that --no-deref and --stdin were incompatible, but it sadly also incorrectly suggested that -d and --no-deref were incompatible. So the help around the --no-deref option is buggy in a few ways. The --stdin option did provide a different mechanism for avoiding dereferencing symbolic-refs: adding a line reading option no-deref before every other directive in the input. (Technically, if the user wants to do the extra work of first determining which refs they want to update or delete are symbolic, then they only need to put the extra "option no-deref" lines before the updates of those refs. But in some cases, that's more work than just adding the "option no-deref" before every other directive.) It's easier to allow the user to just pass --no-deref along with --stdin in order to tell update-ref that the user doesn't want any symbolic ref to be dereferenced. It also makes the update-ref documentation simpler. Implement that, and update the documentation to match. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e4c34855a2
commit
d345e9fbe7
|
@ -8,7 +8,7 @@ git-update-ref - Update the object name stored in a ref safely
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
'git update-ref' [-m <reason>] (-d <ref> [<oldvalue>] | [--no-deref] [--create-reflog] <ref> <newvalue> [<oldvalue>] | --stdin [-z])
|
'git update-ref' [-m <reason>] [--no-deref] (-d <ref> [<oldvalue>] | [--create-reflog] <ref> <newvalue> [<oldvalue>] | --stdin [-z])
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -15,6 +15,7 @@ static const char * const git_update_ref_usage[] = {
|
||||||
|
|
||||||
static char line_termination = '\n';
|
static char line_termination = '\n';
|
||||||
static unsigned int update_flags;
|
static unsigned int update_flags;
|
||||||
|
static unsigned int default_flags;
|
||||||
static unsigned create_reflog_flag;
|
static unsigned create_reflog_flag;
|
||||||
static const char *msg;
|
static const char *msg;
|
||||||
|
|
||||||
|
@ -205,7 +206,7 @@ static const char *parse_cmd_update(struct ref_transaction *transaction,
|
||||||
msg, &err))
|
msg, &err))
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
|
|
||||||
update_flags = 0;
|
update_flags = default_flags;
|
||||||
free(refname);
|
free(refname);
|
||||||
strbuf_release(&err);
|
strbuf_release(&err);
|
||||||
|
|
||||||
|
@ -237,7 +238,7 @@ static const char *parse_cmd_create(struct ref_transaction *transaction,
|
||||||
msg, &err))
|
msg, &err))
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
|
|
||||||
update_flags = 0;
|
update_flags = default_flags;
|
||||||
free(refname);
|
free(refname);
|
||||||
strbuf_release(&err);
|
strbuf_release(&err);
|
||||||
|
|
||||||
|
@ -273,7 +274,7 @@ static const char *parse_cmd_delete(struct ref_transaction *transaction,
|
||||||
update_flags, msg, &err))
|
update_flags, msg, &err))
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
|
|
||||||
update_flags = 0;
|
update_flags = default_flags;
|
||||||
free(refname);
|
free(refname);
|
||||||
strbuf_release(&err);
|
strbuf_release(&err);
|
||||||
|
|
||||||
|
@ -302,7 +303,7 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction,
|
||||||
update_flags, &err))
|
update_flags, &err))
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
|
|
||||||
update_flags = 0;
|
update_flags = default_flags;
|
||||||
free(refname);
|
free(refname);
|
||||||
strbuf_release(&err);
|
strbuf_release(&err);
|
||||||
|
|
||||||
|
@ -357,7 +358,6 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||||
const char *refname, *oldval;
|
const char *refname, *oldval;
|
||||||
struct object_id oid, oldoid;
|
struct object_id oid, oldoid;
|
||||||
int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0;
|
int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0;
|
||||||
unsigned int flags = 0;
|
|
||||||
int create_reflog = 0;
|
int create_reflog = 0;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")),
|
OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")),
|
||||||
|
@ -378,6 +378,11 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||||
|
|
||||||
create_reflog_flag = create_reflog ? REF_FORCE_CREATE_REFLOG : 0;
|
create_reflog_flag = create_reflog ? REF_FORCE_CREATE_REFLOG : 0;
|
||||||
|
|
||||||
|
if (no_deref) {
|
||||||
|
default_flags = REF_NO_DEREF;
|
||||||
|
update_flags = default_flags;
|
||||||
|
}
|
||||||
|
|
||||||
if (read_stdin) {
|
if (read_stdin) {
|
||||||
struct strbuf err = STRBUF_INIT;
|
struct strbuf err = STRBUF_INIT;
|
||||||
struct ref_transaction *transaction;
|
struct ref_transaction *transaction;
|
||||||
|
@ -385,7 +390,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||||
transaction = ref_transaction_begin(&err);
|
transaction = ref_transaction_begin(&err);
|
||||||
if (!transaction)
|
if (!transaction)
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
if (delete || no_deref || argc > 0)
|
if (delete || argc > 0)
|
||||||
usage_with_options(git_update_ref_usage, options);
|
usage_with_options(git_update_ref_usage, options);
|
||||||
if (end_null)
|
if (end_null)
|
||||||
line_termination = '\0';
|
line_termination = '\0';
|
||||||
|
@ -427,8 +432,6 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||||
die("%s: not a valid old SHA1", oldval);
|
die("%s: not a valid old SHA1", oldval);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (no_deref)
|
|
||||||
flags = REF_NO_DEREF;
|
|
||||||
if (delete)
|
if (delete)
|
||||||
/*
|
/*
|
||||||
* For purposes of backwards compatibility, we treat
|
* For purposes of backwards compatibility, we treat
|
||||||
|
@ -436,9 +439,9 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||||
*/
|
*/
|
||||||
return delete_ref(msg, refname,
|
return delete_ref(msg, refname,
|
||||||
(oldval && !is_null_oid(&oldoid)) ? &oldoid : NULL,
|
(oldval && !is_null_oid(&oldoid)) ? &oldoid : NULL,
|
||||||
flags);
|
default_flags);
|
||||||
else
|
else
|
||||||
return update_ref(msg, refname, &oid, oldval ? &oldoid : NULL,
|
return update_ref(msg, refname, &oid, oldval ? &oldoid : NULL,
|
||||||
flags | create_reflog_flag,
|
default_flags | create_reflog_flag,
|
||||||
UPDATE_REFS_DIE_ON_ERR);
|
UPDATE_REFS_DIE_ON_ERR);
|
||||||
}
|
}
|
||||||
|
|
|
@ -807,6 +807,37 @@ test_expect_success 'stdin delete symref works option no-deref' '
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stdin update symref works flag --no-deref' '
|
||||||
|
git symbolic-ref TESTSYMREFONE $b &&
|
||||||
|
git symbolic-ref TESTSYMREFTWO $b &&
|
||||||
|
cat >stdin <<-EOF &&
|
||||||
|
update TESTSYMREFONE $a $b
|
||||||
|
update TESTSYMREFTWO $a $b
|
||||||
|
EOF
|
||||||
|
git update-ref --no-deref --stdin <stdin &&
|
||||||
|
git rev-parse TESTSYMREFONE TESTSYMREFTWO >expect &&
|
||||||
|
git rev-parse $a $a >actual &&
|
||||||
|
test_cmp expect actual &&
|
||||||
|
git rev-parse $m~1 >expect &&
|
||||||
|
git rev-parse $b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stdin delete symref works flag --no-deref' '
|
||||||
|
git symbolic-ref TESTSYMREFONE $b &&
|
||||||
|
git symbolic-ref TESTSYMREFTWO $b &&
|
||||||
|
cat >stdin <<-EOF &&
|
||||||
|
delete TESTSYMREFONE $b
|
||||||
|
delete TESTSYMREFTWO $b
|
||||||
|
EOF
|
||||||
|
git update-ref --no-deref --stdin <stdin &&
|
||||||
|
test_must_fail git rev-parse --verify -q TESTSYMREFONE &&
|
||||||
|
test_must_fail git rev-parse --verify -q TESTSYMREFTWO &&
|
||||||
|
git rev-parse $m~1 >expect &&
|
||||||
|
git rev-parse $b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'stdin delete ref works with right old value' '
|
test_expect_success 'stdin delete ref works with right old value' '
|
||||||
echo "delete $b $m~1" >stdin &&
|
echo "delete $b $m~1" >stdin &&
|
||||||
git update-ref --stdin <stdin &&
|
git update-ref --stdin <stdin &&
|
||||||
|
|
Loading…
Reference in a new issue