[PATCH] PRItime: wrap PRItime for better l10n compatibility
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.avila@free.fr>
Signed-off-by: Jiang Xin <worldhello.net@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