commit - 6fb7cd117fc5150498bd6135a2904a7c726ae49e
commit + fc06ba561252d5ccc36fa7a9be53fe33d098ce8f
blob - c8b1e457cb5ed381384f58dd87556998a7825000
blob + 0efa00c50173477478213669baaabda4efefa954
--- tog/tog.c
+++ tog/tog.c
struct got_repository *repo;
struct tog_blame_cb_args *cb_args;
int *complete;
+ got_cancel_cb cancel_cb;
+ void *cancel_arg;
};
struct tog_blame {
int errcode;
err = got_blame(ta->path, a->commit_id, ta->repo,
- blame_cb, ta->cb_args, NULL, NULL);
+ blame_cb, ta->cb_args, ta->cancel_cb, ta->cancel_arg);
+ if (err && err->code == GOT_ERR_CANCELLED)
+ err = NULL;
errcode = pthread_mutex_lock(&tog_mutex);
if (errcode)
}
static const struct got_error *
+cancel_blame_view(void *arg)
+{
+ const struct got_error *err = NULL;
+ int *done = arg;
+ int errcode;
+
+ errcode = pthread_mutex_lock(&tog_mutex);
+ if (errcode)
+ return got_error_set_errno(errcode,
+ "pthread_mutex_unlock");
+
+ if (*done)
+ err = got_error(GOT_ERR_CANCELLED);
+
+ errcode = pthread_mutex_unlock(&tog_mutex);
+ if (errcode)
+ return got_error_set_errno(errcode,
+ "pthread_mutex_lock");
+
+ return err;
+}
+
+static const struct got_error *
run_blame(struct tog_blame *blame, struct tog_view *view, int *blame_complete,
int *first_displayed_line, int *last_displayed_line, int *selected_line,
int *done, int *eof, const char *path, struct got_object_id *commit_id,
blame->thread_args.repo = thread_repo;
blame->thread_args.cb_args = &blame->cb_args;
blame->thread_args.complete = blame_complete;
+ blame->thread_args.cancel_cb = cancel_blame_view;
+ blame->thread_args.cancel_arg = done;
*blame_complete = 0;
done:
err = open_blame_view(blame_view, path, commit_id, refs, repo);
if (err) {
+ if (err->code == GOT_ERR_CANCELLED)
+ err = NULL;
view_close(blame_view);
} else
*new_view = blame_view;
endwin();
free(cmd_argv);
- if (error)
+ if (error && error->code != GOT_ERR_CANCELLED)
fprintf(stderr, "%s: %s\n", getprogname(), error->msg);
return 0;
}