static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit) { int error; unsigned short i; git_array_t(git_commit_list_node *) pending = GIT_ARRAY_INIT; git_commit_list_node **tmp; assert(commit); do { commit->uninteresting = 1; if ((error = git_commit_list_parse(walk, commit)) < 0) return error; for (i = 0; i < commit->out_degree; ++i) if (!commit->parents[i]->uninteresting) { git_commit_list_node **node = git_array_alloc(pending); GITERR_CHECK_ALLOC(node); *node = commit->parents[i]; } tmp = git_array_pop(pending); commit = tmp ? *tmp : NULL; } while (commit != NULL); git_array_clear(pending); return 0; }
static int diff_driver_add_patterns( git_diff_driver *drv, const char *regex_str, int regex_flags) { int error = 0; const char *scan, *end; git_diff_driver_pattern *pat = NULL; git_buf buf = GIT_BUF_INIT; for (scan = regex_str; scan; scan = end) { /* get pattern to fill in */ if ((pat = git_array_alloc(drv->fn_patterns)) == NULL) { error = -1; break; } pat->flags = regex_flags; if (*scan == '!') { pat->flags |= REG_NEGATE; ++scan; } if ((end = strchr(scan, '\n')) != NULL) { error = git_buf_set(&buf, scan, end - scan); end++; } else { error = git_buf_sets(&buf, scan); } if (error < 0) break; if ((error = regcomp(&pat->re, buf.ptr, regex_flags)) < 0) { /* if regex fails to compile, warn? fail? */ error = giterr_set_regex(&pat->re, error); regfree(&pat->re); break; } } if (error && pat != NULL) (void)git_array_pop(drv->fn_patterns); /* release last item */ git_buf_free(&buf); return error; }