Line Flow Count Block(s) Source
1 - /*
2 - * Copyright (C) the libgit2 contributors. All rights reserved.
3 - *
4 - * This file is part of libgit2, distributed under the GNU GPL v2 with
5 - * a Linking Exception. For full terms see the included COPYING file.
6 - */
7 -
8 - #include "attr.h"
9 -
10 - #include "repository.h"
11 - #include "sysdir.h"
12 - #include "config.h"
13 - #include "attr_file.h"
14 - #include "ignore.h"
15 - #include "git2/oid.h"
16 - #include <ctype.h>
17 -
18 - const char *git_attr__true = "[internal]__TRUE__";
19 - const char *git_attr__false = "[internal]__FALSE__";
20 - const char *git_attr__unset = "[internal]__UNSET__";
21 -
22 166979 2 git_attr_value_t git_attr_value(const char *attr)
23 - {
24 166979 2,3 if (attr == NULL || attr == git_attr__unset)
25 115754 4 return GIT_ATTR_VALUE_UNSPECIFIED;
26 -
27 51225 5 if (attr == git_attr__true)
28 45823 6 return GIT_ATTR_VALUE_TRUE;
29 -
30 5402 7 if (attr == git_attr__false)
31 1090 8 return GIT_ATTR_VALUE_FALSE;
32 -
33 4312 9 return GIT_ATTR_VALUE_STRING;
34 - }
35 -
36 - static int collect_attr_files(
37 - git_repository *repo,
38 - git_attr_session *attr_session,
39 - uint32_t flags,
40 - const char *path,
41 - git_vector *files);
42 -
43 - static void release_attr_files(git_vector *files);
44 -
45 410 2 int git_attr_get(
46 - const char **value,
47 - git_repository *repo,
48 - uint32_t flags,
49 - const char *pathname,
50 - const char *name)
51 - {
52 - int error;
53 - git_attr_path path;
54 410 2 git_vector files = GIT_VECTOR_INIT;
55 - size_t i, j;
56 - git_attr_file *file;
57 - git_attr_name attr;
58 - git_attr_rule *rule;
59 410 2 git_dir_flag dir_flag = GIT_DIR_FLAG_UNKNOWN;
60 -
61 410 2-5 assert(value && repo && name);
62 -
63 410 6 *value = NULL;
64 -
65 410 6,7 if (git_repository_is_bare(repo))
66 1 8 dir_flag = GIT_DIR_FLAG_FALSE;
67 -
68 410 9-11 if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), dir_flag) < 0)
69 ##### 12 return -1;
70 -
71 410 13,14 if ((error = collect_attr_files(repo, NULL, flags, pathname, &files)) < 0)
72 ##### 15 goto cleanup;
73 -
74 410 16 memset(&attr, 0, sizeof(attr));
75 410 16 attr.name = name;
76 410 16 attr.name_hash = git_attr_file__name_hash(name);
77 -
78 1158 17,29-31 git_vector_foreach(&files, i, file) {
79 -
80 1736 18-20,26-28 git_attr_file__foreach_matching_rule(file, &path, j, rule) {
81 - size_t pos;
82 -
83 242 21,22 if (!git_vector_bsearch(&pos, &rule->assigns, &attr)) {
84 91 23,23,24 *value = ((git_attr_assignment *)git_vector_get(
85 91 23,24 &rule->assigns, pos))->value;
86 151 24,25 goto cleanup;
87 - }
88 - }
89 - }
90 -
91 - cleanup:
92 410 32 release_attr_files(&files);
93 410 33 git_attr_path__free(&path);
94 -
95 410 34 return error;
96 - }
97 -
98 -
99 - typedef struct {
100 - git_attr_name name;
101 - git_attr_assignment *found;
102 - } attr_get_many_info;
103 -
104 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files)int git_attr_get_many_with_session(
105 - const char **values,
106 - git_repository *repo,
107 - git_attr_session *attr_session,
108 - uint32_t flags,
109 - const char *pathname,
110 - size_t num_attr,
111 - const char **names)
112 - {
113 - int error;
114 - git_attr_path path;
115 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_vector files = GIT_VECTOR_INIT;
116 - size_t i, j, k;
117 - git_attr_file *file;
118 - git_attr_rule *rule;
119 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) attr_get_many_info *info = NULL;
120 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) size_t num_found = 0;
121 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_dir_flag dir_flag = GIT_DIR_FLAG_UNKNOWN;
122 -
123 - 2 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (!num_attr)
124 - 3 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) return 0;
125 -
126 - 4-7 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) assert(values && repo && names);
127 -
128 - 8,9 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (git_repository_is_bare(repo))
129 - 10 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) dir_flag = GIT_DIR_FLAG_FALSE;
130 -
131 - 11-13 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), dir_flag) < 0)
132 - 14 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) return -1;
133 -
134 - 15,16 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if ((error = collect_attr_files(repo, attr_session, flags, pathname, &files)) < 0)
135 - 17 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
136 -
137 - 18 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) info = git__calloc(num_attr, sizeof(attr_get_many_info));
138 - 19,20 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) GIT_ERROR_CHECK_ALLOC(info);
139 -
140 - 21,42-44 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_vector_foreach(&files, i, file) {
141 -
142 - 22-24,39-41 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_attr_file__foreach_matching_rule(file, &path, j, rule) {
143 -
144 - 25,37,38 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) for (k = 0; k < num_attr; k++) {
145 - size_t pos;
146 -
147 - 26 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (info[k].found != NULL) /* already found assignment */
148 - 27 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) continue;
149 -
150 - 28 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (!info[k].name.name) {
151 - 29 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) info[k].name.name = names[k];
152 - 29,30 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) info[k].name.name_hash = git_attr_file__name_hash(names[k]);
153 - }
154 -
155 - 31,32 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (!git_vector_bsearch(&pos, &rule->assigns, &info[k].name)) {
156 - 33,34 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) info[k].found = (git_attr_assignment *)
157 - 33 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_vector_get(&rule->assigns, pos);
158 - 34 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) values[k] = info[k].found->value;
159 -
160 - 34 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (++num_found == num_attr)
161 - 35,36 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
162 - }
163 - }
164 - }
165 - }
166 -
167 - 45,48,49 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) for (k = 0; k < num_attr; k++) {
168 - 46 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) if (!info[k].found)
169 - 47 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) values[k] = NULL;
170 - }
171 -
172 - cleanup:
173 - 50 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) release_attr_files(&files);
174 - 51 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git_attr_path__free(&path);
175 - 52 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) git__free(info);
176 -
177 - 53 suppressed: function cannot be solved git_attr_get_many_with_session (automatic due to inconsistent arc counts in .gcda files) return error;
178 - }
179 -
180 11 2 int git_attr_get_many(
181 - const char **values,
182 - git_repository *repo,
183 - uint32_t flags,
184 - const char *pathname,
185 - size_t num_attr,
186 - const char **names)
187 - {
188 11 2 return git_attr_get_many_with_session(
189 - values, repo, NULL, flags, pathname, num_attr, names);
190 - }
191 -
192 4 2 int git_attr_foreach(
193 - git_repository *repo,
194 - uint32_t flags,
195 - const char *pathname,
196 - int (*callback)(const char *name, const char *value, void *payload),
197 - void *payload)
198 - {
199 - int error;
200 - git_attr_path path;
201 4 2 git_vector files = GIT_VECTOR_INIT;
202 - size_t i, j, k;
203 - git_attr_file *file;
204 - git_attr_rule *rule;
205 - git_attr_assignment *assign;
206 4 2 git_strmap *seen = NULL;
207 4 2 git_dir_flag dir_flag = GIT_DIR_FLAG_UNKNOWN;
208 -
209 4 2-4 assert(repo && callback);
210 -
211 4 5,6 if (git_repository_is_bare(repo))
212 ##### 7 dir_flag = GIT_DIR_FLAG_FALSE;
213 -
214 4 8-10 if (git_attr_path__init(&path, pathname, git_repository_workdir(repo), dir_flag) < 0)
215 ##### 11 return -1;
216 -
217 4 12-15 if ((error = collect_attr_files(repo, NULL, flags, pathname, &files)) < 0 ||
218 - (error = git_strmap_new(&seen)) < 0)
219 - goto cleanup;
220 -
221 13 16,36-38 git_vector_foreach(&files, i, file) {
222 -
223 85 17-19,33-35 git_attr_file__foreach_matching_rule(file, &path, j, rule) {
224 -
225 26 20,30-32 git_vector_foreach(&rule->assigns, k, assign) {
226 - /* skip if higher priority assignment was already seen */
227 15 21,22 if (git_strmap_exists(seen, assign->name))
228 ##### 23 continue;
229 -
230 15 24,25 if ((error = git_strmap_set(seen, assign->name, assign)) < 0)
231 ##### 26 goto cleanup;
232 -
233 15 27 error = callback(assign->name, assign->value, payload);
234 15 28 if (error) {
235 1 29 git_error_set_after_callback(error);
236 1 39 goto cleanup;
237 - }
238 - }
239 - }
240 - }
241 -
242 - cleanup:
243 4 40 git_strmap_free(seen);
244 4 41 release_attr_files(&files);
245 4 42 git_attr_path__free(&path);
246 -
247 4 43 return error;
248 - }
249 -
250 - 2 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files)static int preload_attr_file(
251 - git_repository *repo,
252 - git_attr_session *attr_session,
253 - git_attr_file_source source,
254 - const char *base,
255 - const char *file,
256 - bool allow_macros)
257 - {
258 - int error;
259 - 2 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) git_attr_file *preload = NULL;
260 -
261 - 2 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) if (!file)
262 - 3 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) return 0;
263 - 4,5 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) if (!(error = git_attr_cache__get(&preload, repo, attr_session, source, base, file,
264 - git_attr_file__parse_buffer, allow_macros)))
265 - 6 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) git_attr_file__free(preload);
266 -
267 - 7 suppressed: function cannot be solved preload_attr_file (automatic due to inconsistent arc counts in .gcda files) return error;
268 - }
269 -
270 107560 2 static int system_attr_file(
271 - git_buf *out,
272 - git_attr_session *attr_session)
273 - {
274 - int error;
275 -
276 107560 2 if (!attr_session) {
277 94766 3 error = git_sysdir_find_system_file(out, GIT_ATTR_FILE_SYSTEM);
278 -
279 94835 4 if (error == GIT_ENOTFOUND)
280 94778 5 git_error_clear();
281 -
282 94826 6 return error;
283 - }
284 -
285 12794 7 if (!attr_session->init_sysdir) {
286 910 8 error = git_sysdir_find_system_file(&attr_session->sysdir, GIT_ATTR_FILE_SYSTEM);
287 -
288 910 9 if (error == GIT_ENOTFOUND)
289 909 10 git_error_clear();
290 1 11 else if (error)
291 ##### 12 return error;
292 -
293 910 13 attr_session->init_sysdir = 1;
294 - }
295 -
296 12794 14 if (attr_session->sysdir.size == 0)
297 12792 15 return GIT_ENOTFOUND;
298 -
299 - /* We can safely provide a git_buf with no allocation (asize == 0) to
300 - * a consumer. This allows them to treat this as a regular `git_buf`,
301 - * but their call to `git_buf_dispose` will not attempt to free it.
302 - */
303 2 16,16 git_buf_attach_notowned(
304 2 16 out, attr_session->sysdir.ptr, attr_session->sysdir.size);
305 2 17 return 0;
306 - }
307 -
308 - 2 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files)static int attr_setup(
309 - git_repository *repo,
310 - git_attr_session *attr_session,
311 - uint32_t flags)
312 - {
313 - 2 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) git_buf path = GIT_BUF_INIT;
314 - 2 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) git_index *idx = NULL;
315 - const char *workdir;
316 - 2 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) int error = 0;
317 -
318 - 2,3 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if (attr_session && attr_session->init_setup)
319 - 4 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) return 0;
320 -
321 - 5,6 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((error = git_attr_cache__init(repo)) < 0)
322 - 7 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) return error;
323 -
324 - /*
325 - * Preload attribute files that could contain macros so the
326 - * definitions will be available for later file parsing.
327 - */
328 -
329 - 8-11 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((error = system_attr_file(&path, attr_session)) < 0 ||
330 - (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
331 - 10 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) NULL, path.ptr, true)) < 0) {
332 - 12 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if (error != GIT_ENOTFOUND)
333 - 13 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) goto out;
334 - }
335 -
336 - 15,16 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
337 - 14 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) NULL, git_repository_attr_cache(repo)->cfg_attr_file, true)) < 0)
338 - 17 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) goto out;
339 -
340 - 18 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) git_buf_clear(&path); /* git_repository_item_path expects an empty buffer, because it uses git_buf_set */
341 - 19-22 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((error = git_repository_item_path(&path, repo, GIT_REPOSITORY_ITEM_INFO)) < 0 ||
342 - (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
343 - 21 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) path.ptr, GIT_ATTR_FILE_INREPO, true)) < 0) {
344 - 23 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if (error != GIT_ENOTFOUND)
345 - 24 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) goto out;
346 - }
347 -
348 - 25-28 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((workdir = git_repository_workdir(repo)) != NULL &&
349 - (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
350 - workdir, GIT_ATTR_FILE, true)) < 0)
351 - 29 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) goto out;
352 -
353 - 30-33 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((error = git_repository_index__weakptr(&idx, repo)) < 0 ||
354 - (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_INDEX,
355 - NULL, GIT_ATTR_FILE, true)) < 0)
356 - goto out;
357 -
358 - 34-36 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if ((flags & GIT_ATTR_CHECK_INCLUDE_HEAD) != 0 &&
359 - (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_HEAD,
360 - NULL, GIT_ATTR_FILE, true)) < 0)
361 - 37 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) goto out;
362 -
363 - 38 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) if (attr_session)
364 - 39 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) attr_session->init_setup = 1;
365 -
366 - out:
367 - 40 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) git_buf_dispose(&path);
368 -
369 - 41 suppressed: function cannot be solved attr_setup (automatic due to inconsistent arc counts in .gcda files) return error;
370 - }
371 -
372 1286 2 int git_attr_add_macro(
373 - git_repository *repo,
374 - const char *name,
375 - const char *values)
376 - {
377 - int error;
378 1286 2 git_attr_rule *macro = NULL;
379 - git_pool *pool;
380 -
381 1286 2,3 if ((error = git_attr_cache__init(repo)) < 0)
382 ##### 4 return error;
383 -
384 1286 5 macro = git__calloc(1, sizeof(git_attr_rule));
385 1286 6,7 GIT_ERROR_CHECK_ALLOC(macro);
386 -
387 1286 8 pool = &git_repository_attr_cache(repo)->pool;
388 -
389 1286 9 macro->match.pattern = git_pool_strdup(pool, name);
390 1286 10,11 GIT_ERROR_CHECK_ALLOC(macro->match.pattern);
391 -
392 1286 12 macro->match.length = strlen(macro->match.pattern);
393 1286 12 macro->match.flags = GIT_ATTR_FNMATCH_MACRO;
394 -
395 1286 12 error = git_attr_assignment__parse(repo, pool, &macro->assigns, &values);
396 -
397 1286 13 if (!error)
398 1286 14 error = git_attr_cache__insert_macro(repo, macro);
399 -
400 1286 15 if (error < 0)
401 ##### 16 git_attr_rule__free(macro);
402 -
403 1286 17 return error;
404 - }
405 -
406 - typedef struct {
407 - git_repository *repo;
408 - git_attr_session *attr_session;
409 - uint32_t flags;
410 - const char *workdir;
411 - git_index *index;
412 - git_vector *files;
413 - } attr_walk_up_info;
414 -
415 - 2 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files)static int attr_decide_sources(
416 - uint32_t flags, bool has_wd, bool has_index, git_attr_file_source *srcs)
417 - {
418 - 2 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) int count = 0;
419 -
420 - 2 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) switch (flags & 0x03) {
421 - case GIT_ATTR_CHECK_FILE_THEN_INDEX:
422 - 3 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if (has_wd)
423 - 4 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_FILE;
424 - 5 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if (has_index)
425 - 6 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_INDEX;
426 - 7 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) break;
427 - case GIT_ATTR_CHECK_INDEX_THEN_FILE:
428 - 8 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if (has_index)
429 - 9 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_INDEX;
430 - 10 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if (has_wd)
431 - 11 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_FILE;
432 - 12 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) break;
433 - case GIT_ATTR_CHECK_INDEX_ONLY:
434 - 13 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if (has_index)
435 - 14 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_INDEX;
436 - 15 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) break;
437 - }
438 -
439 - 16 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) if ((flags & GIT_ATTR_CHECK_INCLUDE_HEAD) != 0)
440 - 17 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) srcs[count++] = GIT_ATTR_FILE__FROM_HEAD;
441 -
442 - 18 suppressed: function cannot be solved attr_decide_sources (automatic due to inconsistent arc counts in .gcda files) return count;
443 - }
444 -
445 184259 2 static int push_attr_file(
446 - git_repository *repo,
447 - git_attr_session *attr_session,
448 - git_vector *list,
449 - git_attr_file_source source,
450 - const char *base,
451 - const char *filename,
452 - bool allow_macros)
453 - {
454 184259 2 int error = 0;
455 184259 2 git_attr_file *file = NULL;
456 -
457 184259 2 error = git_attr_cache__get(&file, repo, attr_session,
458 - source, base, filename, git_attr_file__parse_buffer, allow_macros);
459 -
460 184233 3 if (error < 0)
461 3 4 return error;
462 -
463 184230 5 if (file != NULL) {
464 121933 6,7 if ((error = git_vector_insert(list, file)) < 0)
465 ##### 8 git_attr_file__free(file);
466 - }
467 -
468 184220 9 return error;
469 - }
470 -
471 62604 2 static int push_one_attr(void *ref, const char *path)
472 - {
473 62604 2 attr_walk_up_info *info = (attr_walk_up_info *)ref;
474 - git_attr_file_source src[GIT_ATTR_FILE_NUM_SOURCES];
475 62604 2 int error = 0, n_src, i;
476 - bool allow_macros;
477 -
478 62604 2,2 n_src = attr_decide_sources(
479 62604 2,2 info->flags, info->workdir != NULL, info->index != NULL, src);
480 62604 3-6 allow_macros = info->workdir ? !strcmp(info->workdir, path) : false;
481 -
482 187569 7,9-11 for (i = 0; !error && i < n_src; ++i)
483 125010 8 error = push_attr_file(info->repo, info->attr_session, info->files,
484 - src[i], path, GIT_ATTR_FILE, allow_macros);
485 -
486 62559 12 return error;
487 - }
488 -
489 59360 2 static void release_attr_files(git_vector *files)
490 - {
491 - size_t i;
492 - git_attr_file *file;
493 -
494 181361 2,4-6 git_vector_foreach(files, i, file) {
495 121996 3 git_attr_file__free(file);
496 122001 4 files->contents[i] = NULL;
497 - }
498 59365 7 git_vector_free(files);
499 59365 8 }
500 -
501 - 2 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files)static int collect_attr_files(
502 - git_repository *repo,
503 - git_attr_session *attr_session,
504 - uint32_t flags,
505 - const char *path,
506 - git_vector *files)
507 - {
508 - 2 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) int error = 0;
509 - 2 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) git_buf dir = GIT_BUF_INIT, attrfile = GIT_BUF_INIT;
510 - 2 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) const char *workdir = git_repository_workdir(repo);
511 - 3 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) attr_walk_up_info info = { NULL };
512 -
513 - 3,4 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if ((error = attr_setup(repo, attr_session, flags)) < 0)
514 - 5 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) return error;
515 -
516 - /* Resolve path in a non-bare repo */
517 - 6 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (workdir != NULL)
518 - 7 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = git_path_find_dir(&dir, path, workdir);
519 - else
520 - 8 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = git_path_dirname_r(&dir, path);
521 - 9 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (error < 0)
522 - 10 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
523 -
524 - /* in precendence order highest to lowest:
525 - * - $GIT_DIR/info/attributes
526 - * - path components with .gitattributes
527 - * - config core.attributesfile
528 - * - $GIT_PREFIX/etc/gitattributes
529 - */
530 -
531 - 11-14 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if ((error = git_repository_item_path(&attrfile, repo, GIT_REPOSITORY_ITEM_INFO)) < 0 ||
532 - (error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
533 - 13 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) attrfile.ptr, GIT_ATTR_FILE_INREPO, true)) < 0) {
534 - 15 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (error != GIT_ENOTFOUND)
535 - 16 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
536 - }
537 -
538 - 17 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) info.repo = repo;
539 - 17 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) info.attr_session = attr_session;
540 - 17 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) info.flags = flags;
541 - 17 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) info.workdir = workdir;
542 - 17,18 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (git_repository_index__weakptr(&info.index, repo) < 0)
543 - 19 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) git_error_clear(); /* no error even if there is no index */
544 - 20 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) info.files = files;
545 -
546 - 20 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (!strcmp(dir.ptr, "."))
547 - 21 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = push_one_attr(&info, "");
548 - else
549 - 22 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = git_path_walk_up(&dir, workdir, push_one_attr, &info);
550 -
551 - 23 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (error < 0)
552 - 24 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
553 -
554 - 25,26 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (git_repository_attr_cache(repo)->cfg_attr_file != NULL) {
555 - 28 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
556 - 27 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) NULL, git_repository_attr_cache(repo)->cfg_attr_file, true);
557 - 29 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (error < 0)
558 - 30 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) goto cleanup;
559 - }
560 -
561 - 31 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if ((flags & GIT_ATTR_CHECK_NO_SYSTEM) == 0) {
562 - 32 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = system_attr_file(&dir, attr_session);
563 -
564 - 33 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (!error)
565 - 34 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
566 - 34 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) NULL, dir.ptr, true);
567 - 35 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) else if (error == GIT_ENOTFOUND)
568 - 36 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) error = 0;
569 - }
570 -
571 - cleanup:
572 - 37 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) if (error < 0)
573 - 38 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) release_attr_files(files);
574 - 39 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) git_buf_dispose(&attrfile);
575 - 40 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) git_buf_dispose(&dir);
576 -
577 - 41 suppressed: function cannot be solved collect_attr_files (automatic due to inconsistent arc counts in .gcda files) return error;
578 - }