On Mon, Mar 15, 2021 at 7:31 AM Derrick Stolee <stolee@xxxxxxxxx> wrote: > > On 3/13/2021 5:22 PM, Elijah Newren via GitGitGadget wrote: > > From: Elijah Newren <newren@xxxxxxxxx> > > > > When one side of history renames a directory, and the other side of > > history added files to the old directory, directory rename detection is > > used to warn about the location of the added files so the user can > > move them to the old directory or keep them with the new one. > > > > This sets up three different types of directories: > > * directories that had new files added to them > > * directories underneath a directory that had new files added to them > > * directories where no new files were added to it or any leading path > > > > Save this information in dirs_removed; the next several commits will > > make use of this information. > ... > > +/* dir_rename_relevance: the reason we want rename information for a dir */ > > +enum dir_rename_relevance { > > + NOT_RELEVANT = 0, > > + RELEVANT_FOR_ANCESTOR = 1, > > + RELEVANT_FOR_SELF = 2 > > +}; > > Is this potentially a flag list? It's hard to tell because we don't > have another item (3 or 4?). > > > unsigned sides = (0x07 - dirmask)/2; > > + unsigned relevance = (renames->dir_rename_mask == 0x07) ? > > + RELEVANT_FOR_ANCESTOR : NOT_RELEVANT; > > + /* > > + * Record relevance of this directory. However, note that > > + * when collect_merge_info_callback() recurses into this > > + * directory and calls collect_rename_info() on paths > > + * within that directory, if we find a path that was added > > + * to this directory on the other side of history, we will > > + * upgrade this value to RELEVANT_FOR_SELF; see below. > > + */ > > This comment seems to imply that RELEVANT_FOR_SELF is "more important" > than RELEVANT_FOR_ANCESTOR, so the value will just be changed (not a > flag). Yes. > > + /* > > + * Here's the block that potentially upgrades to RELEVANT_FOR_SELF. > > + * When we run across a file added to a directory. In such a case, > > + * find the directory of the file and upgrade its relevance. > > + */ > > + if (renames->dir_rename_mask == 0x07 && > > + (filemask == 2 || filemask == 4)) { > > + /* > > + * Need directory rename for parent directory on other side > > + * of history from added file. Thus > > + * side = (~filemask & 0x06) >> 1 > > + * or > > + * side = 3 - (filemask/2). > > + */ > > + unsigned side = 3 - (filemask >> 1); > > + strintmap_set(&renames->dirs_removed[side], dirname, > > + RELEVANT_FOR_SELF); > > Yes, using "RELEVANT_FOR_SELF" here, not "relevance | RELEVANT_FOR_SELF". > OK. This should make the later consumers simpler. Yep, indeed. Would it make it clearer earlier if I were to stop assigning the explicit values in the enum? Would adding a comment when I introduce the enum be easier? Or was it just "thinking out loud"?