Re: [PATCH v2 1/5] merge-ort: replace string_list_df_name_compare with faster alternative
From: Derrick Stolee <hidden>
Date: 2021-06-02 11:29:26
On 6/1/21 10:58 AM, Elijah Newren via GitGitGadget wrote:
From: Elijah Newren <redacted>
...
/* - * Here we only care that entries for D/F conflicts are - * adjacent, in particular with the file of the D/F conflict - * appearing before files below the corresponding directory. - * The order of the rest of the list is irrelevant for us. + * Here we only care that entries for directories appear adjacent + * to and before files underneath the directory. We can achieve + * that by pretending to add a trailing slash to every file and + * then sorting. In other words, we do not want the natural + * sorting of + * foo + * foo.txt + * foo/bar + * Instead, we want "foo" to sort as though it were "foo/", so that + * we instead get + * foo.txt + * foo + * foo/bar + * To achieve this, we basically implement our own strcmp, except that + * if we get to the end of either string instead of comparing NUL to + * another character, we compare '/' to it. + * + * If this unusual "sort as though '/' were appended" perplexes + * you, perhaps it will help to note that this is not the final + * sort. write_tree() will sort again without the trailing slash + * magic, but just on paths immediately under a given tree.
I find this comment to be helpful.
+ * The reason to not use df_name_compare directly was that it was + * just too expensive (we don't have the string lengths handy), so + * I had to reimplement it.
Just a hyper-nit I think first person works great in commit messages, as the author's name is clearly listed in context. Here, I'd prefer "so it was reimplemented" over "so I had to reimplement it" as the author will not be present in context.
+
+ while (*one && (*one == *two)) {
+ one++;
+ two++;
+ }
+
+ c1 = *one;
+ if (!c1)
+ c1 = '/';
+
+ c2 = *two;
+ if (!c2)
+ c2 = '/';While I'm making other nits on this patch, perhaps this is an appropriate place for some ternary operators to compress the vertical space in this method: c1 = *one ? *one : '/'; c2 = *two ? *two : '/';
+ if (c1 == c2) {
+ /* Getting here means one is a leading directory of the other */
+ return (*one) ? 1 : -1;
+ } else
+ return c1-c2;nit: "c1 - c2" Thanks, -Stolee