]> git.ipfire.org Git - thirdparty/git.git/commitdiff
wt-status: provide function to expose status for trees
authorPatrick Steinhardt <ps@pks.im>
Wed, 3 Dec 2025 10:48:28 +0000 (11:48 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Dec 2025 21:49:44 +0000 (13:49 -0800)
The "wt-status" subsystem is responsible for printing status information
around the current state of the working tree. This most importantly
includes information around whether the working tree or the index have
any changes.

We're about to introduce a new command where the changes in neither of
them are actually relevant to us. Instead, what we want is to format the
changes between two different trees. While it is a little bit of a
stretch to add this as functionality to _working tree_ status, it
doesn't make any sense to open-code this functionality, either.

Implement a new function `wt_status_collect_changes_trees()` that diffs
two trees and formats the status accordingly. This function is not yet
used, but will be in a subsequent commit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
wt-status.c
wt-status.h

index e12adb26b9f8eb19ba7cf03537da4982b53f7a09..95942399f8cec6d3fbbfd560183309487b7b9e6e 100644 (file)
@@ -612,6 +612,30 @@ static void wt_status_collect_updated_cb(struct diff_queue_struct *q,
        }
 }
 
+void wt_status_collect_changes_trees(struct wt_status *s,
+                                    const struct object_id *old_treeish,
+                                    const struct object_id *new_treeish)
+{
+       struct diff_options opts = { 0 };
+
+       repo_diff_setup(s->repo, &opts);
+       opts.output_format = DIFF_FORMAT_CALLBACK;
+       opts.format_callback = wt_status_collect_updated_cb;
+       opts.format_callback_data = s;
+       opts.detect_rename = s->detect_rename >= 0 ? s->detect_rename : opts.detect_rename;
+       opts.rename_limit = s->rename_limit >= 0 ? s->rename_limit : opts.rename_limit;
+       opts.rename_score = s->rename_score >= 0 ? s->rename_score : opts.rename_score;
+       opts.flags.recursive = 1;
+       diff_setup_done(&opts);
+
+       diff_tree_oid(old_treeish, new_treeish, "", &opts);
+       diffcore_std(&opts);
+       diff_flush(&opts);
+       wt_status_get_state(s->repo, &s->state, 0);
+
+       diff_free(&opts);
+}
+
 static void wt_status_collect_changes_worktree(struct wt_status *s)
 {
        struct rev_info rev;
index e40a27214a700d8a3d62ee67ee8ad5ec461887e1..e9fe32e98cc18c852438e5f96fc8b539141f4c8f 100644 (file)
@@ -153,6 +153,15 @@ void wt_status_add_cut_line(struct wt_status *s);
 void wt_status_prepare(struct repository *r, struct wt_status *s);
 void wt_status_print(struct wt_status *s);
 void wt_status_collect(struct wt_status *s);
+
+/*
+ * Collect all changes between the two trees. Changes will be displayed as if
+ * they were staged into the index.
+ */
+void wt_status_collect_changes_trees(struct wt_status *s,
+                                    const struct object_id *old_treeish,
+                                    const struct object_id *new_treeish);
+
 /*
  * Frees the buffers allocated by wt_status_collect.
  */