merged upstream Index: gettext-0.19.8.1/gettext-tools/src/xgettext.c =================================================================== --- gettext-0.19.8.1.orig/gettext-tools/src/xgettext.c +++ gettext-0.19.8.1/gettext-tools/src/xgettext.c @@ -3714,6 +3714,9 @@ construct_header () char *msgstr; char *comment; static lex_pos_ty pos = { __FILE__, __LINE__ }; + char *source_date_epoch; + unsigned long long epoch; + char *endptr; if (package_name != NULL) { @@ -3734,7 +3738,31 @@ the MSGID_BUGS_ADDRESS variable there; o specify an --msgid-bugs-address command line option.\n\ "))); - time (&now); + source_date_epoch = getenv("SOURCE_DATE_EPOCH"); + if (source_date_epoch) { + errno = 0; + epoch = strtoull(source_date_epoch, &endptr, 10); + if ((errno == ERANGE && (epoch == ULLONG_MAX || epoch == 0)) + || (errno != 0 && epoch == 0)) { + fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: strtoull: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + if (endptr == source_date_epoch) { + fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: No digits were found: %s\n", endptr); + exit(EXIT_FAILURE); + } + if (*endptr != '\0') { + fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: Trailing garbage: %s\n", endptr); + exit(EXIT_FAILURE); + } + if (epoch > ULONG_MAX) { + fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: value must be smaller than or equal to %lu but was found to be: %llu \n", ULONG_MAX, epoch); + exit(EXIT_FAILURE); + } + now = epoch; + } else { + now = time(NULL); + } timestring = po_strftime (&now); msgstr = xasprintf ("\