Commit Diff


commit - e16f7949b860f4a94e2f18128f786ffafc64b0ee
commit + 8acf3aa649625d9afcec49b78392fcfb76063bf8
blob - e7efb2f42607b5d2d795aaea607648b2b504eba0
blob + 9364040ebe5ddbf124e60b56e4ad49d6bc7379fd
--- cvg/cvg.c
+++ cvg/cvg.c
@@ -7934,8 +7934,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);
@@ -8048,10 +8051,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 - 7d213eff608b21b69d395c54e98607d6a422821c
blob + 3e2e47ed53111c0f880a2561b854f807e6d12c8e
--- lib/worktree_cvg.c
+++ lib/worktree_cvg.c
@@ -2226,8 +2226,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)
 {
@@ -2312,8 +2312,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)
@@ -2902,8 +2904,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,
@@ -3044,7 +3046,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)