On Fri, Apr 12, 2024 at 11:59:04AM +0200, Karthik Nayak wrote: > From: Karthik Nayak [snip] > @@ -302,6 +302,37 @@ static void parse_cmd_delete(struct ref_transaction *transaction, > strbuf_release(&err); > } > > +static void parse_cmd_symref_delete(struct ref_transaction *transaction, > + const char *next, const char *end) > +{ > + struct strbuf err = STRBUF_INIT; > + char *refname, *old_ref; > + > + if (!(update_flags & REF_NO_DEREF)) > + die("symref-delete: cannot operate with deref mode"); Again, I'm a bit on the fence regarding this restriction. I feel like it ought to be possible to delete both plain and symbolic refs in a single git-update-ref(1) command. > + refname = parse_refname(&next); > + if (!refname) > + die("symref-delete: missing "); > + > + old_ref = parse_next_refname(&next); This line is indented with spaces and not tabs. [snip] > --- a/t/t1400-update-ref.sh > +++ b/t/t1400-update-ref.sh > @@ -1715,6 +1715,45 @@ test_expect_success "stdin ${type} symref-verify fails for mistaken null value" > test_cmp expect actual > ' > > +test_expect_success "stdin ${type} symref-delete fails without --no-deref" ' > + git symbolic-ref refs/heads/symref $a && > + create_stdin_buf ${type} "symref-delete refs/heads/symref" "$a" && > + test_must_fail git update-ref --stdin ${type} err && > + grep "fatal: symref-delete: cannot operate with deref mode" err > +' > + > +test_expect_success "stdin ${type} fails symref-delete with no ref" ' > + create_stdin_buf ${type} "symref-delete " && > + test_must_fail git update-ref --stdin ${type} --no-deref err && > + grep "fatal: symref-delete: missing " err > +' > + > +test_expect_success "stdin ${type} fails symref-delete with too many arguments" ' > + create_stdin_buf ${type} "symref-delete refs/heads/symref" "$a" "$a" && > + test_must_fail git update-ref --stdin ${type} --no-deref err && > + if test "$type" = "-z" > + then > + grep "fatal: unknown command: $a" err > + else > + grep "fatal: symref-delete refs/heads/symref: extra input: $a" err > + fi > +' > + > +test_expect_success "stdin ${type} symref-delete ref fails with wrong old value" ' > + create_stdin_buf ${type} "symref-delete refs/heads/symref" "$m" && > + test_must_fail git update-ref --stdin ${type} --no-deref err && > + grep "fatal: cannot lock ref '"'"'refs/heads/symref'"'"'" err && You can use "${SQ}" to insert single quotes. Patrick > + git symbolic-ref refs/heads/symref >expect && > + echo $a >actual && > + test_cmp expect actual > +' > + > +test_expect_success "stdin ${type} symref-delete ref works with right old value" ' > + create_stdin_buf ${type} "symref-delete refs/heads/symref" "$a" && > + git update-ref --stdin ${type} --no-deref + test_must_fail git rev-parse --verify -q $b > +' > + > done > > test_done > -- > 2.43.GIT >