Commit cb71f8bdb5 ("PRItime: introduce a new "printf format" for
timestamps", 2017-04-21) does not play well with i18n framework. The
static string concatenation cannot be correctly interpreted by
gettext utilities, such as xgettext.

Wrap PRItime in format_raw_time() function, so that we can extract
correct l10n messages into "po/git.pot".

Reported-by: Jean-Noël Avila <jn.av...@free.fr>
Signed-off-by: Jiang Xin <worldhello....@gmail.com>
---
 archive-zip.c          |  4 ++--
 builtin/blame.c        |  4 ++--
 builtin/fsck.c         |  3 ++-
 builtin/log.c          |  4 ++--
 builtin/receive-pack.c |  4 ++--
 builtin/rev-parse.c    |  2 +-
 cache.h                |  1 +
 date.c                 | 63 ++++++++++++++++++++++++++++++++------------------
 fetch-pack.c           |  2 +-
 refs/files-backend.c   |  6 ++---
 upload-pack.c          |  2 +-
 vcs-svn/fast_export.c  |  8 ++++---
 12 files changed, 63 insertions(+), 40 deletions(-)

diff --git a/archive-zip.c b/archive-zip.c
index e8913e5a26..92df24815e 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -600,8 +600,8 @@ static void dos_time(timestamp_t *timestamp, int *dos_date, 
int *dos_time)
        struct tm *t;
 
        if (date_overflows(*timestamp))
-               die("timestamp too large for this system: %"PRItime,
-                   *timestamp);
+               die("timestamp too large for this system: %s",
+                   format_raw_time(*timestamp));
        time = (time_t)*timestamp;
        t = localtime(&time);
        *timestamp = time;
diff --git a/builtin/blame.c b/builtin/blame.c
index bda1a78726..97bd99dd51 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -245,11 +245,11 @@ static int emit_one_suspect_detail(struct blame_origin 
*suspect, int repeat)
        get_commit_info(suspect->commit, &ci, 1);
        printf("author %s\n", ci.author.buf);
        printf("author-mail %s\n", ci.author_mail.buf);
-       printf("author-time %"PRItime"\n", ci.author_time);
+       printf("author-time %s\n", format_raw_time(ci.author_time));
        printf("author-tz %s\n", ci.author_tz.buf);
        printf("committer %s\n", ci.committer.buf);
        printf("committer-mail %s\n", ci.committer_mail.buf);
-       printf("committer-time %"PRItime"\n", ci.committer_time);
+       printf("committer-time %s\n", format_raw_time(ci.committer_time));
        printf("committer-tz %s\n", ci.committer_tz.buf);
        printf("summary %s\n", ci.summary.buf);
        if (suspect->commit->object.flags & UNINTERESTING)
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 99dea7adf6..1f6fc674c3 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -407,7 +407,8 @@ static void fsck_handle_reflog_oid(const char *refname, 
struct object_id *oid,
                        if (timestamp && name_objects)
                                add_decoration(fsck_walk_options.object_names,
                                        obj,
-                                       xstrfmt("%s@{%"PRItime"}", refname, 
timestamp));
+                                       xstrfmt("%s@{%s}", refname,
+                                               format_raw_time(timestamp)));
                        obj->used = 1;
                        mark_object_reachable(obj);
                } else {
diff --git a/builtin/log.c b/builtin/log.c
index c6362cf92e..83b303f8af 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -920,8 +920,8 @@ static void get_patch_ids(struct rev_info *rev, struct 
patch_ids *ids)
 static void gen_message_id(struct rev_info *info, char *base)
 {
        struct strbuf buf = STRBUF_INIT;
-       strbuf_addf(&buf, "%s.%"PRItime".git.%s", base,
-                   (timestamp_t) time(NULL),
+       strbuf_addf(&buf, "%s.%s.git.%s", base,
+                   format_raw_time((timestamp_t) time(NULL)),
                    
git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
        info->message_id = strbuf_detach(&buf, NULL);
 }
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index cabdc55e09..75f26a1bc5 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -460,12 +460,12 @@ static char *prepare_push_cert_nonce(const char *path, 
timestamp_t stamp)
        struct strbuf buf = STRBUF_INIT;
        unsigned char sha1[20];
 
-       strbuf_addf(&buf, "%s:%"PRItime, path, stamp);
+       strbuf_addf(&buf, "%s:%s", path, format_raw_time(stamp));
        hmac_sha1(sha1, buf.buf, buf.len, cert_nonce_seed, 
strlen(cert_nonce_seed));;
        strbuf_release(&buf);
 
        /* RFC 2104 5. HMAC-SHA1-80 */
-       strbuf_addf(&buf, "%"PRItime"-%.*s", stamp, 20, sha1_to_hex(sha1));
+       strbuf_addf(&buf, "%s-%.*s", format_raw_time(stamp), 20, 
sha1_to_hex(sha1));
        return strbuf_detach(&buf, NULL);
 }
 
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index c78b7b33d6..c55872196f 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -219,7 +219,7 @@ static void show_datestring(const char *flag, const char 
*datestr)
        /* date handling requires both flags and revs */
        if ((filter & (DO_FLAGS | DO_REVS)) != (DO_FLAGS | DO_REVS))
                return;
-       buffer = xstrfmt("%s%"PRItime, flag, approxidate(datestr));
+       buffer = xstrfmt("%s%s", flag, format_raw_time(approxidate(datestr)));
        show(buffer);
        free(buffer);
 }
diff --git a/cache.h b/cache.h
index 71fe092644..ff0d9c77a7 100644
--- a/cache.h
+++ b/cache.h
@@ -1428,6 +1428,7 @@ struct date_mode {
 #define DATE_MODE(t) date_mode_from_type(DATE_##t)
 struct date_mode *date_mode_from_type(enum date_mode_type type);
 
+const char *format_raw_time(timestamp_t time);
 const char *show_date(timestamp_t time, int timezone, const struct date_mode 
*mode);
 void show_date_relative(timestamp_t time, int tz, const struct timeval *now,
                        struct strbuf *timebuf);
diff --git a/date.c b/date.c
index c3e673fd04..161489903c 100644
--- a/date.c
+++ b/date.c
@@ -49,13 +49,15 @@ static time_t gm_time_t(timestamp_t time, int tz)
 
        if (minutes > 0) {
                if (unsigned_add_overflows(time, minutes * 60))
-                       die("Timestamp+tz too large: %"PRItime" +%04d",
-                           time, tz);
+                       die("Timestamp+tz too large: %s +%04d",
+                           format_raw_time(time), tz);
        } else if (time < -minutes * 60)
-               die("Timestamp before Unix epoch: %"PRItime" %04d", time, tz);
+               die("Timestamp before Unix epoch: %s %04d",
+                   format_raw_time(time), tz);
        time += minutes * 60;
        if (date_overflows(time))
-               die("Timestamp too large for this system: %"PRItime, time);
+               die("Timestamp too large for this system: %s",
+                   format_raw_time(time));
        return (time_t)time;
 }
 
@@ -87,7 +89,8 @@ static int local_tzoffset(timestamp_t time)
        int offset, eastwest;
 
        if (date_overflows(time))
-               die("Timestamp too large for this system: %"PRItime, time);
+               die("Timestamp too large for this system: %s",
+                   format_raw_time(time));
 
        t = (time_t)time;
        localtime_r(&t, &tm);
@@ -119,42 +122,46 @@ void show_date_relative(timestamp_t time, int tz,
        diff = now->tv_sec - time;
        if (diff < 90) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" second ago", "%"PRItime" seconds ago", 
diff), diff);
+                        Q_("%s second ago", "%s seconds ago", diff),
+                        format_raw_time(diff));
                return;
        }
        /* Turn it into minutes */
        diff = (diff + 30) / 60;
        if (diff < 90) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" minute ago", "%"PRItime" minutes ago", 
diff), diff);
+                        Q_("%s minute ago", "%s minutes ago", diff),
+                        format_raw_time(diff));
                return;
        }
        /* Turn it into hours */
        diff = (diff + 30) / 60;
        if (diff < 36) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" hour ago", "%"PRItime" hours ago", 
diff), diff);
+                        Q_("%s hour ago", "%s hours ago", diff),
+                        format_raw_time(diff));
                return;
        }
        /* We deal with number of days from here on */
        diff = (diff + 12) / 24;
        if (diff < 14) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" day ago", "%"PRItime" days ago", diff), 
diff);
+                        Q_("%s day ago", "%s days ago", diff),
+                        format_raw_time(diff));
                return;
        }
        /* Say weeks for the past 10 weeks or so */
        if (diff < 70) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" week ago", "%"PRItime" weeks ago", 
(diff + 3) / 7),
-                        (diff + 3) / 7);
+                        Q_("%s week ago", "%s weeks ago", (diff + 3) / 7),
+                        format_raw_time((diff + 3) / 7));
                return;
        }
        /* Say months for the past 12 months or so */
        if (diff < 365) {
                strbuf_addf(timebuf,
-                        Q_("%"PRItime" month ago", "%"PRItime" months ago", 
(diff + 15) / 30),
-                        (diff + 15) / 30);
+                        Q_("%s month ago", "%s months ago", (diff + 15) / 30),
+                        format_raw_time((diff + 15) / 30));
                return;
        }
        /* Give years and months for 5 years or so */
@@ -164,21 +171,23 @@ void show_date_relative(timestamp_t time, int tz,
                timestamp_t months = totalmonths % 12;
                if (months) {
                        struct strbuf sb = STRBUF_INIT;
-                       strbuf_addf(&sb, Q_("%"PRItime" year", "%"PRItime" 
years", years), years);
+                       strbuf_addf(&sb, Q_("%s year", "%s years", years),
+                               format_raw_time(years));
                        strbuf_addf(timebuf,
                                 /* TRANSLATORS: "%s" is "<n> years" */
-                                Q_("%s, %"PRItime" month ago", "%s, %"PRItime" 
months ago", months),
-                                sb.buf, months);
+                                Q_("%s, %s month ago", "%s, %s months ago", 
months),
+                                sb.buf, format_raw_time(months));
                        strbuf_release(&sb);
                } else
                        strbuf_addf(timebuf,
-                                Q_("%"PRItime" year ago", "%"PRItime" years 
ago", years), years);
+                                Q_("%s year ago", "%s years ago", years),
+                                format_raw_time(years));
                return;
        }
        /* Otherwise, just years. Centuries is probably overkill. */
        strbuf_addf(timebuf,
-                Q_("%"PRItime" year ago", "%"PRItime" years ago", (diff + 183) 
/ 365),
-                (diff + 183) / 365);
+                Q_("%s year ago", "%s years ago", (diff + 183) / 365),
+                format_raw_time((diff + 183) / 365));
 }
 
 struct date_mode *date_mode_from_type(enum date_mode_type type)
@@ -191,6 +200,15 @@ struct date_mode *date_mode_from_type(enum date_mode_type 
type)
        return &mode;
 }
 
+const char *format_raw_time(timestamp_t time)
+{
+       static struct strbuf time_buf = STRBUF_INIT;
+
+       strbuf_reset(&time_buf);
+       strbuf_addf(&time_buf, "%"PRItime, time);
+       return time_buf.buf;
+}
+
 const char *show_date(timestamp_t time, int tz, const struct date_mode *mode)
 {
        struct tm *tm;
@@ -198,7 +216,7 @@ const char *show_date(timestamp_t time, int tz, const 
struct date_mode *mode)
 
        if (mode->type == DATE_UNIX) {
                strbuf_reset(&timebuf);
-               strbuf_addf(&timebuf, "%"PRItime, time);
+               strbuf_addstr(&timebuf, format_raw_time(time));
                return timebuf.buf;
        }
 
@@ -207,7 +225,7 @@ const char *show_date(timestamp_t time, int tz, const 
struct date_mode *mode)
 
        if (mode->type == DATE_RAW) {
                strbuf_reset(&timebuf);
-               strbuf_addf(&timebuf, "%"PRItime" %+05d", time, tz);
+               strbuf_addf(&timebuf, "%s %+05d", format_raw_time(time), tz);
                return timebuf.buf;
        }
 
@@ -666,7 +684,8 @@ static void date_string(timestamp_t date, int offset, 
struct strbuf *buf)
                offset = -offset;
                sign = '-';
        }
-       strbuf_addf(buf, "%"PRItime" %c%02d%02d", date, sign, offset / 60, 
offset % 60);
+       strbuf_addf(buf, "%s %c%02d%02d", format_raw_time(date), sign,
+               offset / 60, offset % 60);
 }
 
 /*
diff --git a/fetch-pack.c b/fetch-pack.c
index fbbc99c888..80c4ec27df 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -397,7 +397,7 @@ static int find_common(struct fetch_pack_args *args,
                packet_buf_write(&req_buf, "deepen %d", args->depth);
        if (args->deepen_since) {
                timestamp_t max_age = approxidate(args->deepen_since);
-               packet_buf_write(&req_buf, "deepen-since %"PRItime, max_age);
+               packet_buf_write(&req_buf, "deepen-since %s", 
format_raw_time(max_age));
        }
        if (args->deepen_not) {
                int i;
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 0404f2c233..3872ef33e7 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -3236,9 +3236,9 @@ static int expire_reflog_ent(struct object_id *ooid, 
struct object_id *noid,
                        printf("prune %s", message);
        } else {
                if (cb->newlog) {
-                       fprintf(cb->newlog, "%s %s %s %"PRItime" %+05d\t%s",
-                               oid_to_hex(ooid), oid_to_hex(noid),
-                               email, timestamp, tz, message);
+                       fprintf(cb->newlog, "%s %s %s %s %+05d\t%s",
+                               oid_to_hex(ooid), oid_to_hex(noid), email,
+                               format_raw_time(timestamp), tz, message);
                        oidcpy(&cb->last_kept_oid, noid);
                }
                if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
diff --git a/upload-pack.c b/upload-pack.c
index 7efff2fbfd..cfcc79a9cd 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -864,7 +864,7 @@ static void receive_needs(void)
 
                argv_array_push(&av, "rev-list");
                if (deepen_since)
-                       argv_array_pushf(&av, "--max-age=%"PRItime, 
deepen_since);
+                       argv_array_pushf(&av, "--max-age=%s", 
format_raw_time(deepen_since));
                if (deepen_not.nr) {
                        argv_array_push(&av, "--not");
                        for (i = 0; i < deepen_not.nr; i++) {
diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c
index 5a89db30e3..291f294e30 100644
--- a/vcs-svn/fast_export.c
+++ b/vcs-svn/fast_export.c
@@ -73,7 +73,8 @@ void fast_export_begin_note(uint32_t revision, const char 
*author,
        static int firstnote = 1;
        size_t loglen = strlen(log);
        printf("commit %s\n", note_ref);
-       printf("committer %s <%s@%s> %"PRItime" +0000\n", author, author, 
"local", timestamp);
+       printf("committer %s <%s@%s> %s +0000\n", author, author, "local",
+               format_raw_time(timestamp));
        printf("data %"PRIuMAX"\n", (uintmax_t)loglen);
        fwrite(log, loglen, 1, stdout);
        if (firstnote) {
@@ -107,10 +108,11 @@ void fast_export_begin_commit(uint32_t revision, const 
char *author,
        }
        printf("commit %s\n", local_ref);
        printf("mark :%"PRIu32"\n", revision);
-       printf("committer %s <%s@%s> %"PRItime" +0000\n",
+       printf("committer %s <%s@%s> %s +0000\n",
                   *author ? author : "nobody",
                   *author ? author : "nobody",
-                  *uuid ? uuid : "local", timestamp);
+                  *uuid ? uuid : "local",
+                  format_raw_time(timestamp));
        printf("data %"PRIuMAX"\n",
                (uintmax_t) (log->len + strlen(gitsvnline)));
        fwrite(log->buf, log->len, 1, stdout);
-- 
2.14.0.rc0.1.g3ccfa2fb49

Reply via email to