Separate the step of filtering and normalizing elements of the prefixes list from the iteration that looks for the longest prefix. This will help keep the function testable after we not only normalize the paths, but also convert them into real paths. Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- path.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/path.c b/path.c index f455e8e..b255a74 100644 --- a/path.c +++ b/path.c @@ -568,6 +568,24 @@ int normalize_path_copy(char *dst, const char *src) return 0; } +static int normalize_path_callback(struct string_list_item *item, void *cb_data) +{ + char buf[PATH_MAX+1]; + const char *ceil = item->string; + int len = strlen(ceil); + + if (len == 0 || len > PATH_MAX || !is_absolute_path(ceil)) + return 0; + if (normalize_path_copy(buf, ceil) < 0) + return 0; + len = strlen(buf); + if (len > 0 && buf[len-1] == '/') + buf[--len] = '\0'; + free(item->string); + item->string = xstrdup(buf); + return 1; +} + /* * path = Canonical absolute path * prefix_list = Colon-separated list of absolute paths @@ -584,27 +602,19 @@ int normalize_path_copy(char *dst, const char *src) int longest_ancestor_length(const char *path, const char *prefix_list) { struct string_list prefixes = STRING_LIST_INIT_DUP; - char buf[PATH_MAX+1]; int i, max_len = -1; if (prefix_list == NULL || !strcmp(path, "/")) return -1; string_list_split(&prefixes, prefix_list, PATH_SEP, -1); + filter_string_list(&prefixes, 0, normalize_path_callback, NULL); for (i = 0; i < prefixes.nr; i++) { const char *ceil = prefixes.items[i].string; int len = strlen(ceil); - if (len == 0 || len > PATH_MAX || !is_absolute_path(ceil)) - continue; - if (normalize_path_copy(buf, ceil) < 0) - continue; - len = strlen(buf); - if (len > 0 && buf[len-1] == '/') - buf[--len] = '\0'; - - if (!strncmp(path, buf, len) && + if (!strncmp(path, ceil, len) && path[len] == '/' && len > max_len) { max_len = len; -- 1.7.11.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html