Merge branch 'jc/maint-ident-missing-human-name'
authorJunio C Hamano <gitster@pobox.com>
Tue, 11 Sep 2012 18:35:15 +0000 (11:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 Sep 2012 18:35:15 +0000 (11:35 -0700)
"git show --format='%ci'" did not give timestamp correctly for
commits created without human readable name on "committer" line.

* jc/maint-ident-missing-human-name:
split_ident_line(): make best effort when parsing author/committer line

1  2 
builtin/commit.c
diff --combined builtin/commit.c
index feb43f49dc02608f9a2a6b95297edc4aabfe99ee,62028e7b44b206e9722eef750be8c067aae31b32..778cf16fde64ab81bbe75ec0949a77e6fd9ee702
  #include "column.h"
  
  static const char * const builtin_commit_usage[] = {
 -      "git commit [options] [--] <filepattern>...",
 +      N_("git commit [options] [--] <filepattern>..."),
        NULL
  };
  
  static const char * const builtin_status_usage[] = {
 -      "git status [options] [--] <filepattern>...",
 +      N_("git status [options] [--] <filepattern>..."),
        NULL
  };
  
@@@ -478,6 -478,20 +478,20 @@@ static void export_one(const char *var
        strbuf_release(&buf);
  }
  
+ static int sane_ident_split(struct ident_split *person)
+ {
+       if (!person->name_begin || !person->name_end ||
+           person->name_begin == person->name_end)
+               return 0; /* no human readable name */
+       if (!person->mail_begin || !person->mail_end ||
+           person->mail_begin == person->mail_end)
+               return 0; /* no usable mail */
+       if (!person->date_begin || !person->date_end ||
+           !person->tz_begin || !person->tz_end)
+               return 0;
+       return 1;
+ }
  static void determine_author_info(struct strbuf *author_ident)
  {
        char *name, *email, *date;
        if (force_date)
                date = force_date;
        strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
-       if (!split_ident_line(&author, author_ident->buf, author_ident->len)) {
+       if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
+           sane_ident_split(&author)) {
                export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
                export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
                export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
@@@ -1169,26 -1184,26 +1184,26 @@@ int cmd_status(int argc, const char **a
        int fd;
        unsigned char sha1[20];
        static struct option builtin_status_options[] = {
 -              OPT__VERBOSE(&verbose, "be verbose"),
 +              OPT__VERBOSE(&verbose, N_("be verbose")),
                OPT_SET_INT('s', "short", &status_format,
 -                          "show status concisely", STATUS_FORMAT_SHORT),
 +                          N_("show status concisely"), STATUS_FORMAT_SHORT),
                OPT_BOOLEAN('b', "branch", &s.show_branch,
 -                          "show branch information"),
 +                          N_("show branch information")),
                OPT_SET_INT(0, "porcelain", &status_format,
 -                          "machine-readable output",
 +                          N_("machine-readable output"),
                            STATUS_FORMAT_PORCELAIN),
                OPT_BOOLEAN('z', "null", &s.null_termination,
 -                          "terminate entries with NUL"),
 +                          N_("terminate entries with NUL")),
                { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
 -                "mode",
 -                "show untracked files, optional modes: all, normal, no. (Default: all)",
 +                N_("mode"),
 +                N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
                  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
                OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
 -                          "show ignored files"),
 -              { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
 -                "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
 +                          N_("show ignored files")),
 +              { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
 +                N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
                  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
 -              OPT_COLUMN(0, "column", &s.colopts, "list untracked files in columns"),
 +              OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
                OPT_END(),
        };
  
@@@ -1369,53 -1384,53 +1384,53 @@@ int cmd_commit(int argc, const char **a
  {
        static struct wt_status s;
        static struct option builtin_commit_options[] = {
 -              OPT__QUIET(&quiet, "suppress summary after successful commit"),
 -              OPT__VERBOSE(&verbose, "show diff in commit message template"),
 -
 -              OPT_GROUP("Commit message options"),
 -              OPT_FILENAME('F', "file", &logfile, "read message from file"),
 -              OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
 -              OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
 -              OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
 -              OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
 -              OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
 -              OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
 -              OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
 -              OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
 -              OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
 -              OPT_FILENAME('t', "template", &template_file, "use specified template file"),
 -              OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
 -              OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
 -              OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
 -              { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
 -                "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
 +              OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
 +              OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
 +
 +              OPT_GROUP(N_("Commit message options")),
 +              OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
 +              OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
 +              OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
 +              OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
 +              OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
 +              OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
 +              OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
 +              OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
 +              OPT_BOOLEAN(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
 +              OPT_BOOLEAN('s', "signoff", &signoff, N_("add Signed-off-by:")),
 +              OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
 +              OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
 +              OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
 +              OPT_BOOLEAN(0, "status", &include_status, N_("include status in commit message template")),
 +              { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
 +                N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
                /* end commit message options */
  
 -              OPT_GROUP("Commit contents options"),
 -              OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
 -              OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
 -              OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
 -              OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
 -              OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
 -              OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
 -              OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
 -              OPT_SET_INT(0, "short", &status_format, "show status concisely",
 +              OPT_GROUP(N_("Commit contents options")),
 +              OPT_BOOLEAN('a', "all", &all, N_("commit all changed files")),
 +              OPT_BOOLEAN('i', "include", &also, N_("add specified files to index for commit")),
 +              OPT_BOOLEAN(0, "interactive", &interactive, N_("interactively add files")),
 +              OPT_BOOLEAN('p', "patch", &patch_interactive, N_("interactively add changes")),
 +              OPT_BOOLEAN('o', "only", &only, N_("commit only specified files")),
 +              OPT_BOOLEAN('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
 +              OPT_BOOLEAN(0, "dry-run", &dry_run, N_("show what would be committed")),
 +              OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
                            STATUS_FORMAT_SHORT),
 -              OPT_BOOLEAN(0, "branch", &s.show_branch, "show branch information"),
 +              OPT_BOOLEAN(0, "branch", &s.show_branch, N_("show branch information")),
                OPT_SET_INT(0, "porcelain", &status_format,
 -                          "machine-readable output", STATUS_FORMAT_PORCELAIN),
 +                          N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
                OPT_BOOLEAN('z', "null", &s.null_termination,
 -                          "terminate entries with NUL"),
 -              OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
 -              OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
 -              { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
 +                          N_("terminate entries with NUL")),
 +              OPT_BOOLEAN(0, "amend", &amend, N_("amend previous commit")),
 +              OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
 +              { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
                /* end commit contents options */
  
                { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
 -                "ok to record an empty change",
 +                N_("ok to record an empty change"),
                  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
                { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
 -                "ok to record a change with an empty message",
 +                N_("ok to record a change with an empty message"),
                  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
  
                OPT_END()