git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 02/13] merge-ort: add a special minimal index just for renormalization

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Mar 17, 2021, 21:27 UTC
Message-ID
<6d34cc466bd53e074c690b58ef03391eac10e5d9.1616016485.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.905.v2.git.1616016485.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

renormalize_buffer() requires an index_state, which is something that merge-ort does not operate with. However, all the renormalization code needs is an index with a .gitattributes file...plus a little bit of setup. Create such an index, along with the deallocation and attr_direction handling.

A subsequent commit will add a function to finish the initialization of this index.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 merge-ort.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
diff --git a/merge-ort.c b/merge-ort.c
index 34a91c435737..3c606fa7e4b3 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -18,6 +18,7 @@
 #include "merge-ort.h"
 
 #include "alloc.h"
+#include "attr.h"
 #include "blob.h"
 #include "cache-tree.h"
 #include "commit.h"
@@ -220,6 +221,16 @@ struct merge_options_internal {
 	 */
 	struct rename_info renames;
 
+	/*
+	 * attr_index: hacky minimal index used for renormalization
+	 *
+	 * renormalization code _requires_ an index, though it only needs to
+	 * find a .gitattributes file within the index.  So, when
+	 * renormalization is important, we create a special index with just
+	 * that one file.
+	 */
+	struct index_state attr_index;
+
 	/*
 	 * current_dir_name, toplevel_dir: temporary vars
 	 *
@@ -399,6 +410,9 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
 	string_list_clear(&opti->paths_to_free, 0);
 	opti->paths_to_free.strdup_strings = 0;
 
+	if (opti->attr_index.cache_nr)
+		discard_index(&opti->attr_index);
+
 	/* Free memory used by various renames maps */
 	for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) {
 		strintmap_func(&renames->dirs_removed[i]);
@@ -3407,6 +3421,8 @@ void merge_finalize(struct merge_options *opt,
 {
 	struct merge_options_internal *opti = result->priv;
 
+	if (opt->renormalize)
+		git_attr_set_direction(GIT_ATTR_CHECKIN);
 	assert(opt->priv == NULL);
 
 	clear_or_reinit_internal_opts(opti, 0);
@@ -3482,6 +3498,10 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
 	/* Default to histogram diff.  Actually, just hardcode it...for now. */
 	opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
 
+	/* Handle attr direction stuff for renormalization */
+	if (opt->renormalize)
+		git_attr_set_direction(GIT_ATTR_CHECKOUT);
+
 	/* Initialization of opt->priv, our internal merge data */
 	trace2_region_enter("merge", "allocate/init", opt->repo);
 	if (opt->priv) {
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren via GitGitGadget
Message 8 of 40 in “Declare merge-ort ready for general usage”
  1. 0/2 Declare merge-ort ready for general usageElijah Newren via GitGitGadget, Mar 16, 2021
  2. 2/2 t6423: mark remaining expected failure under merge-ort as suchElijah Newren via GitGitGadget, Mar 16, 2021
  3. 1/2 Revert "merge-ort: ignore the directory rename split conflict for now"Elijah Newren via GitGitGadget, Mar 16, 2021
  4. Derrick StoleeMar 16, 2021
  5. Elijah NewrenMar 16, 2021
  6. Derrick StoleeMar 16, 2021
  7. 00/13 Declare merge-ort ready for general usageElijah Newren via GitGitGadget, Mar 17, 2021
  8. 02/13 merge-ort: add a special minimal index just for renormalizationElijah Newren via GitGitGadget, Mar 17, 2021
  9. 05/13 merge-ort: support subtree shiftingElijah Newren via GitGitGadget, Mar 17, 2021
  10. 01/13 merge-ort: use STABLE_QSORT instead of QSORT where requiredElijah Newren via GitGitGadget, Mar 17, 2021
  11. 03/13 merge-ort: have ll_merge() use a special attr_index for renormalizationElijah Newren via GitGitGadget, Mar 17, 2021
  12. 07/13 merge-ort: implement CE_SKIP_WORKTREE handling with conflicted entriesElijah Newren via GitGitGadget, Mar 17, 2021
  13. 08/13 t: mark several submodule merging tests as fixed under merge-ortElijah Newren via GitGitGadget, Mar 17, 2021
  14. 06/13 t6428: new test for SKIP_WORKTREE handling and conflictsElijah Newren via GitGitGadget, Mar 17, 2021
  15. 04/13 merge-ort: let renormalization change modify/delete into clean deleteElijah Newren via GitGitGadget, Mar 17, 2021
  16. 10/13 merge-recursive: add a bunch of FIXME comments documenting known bugsElijah Newren via GitGitGadget, Mar 17, 2021
  17. 09/13 merge-ort: write $GIT_DIR/AUTO_MERGE whenever we hit a conflictElijah Newren via GitGitGadget, Mar 17, 2021
  18. 11/13 Revert "merge-ort: ignore the directory rename split conflict for now"Elijah Newren via GitGitGadget, Mar 17, 2021
  19. 12/13 t6423: mark remaining expected failure under merge-ort as suchElijah Newren via GitGitGadget, Mar 17, 2021
  20. 13/13 Add testing with merge-ort merge strategyElijah Newren via GitGitGadget, Mar 17, 2021
  21. Derrick StoleeMar 19, 2021
  22. Elijah NewrenMar 19, 2021
  23. Derrick StoleeMar 19, 2021
  24. Elijah NewrenMar 19, 2021
  25. Elijah NewrenMar 19, 2021
  26. 00/13 Declare merge-ort ready for general usageElijah Newren via GitGitGadget, Mar 20, 2021
  27. 03/13 merge-ort: have ll_merge() use a special attr_index for renormalizationElijah Newren via GitGitGadget, Mar 20, 2021
  28. 01/13 merge-ort: use STABLE_QSORT instead of QSORT where requiredElijah Newren via GitGitGadget, Mar 20, 2021
  29. 05/13 merge-ort: support subtree shiftingElijah Newren via GitGitGadget, Mar 20, 2021
  30. 02/13 merge-ort: add a special minimal index just for renormalizationElijah Newren via GitGitGadget, Mar 20, 2021
  31. 07/13 merge-ort: implement CE_SKIP_WORKTREE handling with conflicted entriesElijah Newren via GitGitGadget, Mar 20, 2021
  32. 09/13 merge-ort: write $GIT_DIR/AUTO_MERGE whenever we hit a conflictElijah Newren via GitGitGadget, Mar 20, 2021
  33. 04/13 merge-ort: let renormalization change modify/delete into clean deleteElijah Newren via GitGitGadget, Mar 20, 2021
  34. 06/13 t6428: new test for SKIP_WORKTREE handling and conflictsElijah Newren via GitGitGadget, Mar 20, 2021
  35. 11/13 Revert "merge-ort: ignore the directory rename split conflict for now"Elijah Newren via GitGitGadget, Mar 20, 2021
  36. 08/13 t: mark several submodule merging tests as fixed under merge-ortElijah Newren via GitGitGadget, Mar 20, 2021
  37. 12/13 t6423: mark remaining expected failure under merge-ort as suchElijah Newren via GitGitGadget, Mar 20, 2021
  38. 13/13 Add testing with merge-ort merge strategyElijah Newren via GitGitGadget, Mar 20, 2021
  39. 10/13 merge-recursive: add a bunch of FIXME comments documenting known bugsElijah Newren via GitGitGadget, Mar 20, 2021
  40. Derrick StoleeMar 20, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.