Download raw body.
[patch] preserve and show author dates
Getting back to this after being distracted, I've updated my patch to
current main. As before, it comes in three parts:
- purely preserving author timestamps, no user-visible changes
- keeping similar code in sync in cvg
- pressing '@' in 'tog log' also togles the dates to author dates
Mark Jamsek on Mon, Aug 19 2024:
> I would prefer it be behind an explicit toggle in the diff view. Perhaps
> '@' as it is in the log view to toggle the commit author. This way it is
> still available for users who want this information without consuming
> screen estate for users who aren't interested in having the author date
> displayed. Similarly, perhaps rather than display the "orig: $authordate"
> line in addition to the existing "date: " line when this keymap is
> toggled, it simply replaces the committer date with the author date in
> the existing "date: " line.
And I'm attaching a separate patch that does just this, i.e. toggling
to author date when '@' is pressed in tog diff view.
When I try it, something in me keeps complaining that the 'date:' prefix
should also change...
-----------------------------------------------
commit 5a49c0b61f65d69f7937491b5564d70d398bda5a
from: Sven M. Hallberg <pesco@khjk.org>
date: Mon Aug 19 08:30:09 2024 UTC
got rebase: preserve author timestamps
Adds test_rebase_preserves_author_data to regress/cmdline/rebase.sh.
diff 8c25a0e66cb5f6ea96b120f8e80703e83a6ce85e 5a49c0b61f65d69f7937491b5564d70d398bda5a
commit - 8c25a0e66cb5f6ea96b120f8e80703e83a6ce85e
commit + 5a49c0b61f65d69f7937491b5564d70d398bda5a
blob - 4e9891df54e61ef79c78c24c78c772e6664da73a
blob + 145bd98f76a62eda56e68cde432493c01e1f315d
--- got/got.c
+++ got/got.c
@@ -9663,8 +9663,11 @@ cmd_commit(int argc, char *argv[])
if (error)
goto done;
- if (author == NULL)
+ if (author == NULL) {
+ /* got_worktree_commit() treats committer as the optional one */
author = committer;
+ committer = NULL; /* => author timestamp is ignored */
+ }
if (logmsg == NULL || strlen(logmsg) == 0) {
error = get_editor(&editor);
@@ -9714,8 +9717,8 @@ cmd_commit(int argc, char *argv[])
cl_arg.branch_name += 11;
}
cl_arg.repo_path = got_repo_get_path(repo);
- error = got_worktree_commit(&id, worktree, &paths, author, committer,
- allow_bad_symlinks, show_diff, commit_conflicts,
+ error = got_worktree_commit(&id, worktree, &paths, author, time(NULL),
+ committer, allow_bad_symlinks, show_diff, commit_conflicts,
collect_commit_logmsg, &cl_arg, print_status, NULL, repo);
if (error) {
if (error->code != GOT_ERR_COMMIT_MSG_EMPTY &&
@@ -13960,7 +13963,7 @@ cmd_merge(int argc, char *argv[])
goto done;
} else {
error = got_worktree_merge_commit(&merge_commit_id, worktree,
- fileindex, author, NULL, 1, branch_tip, branch_name,
+ fileindex, author, 0, NULL, 1, branch_tip, branch_name,
allow_conflict, repo, continue_merge ? print_status : NULL,
NULL);
if (error)
blob - 83894a63327d718f09bcb4236d42ccb4c872da6b
blob + 02eac9d035f16856319eb37dc346588302cb7a2e
--- include/got_worktree.h
+++ include/got_worktree.h
@@ -280,12 +280,14 @@ typedef const struct got_error *(*got_worktree_commit_
* current base commit.
* An author and a non-empty log message must be specified.
* The name of the committer is optional (may be NULL).
+ * If a committer is given, a separate author timestamp can be specified
+ * which is ignored otherwise.
* If a path to be committed contains a symlink which points outside
* of the path space under version control, raise an error unless
* committing of such paths is being forced by the caller.
*/
const struct got_error *got_worktree_commit(struct got_object_id **,
- struct got_worktree *, struct got_pathlist_head *, const char *,
+ struct got_worktree *, struct got_pathlist_head *, const char *, time_t,
const char *, int, int, int, got_worktree_commit_msg_cb, void *,
got_worktree_status_cb, void *, struct got_repository *);
@@ -503,9 +505,9 @@ got_worktree_merge_branch(struct got_worktree *worktre
const struct got_error *
got_worktree_merge_commit(struct got_object_id **new_commit_id,
struct got_worktree *worktree, struct got_fileindex *fileindex,
- const char *author, const char *committer, int allow_bad_symlinks,
- struct got_object_id *branch_tip, const char *branch_name,
- int allow_conflict, struct got_repository *repo,
+ const char *author, time_t author_time, const char *committer,
+ int allow_bad_symlinks, struct got_object_id *branch_tip,
+ const char *branch_name, int allow_conflict, struct got_repository *repo,
got_worktree_status_cb status_cb, void *status_arg);
/*
blob - d089bc9ca0d1abc94a4a52d9c1aaa70f7b02ef28
blob + ec38218e360c5bf4089f0760557e463daffa3a38
--- lib/worktree.c
+++ lib/worktree.c
@@ -6470,8 +6470,8 @@ commit_worktree(struct got_object_id **new_commit_id,
struct got_object_id *head_commit_id,
struct got_object_id *parent_id2,
struct got_worktree *worktree,
- const char *author, const char *committer, char *diff_path,
- got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
+ const char *author, time_t author_time, const char *committer,
+ char *diff_path, got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
got_worktree_status_cb status_cb, void *status_arg,
struct got_repository *repo)
{
@@ -6559,8 +6559,10 @@ commit_worktree(struct got_object_id **new_commit_id,
nparents++;
}
timestamp = time(NULL);
+ if (committer == NULL)
+ author_time = timestamp;
err = got_object_commit_create(new_commit_id, new_tree_id, &parent_ids,
- nparents, author, timestamp, committer, timestamp, logmsg, repo);
+ nparents, author, author_time, committer, timestamp, logmsg, repo);
if (logmsg != NULL)
free(logmsg);
if (err)
@@ -6676,8 +6678,8 @@ check_non_staged_files(struct got_fileindex *fileindex
const struct got_error *
got_worktree_commit(struct got_object_id **new_commit_id,
struct got_worktree *worktree, struct got_pathlist_head *paths,
- const char *author, const char *committer, int allow_bad_symlinks,
- int show_diff, int commit_conflicts,
+ const char *author, time_t author_time, const char *committer,
+ int allow_bad_symlinks, int show_diff, int commit_conflicts,
got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
got_worktree_status_cb status_cb, void *status_arg,
struct got_repository *repo)
@@ -6790,7 +6792,7 @@ got_worktree_commit(struct got_object_id **new_commit_
}
err = commit_worktree(new_commit_id, &commitable_paths,
- head_commit_id, NULL, worktree, author, committer,
+ head_commit_id, NULL, worktree, author, author_time, committer,
(diff_path && cc_arg.diff_header_shown) ? diff_path : NULL,
commit_msg_cb, commit_arg, status_cb, status_arg, repo);
if (err)
@@ -7438,6 +7440,7 @@ rebase_commit(struct got_object_id **new_commit_id,
/* NB: commit_worktree will call free(logmsg) */
err = commit_worktree(new_commit_id, &commitable_paths, head_commit_id,
NULL, worktree, got_object_commit_get_author(orig_commit),
+ got_object_commit_get_author_time(orig_commit),
committer ? committer :
got_object_commit_get_committer(orig_commit), NULL,
collect_rebase_commit_msg, logmsg, rebase_status, NULL, repo);
@@ -8753,11 +8756,10 @@ done:
const struct got_error *
got_worktree_merge_commit(struct got_object_id **new_commit_id,
struct got_worktree *worktree, struct got_fileindex *fileindex,
- const char *author, const char *committer, int allow_bad_symlinks,
- struct got_object_id *branch_tip, const char *branch_name,
- int allow_conflict, struct got_repository *repo,
+ const char *author, time_t author_time, const char *committer,
+ int allow_bad_symlinks, struct got_object_id *branch_tip,
+ const char *branch_name, int allow_conflict, struct got_repository *repo,
got_worktree_status_cb status_cb, void *status_arg)
-
{
const struct got_error *err = NULL, *sync_err;
struct got_pathlist_head commitable_paths;
@@ -8810,8 +8812,9 @@ got_worktree_merge_commit(struct got_object_id **new_c
mcm_arg.worktree = worktree;
mcm_arg.branch_name = branch_name;
err = commit_worktree(new_commit_id, &commitable_paths,
- head_commit_id, branch_tip, worktree, author, committer, NULL,
- merge_commit_msg_cb, &mcm_arg, status_cb, status_arg, repo);
+ head_commit_id, branch_tip, worktree, author, author_time,
+ committer, NULL, merge_commit_msg_cb, &mcm_arg, status_cb,
+ status_arg, repo);
if (err)
goto done;
blob - 84c24828bea9475f7b0841d4f7fe0ffec5264646
blob + 98d40ea3754215fd3024137b6c6a860b8d17eca8
--- regress/cmdline/rebase.sh
+++ regress/cmdline/rebase.sh
@@ -1002,6 +1002,68 @@ test_rebase_preserves_logmsg() {
test_done "$testroot" "$ret"
}
+test_rebase_preserves_author_data() {
+ local testroot=`test_init rebase_preserves_author_data`
+
+ git -C $testroot/repo checkout -q -b newbranch
+ echo "modified delta on branch" > $testroot/repo/gamma/delta
+ TZ=EST git_commit $testroot/repo -m "modified delta on newbranch"
+
+ sleep 1 # get a new timestamp
+ echo "modified alpha on branch" > $testroot/repo/alpha
+ TZ=CET git_commit $testroot/repo -m "modified alpha on newbranch"
+
+ local orig_commit1=`git_show_parent_commit $testroot/repo`
+ local orig_commit2=`git_show_head $testroot/repo`
+
+ (cd $testroot/repo && got cat $orig_commit1 $orig_commit2 | \
+ grep '^author ' > $testroot/author_data.expected)
+
+ git -C $testroot/repo checkout -q master
+ echo "modified zeta on master" > $testroot/repo/epsilon/zeta
+ git_commit $testroot/repo -m "committing to zeta on master"
+ local master_commit=`git_show_head $testroot/repo`
+
+ got checkout $testroot/repo $testroot/wt > /dev/null
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ test_done "$testroot" "$ret"
+ return 1
+ fi
+
+ sleep 1 # get a new timestamp
+ (cd $testroot/wt && got rebase newbranch > /dev/null \
+ 2> $testroot/stderr)
+
+ git -C $testroot/repo checkout -q newbranch
+ local new_commit1=`git_show_parent_commit $testroot/repo`
+ local new_commit2=`git_show_head $testroot/repo`
+
+ echo -n > $testroot/stderr.expected
+ cmp -s $testroot/stderr.expected $testroot/stderr
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ diff -u $testroot/stderr.expected $testroot/stderr
+ test_done "$testroot" "$ret"
+ return 1
+ fi
+
+ (cd $testroot/wt && got cat $new_commit1 $new_commit2 | \
+ grep '^author ' > $testroot/author_data)
+ # note: got deliberately clobbers the timezone to UTC, so expect that
+ ed -s $testroot/author_data.expected <<-EOF
+ ,s/ [+-][0-9]\{4\}\$/ +0000/
+ w
+ EOF
+ cmp -s $testroot/author_data.expected $testroot/author_data
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ diff -u $testroot/author_data.expected $testroot/author_data
+ fi
+
+ test_done "$testroot" "$ret"
+}
+
test_rebase_no_commits_to_rebase() {
local testroot=`test_init rebase_no_commits_to_rebase`
@@ -2286,6 +2348,7 @@ run_test test_rebase_no_op_change
run_test test_rebase_in_progress
run_test test_rebase_path_prefix
run_test test_rebase_preserves_logmsg
+run_test test_rebase_preserves_author_data
run_test test_rebase_no_commits_to_rebase
run_test test_rebase_forward
run_test test_rebase_forward_path_prefix
-----------------------------------------------
commit c446b4555214d5618a43435be3648e65ab2e8735
from: Sven M. Hallberg <pesco@khjk.org>
date: Sat Aug 3 19:30:02 2024 UTC
cvg: add author_time argument to got_worktree_cvg_commit()
No functional change, but keeps the code in sync with got.
diff 5a49c0b61f65d69f7937491b5564d70d398bda5a c446b4555214d5618a43435be3648e65ab2e8735
commit - 5a49c0b61f65d69f7937491b5564d70d398bda5a
commit + c446b4555214d5618a43435be3648e65ab2e8735
blob - 9f56f71abaf2f27bce1a2db6a03fcb31eec8511e
blob + 037c89356a5859851914198810a1c10abea434db
--- cvg/cvg.c
+++ cvg/cvg.c
@@ -7936,8 +7936,11 @@ cmd_commit(int argc, char *argv[])
if (error)
goto done;
- if (author == NULL)
+ if (author == NULL) {
+ /* got_worktree_cvg_commit() treats committer as optional */
author = committer;
+ committer = NULL; /* => author timestamp is ignored */
+ }
remote_name = GOT_SEND_DEFAULT_REMOTE_NAME;
worktree_conf = got_worktree_get_gotconfig(worktree);
@@ -8050,10 +8053,10 @@ cmd_commit(int argc, char *argv[])
cl_arg.repo_path = got_repo_get_path(repo);
cl_arg.dial_proto = proto;
error = got_worktree_cvg_commit(&id, worktree, &paths, author,
- committer, allow_bad_symlinks, show_diff, commit_conflicts,
- collect_commit_logmsg, &cl_arg, print_status, NULL, proto, host,
- port, server_path, jumphost, identity_file, verbosity, remote,
- check_cancelled, repo);
+ time(NULL), committer, allow_bad_symlinks, show_diff,
+ commit_conflicts, collect_commit_logmsg, &cl_arg, print_status,
+ NULL, proto, host, port, server_path, jumphost, identity_file,
+ verbosity, remote, check_cancelled, repo);
if (error) {
if (error->code != GOT_ERR_COMMIT_MSG_EMPTY &&
cl_arg.logmsg_path != NULL)
blob - 057137a8ccbd155e4eebbe781aa2acbab0177706
blob + 53abcb2f9c7ae9bf78e62ccf590a8abdb75eedc5
--- include/got_worktree_cvg.h
+++ include/got_worktree_cvg.h
@@ -23,12 +23,14 @@
* current base commit.
* An author and a non-empty log message must be specified.
* The name of the committer is optional (may be NULL).
+ * If a committer is given, a separate author timestamp can be specified
+ * which is ignored otherwise.
* If a path to be committed contains a symlink which points outside
* of the path space under version control, raise an error unless
* committing of such paths is being forced by the caller.
*/
const struct got_error *got_worktree_cvg_commit(struct got_object_id **,
- struct got_worktree *, struct got_pathlist_head *, const char *,
+ struct got_worktree *, struct got_pathlist_head *, const char *, time_t,
const char *, int, int, int, got_worktree_commit_msg_cb, void *,
got_worktree_status_cb, void *, const char *, const char *, const char *,
const char *, const char *, const char *, int,
blob - 2aa66b6119819465449e3153ff18ad42e03458d3
blob + 5b9b1c532c0d687ea6a7630ba195c953fd2add73
--- lib/worktree_cvg.c
+++ lib/worktree_cvg.c
@@ -2229,8 +2229,8 @@ commit_worktree(struct got_object_id **new_commit_id,
struct got_object_id *head_commit_id,
struct got_object_id *parent_id2,
struct got_worktree *worktree,
- const char *author, const char *committer, char *diff_path,
- got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
+ const char *author, time_t author_time, const char *committer,
+ char *diff_path, got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
got_worktree_status_cb status_cb, void *status_arg,
struct got_repository *repo)
{
@@ -2315,8 +2315,10 @@ commit_worktree(struct got_object_id **new_commit_id,
nparents++;
}
timestamp = time(NULL);
+ if (committer == NULL)
+ author_time = timestamp;
err = got_object_commit_create(new_commit_id, new_tree_id, &parent_ids,
- nparents, author, timestamp, committer, timestamp, logmsg, repo);
+ nparents, author, author_time, committer, timestamp, logmsg, repo);
if (logmsg != NULL)
free(logmsg);
if (err)
@@ -2905,8 +2907,8 @@ done:
const struct got_error *
got_worktree_cvg_commit(struct got_object_id **new_commit_id,
struct got_worktree *worktree, struct got_pathlist_head *paths,
- const char *author, const char *committer, int allow_bad_symlinks,
- int show_diff, int commit_conflicts,
+ const char *author, time_t author_time, const char *committer,
+ int allow_bad_symlinks, int show_diff, int commit_conflicts,
got_worktree_commit_msg_cb commit_msg_cb, void *commit_arg,
got_worktree_status_cb status_cb, void *status_arg,
const char *proto, const char *host, const char *port,
@@ -3047,7 +3049,7 @@ got_worktree_cvg_commit(struct got_object_id **new_com
}
err = commit_worktree(new_commit_id, &commitable_paths,
- head_commit_id, NULL, worktree, author, committer,
+ head_commit_id, NULL, worktree, author, author_time, committer,
(diff_path && cc_arg.diff_header_shown) ? diff_path : NULL,
commit_msg_cb, commit_arg, status_cb, status_arg, repo);
if (err)
-----------------------------------------------
commit ac25fa19ea9d7d3f58b29df604555f763be3c8bb
from: Sven M. Hallberg <pesco@khjk.org>
date: Thu Aug 1 16:19:38 2024 UTC
tog log: show author dates if showing author names (@)
diff c446b4555214d5618a43435be3648e65ab2e8735 ac25fa19ea9d7d3f58b29df604555f763be3c8bb
commit - c446b4555214d5618a43435be3648e65ab2e8735
commit + ac25fa19ea9d7d3f58b29df604555f763be3c8bb
blob - 0ccc6a0f788f55d0c7f1bd60778f977402cfd4d8
blob + 4251aa564ea993a3f0dd5ffc945f42dc28d5ce18
--- tog/tog.c
+++ tog/tog.c
@@ -622,7 +622,7 @@ struct tog_help_view_state {
" commit"), \
KEY_("m", "Mark or unmark the selected entry for diffing with the " \
"next selected commit"), \
- KEY_("@", "Toggle between displaying author and committer name"), \
+ KEY_("@", "Toggle between displaying author and committer data"), \
KEY_("&", "Open prompt to enter term to limit commits displayed"), \
KEY_("C-g Backspace", "Cancel current search or log operation"), \
KEY_("C-l", "Reload the log view with new repository commits or " \
@@ -2723,7 +2723,7 @@ draw_commit(struct tog_view *view, struct commit_queue
wchar_t *wrefstr = NULL, *wlogmsg = NULL;
int refstr_width, logmsg_width, col, limit, scrollx, logmsg_x;
const int avail = view->ncols, marker_column = author_display_cols + 1;
- time_t committer_time;
+ time_t timestamp;
struct got_reflist_head *refs;
if (tog_base_commit.id != NULL && tog_base_commit.idx == -1 &&
@@ -2737,8 +2737,11 @@ draw_commit(struct tog_view *view, struct commit_queue
return got_error_set_errno(rc, "pthread_cond_wait");
}
- committer_time = got_object_commit_get_committer_time(commit);
- err = draw_ymd(view, committer_time, &col, avail, date_display_cols);
+ if (s->use_committer)
+ timestamp = got_object_commit_get_committer_time(commit);
+ else
+ timestamp = got_object_commit_get_author_time(commit);
+ err = draw_ymd(view, timestamp, &col, avail, date_display_cols);
if (err != NULL)
return err;
if (col > avail)
-----------------------------------------------
commit f1ce97cddef057c3e3ad731420b2cf1b4098309c
from: Sven M. Hallberg <pesco@khjk.org>
date: Wed Jun 11 20:22:35 2025 UTC
tog: toggle between author and committer date in Diff view (@)
diff ac25fa19ea9d7d3f58b29df604555f763be3c8bb f1ce97cddef057c3e3ad731420b2cf1b4098309c
commit - ac25fa19ea9d7d3f58b29df604555f763be3c8bb
commit + f1ce97cddef057c3e3ad731420b2cf1b4098309c
blob - 4251aa564ea993a3f0dd5ffc945f42dc28d5ce18
blob + bbe1eec2d576b289548f767deccdd88c00adeaf8
--- tog/tog.c
+++ tog/tog.c
@@ -371,6 +371,7 @@ struct tog_diff_view_state {
int force_text_diff;
int diff_worktree;
int diff_staged;
+ int use_committer;
struct got_repository *repo;
struct got_pathlist_head *paths;
struct got_diff_line *lines;
@@ -642,6 +643,7 @@ struct tog_help_view_state {
KEY_("[", "Decrease the number of context lines"), \
KEY_("]", "Increase the number of context lines"), \
KEY_("w", "Toggle ignore whitespace-only changes in the diff"), \
+ KEY_("@", "Toggle between displaying author and committer date"), \
\
KEYMAP_("Blame view", TOG_KEYMAP_BLAME), \
KEY_("Enter", "Display diff view of the selected line's commit"), \
@@ -5777,7 +5779,7 @@ draw_file(struct tog_view *view, const char *header)
}
static char *
-get_datestr(time_t *time, char *datebuf)
+get_datestr(const time_t *time, char *datebuf)
{
struct tm mytm, *tm;
char *p, *s;
@@ -5928,16 +5930,41 @@ write_diffstat(FILE *outfile, struct got_diff_line **l
}
static const struct got_error *
+write_date(struct got_diff_line **lines, size_t *nlines,
+ const char *prefix, const time_t *t, FILE *outfile, off_t *outoff)
+{
+ const struct got_error *err;
+ char datebuf[26], *datestr;
+ int n;
+
+ datestr = get_datestr(t, datebuf);
+ if (datestr == NULL)
+ return NULL; /* silently ignored */
+
+ n = fprintf(outfile, "%s %s UTC\n", prefix, datestr);
+ if (n < 0) {
+ err = got_error_from_errno("fprintf");
+ return err;
+ }
+ *outoff += n;
+ err = add_line_metadata(lines, nlines, *outoff,
+ GOT_DIFF_LINE_DATE);
+ if (err)
+ return err;
+
+ return NULL;
+}
+
+static const struct got_error *
write_commit_info(struct got_diff_line **lines, size_t *nlines,
struct got_object_id *commit_id, struct got_reflist_head *refs,
struct got_repository *repo, int ignore_ws, int force_text_diff,
- struct got_diffstat_cb_arg *dsa, FILE *outfile)
+ int use_committer, struct got_diffstat_cb_arg *dsa, FILE *outfile)
{
const struct got_error *err = NULL;
- char datebuf[26], *datestr;
struct got_commit_object *commit;
char *id_str = NULL, *logmsg = NULL, *s = NULL, *line;
- time_t committer_time;
+ time_t timestamp;
const char *author, *committer;
char *refs_str = NULL;
off_t outoff = 0;
@@ -5972,19 +5999,22 @@ write_commit_info(struct got_diff_line **lines, size_t
if (err)
goto done;
- n = fprintf(outfile, "from: %s\n",
- got_object_commit_get_author(commit));
- if (n < 0) {
- err = got_error_from_errno("fprintf");
- goto done;
- }
- outoff += n;
- err = add_line_metadata(lines, nlines, outoff, GOT_DIFF_LINE_AUTHOR);
- if (err)
- goto done;
-
+ /* author and committer data */
author = got_object_commit_get_author(commit);
committer = got_object_commit_get_committer(commit);
+ if (use_committer)
+ timestamp = got_object_commit_get_committer_time(commit);
+ else
+ timestamp = got_object_commit_get_author_time(commit);
+ n = fprintf(outfile, "from: %s\n", author);
+ if (n < 0) {
+ err = got_error_from_errno("fprintf");
+ goto done;
+ }
+ outoff += n;
+ err = add_line_metadata(lines, nlines, outoff, GOT_DIFF_LINE_AUTHOR);
+ if (err)
+ goto done;
if (strcmp(author, committer) != 0) {
n = fprintf(outfile, "via: %s\n", committer);
if (n < 0) {
@@ -5997,20 +6027,11 @@ write_commit_info(struct got_diff_line **lines, size_t
if (err)
goto done;
}
- committer_time = got_object_commit_get_committer_time(commit);
- datestr = get_datestr(&committer_time, datebuf);
- if (datestr) {
- n = fprintf(outfile, "date: %s UTC\n", datestr);
- if (n < 0) {
- err = got_error_from_errno("fprintf");
- goto done;
- }
- outoff += n;
- err = add_line_metadata(lines, nlines, outoff,
- GOT_DIFF_LINE_DATE);
- if (err)
- goto done;
- }
+ err = write_date(lines, nlines, "date:", ×tamp, outfile, &outoff);
+ if (err)
+ goto done;
+
+ /* parent commits */
if (got_object_commit_get_nparents(commit) > 1) {
const struct got_object_id_queue *parent_ids;
struct got_object_qid *qid;
@@ -6540,7 +6561,7 @@ tog_diff_objects(struct tog_diff_view_state *s, FILE *
if (s->id1 == NULL)
return write_commit_info(&s->lines, &s->nlines, s->id2,
refs, s->repo, s->ignore_whitespace,
- s->force_text_diff, dsa, s->f);
+ s->force_text_diff, s->use_committer, dsa, s->f);
err = got_object_open_as_commit(&commit2, s->repo,
s->id2);
@@ -6552,7 +6573,8 @@ tog_diff_objects(struct tog_diff_view_state *s, FILE *
if (got_object_id_cmp(s->id1, &pid->id) == 0) {
err = write_commit_info(&s->lines, &s->nlines,
s->id2, refs, s->repo, s->ignore_whitespace,
- s->force_text_diff, dsa, s->f);
+ s->force_text_diff, s->use_committer, dsa,
+ s->f);
break;
}
}
@@ -6888,6 +6910,7 @@ open_diff_view(struct tog_view *view, struct got_objec
s->force_text_diff = force_text_diff;
s->diff_worktree = diff_worktree;
s->diff_staged = diff_staged;
+ s->use_committer = 1;
s->parent_view = parent_view;
s->paths = paths;
s->repo = repo;
@@ -7406,6 +7429,12 @@ input_diff_view(struct tog_view **new_view, struct tog
view->count = 0;
err = diff_write_patch(view);
break;
+ case '@':
+ s->use_committer = !s->use_committer;
+ view->action = s->use_committer ?
+ "show commit date" : "show author date";
+ err = create_diff(s);
+ break;
default:
view->count = 0;
break;
[patch] preserve and show author dates