Merge branch 'en/update-ref-no-deref-stdin'
"git update-ref" learned to make both "--no-deref" and "--stdin" work at the same time. * en/update-ref-no-deref-stdin: update-ref: allow --no-deref with --stdin update-ref: fix type of update_flags variable to match its usage
This commit is contained in:
commit
f52b7eea44
@ -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
|
||||||
-----------
|
-----------
|
||||||
|
@ -14,7 +14,8 @@ static const char * const git_update_ref_usage[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static char line_termination = '\n';
|
static char line_termination = '\n';
|
||||||
static 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…
x
Reference in New Issue
Block a user