git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 0/4] Re: [PATCH 3/4] t: rev-parse-parents: avoid yoda conditions

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 4, 2013, 16:47 UTC
Message-ID
<xmqqli3co7ov.fsf@gitster.dls.corp.google.com>
In-Reply-To
<20130903170419.GA29921@google.com>
Jonathan Nieder <jrnieder@gmail.com> writes:
> test_cmp_rev follows the same order of arguments a "diff -u" and
> produces the same output as plain "git diff".  It's perfectly readable
> and normal.

This is way off tangent, but I am somewhat sympathetic to Felipe's "compare actual with expect", with reservations.

If one ignores all other constraints and focuses solely on the order of argument test_cmp takes, one would realize that it is backwards. A(ny) sanely defined "compare A with B" function should yield the result of subtracting B from A, i.e. cmp(A,B) should be like (A-B). That is what you feed qsort() and bsearch() (it is not limited to C; you see the same in "sort { $a <=> $b }"). The definition naturally makes "cmp(A,B) < 0" like "A < B" and "cmp(A,B) > 0" like "A > B".

But unfortunately, test_cmp is defined in terms of "diff -u" by feeding its parameters in the same order as given. "test_cmp A B" just turns into "diff -u A B".

Now, we _do_ want to see "diff -u expect actual", so that in the output, what is _missing_ in the actual output compared to the expected output is marked with "-", and what is _excess_ is marked with "+". If you think about it, this output from "diff -u expect actual" is giving us the result of subtracting expect from actual.

If we want to express it in terms of "cmp", we should be writing "cmp(actual,expect)", not "cmp(expect,actual)". The latter is to subtract actual from expect, which is backwards.

It would have been better if a wrapper around "diff" to give us a higher level "comparison" semantics, test_cmp, had been written in such a way that hid this backward behaviour of "diff", when it was introduced to replace hardcoded "diff -u".

I'd actually be ecstatic if one morning when I get up, I find that test_cmp implementation were replaced with (the moral equivalent of)

	test_cmp () {
		diff -u "$2" "$1"
	}

and all the callsites of test_cmp in the test scripts in all the topic branches in flight were also swapped to "test_cmp actual expect" without anybody having to worry about mismerges, merge conflicts and confusing people who are used to the current order for the past 5 years.

But I do not think that is going to happen without a careful planning. We may be able to manage the code somehow (we can drop all the topics in flight immediately after a release, apply the "swap the order" big patch, and rebase all the topics on top), but retraining people would not be instantaneous "flag day" event, and we will see mistakes for a few months after doing so.

Oh, well.
Previous: Felipe ContrerasNext: John Keeping
Message 24 of 45 in “t: rev-parse-parents: cleanups”
  1. 0/4 t: rev-parse-parents: cleanupsFelipe Contreras, Sep 2, 2013
  2. 1/4 t: rev-parse-parents: fix styleFelipe Contreras, Sep 2, 2013
  3. 2/4 t: rev-parse-parents: fix weird ! notationFelipe Contreras, Sep 2, 2013
  4. 3/4 t: rev-parse-parents: avoid yoda conditionsFelipe Contreras, Sep 2, 2013
  5. Jeff KingSep 3, 2013
  6. SZEDER GáborSep 3, 2013
  7. Jeff KingSep 3, 2013
  8. Felipe ContrerasSep 3, 2013
  9. SZEDER GáborSep 3, 2013
  10. Felipe ContrerasSep 3, 2013
  11. SZEDER GáborSep 3, 2013
  12. 0/4 Re: [PATCH 3/4] t: rev-parse-parents: avoid yoda conditionsJonathan Nieder, Sep 3, 2013
  13. 1/4 rev-parse test: modernize quoting and whitespaceJonathan Nieder, Sep 3, 2013
  14. 2/4 rev-parse test: use test_must_fail, not "if <command>; then false; fi"Jonathan Nieder, Sep 3, 2013
  15. Felipe ContrerasSep 3, 2013
  16. 3/4 rev-parse test: use test_cmp instead of "test" builtinJonathan Nieder, Sep 3, 2013
  17. Junio C HamanoSep 3, 2013
  18. Jonathan NiederSep 4, 2013
  19. Felipe ContrerasSep 3, 2013
  20. 4/4 rev-parse test: use standard test functions for setupJonathan Nieder, Sep 3, 2013
  21. 4/4 rev-parse test: use standard test functions for setupJonathan Nieder, Sep 3, 2013
  22. Jeff KingSep 3, 2013
  23. Felipe ContrerasSep 3, 2013
  24. Junio C HamanoSep 4, 2013
  25. John KeepingSep 4, 2013
  26. Junio C HamanoSep 4, 2013
  27. Jeff KingSep 4, 2013
  28. Junio C HamanoSep 4, 2013
  29. Felipe ContrerasSep 8, 2013
  30. Jeff KingSep 8, 2013
  31. Felipe ContrerasSep 8, 2013
  32. Felipe ContrerasSep 8, 2013
  33. Jeff KingSep 8, 2013
  34. Felipe ContrerasSep 8, 2013
  35. Jeff KingSep 8, 2013
  36. Felipe ContrerasSep 8, 2013
  37. Jeff KingSep 8, 2013
  38. Felipe ContrerasSep 9, 2013
  39. Junio C HamanoSep 8, 2013
  40. Felipe ContrerasSep 8, 2013
  41. Philip OakleySep 8, 2013
  42. Junio C HamanoSep 3, 2013
  43. Junio C HamanoSep 3, 2013
  44. Felipe ContrerasSep 3, 2013
  45. 4/4 t: rev-parse-parents: simplify setupFelipe Contreras, Sep 2, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.