166
if (type == DATE_STRFTIME)
167
die("BUG: cannot create anonymous strftime date_mode struct");
168
mode.type = type;
169
+ mode.local = 0;
170
return &mode;
171
}
172
175
struct tm *tm;
176
static struct strbuf timebuf = STRBUF_INIT;
177
177
- if (mode->type == DATE_LOCAL)
178
+ if (mode->local)
179
tz = local_tzoffset(time);
180
181
if (mode->type == DATE_RAW) {
233
tm->tm_mday,
234
tm->tm_hour, tm->tm_min, tm->tm_sec,
235
tm->tm_year + 1900,
235
- (mode->type == DATE_LOCAL) ? 0 : ' ',
236
+ mode->local ? 0 : ' ',
237
tz);
238
return timebuf.buf;
239
}
771
return 0;
772
}
773
774
+static enum date_mode_type parse_date_type(const char *format, const char **end)
775
+{
776
+ if (skip_prefix(format, "relative", end))
777
+ return DATE_RELATIVE;
778
+ if (skip_prefix(format, "iso8601-strict", end) ||
779
+ skip_prefix(format, "iso-strict", end))
780
+ return DATE_ISO8601_STRICT;
781
+ if (skip_prefix(format, "iso8601", end) ||
782
+ skip_prefix(format, "iso", end))
783
+ return DATE_ISO8601;
784
+ if (skip_prefix(format, "rfc2822", end) ||
785
+ skip_prefix(format, "rfc", end))
786
+ return DATE_RFC2822;
787
+ if (skip_prefix(format, "short", end))
788
+ return DATE_SHORT;
789
+ if (skip_prefix(format, "default", end))
790
+ return DATE_NORMAL;
791
+ if (skip_prefix(format, "raw", end))
792
+ return DATE_RAW;
793
+ if (skip_prefix(format, "format", end))
794
+ return DATE_STRFTIME;
795
+
796
+ die("unknown date format %s", format);
797
+}
798
+
799
void parse_date_format(const char *format, struct date_mode *mode)
800
{
775
- if (!strcmp(format, "relative"))
776
- mode->type = DATE_RELATIVE;
777
- else if (!strcmp(format, "iso8601") ||
778
- !strcmp(format, "iso"))
779
- mode->type = DATE_ISO8601;
780
- else if (!strcmp(format, "iso8601-strict") ||
781
- !strcmp(format, "iso-strict"))
782
- mode->type = DATE_ISO8601_STRICT;
783
- else if (!strcmp(format, "rfc2822") ||
784
- !strcmp(format, "rfc"))
785
- mode->type = DATE_RFC2822;
786
- else if (!strcmp(format, "short"))
787
- mode->type = DATE_SHORT;
788
- else if (!strcmp(format, "local"))
789
- mode->type = DATE_LOCAL;
790
- else if (!strcmp(format, "default"))
791
- mode->type = DATE_NORMAL;
792
- else if (!strcmp(format, "raw"))
793
- mode->type = DATE_RAW;
794
- else if (skip_prefix(format, "format:", &format)) {
795
- mode->type = DATE_STRFTIME;
796
- mode->strftime_fmt = xstrdup(format);
797
- } else
801
+ const char *p;
802
+
803
+ /* historical alias */
804
+ if (!strcmp(format, "local"))
805
+ format = "default-local";
806
+
807
+ mode->type = parse_date_type(format, &p);
808
+ mode->local = 0;
809
+
810
+ if (skip_prefix(p, "-local", &p))
811
+ mode->local = 1;
812
+
813
+ if (mode->type == DATE_STRFTIME) {
814
+ if (!skip_prefix(p, ":", &p))
815
+ die("date format missing colon separator: %s", format);
816
+ mode->strftime_fmt = xstrdup(p);
817
+ } else if (*p)
818
die("unknown date format %s", format);
819
}
820