From: Jeff King <peff@peff.net>
To: Theodore Ts'o <tytso@mit.edu>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: [PATCH] pretty: add format specifiers: %gr, %gt, %gI, gi
Date: Mon, 11 Jul 2016 01:02:02 -0400 [thread overview]
Message-ID: <20160711050201.GA18031@sigill.intra.peff.net> (raw)
In-Reply-To: <20160710142622.GE26097@thunk.org>
On Sun, Jul 10, 2016 at 10:26:22AM -0400, Theodore Ts'o wrote:
> On Sun, Jul 10, 2016 at 02:16:45AM -0400, Jeff King wrote:
> > I wonder if a better approach would be:
> >
> > 1. In the short term, add specific designators for the fields you'd
> > want. One for HEAD@{n} that is unaffected by date, as %gd is (or
> > even one for the branch-name and one for "n"). And one for the
> > reflog date, by itself, in whatever format --date= asked for.
> >
> > That would let you do your format above, though it does not let you
> > show the reflog date in multiple formats.
>
> Hrm, maybe. I didn't realize that %gd and %gD displayed something
> very different if --date is specified. Is this documented? I looked
> everywhere, and the closest I could find is a mention in the
> description of -g that if you specify commit@{now}, the output will
> use commit@{timestamp} notation --- but that's different from
> --date=xxx, and it doesn't actually specify which pretty-printer
> format string this affects, although I suppose that's not that hard to
> infer.
I couldn't find anything beyond the bit that you mentioned. So no
explanation of "--date", and no mention that "%gd" is affected by the
usual "-g" output rules. I have two patches to improve that.
> One other thing I'll note in passing is that the --date notation
> doesn't support Unix timestamps. So you can't actually do the
> equivalent of %gt as proposed in this patch.
We have "--date=raw", but that's not _quite_ the same, as it includes
the timezone. I think we should have "--date=unix" for this case. Patch
to follow.
> I'm not sure what designators we'd use for a HEAD@{n} that is
> uneffected by date, and as far as which arbitrary two-letter code for
> "reflog date in the default date format", we can't use %gd (ala %ad or
> %cd), since it's already spoken for. %gr, %gt, etc., at least have
> the advantage that they are somewhat orthogonal to %ar/%at, %cr/%ct,
> etc.
Yeah, I'd have hoped for %gd, as well. One thing I think we should move
towards in the long run is giving more readable names to our
placeholders for git-log, the way for-each-ref and cat-file do (but
keeping the existing ones for compatibility and as a shorthand).
So ideally the answer in the long run is:
%(reflog-ref)@{%(reflog-index)}
or possibly:
%(reflog:index)
for the whole thing. Or something like that. I haven't thought that hard
about the exact syntax.
But anyway, I don't necessarily expect you to dig into that much larger
topic.
> So I definitely understand the concern about the PP format string
> being somewhat creaky, and obscure. It's not entirely clearly to me
> that adding the new designators actually doesn't add more bloat or
> non-orthogonality. I suppose we could add %gb for branch name, and
> %gU for the HEAD@{n} nUm --- since %gn and %gN are already spoken for
> --- and then use %gt for the reflog date in the default date format.
> So that only adds three new two-letter formats, instead of the four in
> my patch.
>
> (BTW, I really only care about %gt and %gr --- so if the concern is
> bloat, we could just add those two specifiers. I just added %gi and
> %gI because it wasn't hard, and I thought orthoganlity was better
> where it was possible.)
To me it's less about the number, and more the issue that:
1. It's half-implemented. Why can we do format X, but not format Y
(for that matter, why can you do %ct, but there is no --date format
that matches it?). That sort of non-orthogonality ends up
frustrating for users and makes git look creaky and poorly thought
out.
2. Every shorthand we pick, especially for things that aren't commonly
used, eats up the namespace. If I were designing from scratch, I'd
say the reflog selector shouldn't be %gd; that should be reserved
for symmetry with %ad and %cd.
I think your patch is not really an offender here, though; if
anything it's helping symmetry.
> One possibility is %{authordate:format:%s} --- but it suffers from two
> drawbacks:
Yeah, I agree that's pretty horrid. We should have "Unix timestamp" as a
first-class format.
> One other long-term thought. Maybe past a certain point, we should
> just make it easy to get the data from git-log into a perl or pythons
> script, where it becomes possible to do conditionals, more flexible
> padding rules, etc. So some kind of --format=yaml or --format=json
> sort of thing. Some interesting ideas of how we could do this can be
> found here:
I do like that idea, though I think that's a somewhat orthogonal
concept, just because this kind of pretty-format stuff is used in two
ways. One, to easily get it into another script which will do something
clever with it. And two, to make nicer formats for everyday use for
things like "git log", "git branch -v", and so on.
The two needs only intersect when your plan is to get it into a perl
script which will do the nice formatting. :)
So I think --format=json is a great idea for getting it into a separate
script, but it doesn't help people much who just want to customize their
git-log output. As an aside, there was talk and some patches long ago
about having a json-format for a lot of different commands. E.g., not
just "git log", but "git status --porcelain", etc. I like the general
idea; line-oriented is convenient with the usual shell tools, but the
quoting is sometimes a nightmare (and I think the "status --porcelain"
output is even context-sensitive, which is horrible to parse). If you're
interested, I think this is the probably the most relevant thread:
http://thread.gmane.org/gmane.comp.version-control.git/144642
For pretty formats themselves (and possibly other script-ish bits, like
commit selection), I had experimental patches at one point to embed a
lua interpreter:
http://thread.gmane.org/gmane.comp.version-control.git/206335
Again, I don't expect you to pick up and run with either of those idea
(but I'd love it if you did!). Just adding to the discussion. :)
> ... although I doubt whether git would ever want to do the equivalent of:
>
> gcloud compute images list --format='table[box,title=Images](name:sort=1,family)'
>
> which will print something like this:
That's neat, though I think I'd really prefer just making it easy to get
the data out of git in a structured way, and then applying some cool
json-formatting script to it. Surely "turn this json into a table" is a
thing that could be solved once for everybody (I don't work with it
enough to know, but maybe "jq" can do that already).
But let's get back to reality for a moment. Here are some patches that
address the issues you brought up above.
[1/5]: doc/rev-list-options: clarify "commit@{Nth}" for "-g" option
[2/5]: doc/rev-list-options: explain "-g" output formats
[3/5]: doc/pretty-formats: describe index/time formats for %gd
[4/5]: date: document and test "raw-local" mode
[5/5]: date: add "unix" format
The next step is either:
- add specific reflog-time-formats, as your patch does
- add a generic reflog-date placeholder, so you can do:
git log --date=unix --format='%gT'
or whatever. That still doesn't give you multiple date types in a
single invocation, though. It's probably not much code to do so, but
designing the syntax and supporting existing placeholders would be
some work.
I'm on the fence, so I'll let you decide how you want to proceed. I can
live with "%gr" and "%gt", as they are at least symmetric with their
author/committer counterparts.
-Peff
next prev parent reply other threads:[~2016-07-11 5:02 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-10 5:54 [PATCH] pretty: add format specifiers: %gr, %gt, %gI, gi Theodore Ts'o
2016-07-10 6:16 ` Jeff King
2016-07-10 14:26 ` Theodore Ts'o
2016-07-10 16:05 ` Duy Nguyen
2016-07-10 23:28 ` Theodore Ts'o
2016-07-11 5:02 ` Jeff King [this message]
2016-07-11 5:03 ` [PATCH 1/5] doc/rev-list-options: clarify "commit@{Nth}" for "-g" option Jeff King
2016-07-11 5:04 ` [PATCH 2/5] doc/rev-list-options: explain "-g" output formats Jeff King
2016-07-11 5:05 ` [PATCH 3/5] doc/pretty-formats: describe index/time formats for %gd Jeff King
2016-07-11 16:48 ` Theodore Ts'o
2016-07-12 0:08 ` Jeff King
2016-07-12 2:01 ` Junio C Hamano
2016-07-11 5:06 ` [PATCH 4/5] date: document and test "raw-local" mode Jeff King
2016-07-11 16:50 ` Theodore Ts'o
2016-07-12 0:16 ` Jeff King
2016-07-11 5:07 ` [PATCH 5/5] date: add "unix" format Jeff King
2016-07-11 16:43 ` [PATCH] pretty: add format specifiers: %gr, %gt, %gI, gi Theodore Ts'o
2016-07-11 19:07 ` 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=20160711050201.GA18031@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=tytso@mit.edu \
/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).