From: Josh Triplett <josh@joshtriplett.org>
To: "Jakub Narębski" <jnareb@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, Stefan Beller <sbeller@google.com>
Subject: Re: Extending "extended SHA1" syntax to traverse through gitlinks?
Date: Wed, 24 Aug 2016 16:21:33 -0400 [thread overview]
Message-ID: <20160824202133.olvifmet3g4yeswr@x> (raw)
In-Reply-To: <165ac159-29e8-10d1-49ee-e5ff6543d0d2@gmail.com>
On Wed, Aug 24, 2016 at 07:05:17PM +0200, Jakub Narębski wrote:
> W dniu 24.08.2016 o 16:20, Josh Triplett pisze:
> > On Wed, Aug 24, 2016 at 03:16:56PM +0200, Jakub Narębski wrote:
> [...]
> >> Not really.
> >>
> >> The above means only that the support for new syntax would be not
> >> as easy as adding it to 'git rev-parse' (and it's built-in equivalent),
> >> except for the case where submodule uses the same object database as
> >> supermodule.
> >>
> >> So it wouldn't be as easy (on conceptual level) as adding support
> >> for ':/<text>' or '<commit>^{/<text>}'. It would be at least as
> >> hard, if not harder, as adding support for '@{-1}' and its '-'
> >> shortcut.
> >
> > Depends on which cases you want to handle. In the most general case,
> > you'd need to find and process the applicable .gitmodules file, which
> > would only work if you started from the top-level tree, not a random
> > treeish. On the other hand, in the most general case, you don't
> > necessarily even have the module you need, because .git/modules only
> > contains the modules the *current* version needed, not every past
> > version.
>
> There is an additional problem, namely that directory with submodule
> can be renamed.
>
> I don't know if there is an existing API, but assuming modern
> git-submodule (with repository in .git/modules) you would have to
> do the following steps for <revision>:<path/to/submodule>//<path>:
>
> * look up <revision>:.gitmodules for module which 'path'
> is <path/to/submodule>; let's say it is named <submodule>
> * check if <revision>:<path/to/submodule> commit object
> is present in .git/modules/<submodule>
> * look up this object
This also assumes your lookup started with a <committish> and not an
intermediate <treeish>, but that'll work in many cases.
> > As an alternate approach (pun intended): treat every module in
> > .git/modules as an alternate and just look up the object by hash.
>
> This could be a good fallback, to search through all submodules.
>
> > Or, teach git-submodule to store all the objects for submodules in the
> > supermodule's .git/objects (and teach git's reachability algorithm to
> > respect refs in .git/modules, or store their refs in
> > .git/refs/submodules/ or in a namespace).
>
> And fallback to this fallback could be searching through supermodule
> object repository.
I'd flip those around: first search registered .gitmodules, then look up
the object in the superproject (since you have it at hand), and then
maybe search every submodule.
> >> Josh, what was the reason behind proposing this feature? Was it
> >> conceived as adding completeness to gitrevisions syntax, a low-hanging
> >> fruit? It isn't (the latter). Or was it some problem with submodule
> >> handling that you would want to use this syntax for?
> >
> > This wasn't an abstract/theoretical completeness issue. I specifically
> > wanted this syntax for practical use with actual trees containing
> > gitlinks, motivated by having a tool that creates and uses such
> > gitlinks. :)
>
> Could you explain what you need in more detail? Is it a fragment
> of history of submodule, a contents of a file at given point of
> superproject history, diff between file-in-submodule and something
> else, or what?
As part of git-series, I have commits, whose trees contain various
gitlinks, such as "series" and "base". Those gitlinks point to commits
in the same repository. I'd like to use those gitlinks everywhere I
could use any other committish, such as a branch name. In particular,
I'd like to write things like some_feature:series:path/to/file ("what
does path/to/file look like in the current version of some_feature"),
some_feature:series^ ("what's the second-to-last commit in
some_feature"), some_feature~5:series:path/to/file ("what did
path/to/file look like in an older version of some_feature"), or
some_feature~5:base..some_feature~5:series~2 ("all but the last two
patches in some_feature~5"). Those should work with show, diff,
format-patch, log, etc.
> >> As for usefulness: this fills the hole in accessing submodules, one
> >> that could be handled by combining plumbing-level commands. Namely,
> >> there are 5 states of submodule (as I understand it)
> >>
> >> * recorded in ref / commit in supermodule
> >> * recorded in the index in supermodule
> >> - recorded in ref / commit in submodule
> >> - recorded in the index in submodule
> >> - state of worktree in submodule
> >>
> >> The last three can be easyly acessed by cd-ing to submodule. The first
> >> two are not easy to get, AFAIUC.
> >
> > Right. I primarily care about those first two cases, especially the
> > first one: given a commit containing a gitlink, how can I easily dig
> > into the linked commit?
>
> All right.
>
> Though you can cobble it with plumbing... just saying.
Sure, but that makes the expression much more complex.
next prev parent reply other threads:[~2016-08-24 20:22 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-20 22:50 Extending "extended SHA1" syntax to traverse through gitlinks? Josh Triplett
2016-08-21 13:46 ` Jakub Narębski
2016-08-21 14:26 ` Josh Triplett
2016-08-22 18:39 ` Jakub Narębski
2016-08-23 6:53 ` Josh Triplett
2016-08-23 20:24 ` Jakub Narębski
2016-08-24 5:36 ` Junio C Hamano
2016-08-24 13:16 ` Jakub Narębski
2016-08-24 14:20 ` Josh Triplett
2016-08-24 16:26 ` Stefan Beller
2016-08-24 17:05 ` Jakub Narębski
2016-08-24 20:21 ` Josh Triplett [this message]
2016-08-23 16:39 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160824202133.olvifmet3g4yeswr@x \
--to=josh@joshtriplett.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jnareb@gmail.com \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).