blob: 0683d46574fa41e6b4186e8ec49d06ce65d93256 [file] [log] [blame]
Nguyễn Thái Ngọc Duya801a7c2018-03-24 08:44:36 +01001#include "test-tool.h"
Ævar Arnfjörð Bjarmason88c7b4c2022-02-16 09:14:02 +01002#include "date.h"
Elijah Newren74ea5c92023-04-11 03:00:38 +00003#include "trace.h"
Linus Torvalds89967022005-04-30 13:19:56 -07004
Jeff King4f6552e2009-08-30 22:26:46 -04005static const char *usage_msg = "\n"
Nguyễn Thái Ngọc Duya801a7c2018-03-24 08:44:36 +01006" test-tool date relative [time_t]...\n"
Stephen P. Smithb841d4f2019-01-28 20:50:15 -07007" test-tool date human [time_t]...\n"
Nguyễn Thái Ngọc Duya801a7c2018-03-24 08:44:36 +01008" test-tool date show:<format> [time_t]...\n"
9" test-tool date parse [date]...\n"
10" test-tool date approxidate [date]...\n"
11" test-tool date timestamp [date]...\n"
Johannes Schindelin4419de92019-01-27 15:26:54 -080012" test-tool date getnanos [start-nanos]\n"
Nguyễn Thái Ngọc Duya801a7c2018-03-24 08:44:36 +010013" test-tool date is64bit\n"
14" test-tool date time_t-is64bit\n";
Linus Torvalds89967022005-04-30 13:19:56 -070015
Stephen P. Smith29f43322019-09-11 21:11:01 -070016static void show_relative_dates(const char **argv)
Jeff King4f6552e2009-08-30 22:26:46 -040017{
Jonathan Nieder7d29afd2012-04-23 19:30:23 +070018 struct strbuf buf = STRBUF_INIT;
Jeff King4f6552e2009-08-30 22:26:46 -040019
20 for (; *argv; argv++) {
21 time_t t = atoi(*argv);
Stephen P. Smith29f43322019-09-11 21:11:01 -070022 show_date_relative(t, &buf);
Jonathan Nieder7d29afd2012-04-23 19:30:23 +070023 printf("%s -> %s\n", *argv, buf.buf);
Jeff King4f6552e2009-08-30 22:26:46 -040024 }
Jonathan Nieder7d29afd2012-04-23 19:30:23 +070025 strbuf_release(&buf);
Jeff King4f6552e2009-08-30 22:26:46 -040026}
27
Stephen P. Smithb841d4f2019-01-28 20:50:15 -070028static void show_human_dates(const char **argv)
29{
30 for (; *argv; argv++) {
31 time_t t = atoi(*argv);
32 printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(HUMAN)));
33 }
34}
35
Junio C Hamanod4c63752016-07-19 13:22:19 -070036static void show_dates(const char **argv, const char *format)
Jeff King36d67922016-06-20 17:11:59 -040037{
Ævar Arnfjörð Bjarmasonf1842892022-02-16 09:14:03 +010038 struct date_mode mode = DATE_MODE_INIT;
Jeff King36d67922016-06-20 17:11:59 -040039
40 parse_date_format(format, &mode);
41 for (; *argv; argv++) {
Junio C Hamanod4c63752016-07-19 13:22:19 -070042 char *arg;
Johannes Schindelindddbad72017-04-26 21:29:31 +020043 timestamp_t t;
Jeff King36d67922016-06-20 17:11:59 -040044 int tz;
45
46 /*
47 * Do not use our normal timestamp parsing here, as the point
48 * is to test the formatting code in isolation.
49 */
Johannes Schindelin1aeb7e72017-04-21 12:45:44 +020050 t = parse_timestamp(*argv, &arg, 10);
Jeff King36d67922016-06-20 17:11:59 -040051 while (*arg == ' ')
52 arg++;
53 tz = atoi(arg);
54
55 printf("%s -> %s\n", *argv, show_date(t, tz, &mode));
56 }
Ævar Arnfjörð Bjarmason974c9192022-02-16 09:14:05 +010057
58 date_mode_release(&mode);
Jeff King36d67922016-06-20 17:11:59 -040059}
60
Jeff King04c4c762019-03-20 04:14:30 -040061static void parse_dates(const char **argv)
Jeff King4f6552e2009-08-30 22:26:46 -040062{
Jeff Kingc33ddc22014-08-27 03:57:08 -040063 struct strbuf result = STRBUF_INIT;
64
Jeff King4f6552e2009-08-30 22:26:46 -040065 for (; *argv; argv++) {
Johannes Schindelindddbad72017-04-26 21:29:31 +020066 timestamp_t t;
Jeff King6b097782010-07-04 06:48:35 -040067 int tz;
Linus Torvalds89967022005-04-30 13:19:56 -070068
Jeff Kingc33ddc22014-08-27 03:57:08 -040069 strbuf_reset(&result);
70 parse_date(*argv, &result);
Johannes Schindelincb71f8b2017-04-21 12:45:48 +020071 if (sscanf(result.buf, "%"PRItime" %d", &t, &tz) == 2)
Jeff King6b097782010-07-04 06:48:35 -040072 printf("%s -> %s\n",
Jeff Kinga5481a62015-06-25 12:55:02 -040073 *argv, show_date(t, tz, DATE_MODE(ISO8601)));
Jeff King6b097782010-07-04 06:48:35 -040074 else
75 printf("%s -> bad\n", *argv);
Linus Torvalds89967022005-04-30 13:19:56 -070076 }
Jeff Kingc33ddc22014-08-27 03:57:08 -040077 strbuf_release(&result);
Jeff King4f6552e2009-08-30 22:26:46 -040078}
79
Stephen P. Smith29f43322019-09-11 21:11:01 -070080static void parse_approxidate(const char **argv)
Jeff King4f6552e2009-08-30 22:26:46 -040081{
82 for (; *argv; argv++) {
Johannes Schindelindddbad72017-04-26 21:29:31 +020083 timestamp_t t;
René Scharfe8a7f0b62023-04-08 11:35:24 +020084 t = approxidate(*argv);
Jeff Kinga5481a62015-06-25 12:55:02 -040085 printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601)));
Jeff King4f6552e2009-08-30 22:26:46 -040086 }
87}
88
Stephen P. Smith29f43322019-09-11 21:11:01 -070089static void parse_approx_timestamp(const char **argv)
Haaris Mehmood5f967422017-11-18 02:27:27 +000090{
91 for (; *argv; argv++) {
92 timestamp_t t;
René Scharfe8a7f0b62023-04-08 11:35:24 +020093 t = approxidate(*argv);
Haaris Mehmood5f967422017-11-18 02:27:27 +000094 printf("%s -> %"PRItime"\n", *argv, t);
95 }
96}
97
Jeff Kingba285a72019-02-06 14:35:52 -050098static void getnanos(const char **argv)
Johannes Schindelin4419de92019-01-27 15:26:54 -080099{
100 double seconds = getnanotime() / 1.0e9;
101
102 if (*argv)
103 seconds -= strtod(*argv, NULL);
104 printf("%lf\n", seconds);
105}
106
Jeff King126e3b32023-03-28 16:57:25 -0400107int cmd__date(int argc UNUSED, const char **argv)
Jeff King4f6552e2009-08-30 22:26:46 -0400108{
Jeff King4f6552e2009-08-30 22:26:46 -0400109 const char *x;
Jeff King4f6552e2009-08-30 22:26:46 -0400110
111 argv++;
112 if (!*argv)
113 usage(usage_msg);
Jeff Kingfdba2cd2016-06-20 17:10:29 -0400114 if (!strcmp(*argv, "relative"))
Stephen P. Smith29f43322019-09-11 21:11:01 -0700115 show_relative_dates(argv+1);
Stephen P. Smithb841d4f2019-01-28 20:50:15 -0700116 else if (!strcmp(*argv, "human"))
117 show_human_dates(argv+1);
Jeff King36d67922016-06-20 17:11:59 -0400118 else if (skip_prefix(*argv, "show:", &x))
119 show_dates(argv+1, x);
Jeff King4f6552e2009-08-30 22:26:46 -0400120 else if (!strcmp(*argv, "parse"))
Jeff King04c4c762019-03-20 04:14:30 -0400121 parse_dates(argv+1);
Jeff King4f6552e2009-08-30 22:26:46 -0400122 else if (!strcmp(*argv, "approxidate"))
Stephen P. Smith29f43322019-09-11 21:11:01 -0700123 parse_approxidate(argv+1);
Haaris Mehmood5f967422017-11-18 02:27:27 +0000124 else if (!strcmp(*argv, "timestamp"))
Stephen P. Smith29f43322019-09-11 21:11:01 -0700125 parse_approx_timestamp(argv+1);
Johannes Schindelin4419de92019-01-27 15:26:54 -0800126 else if (!strcmp(*argv, "getnanos"))
Jeff Kingba285a72019-02-06 14:35:52 -0500127 getnanos(argv+1);
Johannes Schindelina07fb052017-04-20 22:52:13 +0200128 else if (!strcmp(*argv, "is64bit"))
Johannes Schindelindddbad72017-04-26 21:29:31 +0200129 return sizeof(timestamp_t) == 8 ? 0 : 1;
Johannes Schindelinefac8ac2017-04-20 22:58:21 +0200130 else if (!strcmp(*argv, "time_t-is64bit"))
131 return sizeof(time_t) == 8 ? 0 : 1;
Jeff King4f6552e2009-08-30 22:26:46 -0400132 else
133 usage(usage_msg);
Linus Torvalds89967022005-04-30 13:19:56 -0700134 return 0;
135}