From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>, Elijah Newren <newren@gmail.com>,
Elijah Newren <newren@gmail.com>,
Elijah Newren <newren@gmail.com>
Subject: [PATCH v3 5/7] merge-ort: clarify the interning of strings in opt->priv->path
Date: Wed, 06 Aug 2025 23:15:20 +0000 [thread overview]
Message-ID: <c4caba16c72636c7b726c6753815f7c5f77ecd1d.1754522123.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1943.v3.git.1754522122.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>
Because merge-ort is dealing with potentially all the pathnames in the
repository, it sometimes needs to do an awful lot of string comparisons.
Because of this, struct merge_options_internal's path member was
envisioned from the beginning to contain an interned value for every
path in order to allow us to compare strings via pointer comparison
instead of using strcmp. See
* 5b59c3db059d (merge-ort: setup basic internal data structures,
2020-12-13)
* f591c4724615 (merge-ort: copy and adapt merge_3way() from
merge-recursive.c, 2021-01-01)
for some of the early comments.
However, the original comment was slightly misleading when it switched
from mentioning paths to only mentioning directories. Fix that, and
while at it also point to an example in the code which applies the extra
needed care to permit the pointer comparison optimization.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
merge-ort.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/merge-ort.c b/merge-ort.c
index 9b9d82ed10f7..325b19b182ad 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -316,9 +316,14 @@ struct merge_options_internal {
* (e.g. "drivers/firmware/raspberrypi.c").
* * store all relevant paths in the repo, both directories and
* files (e.g. drivers, drivers/firmware would also be included)
- * * these keys serve to intern all the path strings, which allows
- * us to do pointer comparison on directory names instead of
- * strcmp; we just have to be careful to use the interned strings.
+ * * these keys serve to intern *all* path strings, which allows us
+ * to do pointer comparisons on file & directory names instead of
+ * using strcmp; however, for this pointer-comparison optimization
+ * to work, any code path that independently computes a path needs
+ * to check for it existing in this strmap, and if so, point to
+ * the path in this strmap instead of their computed copy. See
+ * the "reuse known pointer" comment in
+ * apply_directory_rename_modifications() for an example.
*
* The values of paths:
* * either a pointer to a merged_info, or a conflict_info struct
--
gitgitgadget
next prev parent reply other threads:[~2025-08-06 23:15 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-22 15:23 [PATCH 0/6] Fix various rename corner cases Elijah Newren via GitGitGadget
2025-07-22 15:23 ` [PATCH 1/6] merge-ort: update comments to modern testfile location Elijah Newren via GitGitGadget
2025-07-22 15:23 ` [PATCH 2/6] merge-ort: drop unnecessary temporary in check_for_directory_rename() Elijah Newren via GitGitGadget
2025-07-22 15:23 ` [PATCH 3/6] t6423: document two bugs with rename-to-self testcases Elijah Newren via GitGitGadget
2025-08-01 8:30 ` Patrick Steinhardt
2025-08-04 19:15 ` Elijah Newren
2025-08-05 4:38 ` Patrick Steinhardt
2025-08-05 18:33 ` Elijah Newren
2025-07-22 15:23 ` [PATCH 4/6] t6423: fix missed staging of file in testcases 12i,12j,12k Elijah Newren via GitGitGadget
2025-08-01 8:30 ` Patrick Steinhardt
2025-08-04 19:23 ` Elijah Newren
2025-08-05 4:38 ` Patrick Steinhardt
2025-08-05 18:33 ` Elijah Newren
2025-07-22 15:23 ` [PATCH 5/6] merge-ort: fix incorrect file handling Elijah Newren via GitGitGadget
2025-08-01 8:31 ` Patrick Steinhardt
2025-08-04 22:08 ` Elijah Newren
2025-08-05 4:39 ` Patrick Steinhardt
2025-08-05 18:34 ` Elijah Newren
2025-07-22 15:23 ` [PATCH 6/6] merge-ort: fix directory rename on top of source of other rename/delete Elijah Newren via GitGitGadget
2025-08-01 8:31 ` Patrick Steinhardt
2025-08-04 22:33 ` Elijah Newren
2025-08-01 8:31 ` [PATCH 0/6] Fix various rename corner cases Patrick Steinhardt
2025-08-05 19:35 ` [PATCH v2 " Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 1/6] merge-ort: update comments to modern testfile location Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 2/6] merge-ort: drop unnecessary temporary in check_for_directory_rename() Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 3/6] t6423: document two bugs with rename-to-self testcases Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 4/6] t6423: fix missed staging of file in testcases 12i,12j,12k Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 5/6] merge-ort: fix incorrect file handling Elijah Newren via GitGitGadget
2025-08-05 19:35 ` [PATCH v2 6/6] merge-ort: fix directory rename on top of source of other rename/delete Elijah Newren via GitGitGadget
2025-08-05 20:18 ` Junio C Hamano
2025-08-05 20:47 ` Elijah Newren
2025-08-06 23:15 ` [PATCH v3 0/7] Fix various rename corner cases Elijah Newren via GitGitGadget
2025-08-06 23:15 ` [PATCH v3 1/7] merge-ort: update comments to modern testfile location Elijah Newren via GitGitGadget
2025-08-06 23:15 ` [PATCH v3 2/7] merge-ort: drop unnecessary temporary in check_for_directory_rename() Elijah Newren via GitGitGadget
2025-08-06 23:15 ` [PATCH v3 3/7] t6423: document two bugs with rename-to-self testcases Elijah Newren via GitGitGadget
2025-08-06 23:15 ` [PATCH v3 4/7] t6423: fix missed staging of file in testcases 12i,12j,12k Elijah Newren via GitGitGadget
2025-08-06 23:15 ` Elijah Newren via GitGitGadget [this message]
2025-08-06 23:15 ` [PATCH v3 6/7] merge-ort: fix incorrect file handling Elijah Newren via GitGitGadget
2025-08-06 23:15 ` [PATCH v3 7/7] merge-ort: fix directory rename on top of source of other rename/delete Elijah Newren via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c4caba16c72636c7b726c6753815f7c5f77ecd1d.1754522123.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).