diff options
author | Vicent Martà <tanoku@gmail.com> | 2012-05-24 17:43:17 -0700 |
---|---|---|
committer | Vicent Martà <tanoku@gmail.com> | 2012-05-24 17:43:17 -0700 |
commit | 4728b55ac66cde7f8c104f0a8cc350d96a530f33 (patch) | |
tree | 3b1fc3f206d156b356b4a342ea94eadad99192f1 /src | |
parent | a4452eb1b929b95f69768d398008f6f8844941e4 (diff) | |
parent | 2a99df6909af4c93ce2741ddc5d15a7f52270f28 (diff) | |
download | libgit2-4728b55ac66cde7f8c104f0a8cc350d96a530f33.tar.gz |
Merge pull request #729 from arrbee/fix-728
Fix bugs for status
Diffstat (limited to 'src')
-rw-r--r-- | src/attr.c | 11 | ||||
-rw-r--r-- | src/attr_file.c | 26 | ||||
-rw-r--r-- | src/attr_file.h | 3 | ||||
-rw-r--r-- | src/diff.c | 1 |
4 files changed, 29 insertions, 12 deletions
diff --git a/src/attr.c b/src/attr.c index 093f64d5c..fb6651196 100644 --- a/src/attr.c +++ b/src/attr.c @@ -403,9 +403,14 @@ int git_attr_cache__push_file( goto finish; } - if (!file && - (error = git_attr_file__new(&file, source, relfile, &cache->pool)) < 0) - goto finish; + /* if we got here, we have to parse and/or reparse the file */ + if (file) + git_attr_file__clear_rules(file); + else { + error = git_attr_file__new(&file, source, relfile, &cache->pool); + if (error < 0) + goto finish; + } if (parse && (error = parse(repo, content, file)) < 0) goto finish; diff --git a/src/attr_file.c b/src/attr_file.c index 5030ad5de..ca2f8fb58 100644 --- a/src/attr_file.c +++ b/src/attr_file.c @@ -139,18 +139,23 @@ int git_attr_file__new_and_load( return error; } -void git_attr_file__free(git_attr_file *file) +void git_attr_file__clear_rules(git_attr_file *file) { unsigned int i; git_attr_rule *rule; - if (!file) - return; - git_vector_foreach(&file->rules, i, rule) git_attr_rule__free(rule); git_vector_free(&file->rules); +} + +void git_attr_file__free(git_attr_file *file) +{ + if (!file) + return; + + git_attr_file__clear_rules(file); if (file->pool_is_allocated) { git_pool_clear(file->pool); @@ -338,10 +343,13 @@ int git_attr_fnmatch__parse( const char **base) { const char *pattern, *scan; - int slash_count; + int slash_count, allow_space; assert(spec && base && *base); + spec->flags = (spec->flags & GIT_ATTR_FNMATCH_ALLOWSPACE); + allow_space = (spec->flags != 0); + pattern = *base; while (git__isspace(*pattern)) pattern++; @@ -350,8 +358,6 @@ int git_attr_fnmatch__parse( return GIT_ENOTFOUND; } - spec->flags = 0; - if (*pattern == '[') { if (strncmp(pattern, "[attr]", 6) == 0) { spec->flags = spec->flags | GIT_ATTR_FNMATCH_MACRO; @@ -368,8 +374,10 @@ int git_attr_fnmatch__parse( slash_count = 0; for (scan = pattern; *scan != '\0'; ++scan) { /* scan until (non-escaped) white space */ - if (git__isspace(*scan) && *(scan - 1) != '\\') - break; + if (git__isspace(*scan) && *(scan - 1) != '\\') { + if (!allow_space || (*scan != ' ' && *scan != '\t')) + break; + } if (*scan == '/') { spec->flags = spec->flags | GIT_ATTR_FNMATCH_FULLPATH; diff --git a/src/attr_file.h b/src/attr_file.h index 3718f4bda..7939f838a 100644 --- a/src/attr_file.h +++ b/src/attr_file.h @@ -22,6 +22,7 @@ #define GIT_ATTR_FNMATCH_MACRO (1U << 3) #define GIT_ATTR_FNMATCH_IGNORE (1U << 4) #define GIT_ATTR_FNMATCH_HASWILD (1U << 5) +#define GIT_ATTR_FNMATCH_ALLOWSPACE (1U << 6) typedef struct { char *pattern; @@ -88,6 +89,8 @@ extern int git_attr_file__new_and_load( extern void git_attr_file__free(git_attr_file *file); +extern void git_attr_file__clear_rules(git_attr_file *file); + extern int git_attr_file__parse_buffer( git_repository *repo, const char *buf, git_attr_file *file); diff --git a/src/diff.c b/src/diff.c index 0b2f8fb50..90baa9588 100644 --- a/src/diff.c +++ b/src/diff.c @@ -342,6 +342,7 @@ static git_diff_list *git_diff_list_alloc( git_attr_fnmatch *match = git__calloc(1, sizeof(git_attr_fnmatch)); if (!match) goto fail; + match->flags = GIT_ATTR_FNMATCH_ALLOWSPACE; ret = git_attr_fnmatch__parse(match, &diff->pool, NULL, &pattern); if (ret == GIT_ENOTFOUND) { git__free(match); |