|  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)  |