5f9674243d
Add --expiry-date as a data-type for config files when 'git config --get' is used. This will return any relative or fixed dates from config files as timestamps. This is useful for scripts (e.g. gc.reflogexpire) that work with timestamps so that '2.weeks' can be converted to a format acceptable by those scripts/functions. Following the convention of git_config_pathname(), move the helper function required for this feature from builtin/reflog.c to builtin/config.c where other similar functions exist (e.g. for --bool or --path), and match the order of parameters with other functions (i.e. output pointer as first parameter). Signed-off-by: Haaris Mehmood <hsed@unimetic.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
118 lines
2.6 KiB
C
118 lines
2.6 KiB
C
#include "cache.h"
|
|
|
|
static const char *usage_msg = "\n"
|
|
" test-date relative [time_t]...\n"
|
|
" test-date show:<format> [time_t]...\n"
|
|
" test-date parse [date]...\n"
|
|
" test-date approxidate [date]...\n"
|
|
" test-date timestamp [date]...\n"
|
|
" test-date is64bit\n"
|
|
" test-date time_t-is64bit\n";
|
|
|
|
static void show_relative_dates(const char **argv, struct timeval *now)
|
|
{
|
|
struct strbuf buf = STRBUF_INIT;
|
|
|
|
for (; *argv; argv++) {
|
|
time_t t = atoi(*argv);
|
|
show_date_relative(t, 0, now, &buf);
|
|
printf("%s -> %s\n", *argv, buf.buf);
|
|
}
|
|
strbuf_release(&buf);
|
|
}
|
|
|
|
static void show_dates(const char **argv, const char *format)
|
|
{
|
|
struct date_mode mode;
|
|
|
|
parse_date_format(format, &mode);
|
|
for (; *argv; argv++) {
|
|
char *arg;
|
|
timestamp_t t;
|
|
int tz;
|
|
|
|
/*
|
|
* Do not use our normal timestamp parsing here, as the point
|
|
* is to test the formatting code in isolation.
|
|
*/
|
|
t = parse_timestamp(*argv, &arg, 10);
|
|
while (*arg == ' ')
|
|
arg++;
|
|
tz = atoi(arg);
|
|
|
|
printf("%s -> %s\n", *argv, show_date(t, tz, &mode));
|
|
}
|
|
}
|
|
|
|
static void parse_dates(const char **argv, struct timeval *now)
|
|
{
|
|
struct strbuf result = STRBUF_INIT;
|
|
|
|
for (; *argv; argv++) {
|
|
timestamp_t t;
|
|
int tz;
|
|
|
|
strbuf_reset(&result);
|
|
parse_date(*argv, &result);
|
|
if (sscanf(result.buf, "%"PRItime" %d", &t, &tz) == 2)
|
|
printf("%s -> %s\n",
|
|
*argv, show_date(t, tz, DATE_MODE(ISO8601)));
|
|
else
|
|
printf("%s -> bad\n", *argv);
|
|
}
|
|
strbuf_release(&result);
|
|
}
|
|
|
|
static void parse_approxidate(const char **argv, struct timeval *now)
|
|
{
|
|
for (; *argv; argv++) {
|
|
timestamp_t t;
|
|
t = approxidate_relative(*argv, now);
|
|
printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601)));
|
|
}
|
|
}
|
|
|
|
static void parse_approx_timestamp(const char **argv, struct timeval *now)
|
|
{
|
|
for (; *argv; argv++) {
|
|
timestamp_t t;
|
|
t = approxidate_relative(*argv, now);
|
|
printf("%s -> %"PRItime"\n", *argv, t);
|
|
}
|
|
}
|
|
|
|
int cmd_main(int argc, const char **argv)
|
|
{
|
|
struct timeval now;
|
|
const char *x;
|
|
|
|
x = getenv("TEST_DATE_NOW");
|
|
if (x) {
|
|
now.tv_sec = atoi(x);
|
|
now.tv_usec = 0;
|
|
}
|
|
else
|
|
gettimeofday(&now, NULL);
|
|
|
|
argv++;
|
|
if (!*argv)
|
|
usage(usage_msg);
|
|
if (!strcmp(*argv, "relative"))
|
|
show_relative_dates(argv+1, &now);
|
|
else if (skip_prefix(*argv, "show:", &x))
|
|
show_dates(argv+1, x);
|
|
else if (!strcmp(*argv, "parse"))
|
|
parse_dates(argv+1, &now);
|
|
else if (!strcmp(*argv, "approxidate"))
|
|
parse_approxidate(argv+1, &now);
|
|
else if (!strcmp(*argv, "timestamp"))
|
|
parse_approx_timestamp(argv+1, &now);
|
|
else if (!strcmp(*argv, "is64bit"))
|
|
return sizeof(timestamp_t) == 8 ? 0 : 1;
|
|
else if (!strcmp(*argv, "time_t-is64bit"))
|
|
return sizeof(time_t) == 8 ? 0 : 1;
|
|
else
|
|
usage(usage_msg);
|
|
return 0;
|
|
}
|