From bcb2b0044b3baedf7857613ec069f300c364680c Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 21 May 2012 19:09:43 -0400 Subject: ident: split setup_ident into separate functions This function sets up the default name, email, and date, and is not publicly available. Let's split it into three public functions so that callers can get just the parts they need. While we're at it, let's change the interface to simple accessors. The original function was called only by fmt_ident, and contained logic for "if we already have some other value, don't load the default" which properly belongs in fmt_ident. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'cache.h') diff --git a/cache.h b/cache.h index e14ffcd914..0c095d4842 100644 --- a/cache.h +++ b/cache.h @@ -894,6 +894,9 @@ extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); extern const char *fmt_name(const char *name, const char *email); +extern const char *ident_default_name(void); +extern const char *ident_default_email(void); +extern const char *ident_default_date(void); extern const char *git_editor(void); extern const char *git_pager(int stdout_is_tty); -- cgit v1.3 From 9597921b6c173d90359e2cfa4c2e36de8d1554e6 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 21 May 2012 19:09:54 -0400 Subject: move identity config parsing to ident.c There's no reason for this to be in config, except that once upon a time all of the config parsing was there. It makes more sense to keep the ident code together. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 1 + config.c | 24 +----------------------- ident.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 23 deletions(-) (limited to 'cache.h') diff --git a/cache.h b/cache.h index 0c095d4842..86224c8198 100644 --- a/cache.h +++ b/cache.h @@ -899,6 +899,7 @@ extern const char *ident_default_email(void); extern const char *ident_default_date(void); extern const char *git_editor(void); extern const char *git_pager(int stdout_is_tty); +extern int git_ident_config(const char *, const char *, void *); struct ident_split { const char *name_begin; diff --git a/config.c b/config.c index eeee986022..71ef171cab 100644 --- a/config.c +++ b/config.c @@ -762,28 +762,6 @@ static int git_default_core_config(const char *var, const char *value) return 0; } -static int git_default_user_config(const char *var, const char *value) -{ - if (!strcmp(var, "user.name")) { - if (!value) - return config_error_nonbool(var); - strlcpy(git_default_name, value, sizeof(git_default_name)); - user_ident_explicitly_given |= IDENT_NAME_GIVEN; - return 0; - } - - if (!strcmp(var, "user.email")) { - if (!value) - return config_error_nonbool(var); - strlcpy(git_default_email, value, sizeof(git_default_email)); - user_ident_explicitly_given |= IDENT_MAIL_GIVEN; - return 0; - } - - /* Add other config variables here and to Documentation/config.txt. */ - return 0; -} - static int git_default_i18n_config(const char *var, const char *value) { if (!strcmp(var, "i18n.commitencoding")) @@ -870,7 +848,7 @@ int git_default_config(const char *var, const char *value, void *dummy) return git_default_core_config(var, value); if (!prefixcmp(var, "user.")) - return git_default_user_config(var, value); + return git_ident_config(var, value, dummy); if (!prefixcmp(var, "i18n.")) return git_default_i18n_config(var, value); diff --git a/ident.c b/ident.c index 0f7dcae8f8..bb1158f7d2 100644 --- a/ident.c +++ b/ident.c @@ -388,3 +388,24 @@ int user_ident_sufficiently_given(void) return (user_ident_explicitly_given == IDENT_ALL_GIVEN); #endif } + +int git_ident_config(const char *var, const char *value, void *data) +{ + if (!strcmp(var, "user.name")) { + if (!value) + return config_error_nonbool(var); + strlcpy(git_default_name, value, sizeof(git_default_name)); + user_ident_explicitly_given |= IDENT_NAME_GIVEN; + return 0; + } + + if (!strcmp(var, "user.email")) { + if (!value) + return config_error_nonbool(var); + strlcpy(git_default_email, value, sizeof(git_default_email)); + user_ident_explicitly_given |= IDENT_MAIL_GIVEN; + return 0; + } + + return 0; +} -- cgit v1.3 From 2d4b4fcebdd4fb8c8cd2664b390e3bbb82370155 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 21 May 2012 19:09:57 -0400 Subject: move git_default_* variables to ident.c There's no reason anybody outside of ident.c should access these directly (they should use the new accessors which make sure the variables are initialized), so we can make them file-scope statics. While we're at it, move user_ident_explicitly_given into ident.c; while still globally visible, it makes more sense to reside with the ident code. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 3 --- environment.c | 3 --- ident.c | 4 ++++ 3 files changed, 4 insertions(+), 6 deletions(-) (limited to 'cache.h') diff --git a/cache.h b/cache.h index 86224c8198..f63b71ff66 100644 --- a/cache.h +++ b/cache.h @@ -1142,9 +1142,6 @@ struct config_include_data { #define CONFIG_INCLUDE_INIT { 0 } extern int git_config_include(const char *name, const char *value, void *data); -#define MAX_GITNAME (1000) -extern char git_default_email[MAX_GITNAME]; -extern char git_default_name[MAX_GITNAME]; #define IDENT_NAME_GIVEN 01 #define IDENT_MAIL_GIVEN 02 #define IDENT_ALL_GIVEN (IDENT_NAME_GIVEN|IDENT_MAIL_GIVEN) diff --git a/environment.c b/environment.c index d7e6c65763..669e498f5a 100644 --- a/environment.c +++ b/environment.c @@ -11,9 +11,6 @@ #include "refs.h" #include "fmt-merge-msg.h" -char git_default_email[MAX_GITNAME]; -char git_default_name[MAX_GITNAME]; -int user_ident_explicitly_given; int trust_executable_bit = 1; int trust_ctime = 1; int has_symlinks = 1; diff --git a/ident.c b/ident.c index bb1158f7d2..af92b2cd86 100644 --- a/ident.c +++ b/ident.c @@ -7,7 +7,11 @@ */ #include "cache.h" +#define MAX_GITNAME (1000) +static char git_default_name[MAX_GITNAME]; +static char git_default_email[MAX_GITNAME]; static char git_default_date[50]; +int user_ident_explicitly_given; #ifdef NO_GECOS_IN_PWENT #define get_gecos(ignored) "&" -- cgit v1.3 From b9f0ac1710ed1d2dc865ab40893720e9a242e362 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 21 May 2012 19:10:11 -0400 Subject: fmt_ident: drop IDENT_WARN_ON_NO_NAME code There are no more callers who want this, so we can drop it. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 5 ++--- ident.c | 11 ++++------- 2 files changed, 6 insertions(+), 10 deletions(-) (limited to 'cache.h') diff --git a/cache.h b/cache.h index f63b71ff66..65cbab5564 100644 --- a/cache.h +++ b/cache.h @@ -887,9 +887,8 @@ unsigned long approxidate_careful(const char *, int *); unsigned long approxidate_relative(const char *date, const struct timeval *now); enum date_mode parse_date_format(const char *format); -#define IDENT_WARN_ON_NO_NAME 1 -#define IDENT_ERROR_ON_NO_NAME 2 -#define IDENT_NO_DATE 4 +#define IDENT_ERROR_ON_NO_NAME 1 +#define IDENT_NO_DATE 2 extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); diff --git a/ident.c b/ident.c index acb3a0843f..3b92c44654 100644 --- a/ident.c +++ b/ident.c @@ -316,7 +316,6 @@ const char *fmt_ident(const char *name, const char *email, char date[50]; int i; int error_on_no_name = (flag & IDENT_ERROR_ON_NO_NAME); - int warn_on_no_name = (flag & IDENT_WARN_ON_NO_NAME); int name_addr_only = (flag & IDENT_NO_DATE); if (!name) @@ -327,13 +326,11 @@ const char *fmt_ident(const char *name, const char *email, if (!*name) { struct passwd *pw; - if ((warn_on_no_name || error_on_no_name) && - name == git_default_name && env_hint) { - fputs(env_hint, stderr); - env_hint = NULL; /* warn only once */ - } - if (error_on_no_name) + if (error_on_no_name) { + if (name == git_default_name) + fputs(env_hint, stderr); die("empty ident %s <%s> not allowed", name, email); + } pw = getpwuid(getuid()); if (!pw) die("You don't exist. Go away!"); -- cgit v1.3 From c15e1987aec562107bd8e4a9fdeebf6d27d0e53a Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 24 May 2012 19:27:24 -0400 Subject: ident: let callers omit name with fmt_indent Most callers want to see all of "$name <$email> $date", but a few want only limited parts, omitting the date, or even the name. We already have IDENT_NO_DATE to handle the date part, but there's not a good option for getting just the email. Callers have to done one of: 1. Call ident_default_email; this does not respect environment variables, nor does it promise to trim whitespace or other crud from the result. 2. Call git_{committer,author}_info; this returns the name and email, leaving the caller to parse out the wanted bits. This patch adds IDENT_NO_NAME; it stops short of adding IDENT_NO_EMAIL, as no callers want it (nor are likely to), and it complicates the error handling of the function. When no name is requested, the angle brackets (<>) around the email address are also omitted. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 1 + ident.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'cache.h') diff --git a/cache.h b/cache.h index 65cbab5564..713cd04e1e 100644 --- a/cache.h +++ b/cache.h @@ -889,6 +889,7 @@ enum date_mode parse_date_format(const char *format); #define IDENT_ERROR_ON_NO_NAME 1 #define IDENT_NO_DATE 2 +#define IDENT_NO_NAME 4 extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); diff --git a/ident.c b/ident.c index 59beef2f35..8b5080dfe6 100644 --- a/ident.c +++ b/ident.c @@ -269,13 +269,14 @@ const char *fmt_ident(const char *name, const char *email, char date[50]; int error_on_no_name = (flag & IDENT_ERROR_ON_NO_NAME); int want_date = !(flag & IDENT_NO_DATE); + int want_name = !(flag & IDENT_NO_NAME); - if (!name) + if (want_name && !name) name = ident_default_name(); if (!email) email = ident_default_email(); - if (!*name) { + if (want_name && !*name) { struct passwd *pw; if (error_on_no_name) { @@ -297,10 +298,13 @@ const char *fmt_ident(const char *name, const char *email, } strbuf_reset(&ident); - strbuf_addstr_without_crud(&ident, name); - strbuf_addstr(&ident, " <"); + if (want_name) { + strbuf_addstr_without_crud(&ident, name); + strbuf_addstr(&ident, " <"); + } strbuf_addstr_without_crud(&ident, email); - strbuf_addch(&ident, '>'); + if (want_name) + strbuf_addch(&ident, '>'); if (want_date) { strbuf_addch(&ident, ' '); strbuf_addstr_without_crud(&ident, date); -- cgit v1.3 From f9bc573fdaeaf8621008f3f49aaaa64869791691 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 24 May 2012 19:28:40 -0400 Subject: ident: rename IDENT_ERROR_ON_NO_NAME to IDENT_STRICT Callers who ask for ERROR_ON_NO_NAME are not so much concerned that the name will be blank (because, after all, we will fall back to using the username), but rather it is a check to make sure that low-quality identities do not end up in things like commit messages or emails (whereas it is OK for them to end up in things like reflogs). When future commits add more quality checks on the identity, each of these callers would want to use those checks, too. Rather than modify each of them later to add a new flag, let's refactor the flag. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- builtin/commit.c | 3 +-- builtin/log.c | 2 +- builtin/merge.c | 4 ++-- builtin/tag.c | 2 +- builtin/var.c | 4 ++-- cache.h | 2 +- commit.c | 4 ++-- gpg-interface.c | 2 +- ident.c | 6 +++--- 9 files changed, 14 insertions(+), 15 deletions(-) (limited to 'cache.h') diff --git a/builtin/commit.c b/builtin/commit.c index a2ec73d738..f43eaafb3b 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -526,8 +526,7 @@ static void determine_author_info(struct strbuf *author_ident) if (force_date) date = force_date; - strbuf_addstr(author_ident, fmt_ident(name, email, date, - IDENT_ERROR_ON_NO_NAME)); + strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT)); if (!split_ident_line(&author, author_ident->buf, author_ident->len)) { export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); diff --git a/builtin/log.c b/builtin/log.c index 4538309d02..d86bca34dd 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1147,7 +1147,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (do_signoff) { const char *committer; const char *endpos; - committer = git_committer_info(IDENT_ERROR_ON_NO_NAME); + committer = git_committer_info(IDENT_STRICT); endpos = strchr(committer, '>'); if (!endpos) die(_("bogus committer info %s"), committer); diff --git a/builtin/merge.c b/builtin/merge.c index 470fc57c5d..dd50a0c57b 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1447,7 +1447,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) refresh_cache(REFRESH_QUIET); if (allow_trivial && !fast_forward_only) { /* See if it is really trivial. */ - git_committer_info(IDENT_ERROR_ON_NO_NAME); + git_committer_info(IDENT_STRICT); printf(_("Trying really trivial in-index merge...\n")); if (!read_tree_trivial(common->item->object.sha1, head_commit->object.sha1, @@ -1490,7 +1490,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) die(_("Not possible to fast-forward, aborting.")); /* We are going to make a new commit. */ - git_committer_info(IDENT_ERROR_ON_NO_NAME); + git_committer_info(IDENT_STRICT); /* * At this point, we need a real merge. No matter what strategy diff --git a/builtin/tag.c b/builtin/tag.c index 4fb6bd7b3d..7b1be85e48 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -332,7 +332,7 @@ static void create_tag(const unsigned char *object, const char *tag, sha1_to_hex(object), typename(type), tag, - git_committer_info(IDENT_ERROR_ON_NO_NAME)); + git_committer_info(IDENT_STRICT)); if (header_len > sizeof(header_buf) - 1) die(_("tag header too big.")); diff --git a/builtin/var.c b/builtin/var.c index 99d068a532..aedbb53a2d 100644 --- a/builtin/var.c +++ b/builtin/var.c @@ -11,7 +11,7 @@ static const char *editor(int flag) { const char *pgm = git_editor(); - if (!pgm && flag & IDENT_ERROR_ON_NO_NAME) + if (!pgm && flag & IDENT_STRICT) die("Terminal is dumb, but EDITOR unset"); return pgm; @@ -55,7 +55,7 @@ static const char *read_var(const char *var) val = NULL; for (ptr = git_vars; ptr->read; ptr++) { if (strcmp(var, ptr->name) == 0) { - val = ptr->read(IDENT_ERROR_ON_NO_NAME); + val = ptr->read(IDENT_STRICT); break; } } diff --git a/cache.h b/cache.h index 713cd04e1e..f89f22db70 100644 --- a/cache.h +++ b/cache.h @@ -887,7 +887,7 @@ unsigned long approxidate_careful(const char *, int *); unsigned long approxidate_relative(const char *date, const struct timeval *now); enum date_mode parse_date_format(const char *format); -#define IDENT_ERROR_ON_NO_NAME 1 +#define IDENT_STRICT 1 #define IDENT_NO_DATE 2 #define IDENT_NO_NAME 4 extern const char *git_author_info(int); diff --git a/commit.c b/commit.c index 9ed36c7db5..8248a994a5 100644 --- a/commit.c +++ b/commit.c @@ -1154,9 +1154,9 @@ int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, /* Person/date information */ if (!author) - author = git_author_info(IDENT_ERROR_ON_NO_NAME); + author = git_author_info(IDENT_STRICT); strbuf_addf(&buffer, "author %s\n", author); - strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_ERROR_ON_NO_NAME)); + strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_STRICT)); if (!encoding_is_utf8) strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding); diff --git a/gpg-interface.c b/gpg-interface.c index 09ab64aa24..0863c61800 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -30,7 +30,7 @@ const char *get_signing_key(void) { if (configured_signing_key) return configured_signing_key; - return git_committer_info(IDENT_ERROR_ON_NO_NAME|IDENT_NO_DATE); + return git_committer_info(IDENT_STRICT|IDENT_NO_DATE); } /* diff --git a/ident.c b/ident.c index 8b5080dfe6..c42258f4ea 100644 --- a/ident.c +++ b/ident.c @@ -267,7 +267,7 @@ const char *fmt_ident(const char *name, const char *email, { static struct strbuf ident = STRBUF_INIT; char date[50]; - int error_on_no_name = (flag & IDENT_ERROR_ON_NO_NAME); + int strict = (flag & IDENT_STRICT); int want_date = !(flag & IDENT_NO_DATE); int want_name = !(flag & IDENT_NO_NAME); @@ -279,7 +279,7 @@ const char *fmt_ident(const char *name, const char *email, if (want_name && !*name) { struct passwd *pw; - if (error_on_no_name) { + if (strict) { if (name == git_default_name.buf) fputs(env_hint, stderr); die("empty ident name (for <%s>) not allowed", email); @@ -314,7 +314,7 @@ const char *fmt_ident(const char *name, const char *email, const char *fmt_name(const char *name, const char *email) { - return fmt_ident(name, email, NULL, IDENT_ERROR_ON_NO_NAME | IDENT_NO_DATE); + return fmt_ident(name, email, NULL, IDENT_STRICT | IDENT_NO_DATE); } const char *git_author_info(int flag) -- cgit v1.3