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

Re: Summer of Code project ideas due this Friday

From
Jeff King <peff@peff.net>
Date
Mar 10, 2011, 21:42 UTC
Message-ID
<20110310214206.GA15828@sigill.intra.peff.net>
In-Reply-To
<7vtyfa3ddm.fsf@alter.siamese.dyndns.org>
On Thu, Mar 10, 2011 at 12:54:29PM -0800, Junio C Hamano wrote:
Show 6 quoted lines
> Forgetting for now the implementation, I _think_ what you would want is
> for "git add -p" to notice that you are resolving conflicts, and do not
> bother you about cleanly merged parts (I take it is a given that you would
> always want to add them to the index without even inspecting when running
> "add -p"), and make the per-hunk selection loop ask only about the parts
> that originally had conflicts.

Yes, I don't want to see cleanly merged parts. And "--cc" already does what I want by not showing them. But of course they still need to be added to the index.

So my thinking was more along the lines of:
  1. Get "git diff HEAD file" and store its hunks.
  2. Get "git diff --cc file" and stores its hunks.
  3. For each hunk in (1), if it does not have an analagous hunk in (2),
     mark it for staging without asking the user.
  4. For the remaining hunks in (1), show the user the analagous --cc
     hunk from (2), and mark the hunk from (1) for staging if requested.
  5. Create the final patch from the marked hunks, apply it to
     HEAD:file, and put that in the index.

There are two issues (and I think you know this, but it took me reasoning out why this wouldn't work to quite understand what you were saying in your email, so I'll elaborate here for the benefit of other readers):

  a. Step (3) glosses over the definition of "analagous hunk". In simple
     cases the hunk headers match up (i.e., they start at the same
     offsets). But the --cc diff is actually a diff against the merge
     base, and the diff in step (1) is against HEAD. So actually we
     would want step (1) and (5) to deal not with the file in HEAD, but
     the file in the merge-base.
     Or we can use "-c" in the first place, which gives us interesting
     and uninteresting parts, and then suppress the uninteresting ones.
  b. You can't stage part of a resolution. This is the "adding a path
     collapses stages to #0" that you mentioned. So either you need an
     index extension, or you need to make it all-or-nothing.
> [discussion of how this could be done right]

That description makes sense to me, but is way overkill for my workflow. I think at its simplest, what I would like is to be shown the entire --cc diff, have it say "do you want this and all of the cleanly merged bits added?" and then either stage the whole thing or not.

Which really I could do with:
  for i in `git diff-files --name-only --diff-filter=U`; do
    git diff --cc $i
    echo 'OK?'
    read r
    test "$r" = y && git add $i
  done

It would just be a little nicer to have it integrated into the "git add -p" loop.

Even though it is obviously a less featureful solution than what you proposed, I am tempted to implement it anyway because the current behavior is so bad (it shows the diff but doesn't consider it a selectable hunk at all, so it just skips it, exiting immediately if there are no other files).

And then if somebody wants to spend time allowing partial resolution selection, it would be a nice improvement on top of that.

-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 22 of 63 in “Google Summer of Code 2011”
  1. Shawn PearceMar 3, 2011
  2. Jeff KingMar 3, 2011
  3. Shawn PearceMar 3, 2011
  4. Jeff KingMar 3, 2011
  5. Jakub NarebskiMar 3, 2011
  6. Jeff KingMar 9, 2011
  7. Jeff KingMar 9, 2011
  8. Shawn PearceMar 9, 2011
  9. Jeff KingMar 9, 2011
  10. Shawn PearceMar 9, 2011
  11. Summer of Code project ideas due this FridayJeff King, Mar 9, 2011
  12. Jonathan NiederMar 10, 2011
  13. Jeff KingMar 10, 2011
  14. Shawn PearceMar 10, 2011
  15. Alexander MiselerMar 10, 2011
  16. Thomas RastMar 10, 2011
  17. Santi BéjarMar 10, 2011
  18. Jeff KingMar 10, 2011
  19. Junio C HamanoMar 10, 2011
  20. Jeff KingMar 10, 2011
  21. Junio C HamanoMar 10, 2011
  22. Jeff KingMar 10, 2011
  23. Junio C HamanoMar 10, 2011
  24. Jeff KingMar 10, 2011
  25. Thomas RastMar 11, 2011
  26. Jakub NarebskiMar 10, 2011
  27. Thomas RastMar 11, 2011
  28. History surgery with fast-import (Re: Summer of Code project ideas due this Friday)Jonathan Nieder, Mar 12, 2011
  29. Ramkumar RamachandraMar 13, 2011
  30. Nguyen Thai Ngoc DuyMar 10, 2011
  31. Jeff KingMar 10, 2011
  32. Alexander MiselerMar 10, 2011
  33. Jeff KingMar 10, 2011
  34. Alexander MiselerMar 11, 2011
  35. Alexander MiselerMar 12, 2011
  36. Alexander MiselerMar 11, 2011
  37. Ilari LiusvaaraMar 11, 2011
  38. Nguyen Thai Ngoc DuyMar 11, 2011
  39. Alexander MiselerMar 11, 2011
  40. Nguyen Thai Ngoc DuyMar 11, 2011
  41. Sam VilainMar 11, 2011
  42. Alexander MiselerMar 12, 2011
  43. Ævar Arnfjörð BjarmasonMar 11, 2011
  44. code.sculptor@gmail.comMar 11, 2011
  45. Jakub NarebskiMar 17, 2011
  46. Heiko VoigtMar 22, 2011
  47. J.H.Mar 22, 2011
  48. Pat ThoytsMar 25, 2011
  49. Jakub NarebskiMar 25, 2011
  50. Ramkumar RamachandraMar 3, 2011
  51. Jonathan NiederMar 3, 2011
  52. Sverre RabbelierMar 7, 2011
  53. Ramkumar RamachandraMar 8, 2011
  54. Sverre RabbelierMar 8, 2011
  55. Jens LehmannMar 3, 2011
  56. Christian CouderMar 5, 2011
  57. Sam VilainMar 6, 2011
  58. Heiko VoigtMar 7, 2011
  59. Fredrik GustafssonMar 7, 2011
  60. Heiko VoigtMar 9, 2011
  61. Fredrik GustafssonMar 9, 2011
  62. Heiko VoigtMar 10, 2011
  63. Thomas RastMar 9, 2011

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.