Add --date={local,relative,default}
This adds --date={local,relative,default} option to log family of commands, to allow displaying timestamps in user's local timezone, relative time, or the default format. Existing --relative-date option is a synonym of --date=relative; we could probably deprecate it in the long run. Signed-off-by: Junio C Hamano <junkio@cox.net>maint
parent
3e0a93a5bf
commit
a7b02ccf9a
|
@ -25,6 +25,7 @@ SYNOPSIS
|
||||||
[ \--cherry-pick ]
|
[ \--cherry-pick ]
|
||||||
[ \--encoding[=<encoding>] ]
|
[ \--encoding[=<encoding>] ]
|
||||||
[ \--(author|committer|grep)=<pattern> ]
|
[ \--(author|committer|grep)=<pattern> ]
|
||||||
|
[ \--date={local|relative|default} ]
|
||||||
[ [\--objects | \--objects-edge] [ \--unpacked ] ]
|
[ [\--objects | \--objects-edge] [ \--unpacked ] ]
|
||||||
[ \--pretty | \--header ]
|
[ \--pretty | \--header ]
|
||||||
[ \--bisect ]
|
[ \--bisect ]
|
||||||
|
@ -90,9 +91,20 @@ include::pretty-formats.txt[]
|
||||||
|
|
||||||
--relative-date::
|
--relative-date::
|
||||||
|
|
||||||
Show dates relative to the current time, e.g. "2 hours ago".
|
Synonym for `--date=relative`.
|
||||||
|
|
||||||
|
--date={relative,local,default}::
|
||||||
|
|
||||||
Only takes effect for dates shown in human-readable format, such
|
Only takes effect for dates shown in human-readable format, such
|
||||||
as when using "--pretty".
|
as when using "--pretty".
|
||||||
|
+
|
||||||
|
`--date=relative` shows dates relative to the current time,
|
||||||
|
e.g. "2 hours ago".
|
||||||
|
+
|
||||||
|
`--date=local` shows timestamps in user's local timezone.
|
||||||
|
+
|
||||||
|
`--date=default` shows timestamps in the original timezone
|
||||||
|
(either committer's or author's).
|
||||||
|
|
||||||
--header::
|
--header::
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ static void show_commit(struct commit *commit)
|
||||||
static char pretty_header[16384];
|
static char pretty_header[16384];
|
||||||
pretty_print_commit(revs.commit_format, commit, ~0,
|
pretty_print_commit(revs.commit_format, commit, ~0,
|
||||||
pretty_header, sizeof(pretty_header),
|
pretty_header, sizeof(pretty_header),
|
||||||
revs.abbrev, NULL, NULL, revs.relative_date);
|
revs.abbrev, NULL, NULL, revs.date_mode);
|
||||||
printf("%s%c", pretty_header, hdr_termination);
|
printf("%s%c", pretty_header, hdr_termination);
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
2
cache.h
2
cache.h
|
@ -389,7 +389,7 @@ extern void *read_object_with_reference(const unsigned char *sha1,
|
||||||
unsigned long *size,
|
unsigned long *size,
|
||||||
unsigned char *sha1_ret);
|
unsigned char *sha1_ret);
|
||||||
|
|
||||||
enum date_mode { DATE_NORMAL = 0, DATE_RELATIVE, DATE_SHORT };
|
enum date_mode { DATE_NORMAL = 0, DATE_RELATIVE, DATE_SHORT, DATE_LOCAL };
|
||||||
const char *show_date(unsigned long time, int timezone, enum date_mode mode);
|
const char *show_date(unsigned long time, int timezone, enum date_mode mode);
|
||||||
const char *show_rfc2822_date(unsigned long time, int timezone);
|
const char *show_rfc2822_date(unsigned long time, int timezone);
|
||||||
int parse_date(const char *date, char *buf, int bufsize);
|
int parse_date(const char *date, char *buf, int bufsize);
|
||||||
|
|
12
commit.c
12
commit.c
|
@ -526,7 +526,7 @@ static int add_rfc2047(char *buf, const char *line, int len,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf,
|
static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf,
|
||||||
const char *line, int relative_date,
|
const char *line, enum date_mode dmode,
|
||||||
const char *encoding)
|
const char *encoding)
|
||||||
{
|
{
|
||||||
char *date;
|
char *date;
|
||||||
|
@ -569,7 +569,7 @@ static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf,
|
||||||
switch (fmt) {
|
switch (fmt) {
|
||||||
case CMIT_FMT_MEDIUM:
|
case CMIT_FMT_MEDIUM:
|
||||||
ret += sprintf(buf + ret, "Date: %s\n",
|
ret += sprintf(buf + ret, "Date: %s\n",
|
||||||
show_date(time, tz, relative_date));
|
show_date(time, tz, dmode));
|
||||||
break;
|
break;
|
||||||
case CMIT_FMT_EMAIL:
|
case CMIT_FMT_EMAIL:
|
||||||
ret += sprintf(buf + ret, "Date: %s\n",
|
ret += sprintf(buf + ret, "Date: %s\n",
|
||||||
|
@ -577,7 +577,7 @@ static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf,
|
||||||
break;
|
break;
|
||||||
case CMIT_FMT_FULLER:
|
case CMIT_FMT_FULLER:
|
||||||
ret += sprintf(buf + ret, "%sDate: %s\n", what,
|
ret += sprintf(buf + ret, "%sDate: %s\n", what,
|
||||||
show_date(time, tz, relative_date));
|
show_date(time, tz, dmode));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* notin' */
|
/* notin' */
|
||||||
|
@ -919,7 +919,7 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
|
||||||
char *buf, unsigned long space,
|
char *buf, unsigned long space,
|
||||||
int abbrev, const char *subject,
|
int abbrev, const char *subject,
|
||||||
const char *after_subject,
|
const char *after_subject,
|
||||||
int relative_date)
|
enum date_mode dmode)
|
||||||
{
|
{
|
||||||
int hdr = 1, body = 0, seen_title = 0;
|
int hdr = 1, body = 0, seen_title = 0;
|
||||||
unsigned long offset = 0;
|
unsigned long offset = 0;
|
||||||
|
@ -1023,14 +1023,14 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
|
||||||
offset += add_user_info("Author", fmt,
|
offset += add_user_info("Author", fmt,
|
||||||
buf + offset,
|
buf + offset,
|
||||||
line + 7,
|
line + 7,
|
||||||
relative_date,
|
dmode,
|
||||||
encoding);
|
encoding);
|
||||||
if (!memcmp(line, "committer ", 10) &&
|
if (!memcmp(line, "committer ", 10) &&
|
||||||
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER))
|
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER))
|
||||||
offset += add_user_info("Commit", fmt,
|
offset += add_user_info("Commit", fmt,
|
||||||
buf + offset,
|
buf + offset,
|
||||||
line + 10,
|
line + 10,
|
||||||
relative_date,
|
dmode,
|
||||||
encoding);
|
encoding);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
2
commit.h
2
commit.h
|
@ -61,7 +61,7 @@ enum cmit_fmt {
|
||||||
};
|
};
|
||||||
|
|
||||||
extern enum cmit_fmt get_commit_format(const char *arg);
|
extern enum cmit_fmt get_commit_format(const char *arg);
|
||||||
extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char *buf, unsigned long space, int abbrev, const char *subject, const char *after_subject, int relative_date);
|
extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char *buf, unsigned long space, int abbrev, const char *subject, const char *after_subject, enum date_mode dmode);
|
||||||
|
|
||||||
/** Removes the first commit from a list sorted by date, and adds all
|
/** Removes the first commit from a list sorted by date, and adds all
|
||||||
* of its parents.
|
* of its parents.
|
||||||
|
|
35
date.c
35
date.c
|
@ -55,6 +55,32 @@ static struct tm *time_to_tm(unsigned long time, int tz)
|
||||||
return gmtime(&t);
|
return gmtime(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* What value of "tz" was in effect back then at "time" in the
|
||||||
|
* local timezone?
|
||||||
|
*/
|
||||||
|
static int local_tzoffset(unsigned long time)
|
||||||
|
{
|
||||||
|
time_t t, t_local;
|
||||||
|
struct tm tm;
|
||||||
|
int offset, eastwest;
|
||||||
|
|
||||||
|
t = time;
|
||||||
|
localtime_r(&t, &tm);
|
||||||
|
t_local = my_mktime(&tm);
|
||||||
|
|
||||||
|
if (t_local < t) {
|
||||||
|
eastwest = -1;
|
||||||
|
offset = t - t_local;
|
||||||
|
} else {
|
||||||
|
eastwest = 1;
|
||||||
|
offset = t_local - t;
|
||||||
|
}
|
||||||
|
offset /= 60; /* in minutes */
|
||||||
|
offset = (offset % 60) + ((offset / 60) * 100);
|
||||||
|
return offset * eastwest;
|
||||||
|
}
|
||||||
|
|
||||||
const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
||||||
{
|
{
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
|
@ -102,6 +128,9 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
||||||
/* Else fall back on absolute format.. */
|
/* Else fall back on absolute format.. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode == DATE_LOCAL)
|
||||||
|
tz = local_tzoffset(time);
|
||||||
|
|
||||||
tm = time_to_tm(time, tz);
|
tm = time_to_tm(time, tz);
|
||||||
if (!tm)
|
if (!tm)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -109,12 +138,14 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
||||||
sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900,
|
sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900,
|
||||||
tm->tm_mon + 1, tm->tm_mday);
|
tm->tm_mon + 1, tm->tm_mday);
|
||||||
else
|
else
|
||||||
sprintf(timebuf, "%.3s %.3s %d %02d:%02d:%02d %d %+05d",
|
sprintf(timebuf, "%.3s %.3s %d %02d:%02d:%02d %d%c%+05d",
|
||||||
weekday_names[tm->tm_wday],
|
weekday_names[tm->tm_wday],
|
||||||
month_names[tm->tm_mon],
|
month_names[tm->tm_mon],
|
||||||
tm->tm_mday,
|
tm->tm_mday,
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||||
tm->tm_year + 1900, tz);
|
tm->tm_year + 1900,
|
||||||
|
(mode == DATE_LOCAL) ? 0 : ' ',
|
||||||
|
tz);
|
||||||
return timebuf;
|
return timebuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -267,7 +267,7 @@ void show_log(struct rev_info *opt, const char *sep)
|
||||||
if (opt->reflog_info) {
|
if (opt->reflog_info) {
|
||||||
show_reflog_message(opt->reflog_info,
|
show_reflog_message(opt->reflog_info,
|
||||||
opt->commit_format == CMIT_FMT_ONELINE,
|
opt->commit_format == CMIT_FMT_ONELINE,
|
||||||
opt->relative_date);
|
opt->date_mode);
|
||||||
if (opt->commit_format == CMIT_FMT_ONELINE) {
|
if (opt->commit_format == CMIT_FMT_ONELINE) {
|
||||||
printf("%s", sep);
|
printf("%s", sep);
|
||||||
return;
|
return;
|
||||||
|
@ -280,7 +280,7 @@ void show_log(struct rev_info *opt, const char *sep)
|
||||||
*/
|
*/
|
||||||
len = pretty_print_commit(opt->commit_format, commit, ~0u, this_header,
|
len = pretty_print_commit(opt->commit_format, commit, ~0u, this_header,
|
||||||
sizeof(this_header), abbrev, subject,
|
sizeof(this_header), abbrev, subject,
|
||||||
extra_headers, opt->relative_date);
|
extra_headers, opt->date_mode);
|
||||||
|
|
||||||
if (opt->add_signoff)
|
if (opt->add_signoff)
|
||||||
len = append_signoff(this_header, sizeof(this_header), len,
|
len = append_signoff(this_header, sizeof(this_header), len,
|
||||||
|
|
13
revision.c
13
revision.c
|
@ -1111,7 +1111,18 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--relative-date")) {
|
if (!strcmp(arg, "--relative-date")) {
|
||||||
revs->relative_date = 1;
|
revs->date_mode = DATE_RELATIVE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!strncmp(arg, "--date=", 7)) {
|
||||||
|
if (!strcmp(arg + 7, "relative"))
|
||||||
|
revs->date_mode = DATE_RELATIVE;
|
||||||
|
else if (!strcmp(arg + 7, "local"))
|
||||||
|
revs->date_mode = DATE_LOCAL;
|
||||||
|
else if (!strcmp(arg + 7, "default"))
|
||||||
|
revs->date_mode = DATE_NORMAL;
|
||||||
|
else
|
||||||
|
die("unknown date format %s", arg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,8 +63,8 @@ struct rev_info {
|
||||||
|
|
||||||
/* Format info */
|
/* Format info */
|
||||||
unsigned int shown_one:1,
|
unsigned int shown_one:1,
|
||||||
abbrev_commit:1,
|
abbrev_commit:1;
|
||||||
relative_date:1;
|
enum date_mode date_mode;
|
||||||
|
|
||||||
const char **ignore_packed; /* pretend objects in these are unpacked */
|
const char **ignore_packed; /* pretend objects in these are unpacked */
|
||||||
int num_ignore_packed;
|
int num_ignore_packed;
|
||||||
|
|
Loading…
Reference in New Issue