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

Re: [PATCH v2 05/17] merge-ort: add outline of get_provisional_directory_renames()

From
Taylor Blau <me@ttaylorr.com>
Date
Jan 18, 2021, 20:10 UTC
Message-ID
<YAXrKLM5vkkwmxjC@nand.local>
In-Reply-To
<bb4285250cdef2fcd16a22f8540968c871302c9f.1610055365.git.gitgitgadget@gmail.com>
On Thu, Jan 07, 2021 at 09:35:53PM +0000, Elijah Newren via GitGitGadget wrote:
Show 61 quoted lines
> From: Elijah Newren <newren@gmail.com>
>
> This function is based on merge-recursive.c's get_directory_renames(),
> except that the first half has been split out into a not-yet-implemented
> compute_rename_counts().  The primary difference here is our lack of the
> non_unique_new_dir boolean in our strmap.  The lack of that field will
> at first cause us to fail testcase 2b of t6423; however, future
> optimizations will obviate the need for that ugly field so we have just
> left it out.
>
> Signed-off-by: Elijah Newren <newren@gmail.com>
> ---
>  merge-ort.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/merge-ort.c b/merge-ort.c
> index 378ac495d09..73d3ff97f52 100644
> --- a/merge-ort.c
> +++ b/merge-ort.c
> @@ -721,11 +721,69 @@ static int handle_content_merge(struct merge_options *opt,
>
>  /*** Function Grouping: functions related to directory rename detection ***/
>
> +static void compute_rename_counts(struct diff_queue_struct *pairs,
> +				  struct strmap *dir_rename_count,
> +				  struct strset *dirs_removed)
> +{
> +	die("Not yet implemented!");
> +}
> +
>  static void get_provisional_directory_renames(struct merge_options *opt,
>  					      unsigned side,
>  					      int *clean)
>  {
> -	die("Not yet implemented!");
> +	struct hashmap_iter iter;
> +	struct strmap_entry *entry;
> +	struct rename_info *renames = &opt->priv->renames;
> +
> +	compute_rename_counts(&renames->pairs[side],
> +			      &renames->dir_rename_count[side],
> +			      &renames->dirs_removed[side]);
> +	/*
> +	 * Collapse
> +	 *    dir_rename_count: old_directory -> {new_directory -> count}
> +	 * down to
> +	 *    dir_renames: old_directory -> best_new_directory
> +	 * where best_new_directory is the one with the unique highest count.
> +	 */
> +	strmap_for_each_entry(&renames->dir_rename_count[side], &iter, entry) {
> +		const char *source_dir = entry->key;
> +		struct strintmap *counts = entry->value;
> +		struct hashmap_iter count_iter;
> +		struct strmap_entry *count_entry;
> +		int max = 0;
> +		int bad_max = 0;
> +		const char *best = NULL;
> +
> +		strintmap_for_each_entry(counts, &count_iter, count_entry) {
> +			const char *target_dir = count_entry->key;
> +			intptr_t count = (intptr_t)count_entry->value;

Just to make sure I understand what's going on here: you're storing the whole int inside the pointer (and not pointing at it)?

Show 10 quoted lines
> +			if (count == max)
> +				bad_max = max;
> +			else if (count > max) {
> +				max = count;
> +				best = target_dir;
> +			}
> +		}
> +
> +		if (max == 0)
> +			continue;

This is new from merge_recursive.c:get_directory_renames(). What is it doing here?

Show 9 quoted lines
> +		if (bad_max == max) {
> +			path_msg(opt, source_dir, 0,
> +			       _("CONFLICT (directory rename split): "
> +				 "Unclear where to rename %s to; it was "
> +				 "renamed to multiple other directories, with "
> +				 "no destination getting a majority of the "
> +				 "files."),
> +			       source_dir);
> +			*clean &= 0;
Also not a big deal, but why not simply '*clean = 0'?
> +		} else {
> +			strmap_put(&renames->dir_renames[side],
> +				   source_dir, (void*)best);

Ah, answering my onw question: this is indeed shoving the int into your void*. That said, shouldn't this be '(void*)(intptr_t)best'?

Thanks, Taylor

Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren
Message 25 of 66 in “Add directory rename detection to merge-ort”
  1. 00/18 Add directory rename detection to merge-ortElijah Newren via GitGitGadget, Jan 7, 2021
  2. 10/18 merge-ort: implement compute_collisions()Elijah Newren via GitGitGadget, Jan 7, 2021
  3. 12/18 merge-ort: implement check_for_directory_rename()Elijah Newren via GitGitGadget, Jan 7, 2021
  4. 02/18 merge-ort: initialize and free new directory rename data structuresElijah Newren via GitGitGadget, Jan 7, 2021
  5. 01/18 merge-ort: add new data structures for directory rename detectionElijah Newren via GitGitGadget, Jan 7, 2021
  6. 07/18 merge-ort: implement compute_rename_counts()Elijah Newren via GitGitGadget, Jan 7, 2021
  7. 14/18 merge-ort: add a new toplevel_dir fieldElijah Newren via GitGitGadget, Jan 7, 2021
  8. 03/18 merge-ort: collect which directories are removed in dirs_removedElijah Newren via GitGitGadget, Jan 7, 2021
  9. 05/18 merge-ort: add outline of get_provisional_directory_renames()Elijah Newren via GitGitGadget, Jan 7, 2021
  10. 06/18 merge-ort: copy get_renamed_dir_portion() from merge-recursive.cElijah Newren via GitGitGadget, Jan 7, 2021
  11. 08/18 merge-ort: implement handle_directory_level_conflicts()Elijah Newren via GitGitGadget, Jan 7, 2021
  12. 09/18 merge-ort: modify collect_renames() for directory rename handlingElijah Newren via GitGitGadget, Jan 7, 2021
  13. 04/18 merge-ort: add outline for computing directory renamesElijah Newren via GitGitGadget, Jan 7, 2021
  14. 16/18 merge-ort: process_renames() now needs more defensivenessElijah Newren via GitGitGadget, Jan 7, 2021
  15. 11/18 merge-ort: implement apply_dir_rename() and check_dir_renamed()Elijah Newren via GitGitGadget, Jan 7, 2021
  16. 18/18 DO NOT SUBMIT: directory rename stuff for redo_after_renamesElijah Newren via GitGitGadget, Jan 7, 2021
  17. Elijah NewrenJan 7, 2021
  18. 13/18 merge-ort: implement handle_path_level_conflicts()Elijah Newren via GitGitGadget, Jan 7, 2021
  19. 15/18 merge-ort: implement apply_directory_rename_modifications()Elijah Newren via GitGitGadget, Jan 7, 2021
  20. 17/18 merge-ort: fix a directory rename detection bugElijah Newren via GitGitGadget, Jan 7, 2021
  21. 00/17 Add directory rename detection to merge-ortElijah Newren via GitGitGadget, Jan 7, 2021
  22. 02/17 merge-ort: initialize and free new directory rename data structuresElijah Newren via GitGitGadget, Jan 7, 2021
  23. 01/17 merge-ort: add new data structures for directory rename detectionElijah Newren via GitGitGadget, Jan 7, 2021
  24. 05/17 merge-ort: add outline of get_provisional_directory_renames()Elijah Newren via GitGitGadget, Jan 7, 2021
  25. Taylor BlauJan 18, 2021
  26. Elijah NewrenJan 18, 2021
  27. 09/17 merge-ort: modify collect_renames() for directory rename handlingElijah Newren via GitGitGadget, Jan 7, 2021
  28. 15/17 merge-ort: implement apply_directory_rename_modifications()Elijah Newren via GitGitGadget, Jan 7, 2021
  29. 03/17 merge-ort: collect which directories are removed in dirs_removedElijah Newren via GitGitGadget, Jan 7, 2021
  30. 16/17 merge-ort: process_renames() now needs more defensivenessElijah Newren via GitGitGadget, Jan 7, 2021
  31. 04/17 merge-ort: add outline for computing directory renamesElijah Newren via GitGitGadget, Jan 7, 2021
  32. Taylor BlauJan 18, 2021
  33. Elijah NewrenJan 18, 2021
  34. Taylor BlauJan 18, 2021
  35. 10/17 merge-ort: implement compute_collisions()Elijah Newren via GitGitGadget, Jan 7, 2021
  36. 13/17 merge-ort: implement handle_path_level_conflicts()Elijah Newren via GitGitGadget, Jan 7, 2021
  37. 11/17 merge-ort: implement apply_dir_rename() and check_dir_renamed()Elijah Newren via GitGitGadget, Jan 7, 2021
  38. 14/17 merge-ort: add a new toplevel_dir fieldElijah Newren via GitGitGadget, Jan 7, 2021
  39. 08/17 merge-ort: implement handle_directory_level_conflicts()Elijah Newren via GitGitGadget, Jan 7, 2021
  40. Taylor BlauJan 18, 2021
  41. Elijah NewrenJan 18, 2021
  42. 06/17 merge-ort: copy get_renamed_dir_portion() from merge-recursive.cElijah Newren via GitGitGadget, Jan 7, 2021
  43. 12/17 merge-ort: implement check_for_directory_rename()Elijah Newren via GitGitGadget, Jan 7, 2021
  44. 07/17 merge-ort: implement compute_rename_counts()Elijah Newren via GitGitGadget, Jan 7, 2021
  45. Taylor BlauJan 18, 2021
  46. Elijah NewrenJan 18, 2021
  47. 17/17 merge-ort: fix a directory rename detection bugElijah Newren via GitGitGadget, Jan 7, 2021
  48. 00/17 Add directory rename detection to merge-ortElijah Newren via GitGitGadget, Jan 19, 2021
  49. 02/17 merge-ort: initialize and free new directory rename data structuresElijah Newren via GitGitGadget, Jan 19, 2021
  50. 03/17 merge-ort: collect which directories are removed in dirs_removedElijah Newren via GitGitGadget, Jan 19, 2021
  51. 06/17 merge-ort: copy get_renamed_dir_portion() from merge-recursive.cElijah Newren via GitGitGadget, Jan 19, 2021
  52. 04/17 merge-ort: add outline for computing directory renamesElijah Newren via GitGitGadget, Jan 19, 2021
  53. 05/17 merge-ort: add outline of get_provisional_directory_renames()Elijah Newren via GitGitGadget, Jan 19, 2021
  54. 10/17 merge-ort: implement compute_collisions()Elijah Newren via GitGitGadget, Jan 19, 2021
  55. 15/17 merge-ort: implement apply_directory_rename_modifications()Elijah Newren via GitGitGadget, Jan 19, 2021
  56. 17/17 merge-ort: fix a directory rename detection bugElijah Newren via GitGitGadget, Jan 19, 2021
  57. 11/17 merge-ort: implement apply_dir_rename() and check_dir_renamed()Elijah Newren via GitGitGadget, Jan 19, 2021
  58. 16/17 merge-ort: process_renames() now needs more defensivenessElijah Newren via GitGitGadget, Jan 19, 2021
  59. 14/17 merge-ort: add a new toplevel_dir fieldElijah Newren via GitGitGadget, Jan 19, 2021
  60. 13/17 merge-ort: implement handle_path_level_conflicts()Elijah Newren via GitGitGadget, Jan 19, 2021
  61. 12/17 merge-ort: implement check_for_directory_rename()Elijah Newren via GitGitGadget, Jan 19, 2021
  62. 08/17 merge-ort: implement handle_directory_level_conflicts()Elijah Newren via GitGitGadget, Jan 19, 2021
  63. 09/17 merge-ort: modify collect_renames() for directory rename handlingElijah Newren via GitGitGadget, Jan 19, 2021
  64. 01/17 merge-ort: add new data structures for directory rename detectionElijah Newren via GitGitGadget, Jan 19, 2021
  65. 07/17 merge-ort: implement compute_rename_counts()Elijah Newren via GitGitGadget, Jan 19, 2021
  66. Taylor BlauJan 19, 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.