From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v2 39/45] parse_pathspec: make sure the prefix part is wildcard-free
Date: Wed, 20 Mar 2013 19:16:19 +0700 [thread overview]
Message-ID: <1363781779-14947-7-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1363781779-14947-1-git-send-email-pclouds@gmail.com>
Prepending prefix to pathspec is a trick to workaround the fact that
commands can be executed in a subdirectory, but all git commands run
at worktree's root. The prefix part should always be treated as
literal string. Make it so.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
cache.h | 2 ++
path.c | 15 ++++++++++++++-
pathspec.c | 17 +++++++++++++----
pathspec.h | 2 +-
setup.c | 9 +++++----
5 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/cache.h b/cache.h
index 6297783..17e0b26 100644
--- a/cache.h
+++ b/cache.h
@@ -401,6 +401,7 @@ extern void setup_work_tree(void);
extern const char *setup_git_directory_gently(int *);
extern const char *setup_git_directory(void);
extern char *prefix_path(const char *prefix, int len, const char *path);
+extern char *prefix_path_gently(const char *prefix, int *p_len, const char *path);
extern const char *prefix_filename(const char *prefix, int len, const char *path);
extern int check_filename(const char *prefix, const char *name);
extern void verify_filename(const char *prefix,
@@ -712,6 +713,7 @@ const char *real_path(const char *path);
const char *real_path_if_valid(const char *path);
const char *absolute_path(const char *path);
const char *relative_path(const char *abs, const char *base);
+int normalize_path_copy_len(char *dst, const char *src, int *prefix_len);
int normalize_path_copy(char *dst, const char *src);
int longest_ancestor_length(const char *path, struct string_list *prefixes);
char *strip_path_suffix(const char *path, const char *suffix);
diff --git a/path.c b/path.c
index d3d3f8b..7baf334 100644
--- a/path.c
+++ b/path.c
@@ -487,8 +487,14 @@ const char *relative_path(const char *abs, const char *base)
*
* Note that this function is purely textual. It does not follow symlinks,
* verify the existence of the path, or make any system calls.
+ *
+ * prefix_len != NULL is for a specific case of prefix_pathspec():
+ * assume that src == dst and src[0..prefix_len-1] is already
+ * normalized, any time "../" eats up to the prefix_len part,
+ * prefix_len is reduced. In the end prefix_len is the remaining
+ * prefix that has not been overridden by user pathspec.
*/
-int normalize_path_copy(char *dst, const char *src)
+int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
{
char *dst0;
@@ -563,11 +569,18 @@ int normalize_path_copy(char *dst, const char *src)
/* Windows: dst[-1] cannot be backslash anymore */
while (dst0 < dst && dst[-1] != '/')
dst--;
+ if (prefix_len && *prefix_len > dst - dst0)
+ *prefix_len = dst - dst0;
}
*dst = '\0';
return 0;
}
+int normalize_path_copy(char *dst, const char *src)
+{
+ return normalize_path_copy_len(dst, src, NULL);
+}
+
/*
* path = Canonical absolute path
* prefixes = string_list containing normalized, absolute paths without
diff --git a/pathspec.c b/pathspec.c
index 9cd3f2c..01f8844 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -149,10 +149,14 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
magic |= short_magic;
*p_short_magic = short_magic;
- if (magic & PATHSPEC_FROMTOP)
+ if (magic & PATHSPEC_FROMTOP) {
match = xstrdup(copyfrom);
- else
- match = prefix_path(prefix, prefixlen, copyfrom);
+ prefixlen = 0;
+ } else {
+ match = prefix_path_gently(prefix, &prefixlen, copyfrom);
+ if (!match)
+ die("%s: '%s' is outside repository", elt, copyfrom);
+ }
*raw = item->match = match;
/*
* Prefix the pathspec (keep all magic) and put to
@@ -166,6 +170,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
} else
item->original = elt;
item->len = strlen(item->match);
+ item->prefix = prefixlen;
if ((flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) &&
(item->len >= 1 && item->match[item->len - 1] == '/') &&
@@ -197,8 +202,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
if (limit_pathspec_to_literal())
item->nowildcard_len = item->len;
- else
+ else {
item->nowildcard_len = simple_length(item->match);
+ if (item->nowildcard_len < prefixlen)
+ item->nowildcard_len = prefixlen;
+ }
item->flags = 0;
if (item->nowildcard_len < item->len &&
item->match[item->nowildcard_len] == '*' &&
@@ -283,6 +291,7 @@ void parse_pathspec(struct pathspec *pathspec,
item->match = prefix;
item->original = prefix;
item->nowildcard_len = item->len = strlen(prefix);
+ item->prefix = item->len;
raw[0] = prefix;
raw[1] = NULL;
pathspec->nr = 1;
diff --git a/pathspec.h b/pathspec.h
index 16bbb7b..bbcfa74 100644
--- a/pathspec.h
+++ b/pathspec.h
@@ -21,7 +21,7 @@ struct pathspec {
const char *match;
const char *original;
unsigned magic;
- int len;
+ int len, prefix;
int nowildcard_len;
int flags;
} *items;
diff --git a/setup.c b/setup.c
index acdc634..e661a71 100644
--- a/setup.c
+++ b/setup.c
@@ -5,10 +5,11 @@
static int inside_git_dir = -1;
static int inside_work_tree = -1;
-static char *prefix_path_gently(const char *prefix, int len, const char *path)
+char *prefix_path_gently(const char *prefix, int *p_len, const char *path)
{
const char *orig = path;
char *sanitized;
+ int len = *p_len;
if (is_absolute_path(orig)) {
const char *temp = real_path(path);
sanitized = xmalloc(len + strlen(temp) + 1);
@@ -19,7 +20,7 @@ static char *prefix_path_gently(const char *prefix, int len, const char *path)
memcpy(sanitized, prefix, len);
strcpy(sanitized + len, path);
}
- if (normalize_path_copy(sanitized, sanitized))
+ if (normalize_path_copy_len(sanitized, sanitized, p_len))
goto error_out;
if (is_absolute_path(orig)) {
size_t root_len, len, total;
@@ -44,7 +45,7 @@ static char *prefix_path_gently(const char *prefix, int len, const char *path)
char *prefix_path(const char *prefix, int len, const char *path)
{
- char *r = prefix_path_gently(prefix, len, path);
+ char *r = prefix_path_gently(prefix, &len, path);
if (!r)
die("'%s' is outside repository", path);
return r;
@@ -53,7 +54,7 @@ char *prefix_path(const char *prefix, int len, const char *path)
int path_inside_repo(const char *prefix, const char *path)
{
int len = prefix ? strlen(prefix) : 0;
- char *r = prefix_path_gently(prefix, len, path);
+ char *r = prefix_path_gently(prefix, &len, path);
if (r) {
free(r);
return 1;
--
1.8.0.rc0.19.g7bbb31d
next prev parent reply other threads:[~2013-03-20 12:17 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-15 6:06 [PATCH v1 00/45] nd/parse-pathspec and :(glob) pathspec magic Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 01/45] setup.c: check that the pathspec magic ends with ")" Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 02/45] clean: remove unused variable "seen" Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 03/45] Move struct pathspec and related functions to pathspec.[ch] Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 04/45] pathspec: i18n-ize error strings in pathspec parsing code Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 05/45] pathspec: add copy_pathspec Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 06/45] Add parse_pathspec() that converts cmdline args to struct pathspec Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 07/45] parse_pathspec: save original pathspec for reporting Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 08/45] parse_pathspec: add PATHSPEC_PREFER_{CWD,FULL} Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 09/45] Convert some get_pathspec() calls to parse_pathspec() Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 10/45] parse_pathspec: a special flag for max_depth feature Nguyễn Thái Ngọc Duy
2013-03-15 21:28 ` Eric Sunshine
2013-03-15 6:06 ` [PATCH v1 11/45] parse_pathspec: support stripping submodule trailing slashes Nguyễn Thái Ngọc Duy
2013-03-17 21:55 ` Junio C Hamano
2013-03-18 0:53 ` Duy Nguyen
2013-03-15 6:06 ` [PATCH v1 12/45] parse_pathspec: support stripping/checking submodule paths Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 13/45] parse_pathspec: support prefixing original patterns Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 14/45] Guard against new pathspec magic in pathspec matching code Nguyễn Thái Ngọc Duy
2013-03-17 22:00 ` Junio C Hamano
2013-03-15 6:06 ` [PATCH v1 15/45] clean: convert to use parse_pathspec Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 16/45] commit: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 17/45] status: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 18/45] rerere: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 19/45] checkout: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 20/45] rm: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 21/45] ls-files: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 22/45] archive: " Nguyễn Thái Ngọc Duy
2013-03-15 17:56 ` Junio C Hamano
2013-03-16 1:08 ` Duy Nguyen
2013-03-17 5:00 ` Junio C Hamano
2013-03-17 5:31 ` Duy Nguyen
2013-03-17 6:22 ` Junio C Hamano
2013-03-15 6:06 ` [PATCH v1 23/45] check-ignore: " Nguyễn Thái Ngọc Duy
2013-04-12 15:03 ` Adam Spiers
2013-04-12 23:09 ` Duy Nguyen
2013-04-14 23:25 ` Adam Spiers
2013-04-14 23:48 ` Duy Nguyen
2013-04-15 16:17 ` Adam Spiers
2013-03-15 6:06 ` [PATCH v1 24/45] add: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 25/45] reset: " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 26/45] Convert read_cache_preload() to take struct pathspec Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 27/45] Convert run_add_interactive to use " Nguyễn Thái Ngọc Duy
2013-03-18 18:26 ` John Keeping
2013-03-19 1:58 ` Duy Nguyen
2013-03-19 10:58 ` John Keeping
2013-03-15 6:06 ` [PATCH v1 28/45] Convert unmerge_cache to take " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 29/45] checkout: convert read_tree_some " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 30/45] Convert report_path_error " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 31/45] Convert refresh_index " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 32/45] Convert {read,fill}_directory " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 33/45] Convert add_files_to_cache " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 34/45] Convert common_prefix() to use " Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 35/45] Remove diff_tree_{setup,release}_paths Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 36/45] Remove init_pathspec() in favor of parse_pathspec() Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 37/45] Remove match_pathspec() in favor of match_pathspec_depth() Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 38/45] tree-diff: remove the use of pathspec's raw[] in follow-rename codepath Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 39/45] parse_pathspec: make sure the prefix part is wildcard-free Nguyễn Thái Ngọc Duy
2013-03-19 18:34 ` Junio C Hamano
2013-03-20 1:32 ` Duy Nguyen
2013-03-20 10:54 ` Duy Nguyen
2013-03-15 6:06 ` [PATCH v1 40/45] parse_pathspec: preserve prefix length via PATHSPEC_PREFIX_ORIGIN Nguyễn Thái Ngọc Duy
2013-03-15 22:00 ` Eric Sunshine
2013-03-15 6:06 ` [PATCH v1 41/45] Kill limit_pathspec_to_literal() as it's only used by parse_pathspec() Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 42/45] pathspec: support :(literal) syntax for noglob pathspec Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 43/45] pathspec: make --literal-pathspecs disable pathspec magic Nguyễn Thái Ngọc Duy
2013-03-15 6:06 ` [PATCH v1 44/45] pathspec: support :(glob) syntax Nguyễn Thái Ngọc Duy
2013-03-15 22:11 ` Eric Sunshine
2013-03-15 6:07 ` [PATCH v1 45/45] Rename field "raw" to "_raw" in struct pathspec Nguyễn Thái Ngọc Duy
2013-03-15 17:48 ` [PATCH v1 00/45] nd/parse-pathspec and :(glob) pathspec magic Junio C Hamano
2013-03-20 12:16 ` [PATCH v2 00/45] parse_pathspec and :(glob) magic Nguyễn Thái Ngọc Duy
2013-03-20 12:16 ` [PATCH v2 06/45] Add parse_pathspec() that converts cmdline args to struct pathspec Nguyễn Thái Ngọc Duy
2013-03-20 19:40 ` Eric Sunshine
2013-03-22 21:55 ` Junio C Hamano
2013-03-20 12:16 ` [PATCH v2 11/45] parse_pathspec: support stripping submodule trailing slashes Nguyễn Thái Ngọc Duy
2013-03-20 12:16 ` [PATCH v2 12/45] parse_pathspec: support stripping/checking submodule paths Nguyễn Thái Ngọc Duy
2013-03-20 12:16 ` [PATCH v2 14/45] Guard against new pathspec magic in pathspec matching code Nguyễn Thái Ngọc Duy
2013-03-20 19:45 ` Eric Sunshine
2013-03-20 12:16 ` [PATCH v2 27/45] Convert run_add_interactive to use struct pathspec Nguyễn Thái Ngọc Duy
2013-03-20 12:16 ` Nguyễn Thái Ngọc Duy [this message]
2013-03-20 18:02 ` [PATCH v2 00/45] parse_pathspec and :(glob) magic Junio C Hamano
2013-03-21 5:33 ` Duy Nguyen
2013-03-21 5:43 ` Duy Nguyen
2013-03-21 17:28 ` Junio C Hamano
2013-03-21 17:50 ` Junio C Hamano
2013-03-23 3:13 ` Duy Nguyen
2013-03-23 3:15 ` Duy Nguyen
2013-03-27 15:39 ` Junio C Hamano
2013-03-24 0:57 ` Eric Sunshine
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=1363781779-14947-7-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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).