From: Stefan Beller <stefanbeller@googlemail.com>
To: Thomas Rast <tr@thomasrast.ch>
Cc: Josh Triplett <josh@joshtriplett.org>,
Michael Haggerty <mhagger@alum.mit.edu>,
git@vger.kernel.org, Dan Carpenter <dan.carpenter@oracle.com>,
Greg KH <greg@kroah.com>,
ksummit-2013-discuss@lists.linuxfoundation.org,
ksummit-attendees@lists.linuxfoundation.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] commit: Add -f, --fixes <commit> option to add Fixes: line
Date: Sun, 27 Oct 2013 18:03:12 +0100 [thread overview]
Message-ID: <526D4750.7040804@googlemail.com> (raw)
In-Reply-To: <87zjpuznf1.fsf@thomasrast.ch>
On 10/27/2013 05:30 PM, Thomas Rast wrote:
> Stefan Beller <stefanbeller@googlemail.com> writes:
>
>> I assembled an overview table, which plots the long options of
>> git commands by the short letters.
> [...]
>> (In case thunderbird messes it up, here it is again http://pastebin.com/raw.php?i=JBci2Krx)
>>
>> As you can see, f is always --force except for git-config, where it is --file
>
> Woah! Impressive work. Did you autogenerate this? If so, can we have
> it as a small make target somewhere? If not, can you send a patch to
> put your table in Documentation somewhere?
>
I thought about generating it by parsing the man pages,
but I felt it would not be reliable enough and quite time consuming
to come up with a parser. Parsing the C sources however also seemed time consuming,
so I decided to come up with this patch:
--8<--
Subject: [PATCH] parse-options: print all options having short and long form and exit
This patch basically only prints all options which have a long and a short form
and then aborts the program. A typical output looks like this:
./git-add
add, n, dry-run
add, v, verbose
add, i, interactive
add, p, patch
add, e, edit
add, f, force
add, u, update
add, N, intent-to-add
add, A, all
---
parse-options.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/parse-options.c b/parse-options.c
index 62e9b1c..b356ca9 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -500,6 +500,12 @@ int parse_options(int argc, const char **argv, const char *prefix,
{
struct parse_opt_ctx_t ctx;
+ for (; options->type != OPTION_END; options++) {
+ if (options->long_name && options->short_name)
+ printf("%s, %c, %s\n", argv[0], options->short_name, options->long_name);
+ }
+ exit(1);
+
parse_options_start(&ctx, argc, argv, prefix, options, flags);
switch (parse_options_step(&ctx, options, usagestr)) {
case PARSE_OPT_HELP:
--
1.8.4.1.605.g23c6912
Unfortunately we can only check git commands, which are written in C.
You'll notice all the perl/shell written commands are missing (rebase, etc).
Also a few commands written in C cannot easily be picked up, as they do stuff
before calling parse_options. [typically something like "if (argc != 4) print_usage();"]
These commands are also not contained.
The generation of the table however was just a little python:
--8<--
#!/usr/bin/python
cmds="""git-add
git-apply
git-archive
git-branch
git-check-attr
git-check-ignore
git-check-mailmap
git-checkout
git-checkout-index
git-cherry
git-cherry-pick
git-clean
git-clone
git-column
git-commit
git-config
git-count-objects
git-credential-cache
git-credential-store
git-describe
git-fetch
git-fmt-merge-msg
git-for-each-ref
git-format-patch
git-fsck
git-fsck-objects
git-gc
git-grep
git-hash-object
git-help
git-init
git-init-db
git-log
git-ls-files
git-ls-tree
git-merge
git-merge-base
git-merge-file
git-merge-ours
git-mktree
git-mv
git-name-rev
git-notes
git-pack-objects
git-pack-refs
git-prune
git-prune-packed
git-push
git-read-tree
git-reflog
git-remote
git-repack
git-replace
git-rerere
git-reset
git-revert
git-rev-parse
git-rm
git-show
git-show-branch
git-show-ref
git-stage
git-status
git-symbolic-ref
git-tag
git-update-index
git-update-ref
git-update-server-info
git-verify-pack
git-verify-tag
git-whatchanged
git-write-tree"""
import subprocess
shorts={}
cmdoptions={}
for cmd in cmds.split("\n"):
p = subprocess.Popen("./"+cmd, stdout=subprocess.PIPE)
p.wait()
lines = p.stdout.read()
for line in lines.split("\n"):
if not len(line):
continue
name, short, long = line.split(",")
if not short in shorts:
shorts[short] = len(long)
else:
shorts[short] = max(shorts[short], len(long))
if not name in cmdoptions:
cmdoptions[name] = {}
cmdoptions[name][short] = long
longest_cmd = 0
for cmd in cmdoptions:
longest_cmd = max(longest_cmd, len(cmd))
print " "*(longest_cmd-len("Name\\short")), "Name\\short",
for short in shorts:
print "|" + " "*(1+shorts[short]-len(short)) + short,
print
for cmd in cmdoptions:
print " "*(longest_cmd-len(cmd)), cmd,
for short in shorts:
s = ""
if short in cmdoptions[cmd]:
s = cmdoptions[cmd][short]
print "|" + " "*(1+shorts[short]-len(s)) + s,
print " ", cmd
--8<--
I am not sure if we should add such code to the git code base, as it would need some cleanup.
The existing table however would become outdated fast?
So I do not have a good idea, how such a table could be easily incorporated and kept up to date.
Thanks,
Stefan
next prev parent reply other threads:[~2013-10-27 17:03 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20131024122255.GI9378@mwanda>
[not found] ` <20131024122512.GB9534@mwanda>
[not found] ` <20131026181709.GB10488@kroah.com>
2013-10-27 1:34 ` [PATCH] commit: Add -f, --fixes <commit> option to add Fixes: line Josh Triplett
2013-10-27 5:42 ` Michael Haggerty
2013-10-27 6:37 ` Theodore Ts'o
2013-10-27 7:14 ` Josh Triplett
2013-10-27 8:03 ` [Ksummit-2013-discuss] " Michel Lespinasse
2013-10-27 9:23 ` Josh Triplett
2013-10-27 8:09 ` Thomas Rast
2013-10-27 9:20 ` Josh Triplett
2013-10-27 10:59 ` Johan Herland
2013-10-27 19:10 ` Christian Couder
2013-10-28 2:46 ` Johan Herland
2013-10-28 22:10 ` Thomas Rast
2013-10-29 2:02 ` Jeff King
2013-10-30 17:53 ` Johan Herland
2013-10-29 6:23 ` Christian Couder
2013-10-30 19:07 ` Johan Herland
2013-11-02 12:54 ` Christian Couder
2013-10-27 9:26 ` Stefan Beller
2013-10-27 16:30 ` Thomas Rast
2013-10-27 17:03 ` Stefan Beller [this message]
2013-10-31 23:03 ` Stefan Beller
2013-10-31 23:04 ` [PATCH] Documentation: add a script to generate a (long/short) options overview Stefan Beller
2013-10-31 23:09 ` Stefan Beller
2013-10-31 23:45 ` brian m. carlson
2013-11-01 0:09 ` Junio C Hamano
2013-10-28 9:02 ` [PATCH] commit: Add -f, --fixes <commit> option to add Fixes: line Michael Haggerty
2013-10-28 11:29 ` Johan Herland
2013-10-29 2:08 ` Jeff King
2013-10-29 8:26 ` Matthieu Moy
2013-10-30 18:12 ` Johan Herland
2013-10-31 6:28 ` Duy Nguyen
2013-10-31 17:20 ` Junio C Hamano
2013-10-31 23:52 ` Duy Nguyen
2013-11-01 0:16 ` Johan Herland
2013-10-27 8:33 ` Duy Nguyen
2013-10-27 9:13 ` Josh Triplett
2013-10-28 0:49 ` Jim Hill
2013-10-28 1:52 ` Junio C Hamano
2013-10-28 7:16 ` Josh Triplett
2013-10-28 8:27 ` Michael Haggerty
2013-10-28 8:59 ` [ksummit-attendees] " Christoph Hellwig
2013-10-28 23:09 ` Benjamin Herrenschmidt
2013-10-28 23:38 ` Russell King - ARM Linux
2013-10-28 23:41 ` Russell King - ARM Linux
2013-10-28 9:08 ` Junio C Hamano
2013-10-29 4:45 ` Christian Couder
2013-10-29 19:54 ` Junio C Hamano
2013-10-30 17:28 ` Tony Luck
2013-10-30 18:33 ` 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=526D4750.7040804@googlemail.com \
--to=stefanbeller@googlemail.com \
--cc=dan.carpenter@oracle.com \
--cc=git@vger.kernel.org \
--cc=greg@kroah.com \
--cc=josh@joshtriplett.org \
--cc=ksummit-2013-discuss@lists.linuxfoundation.org \
--cc=ksummit-attendees@lists.linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhagger@alum.mit.edu \
--cc=tr@thomasrast.ch \
/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).