]> git.ipfire.org Git - thirdparty/git.git/commitdiff
history: extract helper for a commit's parent tree
authorHarald Nordgren <haraldnordgren@gmail.com>
Mon, 20 Jul 2026 08:27:00 +0000 (08:27 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 Jul 2026 14:35:18 +0000 (07:35 -0700)
Three places resolve the tree of a commit's first parent, falling back
to the empty tree for a root commit, each repeating the same parse and
oidcpy dance. Extract a first_parent_tree_oid() helper and route the
existing callers through it.

No change in behavior.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/history.c

index d28c1f08bb66ea3db09a5c7e7aee904cf8fd7e8c..673744a55a33f1e68199da6e2fb377ccaf97f93e 100644 (file)
@@ -164,6 +164,25 @@ out:
        return ret;
 }
 
+static int first_parent_tree_oid(struct repository *repo,
+                                struct commit *commit,
+                                struct object_id *out)
+{
+       struct commit *parent = commit->parents ? commit->parents->item : NULL;
+
+       if (!parent) {
+               oidcpy(out, repo->hash_algo->empty_tree);
+               return 0;
+       }
+
+       if (repo_parse_commit(repo, parent))
+               return error(_("unable to parse parent commit %s"),
+                            oid_to_hex(&parent->object.oid));
+
+       oidcpy(out, &repo_get_commit_tree(repo, parent)->object.oid);
+       return 0;
+}
+
 static int commit_tree_with_edited_message(struct repository *repo,
                                           const char *action,
                                           struct commit *original,
@@ -171,21 +190,11 @@ static int commit_tree_with_edited_message(struct repository *repo,
 {
        struct object_id parent_tree_oid;
        const struct object_id *tree_oid;
-       struct commit *parent;
 
        tree_oid = &repo_get_commit_tree(repo, original)->object.oid;
 
-       parent = original->parents ? original->parents->item : NULL;
-       if (parent) {
-               if (repo_parse_commit(repo, parent)) {
-                       return error(_("unable to parse parent commit %s"),
-                                    oid_to_hex(&parent->object.oid));
-               }
-
-               parent_tree_oid = repo_get_commit_tree(repo, parent)->object.oid;
-       } else {
-               oidcpy(&parent_tree_oid, repo->hash_algo->empty_tree);
-       }
+       if (first_parent_tree_oid(repo, original, &parent_tree_oid) < 0)
+               return -1;
 
        return commit_tree_ext(repo, action, original, original->parents,
                               &parent_tree_oid, tree_oid, out, COMMIT_TREE_EDIT_MESSAGE);
@@ -475,18 +484,10 @@ static int commit_became_empty(struct repository *repo,
                               struct commit *original,
                               struct tree *result)
 {
-       struct commit *parent = original->parents ? original->parents->item : NULL;
        struct object_id parent_tree_oid;
 
-       if (parent) {
-               if (repo_parse_commit(repo, parent))
-                       return error(_("unable to parse parent of %s"),
-                                    oid_to_hex(&original->object.oid));
-
-               parent_tree_oid = repo_get_commit_tree(repo, parent)->object.oid;
-       } else {
-               oidcpy(&parent_tree_oid, repo->hash_algo->empty_tree);
-       }
+       if (first_parent_tree_oid(repo, original, &parent_tree_oid) < 0)
+               return -1;
 
        return oideq(&result->object.oid, &parent_tree_oid);
 }
@@ -830,16 +831,9 @@ static int split_commit(struct repository *repo,
        struct tree *split_tree;
        int ret;
 
-       if (original->parents) {
-               if (repo_parse_commit(repo, original->parents->item)) {
-                       ret = error(_("unable to parse parent commit %s"),
-                                   oid_to_hex(&original->parents->item->object.oid));
-                       goto out;
-               }
-
-               parent_tree_oid = *get_commit_tree_oid(original->parents->item);
-       } else {
-               oidcpy(&parent_tree_oid, repo->hash_algo->empty_tree);
+       if (first_parent_tree_oid(repo, original, &parent_tree_oid) < 0) {
+               ret = -1;
+               goto out;
        }
        original_commit_tree_oid = get_commit_tree_oid(original);