Nguyễn Thái Ngọc Duy | a801a7c | 2018-03-24 08:44:36 +0100 | [diff] [blame] | 1 | #include "test-tool.h" |
Ævar Arnfjörð Bjarmason | 88c7b4c | 2022-02-16 09:14:02 +0100 | [diff] [blame] | 2 | #include "date.h" |
Elijah Newren | 74ea5c9 | 2023-04-11 03:00:38 +0000 | [diff] [blame] | 3 | #include "trace.h" |
Linus Torvalds | 8996702 | 2005-04-30 13:19:56 -0700 | [diff] [blame] | 4 | |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 5 | static const char *usage_msg = "\n" |
Nguyễn Thái Ngọc Duy | a801a7c | 2018-03-24 08:44:36 +0100 | [diff] [blame] | 6 | " test-tool date relative [time_t]...\n" |
Stephen P. Smith | b841d4f | 2019-01-28 20:50:15 -0700 | [diff] [blame] | 7 | " test-tool date human [time_t]...\n" |
Nguyễn Thái Ngọc Duy | a801a7c | 2018-03-24 08:44:36 +0100 | [diff] [blame] | 8 | " 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 Schindelin | 4419de9 | 2019-01-27 15:26:54 -0800 | [diff] [blame] | 12 | " test-tool date getnanos [start-nanos]\n" |
Nguyễn Thái Ngọc Duy | a801a7c | 2018-03-24 08:44:36 +0100 | [diff] [blame] | 13 | " test-tool date is64bit\n" |
| 14 | " test-tool date time_t-is64bit\n"; |
Linus Torvalds | 8996702 | 2005-04-30 13:19:56 -0700 | [diff] [blame] | 15 | |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 16 | static void show_relative_dates(const char **argv) |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 17 | { |
Jonathan Nieder | 7d29afd | 2012-04-23 19:30:23 +0700 | [diff] [blame] | 18 | struct strbuf buf = STRBUF_INIT; |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 19 | |
| 20 | for (; *argv; argv++) { |
| 21 | time_t t = atoi(*argv); |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 22 | show_date_relative(t, &buf); |
Jonathan Nieder | 7d29afd | 2012-04-23 19:30:23 +0700 | [diff] [blame] | 23 | printf("%s -> %s\n", *argv, buf.buf); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 24 | } |
Jonathan Nieder | 7d29afd | 2012-04-23 19:30:23 +0700 | [diff] [blame] | 25 | strbuf_release(&buf); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 26 | } |
| 27 | |
Stephen P. Smith | b841d4f | 2019-01-28 20:50:15 -0700 | [diff] [blame] | 28 | static 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 Hamano | d4c6375 | 2016-07-19 13:22:19 -0700 | [diff] [blame] | 36 | static void show_dates(const char **argv, const char *format) |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 37 | { |
Ævar Arnfjörð Bjarmason | f184289 | 2022-02-16 09:14:03 +0100 | [diff] [blame] | 38 | struct date_mode mode = DATE_MODE_INIT; |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 39 | |
| 40 | parse_date_format(format, &mode); |
| 41 | for (; *argv; argv++) { |
Junio C Hamano | d4c6375 | 2016-07-19 13:22:19 -0700 | [diff] [blame] | 42 | char *arg; |
Johannes Schindelin | dddbad7 | 2017-04-26 21:29:31 +0200 | [diff] [blame] | 43 | timestamp_t t; |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 44 | 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 Schindelin | 1aeb7e7 | 2017-04-21 12:45:44 +0200 | [diff] [blame] | 50 | t = parse_timestamp(*argv, &arg, 10); |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 51 | while (*arg == ' ') |
| 52 | arg++; |
| 53 | tz = atoi(arg); |
| 54 | |
| 55 | printf("%s -> %s\n", *argv, show_date(t, tz, &mode)); |
| 56 | } |
Ævar Arnfjörð Bjarmason | 974c919 | 2022-02-16 09:14:05 +0100 | [diff] [blame] | 57 | |
| 58 | date_mode_release(&mode); |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 59 | } |
| 60 | |
Jeff King | 04c4c76 | 2019-03-20 04:14:30 -0400 | [diff] [blame] | 61 | static void parse_dates(const char **argv) |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 62 | { |
Jeff King | c33ddc2 | 2014-08-27 03:57:08 -0400 | [diff] [blame] | 63 | struct strbuf result = STRBUF_INIT; |
| 64 | |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 65 | for (; *argv; argv++) { |
Johannes Schindelin | dddbad7 | 2017-04-26 21:29:31 +0200 | [diff] [blame] | 66 | timestamp_t t; |
Jeff King | 6b09778 | 2010-07-04 06:48:35 -0400 | [diff] [blame] | 67 | int tz; |
Linus Torvalds | 8996702 | 2005-04-30 13:19:56 -0700 | [diff] [blame] | 68 | |
Jeff King | c33ddc2 | 2014-08-27 03:57:08 -0400 | [diff] [blame] | 69 | strbuf_reset(&result); |
| 70 | parse_date(*argv, &result); |
Johannes Schindelin | cb71f8b | 2017-04-21 12:45:48 +0200 | [diff] [blame] | 71 | if (sscanf(result.buf, "%"PRItime" %d", &t, &tz) == 2) |
Jeff King | 6b09778 | 2010-07-04 06:48:35 -0400 | [diff] [blame] | 72 | printf("%s -> %s\n", |
Jeff King | a5481a6 | 2015-06-25 12:55:02 -0400 | [diff] [blame] | 73 | *argv, show_date(t, tz, DATE_MODE(ISO8601))); |
Jeff King | 6b09778 | 2010-07-04 06:48:35 -0400 | [diff] [blame] | 74 | else |
| 75 | printf("%s -> bad\n", *argv); |
Linus Torvalds | 8996702 | 2005-04-30 13:19:56 -0700 | [diff] [blame] | 76 | } |
Jeff King | c33ddc2 | 2014-08-27 03:57:08 -0400 | [diff] [blame] | 77 | strbuf_release(&result); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 78 | } |
| 79 | |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 80 | static void parse_approxidate(const char **argv) |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 81 | { |
| 82 | for (; *argv; argv++) { |
Johannes Schindelin | dddbad7 | 2017-04-26 21:29:31 +0200 | [diff] [blame] | 83 | timestamp_t t; |
René Scharfe | 8a7f0b6 | 2023-04-08 11:35:24 +0200 | [diff] [blame] | 84 | t = approxidate(*argv); |
Jeff King | a5481a6 | 2015-06-25 12:55:02 -0400 | [diff] [blame] | 85 | printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601))); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 86 | } |
| 87 | } |
| 88 | |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 89 | static void parse_approx_timestamp(const char **argv) |
Haaris Mehmood | 5f96742 | 2017-11-18 02:27:27 +0000 | [diff] [blame] | 90 | { |
| 91 | for (; *argv; argv++) { |
| 92 | timestamp_t t; |
René Scharfe | 8a7f0b6 | 2023-04-08 11:35:24 +0200 | [diff] [blame] | 93 | t = approxidate(*argv); |
Haaris Mehmood | 5f96742 | 2017-11-18 02:27:27 +0000 | [diff] [blame] | 94 | printf("%s -> %"PRItime"\n", *argv, t); |
| 95 | } |
| 96 | } |
| 97 | |
Jeff King | ba285a7 | 2019-02-06 14:35:52 -0500 | [diff] [blame] | 98 | static void getnanos(const char **argv) |
Johannes Schindelin | 4419de9 | 2019-01-27 15:26:54 -0800 | [diff] [blame] | 99 | { |
| 100 | double seconds = getnanotime() / 1.0e9; |
| 101 | |
| 102 | if (*argv) |
| 103 | seconds -= strtod(*argv, NULL); |
| 104 | printf("%lf\n", seconds); |
| 105 | } |
| 106 | |
Jeff King | 126e3b3 | 2023-03-28 16:57:25 -0400 | [diff] [blame] | 107 | int cmd__date(int argc UNUSED, const char **argv) |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 108 | { |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 109 | const char *x; |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 110 | |
| 111 | argv++; |
| 112 | if (!*argv) |
| 113 | usage(usage_msg); |
Jeff King | fdba2cd | 2016-06-20 17:10:29 -0400 | [diff] [blame] | 114 | if (!strcmp(*argv, "relative")) |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 115 | show_relative_dates(argv+1); |
Stephen P. Smith | b841d4f | 2019-01-28 20:50:15 -0700 | [diff] [blame] | 116 | else if (!strcmp(*argv, "human")) |
| 117 | show_human_dates(argv+1); |
Jeff King | 36d6792 | 2016-06-20 17:11:59 -0400 | [diff] [blame] | 118 | else if (skip_prefix(*argv, "show:", &x)) |
| 119 | show_dates(argv+1, x); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 120 | else if (!strcmp(*argv, "parse")) |
Jeff King | 04c4c76 | 2019-03-20 04:14:30 -0400 | [diff] [blame] | 121 | parse_dates(argv+1); |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 122 | else if (!strcmp(*argv, "approxidate")) |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 123 | parse_approxidate(argv+1); |
Haaris Mehmood | 5f96742 | 2017-11-18 02:27:27 +0000 | [diff] [blame] | 124 | else if (!strcmp(*argv, "timestamp")) |
Stephen P. Smith | 29f4332 | 2019-09-11 21:11:01 -0700 | [diff] [blame] | 125 | parse_approx_timestamp(argv+1); |
Johannes Schindelin | 4419de9 | 2019-01-27 15:26:54 -0800 | [diff] [blame] | 126 | else if (!strcmp(*argv, "getnanos")) |
Jeff King | ba285a7 | 2019-02-06 14:35:52 -0500 | [diff] [blame] | 127 | getnanos(argv+1); |
Johannes Schindelin | a07fb05 | 2017-04-20 22:52:13 +0200 | [diff] [blame] | 128 | else if (!strcmp(*argv, "is64bit")) |
Johannes Schindelin | dddbad7 | 2017-04-26 21:29:31 +0200 | [diff] [blame] | 129 | return sizeof(timestamp_t) == 8 ? 0 : 1; |
Johannes Schindelin | efac8ac | 2017-04-20 22:58:21 +0200 | [diff] [blame] | 130 | else if (!strcmp(*argv, "time_t-is64bit")) |
| 131 | return sizeof(time_t) == 8 ? 0 : 1; |
Jeff King | 4f6552e | 2009-08-30 22:26:46 -0400 | [diff] [blame] | 132 | else |
| 133 | usage(usage_msg); |
Linus Torvalds | 8996702 | 2005-04-30 13:19:56 -0700 | [diff] [blame] | 134 | return 0; |
| 135 | } |