From: Jakub Narebski <jnareb@gmail.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org
Subject: Re: [RFC] git blame-tree
Date: Thu, 03 Mar 2011 12:20:10 -0800 (PST) [thread overview]
Message-ID: <m3fwr46jp3.fsf@localhost.localdomain> (raw)
In-Reply-To: <20110302171653.GA18957@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
> On Wed, Mar 02, 2011 at 11:40:32AM -0500, Jeff King wrote:
> > It's sometimes useful to get a list of files in a tree along with the
> > last commit that touched them. This is the default tree view shown on
> > github.com, but it can also be handy from the command line (there has
> > been talk lately of having a "git ls"), or as plumbing for a local
> > fancier tree view. E.g., something like:
> >
> > add.c 6e7293e git-add: make -A description clearer vs. -u
> > apply.c fd03881 add description parameter to OPT__VERBOSE
> > blame.c 9ca1169 parse-options: Don't call parse_options_check() so much
> > branch.c 62270f6 branch_merged: fix grammar in warning
> > bundle.c 62b4698 Use angles for placeholders consistently
[...]
> > blame-tree.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++
> > blame-tree.h | 25 ++++++++
> > builtin.h | 1 +
> > builtin/blame-tree.c | 34 +++++++++++
>
> I tried to lib-ify the implementation as much as possible. It increases
> the lines of code, of course, but I figured there was a reasonable
> chance that there might be a user-friendly "git ls" command eventually,
> and this would probably make a good "-v" option to it.
I think it _might_ be a good idea to add `--blame' option to
"git ls-tree", as a one of ways of presenting tree-blame output.
Or perhaps as part of "git ls".
In "[RFC] Tree blame (git blame <directory>)"[1] I proposed for
$ git blame --abbrev v1.6.3.3 -- .
to generate
100644 blob e57630e ba19a80 Junio C Hamano Feb 10 17:42 walker.c
100644 blob 8a149e1 c13b263 Daniel Barkalow Apr 26 2008 walker.h
100644 blob 7eb3218 fc71db3 Alex Riesen Apr 29 23:21 wrapper.c
100644 blob 4c29255 559e840 Junio C Hamano Jul 20 2008 write_or_die.c
100644 blob 819c797 a437900 Junio C Hamano Jun 21 02:35 ws.c
100644 blob 1b6df45 2af202b Linus Torvalds Jun 18 10:28 wt-status.c
100644 blob 78add09 6c2ce04 Marius Storm-Olsen Jun 5 2008 wt-status.h
100644 blob b9b0db8 eb3a9dd Benjamin Kramer Mar 7 21:02 xdiff-interface.c
100644 blob 7352b9a 86295bb Rene Scharfe Oct 25 2008 xdiff-interface.h
040000 tree ef5d413 5719db9 Charles Bailey May 25 01:21 xdiff/
or something like that. Date doesn't have to be in this strange format
used by 'ls'. Also instead of name we can use username part of email,
or just email; OTOH git-blame uses above format for author.
This could be result of "git ls-tree --abbrev --blame v1.6.3.3"...
and it could be combined with `-l' option of git-ls-tree.
[1]: http://article.gmane.org/gmane.comp.version-control.git/122830
>
> I considered making it a special mode of "git blame" when blame is fed a
> directory instead of a file. But the implementations aren't shared at
> all (nor do I think they need to be; blame-tree is _way_ simpler). And I
> didn't want to steal that concept in case somebody can think of a more
> content-level way of blaming a whole tree that makes sense (obviously
> just showing the concatenation of the blames of each file is one way,
> but I don't know how useful that would be). If we want to go that way,
> we can always catch the special case in blame and just exec blame-tree.
Well, having "git blame [<rev>] <directory>" to output tre-blame
would allow to reuse some of already existing options to ordinary
git-blame; well those that makes sense, like `-b', `-S <revs-file>',
`--reverse', perhaps (depending on available output) also `-l', `-t',
`-s', `--date <format>'.
<rev> is here starting revision or revision range; if it is revision
range then negative specifiers function as boundary.
We could use `-M' to turn on rename detection, and `-C' to turn on
copy detection; I think that in tree-blame we need to consider only
_exact_ renames (pure renames, i.e. the same SHA-1, different name).
Also for GitHub (and perhaps also in the future for gitweb too) would
I think use `--porcelain' or even `--incremental' version of tree-blame;
in [1] I have proposed the following output (following existing "for
porcelain" format):
$ git blame --porcelain v1.6.3.3 -- .
86295bb6bac1482d29650d1f77f19d8e7a7cc2fe 7352b9a9c204c2b1d4ca9df5ce040fe22d6f521c
author Rene Scharfe
author-mail <rene.scharfe@lsrfire.ath.cx>
author-time 1224941475
author-tz +0200
committer Junio C Hamano
committer-mail <gitster@pobox.com>
committer-time 1224961771
committer-tz -0700
summary add xdi_diff_hunks() for callers that only need hunk lengths
filename xdiff-interface.h
100644 blob 7352b9a9c204c2b1d4ca9df5ce040fe22d6f521c xdiff-interface.h
5719db91ce5915ee07c50f1afdc94fe34e91529f ef5d413237b3a390007fba56671b00d7c371ae1e
author Charles Bailey
author-mail <charles@hashpling.org>
author-time 1243210874
author-tz +0100
committer Junio C Hamano
committer-mail <gitster@pobox.com>
committer-time 1243234594
committer-tz -0700
summary add xdi_diff_hunks() for callers that only need hunk lengths
filename xdiff
040000 tree ef5d413237b3a390007fba56671b00d7c371ae1e xdiff
> > +void blame_tree_init(struct blame_tree *bt)
> > +{
> > + memset(bt, 0, sizeof(*bt));
> > + bt->paths.strdup_strings = 1;
> > + init_revisions(&bt->rev, NULL);
> > + bt->rev.no_merges = 1;
> > + bt->rev.def = "HEAD";
> > +}
>
> I turn off merges by default, since they are unlikely to be interesting
> matches (you will see the merge of a side-branch that touched a file
> instead of the actual commit on the side-branch). You could of course do
> "git blame-tree . --no-merges" to get the same effect. I think no-merges
> makes a saner default, but sadly it doesn't seem like there is a way to
> turn no-merges back off ("--merges" means something else, and there is
> no --no-no-merges").
IMHO merges are interecting; moreover if I remember correctly my proof
of concept of tree-blame which I tried to implement in Perl using
Git.pm (git cat-file --batch + git diff-tree --stdin), I have problems
with merges in tree-blame of subdirectory ("--relative" option doesn't
work as I thought it did).
> Right now the code just handles trees. But in the long run, it would
> probably make sense to get the list of files from the index, and mark
> files modified in the working tree or index, too. So something like:
>
> foo.c 1234abcd this is a commit subject
> bar.c modified in working tree
> baz.c modified in index
>
> Sort of like how gitk shows "pseudo-commits" on top of history to
> indicate changes.
Or how "git blame" handles "--contents <file>" option... though what
you mentioned is more than that.
[...]
> > +int cmd_blame_tree(int argc, const char **argv, const char *prefix)
> > +{
> > + struct blame_tree bt;
> > + const char *path = NULL;
> > +
> > + git_config(git_default_config, NULL);
> > +
> > + if (argv[1]) {
> > + path = argv[1];
> > + argc--;
> > + argv++;
> > + }
>
> Obviously no options. Probably there should at least be "--porcelain" to
> output the current form, and the default output should be more
> user-friendly. And probably "-z" to avoid quoting issues.
Thank you for working on this.
--
Jakub Narebski
Poland
ShadeHawk on #git
next prev parent reply other threads:[~2011-03-03 20:20 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-02 16:40 [RFC] git blame-tree Jeff King
2011-03-02 17:16 ` Jeff King
2011-03-02 17:51 ` Piotr Krukowiecki
2011-03-02 18:07 ` Jeff King
2011-03-02 18:39 ` Piotr Krukowiecki
2011-03-02 21:10 ` Jeff King
2011-03-02 21:24 ` Piotr Krukowiecki
2011-03-02 21:41 ` Jeff King
2011-03-02 18:31 ` Junio C Hamano
2011-03-02 21:04 ` Jeff King
2011-03-02 23:22 ` Junio C Hamano
2011-03-03 15:36 ` Jeff King
2011-03-05 5:41 ` Ryan Tomayko
2011-03-03 20:20 ` Jakub Narebski [this message]
2011-03-02 17:40 ` Jeff King
2011-03-04 14:40 ` Will Palmer
2011-03-04 14:53 ` Jeff King
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=m3fwr46jp3.fsf@localhost.localdomain \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/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).