Branch Coverage

deps/libgit2/src/libgit2/attr_file.c
Criterion Covered Total %
branch 151 384 39.3


line true false branch
25 2426 0 if (unlock)
39 0 2426 GIT_ERROR_CHECK_ALLOC(attrs);
41 0 2426 if (git_mutex_init(&attrs->lock) < 0) {
46 0 2426 if (git_pool_init(&attrs->pool, 1) < 0)
65 0 2426 if (need_lock && git_mutex_lock(&file->lock) < 0) {
0 0 if (need_lock && git_mutex_lock(&file->lock) < 0) {
70 44 2426 git_vector_foreach(&file->rules, i, rule)
74 0 2426 if (need_lock)
82 649 7895 if (!file)
84 2426 5469 GIT_REFCOUNT_DEC(file, attr_file_free);
2426 0 GIT_REFCOUNT_DEC(file, attr_file_free);
95 1272 0 if ((error = git_repository_index__weakptr(&idx, repo)) < 0 ||
1272 0 if ((error = git_repository_index__weakptr(&idx, repo)) < 0 ||
99 0 0 if (!(entry = git_index_get_byindex(idx, pos)))
137 0 1272 if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
0 0 if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
145 0 0 GIT_ERROR_CHECK_BLOBSIZE(blobsize);
155 15 2397 if (p_stat(entry->fullpath, &st) < 0 ||
15 0 if (p_stat(entry->fullpath, &st) < 0 ||
156 15 0 S_ISDIR(st.st_mode) ||
157 0 15 (fd = git_futils_open_ro(entry->fullpath)) < 0 ||
161 15 2397 if (fd >= 0)
168 0 0 if (source->type == GIT_ATTR_FILE_SOURCE_COMMIT) {
169 0 0 if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0 ||
0 0 if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0 ||
173 0 0 if ((error = git_repository_head_tree(&tree, repo)) < 0)
177 0 0 if ((error = git_tree_entry_bypath(&tree_entry, tree, entry->path)) < 0) {
183 0 0 if (error == GIT_ENOTFOUND) {
191 0 0 if ((error = git_blob_lookup(&blob, repo, git_tree_entry_id(tree_entry))) < 0)
200 0 0 GIT_ERROR_CHECK_BLOBSIZE(blobsize);
201 0 0 if ((error = git_str_put(&content,
212 0 2426 if ((error = git_attr_file__new(&file, entry, source)) < 0)
219 0 2426 if (bom == GIT_STR_BOM_UTF8)
225 117 2309 if (attr_session)
228 2412 14 if (parser && (error = parser(repo, file, content_str, allow_macros)) < 0) {
0 2412 if (parser && (error = parser(repo, file, content_str, allow_macros)) < 0) {
234 2397 29 if (nonexistent)
236 0 29 else if (source->type == GIT_ATTR_FILE_SOURCE_INDEX)
238 0 29 else if (source->type == GIT_ATTR_FILE_SOURCE_HEAD)
240 0 29 else if (source->type == GIT_ATTR_FILE_SOURCE_COMMIT)
242 15 14 else if (source->type == GIT_ATTR_FILE_SOURCE_FILE)
264 0 3043 if (!file)
270 465 2578 if (attr_session && attr_session->key == file->session_key)
361 104 if (attr_session && attr_session->key == file->session_key)
272 2325 357 else if (file->nonexistent)
287 0 0 if ((error = attr_file_oid_from_index(
298 0 0 if (error < 0)
312 0 0 if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0)
318 0 0 if (error < 0)
348 2059 0 if (attrs->entry && git_fs_path_root(attrs->entry->path) < 0 &&
352 0 2059 if (git_mutex_lock(&attrs->lock) < 0) {
357 2059 0 while (!error && *scan) {
0 2059 while (!error && *scan) {
359 0 0 if (!rule) {
361 0 0 GIT_ERROR_CHECK_ALLOC(rule);
368 0 0 if ((error = git_attr_fnmatch__parse(&rule->match, &attrs->pool, context, &scan)) < 0 ||
0 0 if ((error = git_attr_fnmatch__parse(&rule->match, &attrs->pool, context, &scan)) < 0 ||
371 0 0 if (error != GIT_ENOTFOUND)
377 0 0 if (rule->match.flags & GIT_ATTR_FNMATCH_MACRO) {
379 0 0 if (!allow_macros)
381 0 0 if ((error = git_attr_cache__insert_macro(repo, rule)) < 0)
383 0 0 } else if ((error = git_vector_insert(&attrs->rules, rule)) < 0)
401 0 4 GIT_ASSERT_ARG(name);
403 20 4 while ((c = (int)*name++) != 0)
423 0 0 git_attr_file__foreach_matching_rule(file, path, i, rule) {
0 0 git_attr_file__foreach_matching_rule(file, path, i, rule) {
426 0 0 if (!git_vector_bsearch(&pos, &rule->assigns, &name)) {
443 0 0 if ((error = git_futils_readbuffer(&content, path)) < 0)
451 0 0 if ((error = git_attr_file__new(&file, NULL, &source)) < 0 ||
0 0 if ((error = git_attr_file__new(&file, NULL, &source)) < 0 ||
452 0 0 (error = git_attr_file__parse_buffer(NULL, file, content.ptr, true)) < 0 ||
458 0 0 if (error < 0)
478 0 2330 if (match->containing_dir) {
479 0 0 if (match->flags & GIT_ATTR_FNMATCH_ICASE) {
480 0 0 if (git__strncasecmp(path->path, match->containing_dir, match->containing_dir_length))
483 0 0 if (git__prefixcmp(path->path, match->containing_dir))
490 0 2330 if (match->flags & GIT_ATTR_FNMATCH_ICASE)
493 0 2330 if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) {
500 0 2330 if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) {
0 0 if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) {
508 0 0 if (!(match->flags & GIT_ATTR_FNMATCH_IGNORE) ||
0 0 if (!(match->flags & GIT_ATTR_FNMATCH_IGNORE) ||
514 0 0 !strcasecmp(match->pattern, relpath) :
517 0 0 if (samename)
532 0 0 if (rule->match.flags & GIT_ATTR_FNMATCH_NEGATIVE)
546 0 0 if (git_vector_bsearch(&pos, &rule->assigns, &key))
563 0 1394 if (git_fs_path_join_unrooted(&info->full, path, base, &root) < 0)
569 1911 0 while (info->full.size > 0) {
570 1394 517 if (info->full.ptr[info->full.size - 1] != '/')
577 0 1394 while (*info->path == '/')
582 249 1145 if (info->basename)
584 249 1145 if (!info->basename || !*info->basename)
0 249 if (!info->basename || !*info->basename)
652 128 0 for (n = len; n; n--) {
653 128 0 if (p[n-1] != ' ' && p[n-1] != '\t')
128 0 if (p[n-1] != ' ' && p[n-1] != '\t')
664 0 0 while (i > 1 && p[i-2] == '\\')
0 0 while (i > 1 && p[i-2] == '\\')
666 0 0 if ((n - i) % 2)
677 0 128 if (!str)
680 637 128 for (scan = str; *scan; scan++) {
681 637 0 if (!escaped && *scan == '\\') {
0 637 if (!escaped && *scan == '\\') {
687 0 637 if (escaped && !git__isspace(*scan))
0 0 if (escaped && !git__isspace(*scan))
694 0 128 if (pos != scan)
715 0 156 GIT_ASSERT_ARG(spec);
716 156 0 GIT_ASSERT_ARG(base && *base);
0 156 GIT_ASSERT_ARG(base && *base);
718 0 156 if (parse_optimized_patterns(spec, pool, *base))
726 0 156 while (!allow_space && git__isspace(*pattern))
0 0 while (!allow_space && git__isspace(*pattern))
729 156 0 if (!*pattern || *pattern == '#' || *pattern == '\n' ||
128 28 if (!*pattern || *pattern == '#' || *pattern == '\n' ||
128 0 if (!*pattern || *pattern == '#' || *pattern == '\n' ||
0 128 if (!*pattern || *pattern == '#' || *pattern == '\n' ||
730 0 0 (*pattern == '\r' && *(pattern + 1) == '\n')) {
735 0 128 if (*pattern == '[' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWMACRO) != 0) {
0 0 if (*pattern == '[' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWMACRO) != 0) {
736 0 0 if (strncmp(pattern, "[attr]", 6) == 0) {
743 0 128 if (*pattern == '!' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWNEG) != 0) {
0 0 if (*pattern == '!' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWNEG) != 0) {
751 683 84 for (scan = pattern; *scan != '\0'; ++scan) {
754 0 683 if (c == '\\' && !escaped) {
0 0 if (c == '\\' && !escaped) {
757 44 639 } else if (git__isspace(c) && !escaped) {
44 0 } else if (git__isspace(c) && !escaped) {
758 44 0 if (!allow_space || (c != ' ' && c != '\t' && c != '\r'))
44 0 if (!allow_space || (c != ' ' && c != '\t' && c != '\r'))
44 0 if (!allow_space || (c != ' ' && c != '\t' && c != '\r'))
0 44 if (!allow_space || (c != ' ' && c != '\t' && c != '\r'))
760 11 628 } else if (c == '/') {
764 5 6 if (slash_count == 1 && pattern == scan)
0 5 if (slash_count == 1 && pattern == scan)
766 16 612 } else if (git__iswildcard(c) && !escaped) {
16 0 } else if (git__iswildcard(c) && !escaped) {
776 0 128 if ((spec->length = scan - pattern) == 0)
784 0 128 if (pattern[spec->length - 1] == '\r')
785 0 0 if (--spec->length == 0)
791 0 128 if (spec->length == 0)
794 2 126 if (pattern[spec->length - 1] == '/') {
797 2 0 if (--slash_count <= 0)
801 0 128 if (context) {
804 0 0 if (slash) {
814 0 128 if (!spec->pattern) {
830 0 156 if (!pattern[1] && (pattern[0] == '*' || pattern[0] == '.')) {
0 0 if (!pattern[1] && (pattern[0] == '*' || pattern[0] == '.')) {
0 0 if (!pattern[1] && (pattern[0] == '*' || pattern[0] == '.')) {
846 32 32 if (b->name_hash < a->name_hash)
848 32 0 else if (b->name_hash > a->name_hash)
869 0 0 GIT_REFCOUNT_DEC(*old, git_attr_assignment__free);
0 0 GIT_REFCOUNT_DEC(*old, git_attr_assignment__free);
884 16 0 GIT_ASSERT_ARG(assigns && !assigns->length);
0 16 GIT_ASSERT_ARG(assigns && !assigns->length);
888 64 16 while (*scan && *scan != '\n') {
64 0 while (*scan && *scan != '\n') {
892 48 64 while (git__isspace(*scan) && *scan != '\n') scan++;
48 0 while (git__isspace(*scan) && *scan != '\n') scan++;
895 64 0 if (!assign) {
897 0 64 GIT_ERROR_CHECK_ALLOC(assign);
905 64 0 if (*scan == '-') {
908 0 0 } else if (*scan == '!') {
911 0 0 } else if (*scan == '#') /* comment rest of line */
916 320 16 while (*scan && !git__isspace(*scan) && *scan != '=') {
272 48 while (*scan && !git__isspace(*scan) && *scan != '=') {
272 0 while (*scan && !git__isspace(*scan) && *scan != '=') {
921 0 64 if (scan == name_start) {
925 0 0 while (*scan && !git__isspace(*scan)) scan++;
0 0 while (*scan && !git__isspace(*scan)) scan++;
931 0 64 GIT_ERROR_CHECK_ALLOC(assign->name);
934 0 64 if (*scan == '=') {
935 0 0 for (value_start = ++scan; *scan && !git__isspace(*scan); ++scan);
0 0 for (value_start = ++scan; *scan && !git__isspace(*scan); ++scan);
938 0 0 if (scan > value_start) {
940 0 0 GIT_ERROR_CHECK_ALLOC(assign->value);
945 64 0 if (repo != NULL && assign->value == git_attr__true) {
0 64 if (repo != NULL && assign->value == git_attr__true) {
949 0 0 if (macro != NULL) {
953 0 0 git_vector_foreach(¯o->assigns, i, massign) {
958 0 0 if (error < 0 && error != GIT_EEXISTS) {
0 0 if (error < 0 && error != GIT_EEXISTS) {
968 0 64 if (error < 0 && error != GIT_EEXISTS)
0 0 if (error < 0 && error != GIT_EEXISTS)
975 0 16 if (assign != NULL)
980 0 16 return (assigns->length == 0) ? GIT_ENOTFOUND : 0;
988 2059 60 if (!rule)
991 16 44 if (!(rule->match.flags & GIT_ATTR_FNMATCH_IGNORE)) {
992 64 16 git_vector_foreach(&rule->assigns, i, assign)
993 64 0 GIT_REFCOUNT_DEC(assign, git_attr_assignment__free);
64 0 GIT_REFCOUNT_DEC(assign, git_attr_assignment__free);
1010 0 351 GIT_ASSERT_ARG(repo);
1020 0 351 if (!session)