From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jiang Xin <worldhello.net@gmail.com>,
Lea Wiemann <lewiemann@gmail.com>,
git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH 4/8] longest_ancestor_length(): explicitly filter list before loop
Date: Wed, 26 Sep 2012 21:34:46 +0200 [thread overview]
Message-ID: <1348688090-13648-5-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1348688090-13648-1-git-send-email-mhagger@alum.mit.edu>
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@alum.mit.edu>
---
path.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/path.c b/path.c
index 969bc17..6da7029 100644
--- a/path.c
+++ b/path.c
@@ -568,6 +568,25 @@ 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;
+ memcpy(buf, ceil, len+1);
+ if (normalize_path_copy(buf, buf) < 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,28 +603,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;
- memcpy(buf, ceil, len+1);
- if (normalize_path_copy(buf, buf) < 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
next prev parent reply other threads:[~2012-09-26 19:35 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-24 8:00 [PATCH] test: some testcases failed if cwd is on a symlink Jiang Xin
2012-07-24 8:24 ` Stefano Lattarini
2012-07-24 10:59 ` Pete Wyckoff
2012-07-24 14:47 ` Junio C Hamano
2012-07-24 22:06 ` Jiang Xin
2012-08-18 14:41 ` Michael Haggerty
2012-08-18 20:36 ` Junio C Hamano
2012-08-19 13:57 ` Michael Haggerty
2012-08-19 16:43 ` Junio C Hamano
2012-08-21 5:59 ` Michael Haggerty
2012-08-27 5:13 ` [PATCH v2] test: set the realpath of CWD as TRASH_DIRECTORY Jiang Xin
2012-08-27 16:15 ` Junio C Hamano
2012-08-29 4:14 ` Michael Haggerty
2012-08-29 6:06 ` Junio C Hamano
2012-08-29 8:15 ` Michael Haggerty
2012-08-29 16:33 ` Junio C Hamano
2012-08-30 4:37 ` Michael Haggerty
2012-08-30 5:26 ` Junio C Hamano
2012-08-31 7:49 ` Michael Haggerty
2012-09-26 19:34 ` [PATCH 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks Michael Haggerty
2012-09-26 19:34 ` [PATCH 1/8] Introduce new static function real_path_internal() Michael Haggerty
2012-09-27 21:27 ` Junio C Hamano
2012-09-29 4:56 ` Michael Haggerty
2012-09-29 5:40 ` Junio C Hamano
2012-09-26 19:34 ` [PATCH 2/8] Introduce new function real_path_if_valid() Michael Haggerty
2012-09-26 19:34 ` [PATCH 3/8] longest_ancestor_length(): use string_list_split() Michael Haggerty
2012-09-27 22:48 ` Junio C Hamano
2012-09-29 5:25 ` Michael Haggerty
2012-09-29 5:43 ` Junio C Hamano
2012-09-26 19:34 ` Michael Haggerty [this message]
2012-09-27 22:48 ` [PATCH 4/8] longest_ancestor_length(): explicitly filter list before loop Junio C Hamano
2012-09-26 19:34 ` [PATCH 5/8] longest_ancestor_length(): always add a slash to the end of prefixes Michael Haggerty
2012-09-26 19:34 ` [PATCH 6/8] longest_ancestor_length(): use string_list_longest_prefix() Michael Haggerty
2012-09-26 19:34 ` [PATCH 7/8] longest_ancestor_length(): resolve symlinks before comparing paths Michael Haggerty
2012-09-27 22:51 ` Junio C Hamano
2012-09-29 5:46 ` Michael Haggerty
2012-09-26 19:34 ` [PATCH 8/8] t1504: stop resolving symlinks in GIT_CEILING_DIRECTORIES Michael Haggerty
2012-09-27 19:42 ` [PATCH 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1348688090-13648-5-git-send-email-mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=lewiemann@gmail.com \
--cc=worldhello.net@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).