Download raw body.
add got_patch_process_cb
As recently pointed out by stsp, got_patch abuses some callbacks.
The attached diff solves the situation by introducing a
got_patch_process_cb callback that gets invoked after every patch. This
also remove the hackish printf("M") I added in the modified-only case.
I've got ready a follow-up diff to extend the callback to handle also
the "patch applied with offset" case, but wanted to get a feedback on
the direction first.
regress is still passing.
ok?
-----------------------------------------------
commit 70e6ccc6e3da8f8faf26a3c0d0970e9ae07285f9 (pscb)
from: Omar Polo <op@omarpolo.com>
date: Mon Mar 14 19:17:27 2022 UTC
introduce got_patch_progress_cb
in got_patch I made use of callbacks that are intended for other got
operations. This introduce a proper got_patch specific progress
callback that gets invoked when got_patch fisishes to process a patch.
It also drops the other hackish printf in the modified case.
diff 463cdc6089041a9ec1747b58910c2f9be8bb6cd7 505f0729553b22eae6437d812ca4df013411b509
blob - d595de198f4880c3458bb395b994e889acf68df3
blob + 541f9eac1d2cad4c888bcf3da0eb9a7a1632c750
--- got/got.c
+++ got/got.c
@@ -7186,6 +7186,17 @@ patch_from_stdin(int *patchfd)
}
static const struct got_error *
+patch_progress(void *arg, const char *old, const char *new, unsigned char mode)
+{
+ const char *path = new == NULL ? old : new;
+
+ while (*path == '/')
+ path++;
+ printf("%c %s\n", mode, path);
+ return NULL;
+}
+
+static const struct got_error *
cmd_patch(int argc, char *argv[])
{
const struct got_error *error = NULL, *close_error = NULL;
@@ -7247,8 +7258,8 @@ cmd_patch(int argc, char *argv[])
err(1, "pledge");
#endif
- error = got_patch(patchfd, worktree, repo, nop, &print_remove_status,
- NULL, &add_progress, NULL, check_cancelled, NULL);
+ error = got_patch(patchfd, worktree, repo, nop, &patch_progress,
+ NULL, check_cancelled, NULL);
done:
if (repo) {
blob - 5f28ffc619f1b4e32ba37ff8e5361c636009ba74
blob + 2c3744d0ad739fd94ee5702c1684aa55ca80e8e6
--- include/got_patch.h
+++ include/got_patch.h
@@ -15,6 +15,14 @@
*/
/*
+ * A callback that gets invoked during the patch application.
+ *
+ * Receives the old and new path and the mode of the change (A, M or D.)
+ */
+typedef const struct got_error *(*got_patch_progress_cb)(void *,
+ const char *, const char *, unsigned char);
+
+/*
* Apply the (already opened) patch to the repository and register the
* status of the added and removed files.
*
@@ -22,5 +30,4 @@
*/
const struct got_error *
got_patch(int, struct got_worktree *, struct got_repository *, int,
- got_worktree_delete_cb, void *, got_worktree_checkout_cb, void *,
- got_cancel_cb, void *);
+ got_patch_progress_cb, void *, got_cancel_cb, void *);
blob - 6e5ec0f2143d39ff9eeca89060522c5155706a77
blob + e12ead90351f918d666094a55081a5fafa0ba42c
--- lib/patch.c
+++ lib/patch.c
@@ -66,6 +66,8 @@ struct got_patch_hunk {
};
struct got_patch {
+ got_patch_progress_cb cb;
+ void *arg;
int nop;
char *old;
char *new;
@@ -565,10 +567,25 @@ check_file_status(struct got_patch *p, int file_rename
}
static const struct got_error *
+patch_delete(void *arg, unsigned char status, unsigned char staged_status,
+ const char *path)
+{
+ struct got_patch *p = arg;
+
+ return p->cb(p->arg, path, NULL, status);
+}
+
+static const struct got_error *
+patch_add(void *arg, unsigned char status, const char *path)
+{
+ struct got_patch *p = arg;
+
+ return p->cb(p->arg, NULL, path, status);
+}
+
+static const struct got_error *
apply_patch(struct got_worktree *worktree, struct got_repository *repo,
- struct got_patch *p, got_worktree_delete_cb delete_cb, void *delete_arg,
- got_worktree_checkout_cb add_cb, void *add_arg, got_cancel_cb cancel_cb,
- void *cancel_arg)
+ struct got_patch *p, got_cancel_cb cancel_cb, void *cancel_arg)
{
const struct got_error *err = NULL;
struct got_pathlist_head oldpaths, newpaths;
@@ -617,7 +634,7 @@ apply_patch(struct got_worktree *worktree, struct got_
if (p->old != NULL && p->new == NULL) {
err = got_worktree_schedule_delete(worktree, &oldpaths,
- 0, NULL, delete_cb, delete_arg, repo, 0, 0);
+ 0, NULL, patch_delete, p, repo, 0, 0);
goto done;
}
@@ -628,15 +645,15 @@ apply_patch(struct got_worktree *worktree, struct got_
if (file_renamed) {
err = got_worktree_schedule_delete(worktree, &oldpaths,
- 0, NULL, delete_cb, delete_arg, repo, 0, 0);
+ 0, NULL, patch_delete, p, repo, 0, 0);
if (err == NULL)
err = got_worktree_schedule_add(worktree, &newpaths,
- add_cb, add_arg, repo, 1);
+ patch_add, p, repo, 1);
} else if (p->old == NULL)
err = got_worktree_schedule_add(worktree, &newpaths,
- add_cb, add_arg, repo, 1);
+ patch_add, p, repo, 1);
else
- printf("M %s\n", oldpath); /* XXX */
+ err = p->cb(p->arg, oldpath, newpath, GOT_STATUS_MODIFY);
done:
if (err != NULL && newpath != NULL && (file_renamed || p->old == NULL))
@@ -654,9 +671,8 @@ done:
const struct got_error *
got_patch(int fd, struct got_worktree *worktree, struct got_repository *repo,
- int nop, got_worktree_delete_cb delete_cb, void *delete_arg,
- got_worktree_checkout_cb add_cb, void *add_arg, got_cancel_cb cancel_cb,
- void *cancel_arg)
+ int nop, got_patch_progress_cb progress_cb, void *progress_arg,
+ got_cancel_cb cancel_cb, void *cancel_arg)
{
const struct got_error *err = NULL;
struct imsgbuf *ibuf;
@@ -704,9 +720,10 @@ got_patch(int fd, struct got_worktree *worktree, struc
if (err || done)
break;
+ p.cb = progress_cb;
+ p.arg = progress_arg;
p.nop = nop;
- err = apply_patch(worktree, repo, &p, delete_cb, delete_arg,
- add_cb, add_arg, cancel_cb, cancel_arg);
+ err = apply_patch(worktree, repo, &p, cancel_cb, cancel_arg);
patch_free(&p);
if (err)
break;
add got_patch_process_cb