Fix getting status of files containing brackets
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
diff --git a/src/diff.c b/src/diff.c
index 09f319e..f08688e 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 e9ad3cf..633082c 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;