"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
improve got log cancellation behaviour
To:
gameoftrees@openbsd.org
Date:
Sun, 1 Aug 2021 15:21:45 +0200

Download raw body.

Thread
The Git repository at https://github.com/adhn/nanobox-pkgsrc-lite
contains the entire git log of pkgsrc from netbsd embedded in a
single 100MB commit message.

Once 'got log' starts printing such a long message it won't stop
until everything has been printed, even when the user tries to
abort the process with Ctrl-C. This patch fixes this issue.

ok?

diff aa8b5dd032c8cba930e5be67a90069a95e0001b8 /home/stsp/src/got
blob - 71cc16e4b52a05afc8991d3d0c566bd8c200b3d7
file + got/got.c
--- got/got.c
+++ got/got.c
@@ -3697,7 +3697,7 @@ print_commit(struct got_commit_object *commit, struct 
     const char *custom_refs_str)
 {
 	const struct got_error *err = NULL;
-	char *id_str, *datestr, *logmsg0, *logmsg, *line;
+	char *id_str, *datestr, *logmsg0 = NULL, *logmsg, *line;
 	char datebuf[26];
 	time_t committer_time;
 	const char *author, *committer;
@@ -3742,6 +3742,9 @@ print_commit(struct got_commit_object *commit, struct 
 		int n = 1;
 		parent_ids = got_object_commit_get_parent_ids(commit);
 		STAILQ_FOREACH(qid, parent_ids, entry) {
+			err = check_cancelled(NULL);
+			if (err)
+				goto done;
 			err = got_object_id_str(&id_str, qid->id);
 			if (err)
 				goto done;
@@ -3757,16 +3760,21 @@ print_commit(struct got_commit_object *commit, struct 
 
 	logmsg = logmsg0;
 	do {
+		err = check_cancelled(NULL);
+		if (err)
+			goto done;
 		line = strsep(&logmsg, "\n");
 		if (line)
 			printf(" %s\n", line);
 	} while (line);
-	free(logmsg0);
 
 	if (changed_paths) {
 		struct got_pathlist_entry *pe;
 		TAILQ_FOREACH(pe, changed_paths, entry) {
 			struct got_diff_changed_path *cp = pe->data;
+			err = check_cancelled(NULL);
+			if (err)
+				goto done;
 			printf(" %c  %s\n", cp->status, pe->path);
 		}
 		printf("\n");
@@ -3780,6 +3788,7 @@ print_commit(struct got_commit_object *commit, struct 
 	if (fflush(stdout) != 0 && err == NULL)
 		err = got_error_from_errno("fflush");
 done:
+	free(logmsg0);
 	free(id_str);
 	free(refs_str);
 	return err;