summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryorah <yoram.harmelin@gmail.com>2012-07-18 16:26:55 +0200
committeryorah <yoram.harmelin@gmail.com>2012-07-24 14:03:09 +0200
commitffbc689c8768c66cddf9ef3ab6c88c41ecf4c1ab (patch)
tree4b8a9a6f2576a1787eb26fdae1c3ce0751938806
parente5e71f5e1db75075a81881f38b4ee0013fa966be (diff)
downloadlibgit2-ffbc689c8768c66cddf9ef3ab6c88c41ecf4c1ab.tar.gz
Fix getting status of files containing brackets
-rw-r--r--src/diff.c23
-rw-r--r--src/status.c6
2 files changed, 20 insertions, 9 deletions
diff --git a/src/diff.c b/src/diff.c
index 09f319e6e..f08688e38 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -20,14 +20,21 @@ static char *diff_prefix_from_pathspec(const git_strarray *pathspec)
return NULL;
/* diff prefix will only be leading non-wildcards */
- for (scan = prefix.ptr; *scan && !git__iswildcard(*scan); ++scan);
+ for (scan = prefix.ptr; *scan; ++scan) {
+ if (git__iswildcard(*scan) &&
+ (scan == prefix.ptr || (*(scan - 1) != '\\')))
+ break;
+ }
git_buf_truncate(&prefix, scan - prefix.ptr);
- if (prefix.size > 0)
- return git_buf_detach(&prefix);
+ if (prefix.size <= 0) {
+ git_buf_free(&prefix);
+ return NULL;
+ }
- git_buf_free(&prefix);
- return NULL;
+ git_buf_unescape(&prefix);
+
+ return git_buf_detach(&prefix);
}
static bool diff_pathspec_is_interesting(const git_strarray *pathspec)
@@ -54,7 +61,10 @@ static bool diff_path_matches_pathspec(git_diff_list *diff, const char *path)
return true;
git_vector_foreach(&diff->pathspec, i, match) {
- int result = p_fnmatch(match->pattern, path, 0);
+ int result = strcmp(match->pattern, path);
+
+ if (result != 0)
+ result = p_fnmatch(match->pattern, path, 0);
/* if we didn't match, look for exact dirname prefix match */
if (result == FNM_NOMATCH &&
@@ -826,4 +836,3 @@ int git_diff_merge(
return error;
}
-
diff --git a/src/status.c b/src/status.c
index e9ad3cfe4..633082c09 100644
--- a/src/status.c
+++ b/src/status.c
@@ -176,10 +176,12 @@ static int get_one_status(const char *path, unsigned int status, void *data)
sfi->count++;
sfi->status = status;
- if (sfi->count > 1 || strcmp(sfi->expected, path) != 0) {
+ if (sfi->count > 1 ||
+ (strcmp(sfi->expected, path) != 0 &&
+ p_fnmatch(sfi->expected, path, 0) != 0)) {
giterr_set(GITERR_INVALID,
"Ambiguous path '%s' given to git_status_file", sfi->expected);
- return -1;
+ return GIT_EAMBIGUOUS;
}
return 0;