Commit f52b7eea authored by Junio C Hamano's avatar Junio C Hamano

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
parents 00d5f665 d345e9fb
......@@ -8,7 +8,7 @@ git-update-ref - Update the object name stored in a ref safely
SYNOPSIS
--------
[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
-----------
......
......@@ -14,7 +14,8 @@ static const char * const git_update_ref_usage[] = {
};
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 const char *msg;
......@@ -205,7 +206,7 @@ static const char *parse_cmd_update(struct ref_transaction *transaction,
msg, &err))
die("%s", err.buf);
update_flags = 0;
update_flags = default_flags;
free(refname);
strbuf_release(&err);
......@@ -237,7 +238,7 @@ static const char *parse_cmd_create(struct ref_transaction *transaction,
msg, &err))
die("%s", err.buf);
update_flags = 0;
update_flags = default_flags;
free(refname);
strbuf_release(&err);
......@@ -273,7 +274,7 @@ static const char *parse_cmd_delete(struct ref_transaction *transaction,
update_flags, msg, &err))
die("%s", err.buf);
update_flags = 0;
update_flags = default_flags;
free(refname);
strbuf_release(&err);
......@@ -302,7 +303,7 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction,
update_flags, &err))
die("%s", err.buf);
update_flags = 0;
update_flags = default_flags;
free(refname);
strbuf_release(&err);
......@@ -357,7 +358,6 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
const char *refname, *oldval;
struct object_id oid, oldoid;
int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0;
unsigned int flags = 0;
int create_reflog = 0;
struct option options[] = {
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;
if (no_deref) {
default_flags = REF_NO_DEREF;
update_flags = default_flags;
}
if (read_stdin) {
struct strbuf err = STRBUF_INIT;
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);
if (!transaction)
die("%s", err.buf);
if (delete || no_deref || argc > 0)
if (delete || argc > 0)
usage_with_options(git_update_ref_usage, options);
if (end_null)
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);
}
if (no_deref)
flags = REF_NO_DEREF;
if (delete)
/*
* 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,
(oldval && !is_null_oid(&oldoid)) ? &oldoid : NULL,
flags);
default_flags);
else
return update_ref(msg, refname, &oid, oldval ? &oldoid : NULL,
flags | create_reflog_flag,
default_flags | create_reflog_flag,
UPDATE_REFS_DIE_ON_ERR);
}
......@@ -807,6 +807,37 @@ test_expect_success 'stdin delete symref works option no-deref' '
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' '
echo "delete $b $m~1" >stdin &&
git update-ref --stdin <stdin &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment