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

Re: [PATCH v2 07/17] merge-ort: implement compute_rename_counts()

From
Elijah Newren <newren@gmail.com>
Date
Jan 18, 2021, 20:41 UTC
Message-ID
<CABPp-BG0a7AfqHgnxWRwsA774d=n7tnTo6Mcx5x4x5E_NtUSSA@mail.gmail.com>
In-Reply-To
<YAXxTsnQ0gqQZv75@nand.local>
On Mon, Jan 18, 2021 at 12:36 PM Taylor Blau <me@ttaylorr.com> wrote:
Show 66 quoted lines
>
> On Thu, Jan 07, 2021 at 09:35:55PM +0000, Elijah Newren via GitGitGadget wrote:
> > From: Elijah Newren <newren@gmail.com>
> >
> > This function is based on the first half of get_directory_renames() from
> > merge-recursive.c
> >
> > Signed-off-by: Elijah Newren <newren@gmail.com>
> > ---
> >  merge-ort.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 51 insertions(+), 2 deletions(-)
> >
> > diff --git a/merge-ort.c b/merge-ort.c
> > index 7e0cc597055..a8fcc026031 100644
> > --- a/merge-ort.c
> > +++ b/merge-ort.c
> > @@ -721,7 +721,6 @@ static int handle_content_merge(struct merge_options *opt,
> >
> >  /*** Function Grouping: functions related to directory rename detection ***/
> >
> > -MAYBE_UNUSED
> >  static void get_renamed_dir_portion(const char *old_path, const char *new_path,
> >                                   char **old_dir, char **new_dir)
> >  {
> > @@ -825,11 +824,61 @@ static void get_renamed_dir_portion(const char *old_path, const char *new_path,
> >       *new_dir = xstrndup(new_path, end_of_new - new_path);
> >  }
> >
> > +static void increment_count(struct strmap *dir_rename_count,
> > +                         char *old_dir,
> > +                         char *new_dir)
> > +{
> > +     struct strintmap *counts;
> > +     struct strmap_entry *e;
> > +
> > +     /* Get the {new_dirs -> counts} mapping using old_dir */
> > +     e = strmap_get_entry(dir_rename_count, old_dir);
> > +     if (e) {
> > +             counts = e->value;
> > +     } else {
> > +             counts = xmalloc(sizeof(*counts));
> > +             strintmap_init_with_options(counts, 0, NULL, 1);
> > +             strmap_put(dir_rename_count, old_dir, counts);
> > +     }
> > +
> > +     /* Increment the count for new_dir */
> > +     strintmap_incr(counts, new_dir, 1);
> > +}
> > +
> >  static void compute_rename_counts(struct diff_queue_struct *pairs,
> >                                 struct strmap *dir_rename_count,
> >                                 struct strset *dirs_removed)
> >  {
> > -     die("Not yet implemented!");
> > +     int i;
> > +
> > +     for (i = 0; i < pairs->nr; ++i) {
> > +             char *old_dir, *new_dir;
> > +             struct diff_filepair *pair = pairs->queue[i];
> > +
> > +             if (pair->status != 'R')
> > +                     continue;
>
> This had a useful comment in merge-recursive.c that I think would help
> future readers here. Would you consider brining over the comment that
> starts with "File not part of directory rename ..." here?
Sure, will do.
Show 25 quoted lines
> > +             /* Get the old and new directory names */
> > +             get_renamed_dir_portion(pair->one->path, pair->two->path,
> > +                                     &old_dir,        &new_dir);
>
> This spacing is a little odd to me, but it does come directly from
> merge-recursive.c. I don't feel strongly about it.
>
> > +             if (!old_dir)
> > +                     /* Directory didn't change at all; ignore this one. */
> > +                     continue;
> > +
> > +             /*
> > +              * Make dir_rename_count contain a map of a map:
> > +              *   old_directory -> {new_directory -> count}
> > +              * In other words, for every pair look at the directories for
> > +              * the old filename and the new filename and count how many
> > +              * times that pairing occurs.
> > +              */
> > +             if (strset_contains(dirs_removed, old_dir))
> > +                     increment_count(dir_rename_count, old_dir, new_dir);
>
> Much clearer. If you're rerolling anyway, it may be worth it to say
> something about this movement in the patch message: "along the way,
> factor out the routine to update the bookkeeping to track the number of
> items renamed into new directories".
Sure, makes sense.
Show 10 quoted lines
>
> > +             /* Free resources we don't need anymore */
> > +             free(old_dir);
> > +             free(new_dir);
> > +     }
>
> And obviously this is new, but it makes sense here. Thanks.
>
> Thanks,
> Taylor
Previous: Taylor BlauNext: Elijah Newren via GitGitGadget
Message 46 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.