Paper bag fix diff invocation in 'git stash show'
[gitweb.git] / commit.c
index 03436b1b077f3f83cebceb697f97c3ba5b26265c..1fbdd2d51b8e798ac73c4b020f8fa47b1d6fb168 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -441,17 +441,22 @@ struct commit *pop_most_recent_commit(struct commit_list **list,
 
 void clear_commit_marks(struct commit *commit, unsigned int mark)
 {
-       struct commit_list *parents;
+       while (commit) {
+               struct commit_list *parents;
 
-       commit->object.flags &= ~mark;
-       parents = commit->parents;
-       while (parents) {
-               struct commit *parent = parents->item;
+               if (!(mark & commit->object.flags))
+                       return;
 
-               /* Have we already cleared this? */
-               if (mark & parent->object.flags)
-                       clear_commit_marks(parent, mark);
-               parents = parents->next;
+               commit->object.flags &= ~mark;
+
+               parents = commit->parents;
+               if (!parents)
+                       return;
+
+               while ((parents = parents->next))
+                       clear_commit_marks(parents->item, mark);
+
+               commit = commit->parents->item;
        }
 }
 
@@ -585,7 +590,7 @@ static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf,
                break;
        case CMIT_FMT_EMAIL:
                ret += sprintf(buf + ret, "Date: %s\n",
-                              show_rfc2822_date(time, tz));
+                              show_date(time, tz, DATE_RFC2822));
                break;
        case CMIT_FMT_FULLER:
                ret += sprintf(buf + ret, "%sDate: %s\n", what,
@@ -721,7 +726,10 @@ static char *logmsg_reencode(const struct commit *commit,
        encoding = get_header(commit, "encoding");
        use_encoding = encoding ? encoding : utf8;
        if (!strcmp(use_encoding, output_encoding))
-               out = xstrdup(commit->buffer);
+               if (encoding) /* we'll strip encoding header later */
+                       out = xstrdup(commit->buffer);
+               else
+                       return NULL; /* nothing to do */
        else
                out = reencode_string(commit->buffer,
                                      output_encoding, use_encoding);
@@ -778,9 +786,10 @@ static void fill_person(struct interp *table, const char *msg, int len)
                        tz = -tz;
        }
 
-       interp_set_entry(table, 2, show_date(date, tz, 0));
-       interp_set_entry(table, 3, show_rfc2822_date(date, tz));
-       interp_set_entry(table, 4, show_date(date, tz, 1));
+       interp_set_entry(table, 2, show_date(date, tz, DATE_NORMAL));
+       interp_set_entry(table, 3, show_date(date, tz, DATE_RFC2822));
+       interp_set_entry(table, 4, show_date(date, tz, DATE_RELATIVE));
+       interp_set_entry(table, 6, show_date(date, tz, DATE_ISO8601));
 }
 
 static long format_commit_message(const struct commit *commit,
@@ -799,12 +808,14 @@ static long format_commit_message(const struct commit *commit,
                { "%aD" },      /* author date, RFC2822 style */
                { "%ar" },      /* author date, relative */
                { "%at" },      /* author date, UNIX timestamp */
+               { "%ai" },      /* author date, ISO 8601 */
                { "%cn" },      /* committer name */
                { "%ce" },      /* committer email */
                { "%cd" },      /* committer date */
                { "%cD" },      /* committer date, RFC2822 style */
                { "%cr" },      /* committer date, relative */
                { "%ct" },      /* committer date, UNIX timestamp */
+               { "%ci" },      /* committer date, ISO 8601 */
                { "%e" },       /* encoding */
                { "%s" },       /* subject */
                { "%b" },       /* body */
@@ -821,10 +832,11 @@ static long format_commit_message(const struct commit *commit,
                IPARENTS, IPARENTS_ABBREV,
                IAUTHOR_NAME, IAUTHOR_EMAIL,
                IAUTHOR_DATE, IAUTHOR_DATE_RFC2822, IAUTHOR_DATE_RELATIVE,
-               IAUTHOR_TIMESTAMP,
+               IAUTHOR_TIMESTAMP, IAUTHOR_ISO8601,
                ICOMMITTER_NAME, ICOMMITTER_EMAIL,
                ICOMMITTER_DATE, ICOMMITTER_DATE_RFC2822,
                ICOMMITTER_DATE_RELATIVE, ICOMMITTER_TIMESTAMP,
+               ICOMMITTER_ISO8601,
                IENCODING,
                ISUBJECT,
                IBODY,