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

Re: git-name-rev off-by-one bug

From
Junio C Hamano <junkio@cox.net>
Date
Nov 30, 2005, 20:05 UTC
Message-ID
<7vsltdsxzb.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.64.0511301235390.25300@iabervon.org>
Daniel Barkalow <barkalow@iabervon.org> writes:
Show 7 quoted lines
> On Mon, 28 Nov 2005, Junio C Hamano wrote:
>
>> *1* It is a shame that the most comprehensive definition of
>> 3-way read-tree semantics is in t/t1000-read-tree-m-3way.sh test
>> script.
>
> Isn't Documentation/technical/trivial-merge.txt more comprehensive?

It describes the multi-base extention while the old one was done before the multi-base, so content-wise it may be more up to date.

One thing I have most trouble with is that it is not obvious if the table is covering all the cases. You have to read from top to bottom and consider the first match as its fate [*1*]. I was about to write "with no match resulting in no merge", but it is not even obvious if there are cases that would fall off at the end from the table by just looking at it. Even worse, if we add "no match results in no merge" at the end, by definition it covers all the cases, but it is not obvious what those fall-off cases are (IOW, what kinds of conflict they are and why they are not handled).

Another thing, perhaps more important, is taht it does not seem to talk about index and up-to-dateness requirements much; it says something about what happens when "no merge" result is taken, but it is not clear about other cases. The table in t1000 test marks the case with "must match X" when index and tree X must agree at the path, and with "must match X and be up-to-date" when in addition the file in the working tree must match what is recorded in the index at the path (i.e. the former can have local modification in the working tree as long as index entry and tree match).

This is vital in making sure that read-tree 3-way merge does not lose information from the working tree. I am sure your updated *code* is doing the right thing, but the documentation is not clear about it. E.g. case 3ALT in the table says "take our branch if the path does not exist in one or more of common ancestors and the other branch does not have it" without saying anything about index nor up-to-dateness requirements. In this case, the index must match HEAD but the working tree file is allowed to have local modification (t1000 table says "must match A"). If somebody wants to audit if the current read-tree.c does the right thing for this case, he needs the documentation to tell him what should happen. There may be thinko in the design (IOW, the index requirements the documentation places may not make sense) that can be found during such an audit. There may be implementation error that the code does not match what the documentation says should happen. Not having that information in the case table makes these verification difficult.

> Probably the tables in various other places should be replaced with 
> references to this document.

I agree 100% that having them scattered all over is bad and the trivial-merge.txt is the logical place to consolidate them, but I do not think simply removing others and pointing at trivial-merge.txt without updating it is good enough.

[Footnote]

*1* That is OK from an implementation point of view (i.e. we can look at the table, and then go to C implementation and follow its if-elif chain to see if the same checks are done in the same order as specified in the document), but for somebody who wants to understand the semantics, i.e. what the thing it does means, by looking at the documentation it is harder to read.

Previous: Daniel BarkalowNext: Daniel Barkalow
Message 57 of 64 in “git-name-rev off-by-one bug”
  1. linux@horizon.comNov 28, 2005
  2. Junio C HamanoNov 29, 2005
  3. linux@horizon.comNov 29, 2005
  4. Junio C HamanoNov 29, 2005
  5. Junio C HamanoNov 30, 2005
  6. Petr BaudisNov 29, 2005
  7. Junio C HamanoNov 29, 2005
  8. Petr BaudisDec 4, 2005
  9. as promised, docs: git for the confusedlinux@horizon.com, Dec 8, 2005
  10. Junio C HamanoDec 8, 2005
  11. H. Peter AnvinDec 8, 2005
  12. Alan ChandlerDec 9, 2005
  13. Petr BaudisDec 9, 2005
  14. Josef WeidendorferDec 9, 2005
  15. linux@horizon.comNov 29, 2005
  16. Junio C HamanoNov 29, 2005
  17. linux@horizon.comNov 30, 2005
  18. Junio C HamanoNov 30, 2005
  19. Junio C HamanoNov 30, 2005
  20. Linus TorvaldsNov 30, 2005
  21. Junio C HamanoNov 30, 2005
  22. Junio C HamanoNov 30, 2005
  23. Linus TorvaldsNov 30, 2005
  24. Linus TorvaldsNov 30, 2005
  25. Junio C HamanoNov 30, 2005
  26. Junio C HamanoNov 30, 2005
  27. Linus TorvaldsNov 30, 2005
  28. Linus TorvaldsNov 30, 2005
  29. Junio C HamanoDec 2, 2005
  30. merge-one-file: make sure we create the merged file.Junio C Hamano, Dec 2, 2005
  31. merge-one-file: make sure we do not mismerge symbolic links.Junio C Hamano, Dec 2, 2005
  32. git-merge documentation: conflicting merge leaves higher stages in indexJunio C Hamano, Dec 2, 2005
  33. linux@horizon.comNov 30, 2005
  34. Junio C HamanoNov 30, 2005
  35. More merge questionslinux@horizon.com, Nov 30, 2005
  36. Daniel BarkalowNov 30, 2005
  37. Junio C HamanoNov 30, 2005
  38. linux@horizon.comDec 2, 2005
  39. Junio C HamanoDec 2, 2005
  40. Sven VerdoolaegeDec 2, 2005
  41. Junio C HamanoDec 2, 2005
  42. Sven VerdoolaegeDec 5, 2005
  43. linux@horizon.comDec 2, 2005
  44. Junio C HamanoDec 2, 2005
  45. linux@horizon.comDec 2, 2005
  46. Junio C HamanoDec 2, 2005
  47. Linus TorvaldsDec 2, 2005
  48. linux@horizon.comDec 2, 2005
  49. linux@horizon.comDec 2, 2005
  50. Linus TorvaldsNov 30, 2005
  51. Junio C HamanoNov 30, 2005
  52. Junio C HamanoNov 30, 2005
  53. Junio C HamanoNov 30, 2005
  54. linux@horizon.comNov 30, 2005
  55. Daniel BarkalowNov 30, 2005
  56. Daniel BarkalowNov 30, 2005
  57. Junio C HamanoNov 30, 2005
  58. Daniel BarkalowNov 30, 2005
  59. Junio C HamanoNov 30, 2005
  60. Daniel BarkalowNov 30, 2005
  61. Junio C HamanoDec 1, 2005
  62. Junio C HamanoDec 1, 2005
  63. Petr BaudisDec 1, 2005
  64. Randal L. SchwartzDec 1, 2005

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.