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

Re: [PATCH v2 0/3] remote: replace static variables with struct remote_state

From
Glen Choo <chooglen@google.com>
Date
Oct 13, 2021, 21:56 UTC
Message-ID
<kl6ltuhk1tdg.fsf@chooglen-macbookpro.roam.corp.google.com>
In-Reply-To
<xmqqtuhkfzw8.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 29 quoted lines
>>    However, I believe that some questions *shouldn't* be answered by
>>    just struct branch. The prime example in this series is
>>    branch_get_push() - it conceptually answers 'What is the pushremote
>>    of this branch', but the behavior we want is closer to 'If
>>    configured, give me the pushremote for the branch. Otherwise, give me
>>    the default pushremote of the repo.'. This is arguably a relevant
>>    detail that should be exposed to callers.
>
> It is a good example why such a function can just take an instance
> of branch, and the caller,
>
>  (1) who does care about the fallback, can be assured that the logic
>      falls back to the correct repository; and
>
>  (2) who does not care about the fallback and sees it a mere
>      implementation detail of "I am on this branch; give me the
>      remote to push to", do not have to know what, other than the
>      branch object, needs to be passed.
>
> if we explicitly record a branch object which repository it was
> taken from.
>
> There may be some other (real) reason where the resistance comes
> from, that you may not be telling us, though.  But in what was
> described in the message I am responding to, I didn't see much
> convincing reason to argue _for_ keeping the contained objects
> ignorant of the container and forcing callers to pass both to
> functions that use both the container and contained to compute
> something.

My primary line of thinking is that adding the backpointer from struct branch to struct repository adds "unnecessary" coupling between the two objects, which causes the more concrete problems of:

* Inconsistency between other functions that use struct repository as a
  "context object". We now find ourselves having to justify why branch
  functions can bypass the context object using a special pointer,
  whereas other functions and structs (say, struct object) cannot.
* Interface misuse, where callers can now dereference branch->repository
  even though it is meant to be internal. This is also a possible source
  of inconsistency.
* Extra memory consumption.

A counterpoint to what I said is [1], where Jonathan eventually added the backpointer from struct ref_store to struct repository, which does give the nice benefits of referential integrity and abstraction that you cited. However in most of that series, struct ref_store is meant to be the context object, but due to poor internal abstraction, ref_store ends up depending on repository in some form or another and thus the backpointer is more defensible (as opposed to passing two context objects). I do not think we are in the same position with struct branch; struct branch seems sufficiently separated to me.

I'm not opposed to adding a backpointer if it helps us get to a good final state, but I currently suspect that the final state still involves passing around struct repository as a context object.

[1] https://lore.kernel.org/git/xmqqlf3gib0p.fsf@gitster.g/
Previous: Glen ChooNext: Junio C Hamano
Message 19 of 56 in “remote: replace static variables with struct remote_state”
  1. 0/2 remote: replace static variables with struct remote_stateGlen Choo via GitGitGadget, Oct 7, 2021
  2. 1/2 remote: move static variables into structGlen Choo via GitGitGadget, Oct 7, 2021
  3. Junio C HamanoOct 7, 2021
  4. 2/2 remote: add remote_state to struct repositoryGlen Choo via GitGitGadget, Oct 7, 2021
  5. Junio C HamanoOct 7, 2021
  6. Glen ChooOct 8, 2021
  7. 0/3 remote: replace static variables with struct remote_stateGlen Choo, Oct 13, 2021
  8. 1/3 remote: move static variables into per-repository structGlen Choo, Oct 13, 2021
  9. Junio C HamanoOct 13, 2021
  10. Glen ChooOct 14, 2021
  11. Junio C HamanoOct 14, 2021
  12. 2/3 remote: use remote_state parameter internallyGlen Choo, Oct 13, 2021
  13. Junio C HamanoOct 13, 2021
  14. 3/3 remote: add struct repository parameter to external functionsGlen Choo, Oct 13, 2021
  15. Junio C HamanoOct 13, 2021
  16. Junio C HamanoOct 13, 2021
  17. Junio C HamanoOct 13, 2021
  18. Glen ChooOct 13, 2021
  19. Glen ChooOct 13, 2021
  20. Junio C HamanoOct 13, 2021
  21. Glen ChooOct 14, 2021
  22. 0/4 remote: replace static variables with struct remote_stateGlen Choo, Oct 19, 2021
  23. 1/4 remote: move static variables into per-repository structGlen Choo, Oct 19, 2021
  24. 2/4 remote: use remote_state parameter internallyGlen Choo, Oct 19, 2021
  25. Junio C HamanoOct 20, 2021
  26. Junio C HamanoOct 20, 2021
  27. Junio C HamanoOct 20, 2021
  28. Glen ChooOct 25, 2021
  29. Glen ChooOct 25, 2021
  30. Junio C HamanoOct 25, 2021
  31. Glen ChooOct 25, 2021
  32. Junio C HamanoOct 26, 2021
  33. Junio C HamanoOct 26, 2021
  34. Glen ChooOct 26, 2021
  35. Junio C HamanoOct 27, 2021
  36. Glen ChooOct 27, 2021
  37. Junio C HamanoOct 27, 2021
  38. 3/4 remote: remove the_repository->remote_state from static methodsGlen Choo, Oct 19, 2021
  39. 4/4 remote: add struct repository parameter to external functionsGlen Choo, Oct 19, 2021
  40. 0/6 remote: replace static variables with struct remote_stateGlen Choo, Oct 28, 2021
  41. 1/6 t5516: add test case for pushing remote refspecsGlen Choo, Oct 28, 2021
  42. Junio C HamanoOct 28, 2021
  43. Jonathan TanNov 15, 2021
  44. Glen ChooNov 15, 2021
  45. 2/6 remote: move static variables into per-repository structGlen Choo, Oct 28, 2021
  46. 3/6 remote: use remote_state parameter internallyGlen Choo, Oct 28, 2021
  47. 4/6 remote: remove the_repository->remote_state from static methodsGlen Choo, Oct 28, 2021
  48. Jonathan TanNov 15, 2021
  49. 5/6 remote: die if branch is not found in repositoryGlen Choo, Oct 28, 2021
  50. Jonathan TanNov 15, 2021
  51. Glen ChooNov 15, 2021
  52. Jonathan TanNov 16, 2021
  53. 6/6 remote: add struct repository parameter to external functionsGlen Choo, Oct 28, 2021
  54. Jonathan TanNov 15, 2021
  55. Glen ChooNov 15, 2021
  56. Glen ChooNov 12, 2021

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.