Skip to content

Commit

Permalink
Merge branch 'jk/ident-gecos-strbuf'
Browse files Browse the repository at this point in the history
Fixes quite a lot of brokenness when ident information needs to be taken
from the system and cleans up the code.

By Jeff King
* jk/ident-gecos-strbuf: (22 commits)
  format-patch: do not use bogus email addresses in message ids
  ident: reject bogus email addresses with IDENT_STRICT
  ident: rename IDENT_ERROR_ON_NO_NAME to IDENT_STRICT
  format-patch: use GIT_COMMITTER_EMAIL in message ids
  ident: let callers omit name with fmt_indent
  ident: refactor NO_DATE flag in fmt_ident
  ident: reword empty ident error message
  format-patch: refactor get_patch_filename
  ident: trim whitespace from default name/email
  ident: use a dynamic strbuf in fmt_ident
  ident: use full dns names to generate email addresses
  ident: report passwd errors with a more friendly message
  drop length limitations on gecos-derived names and emails
  ident: don't write fallback username into git_default_name
  fmt_ident: drop IDENT_WARN_ON_NO_NAME code
  format-patch: use default email for generating message ids
  ident: trim trailing newline from /etc/mailname
  move git_default_* variables to ident.c
  move identity config parsing to ident.c
  fmt-merge-msg: don't use static buffer in record_person
  ...
  • Loading branch information
gitster committed May 29, 2012
2 parents 12d7d15 + 59f9b8a commit 261ec7d
Show file tree
Hide file tree
Showing 19 changed files with 176 additions and 238 deletions.
9 changes: 0 additions & 9 deletions Documentation/git-commit-tree.txt
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,6 @@ for one to be entered and terminated with ^D.

include::date-formats.txt[]

Diagnostics
-----------
You don't exist. Go away!::
The passwd(5) gecos field couldn't be read
Your parents must have hated you!::
The passwd(5) gecos field is longer than a giant static buffer.
Your sysadmin must hate you!::
The passwd(5) name field is longer than a giant static buffer.

Discussion
----------

Expand Down
9 changes: 0 additions & 9 deletions Documentation/git-var.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,6 @@ ifdef::git-default-pager[]
The build you are using chose '{git-default-pager}' as the default.
endif::git-default-pager[]

Diagnostics
-----------
You don't exist. Go away!::
The passwd(5) gecos field couldn't be read
Your parents must have hated you!::
The passwd(5) gecos field is longer than a giant static buffer.
Your sysadmin must hate you!::
The passwd(5) name field is longer than a giant static buffer.

SEE ALSO
--------
linkgit:git-commit-tree[1]
Expand Down
3 changes: 1 addition & 2 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions builtin/fmt-merge-msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ static void add_branch_desc(struct strbuf *out, const char *name)
static void record_person(int which, struct string_list *people,
struct commit *commit)
{
char name_buf[MAX_GITNAME], *name, *name_end;
char *name_buf, *name, *name_end;
struct string_list_item *elem;
const char *field = (which == 'a') ? "\nauthor " : "\ncommitter ";

Expand All @@ -243,17 +243,17 @@ static void record_person(int which, struct string_list *people,
name_end--;
while (isspace(*name_end) && name <= name_end)
name_end--;
if (name_end < name || name + MAX_GITNAME <= name_end)
if (name_end < name)
return;
memcpy(name_buf, name, name_end - name + 1);
name_buf[name_end - name + 1] = '\0';
name_buf = xmemdupz(name, name_end - name + 1);

elem = string_list_lookup(people, name_buf);
if (!elem) {
elem = string_list_insert(people, name_buf);
elem->util = (void *)0;
}
elem->util = (void*)(util_as_integral(elem) + 1);
free(name_buf);
}

static int cmp_string_list_util_as_integral(const void *a_, const void *b_)
Expand Down
46 changes: 10 additions & 36 deletions builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,8 @@ static FILE *realstdout = NULL;
static const char *output_directory = NULL;
static int outdir_offset;

static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet)
static int reopen_stdout(struct commit *commit, const char *subject,
struct rev_info *rev, int quiet)
{
struct strbuf filename = STRBUF_INIT;
int suffix_len = strlen(fmt_patch_suffix) + 1;
Expand All @@ -677,7 +678,7 @@ static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet)
strbuf_addch(&filename, '/');
}

get_patch_filename(commit, rev->nr, fmt_patch_suffix, &filename);
get_patch_filename(commit, subject, rev->nr, fmt_patch_suffix, &filename);

if (!quiet)
fprintf(realstdout, "%s\n", filename.buf + outdir_offset);
Expand Down Expand Up @@ -737,15 +738,10 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha

static void gen_message_id(struct rev_info *info, char *base)
{
const char *committer = git_committer_info(IDENT_WARN_ON_NO_NAME);
const char *email_start = strrchr(committer, '<');
const char *email_end = strrchr(committer, '>');
struct strbuf buf = STRBUF_INIT;
if (!email_start || !email_end || email_start > email_end - 1)
die(_("Could not extract email from committer identity."));
strbuf_addf(&buf, "%s.%lu.git.%.*s", base,
strbuf_addf(&buf, "%s.%lu.git.%s", base,
(unsigned long) time(NULL),
(int)(email_end - email_start - 1), email_start + 1);
git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
info->message_id = strbuf_detach(&buf, NULL);
}

Expand Down Expand Up @@ -784,39 +780,17 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
const char *encoding = "UTF-8";
struct diff_options opts;
int need_8bit_cte = 0;
struct commit *commit = NULL;
struct pretty_print_context pp = {0};

if (rev->commit_format != CMIT_FMT_EMAIL)
die(_("Cover letter needs email format"));

committer = git_committer_info(0);

if (!numbered_files) {
/*
* We fake a commit for the cover letter so we get the filename
* desired.
*/
commit = xcalloc(1, sizeof(*commit));
commit->buffer = xmalloc(400);
snprintf(commit->buffer, 400,
"tree 0000000000000000000000000000000000000000\n"
"parent %s\n"
"author %s\n"
"committer %s\n\n"
"cover letter\n",
sha1_to_hex(head->object.sha1), committer, committer);
}

if (!use_stdout && reopen_stdout(commit, rev, quiet))
if (!use_stdout &&
reopen_stdout(NULL, numbered_files ? NULL : "cover-letter", rev, quiet))
return;

if (commit) {

free(commit->buffer);
free(commit);
}

log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
&need_8bit_cte);

Expand Down Expand Up @@ -1173,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);
Expand Down Expand Up @@ -1411,8 +1385,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
gen_message_id(&rev, sha1_to_hex(commit->object.sha1));
}

if (!use_stdout && reopen_stdout(numbered_files ? NULL : commit,
&rev, quiet))
if (!use_stdout &&
reopen_stdout(numbered_files ? NULL : commit, NULL, &rev, quiet))
die(_("Failed to create output files"));
shown = log_tree_commit(&rev, commit);
free(commit->buffer);
Expand Down
4 changes: 2 additions & 2 deletions builtin/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion builtin/tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -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."));
Expand Down
4 changes: 2 additions & 2 deletions builtin/var.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
}
Expand Down
13 changes: 7 additions & 6 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -887,15 +887,19 @@ 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_STRICT 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);
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);
extern int git_ident_config(const char *, const char *, void *);

struct ident_split {
const char *name_begin;
Expand Down Expand Up @@ -1139,9 +1143,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)
Expand Down
4 changes: 2 additions & 2 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
24 changes: 1 addition & 23 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 0 additions & 3 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -595,4 +595,7 @@ int rmdir_or_warn(const char *path);
*/
int remove_or_warn(unsigned int mode, const char *path);

/* Get the passwd entry for the UID of the current process. */
struct passwd *xgetpwuid_self(void);

#endif
2 changes: 1 addition & 1 deletion gpg-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion http-push.c
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
ep = strchr(ep + 1, '/');
}

escaped = xml_entities(git_default_email);
escaped = xml_entities(ident_default_email());
strbuf_addf(&out_buffer.buf, LOCK_REQUEST, escaped);
free(escaped);

Expand Down
Loading

0 comments on commit 261ec7d

Please sign in to comment.