From: Michael J Gruber <michaeljgruber+gmane@fastmail.fm>
To: git@vger.kernel.org
Subject: [PATCH] allow user aliases for the --author parameter
Date: Thu, 21 Aug 2008 11:19:41 +0200 [thread overview]
Message-ID: <g8jbvd$18k$1@ger.gmane.org> (raw)
This allows the use of author abbreviations when specifying commit
authors via the --author option to git commit. "--author=$key" is
resolved by looking up "user.$key.name" and "user.$key.email" in the
config.
Signed-off-by: Michael J Gruber <michaeljgruber+gmane@fastmail.fm>
---
In an ideal word, all my collaborators would exchange changes as git
patches (or even via pull/push). In the real world, they send new
versions which I integrate (after dealing with their whitespace and encoding changes...).
Therefore, being able to say
"git commit --author=mickey"
and having git translate "mickey" into "Mickey Mouse <mickey@ducktown.us>"
is a real time saver. The patch accomplishes this by reading config keys "user.mickey.name" and "user.mickey.email" when encountering an
--author argument without "<>".
If there's interest in this patch I'll follow up with a documentation patch.
The "--committer" argument to git commit is not treated because I don't
consider it worthwhile.
Note that the implementation is different from git-svn's author file on
purpose because it serves a different purpose.
Michael
P.S.: That's my first patch here. Yes, I've read Doc/SubmittingPatches.
So, if something's wrong, please be gentle but not overly so ;)
builtin-commit.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 64 insertions(+), 1 deletions(-)
diff --git a/builtin-commit.c b/builtin-commit.c
index 649c8be..d90e2f4 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -53,6 +53,12 @@ static char *author_name, *author_email, *author_date;
static int all, edit_flag, also, interactive, only, amend, signoff;
static int quiet, verbose, no_verify, allow_empty;
static char *untracked_files_arg;
+struct user {
+ char *name, *full_name, *email;
+};
+static struct user **users;
+static int users_alloc;
+static int users_nr;
/*
* The default commit message cleanup mode will remove the lines
* beginning with # (shell comments) and leading and trailing
@@ -406,6 +412,7 @@ static const char sign_off_header[] = "Signed-off-by: ";
static void determine_author_info(void)
{
char *name, *email, *date;
+ int i;
name = getenv("GIT_AUTHOR_NAME");
email = getenv("GIT_AUTHOR_EMAIL");
@@ -429,10 +436,22 @@ static void determine_author_info(void)
date = xstrndup(rb + 2, eol - (rb + 2));
}
+ author_date = date;
+
if (force_author) {
const char *lb = strstr(force_author, " <");
const char *rb = strchr(force_author, '>');
+ if (!lb && !rb) {
+ for (i=0; i < users_nr; i++) {
+ if (!strcmp(force_author, users[i]->name)) {
+ author_name = users[i]->full_name;
+ author_email = users[i]->email;
+ return;
+ }
+ }
+ }
+
if (!lb || !rb)
die("malformed --author parameter");
name = xstrndup(force_author, lb - force_author);
@@ -441,7 +460,6 @@ static void determine_author_info(void)
author_name = name;
author_email = email;
- author_date = date;
}
static int prepare_to_commit(const char *index_file, const char *prefix)
@@ -888,11 +906,56 @@ static void print_summary(const char *prefix, const unsigned char *sha1)
}
}
+static struct user *make_user(const char *name, int len)
+{
+ struct user *ret;
+ int i;
+
+ for (i = 0; i < users_nr; i++) {
+ if (len ? (!strncmp(name, users[i]->name, len) &&
+ !users[i]->name[len]) :
+ !strcmp(name, users[i]->name))
+ return users[i];
+ }
+
+ ALLOC_GROW(users, users_nr + 1, users_alloc);
+ ret = xcalloc(1, sizeof(struct user));
+ users[users_nr++] = ret;
+ if (len)
+ ret->name = xstrndup(name, len);
+ else
+ ret->name = xstrdup(name);
+
+ return ret;
+}
+
static int git_commit_config(const char *k, const char *v, void *cb)
{
+ const char *name;
+ const char *subkey;
+ struct user *user;
+
if (!strcmp(k, "commit.template"))
return git_config_string(&template_file, k, v);
+ if (!prefixcmp(k, "user.")) {
+ name = k + 5;
+ subkey = strrchr(name, '.');
+ if (!subkey)
+ return 0;
+ user = make_user(name, subkey - name);
+ if (!strcmp(subkey, ".name")) {
+ if (!v)
+ return config_error_nonbool(k);
+ user->full_name = xstrdup(v);
+ } else if (!strcmp(subkey, ".email")) {
+ if (!v)
+ return config_error_nonbool(k);
+ user->email = xstrdup(v);
+ }
+ return 0;
+ }
+
return git_status_config(k, v, cb);
}
--
1.6.0
next reply other threads:[~2008-08-21 9:20 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-21 9:19 Michael J Gruber [this message]
2008-08-21 13:49 ` [PATCH] allow user aliases for the --author parameter Miklos Vajna
2008-08-21 14:30 ` Michael J Gruber
2008-08-21 17:41 ` Alex Riesen
2008-08-21 17:49 ` Alex Riesen
2008-08-21 20:02 ` Jeff King
2008-08-22 6:09 ` Junio C Hamano
2008-08-22 8:27 ` Michael J Gruber
2008-08-22 16:50 ` Jeff King
2008-08-22 21:09 ` Junio C Hamano
2008-08-22 21:19 ` Jeff King
2008-08-26 8:02 ` [PATCH v2] " Michael J Gruber
2008-08-26 23:31 ` Junio C Hamano
2008-08-27 0:19 ` Jeff King
2008-08-27 6:13 ` Junio C Hamano
2008-08-27 9:36 ` Michael J Gruber
2008-08-27 12:40 ` Jeff King
[not found] ` <20080827123656.GB11986@coredump.intra.peff.net>
[not found] ` <7vmyiyqt08.fsf@gitster.siamese.dyndns.org>
2008-08-27 17:18 ` Jeff King
2008-08-28 8:53 ` Michael J Gruber
2008-08-28 21:33 ` Jeff King
[not found] ` <7vr68aqt3h.fsf@gitster.siamese.dyndns.org>
[not found] ` <48B65922.4050005@fastmail.fm>
2008-08-28 21:36 ` Jeff King
2008-08-27 12:29 ` Jeff King
2008-08-27 17:19 ` Junio C Hamano
2008-08-24 9:19 ` [PATCH] " Pedro Melo
2008-08-24 17:21 ` Jeff King
2008-08-25 1:38 ` [PATCH] fix "git log -i --grep" Jeff King
2008-08-25 2:10 ` [PATCH] format-patch: use default diff format even with patch options Jeff King
2008-08-25 4:57 ` Junio C Hamano
2008-08-25 5:12 ` [PATCH] fix "git log -i --grep" Junio C Hamano
2008-08-25 6:15 ` Jeff King
2008-08-25 6:18 ` Jeff King
2008-08-25 6:27 ` 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='g8jbvd$18k$1@ger.gmane.org' \
--to=michaeljgruber+gmane@fastmail.fm \
--cc=git@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.