diff options
-rw-r--r-- | pkgrel.c | 36 |
1 files changed, 19 insertions, 17 deletions
@@ -9,10 +9,11 @@ enum match_result { - MATCH_RESULT_NEVER, - MATCH_RESULT_NEWDIFF, - MATCH_RESULT_NOTFOUND, - MATCH_RESULT_FOUND, + MATCH_RESULT_INIT, + MATCH_RESULT_ROOT, + MATCH_RESULT_COMMIT, + MATCH_RESULT_ANYTHING, + MATCH_RESULT_PKGVER, }; @@ -88,8 +89,8 @@ try_git(const int err, const char* msg) /// Callback for git_diff_foreach. Check each line reported by the diff looking for "pkgver" occurrance. If found, set -/// *payload* to MATCH_RESULT_FOUND, otherwise set it to MATCH_RESULT_NOTFOUND, but only if it is not set to FOUND -/// already. +/// *payload* to MATCH_RESULT_PKGVER, otherwise set it to MATCH_RESULT_ANYTHING, but only if it is not set to +/// MATCH_RESULT_PKGVER already. int match_line(const git_diff_delta* delta, const git_diff_hunk* hunk, const git_diff_line* line, void* payload) { @@ -100,12 +101,11 @@ match_line(const git_diff_delta* delta, const git_diff_hunk* hunk, const git_dif case GIT_DIFF_LINE_ADDITION: case GIT_DIFF_LINE_DELETION: if (PKGVER_LEN <= line->content_len && 0 == strncmp(line->content, PKGVER, PKGVER_LEN)) - *match = MATCH_RESULT_FOUND; + *match = MATCH_RESULT_PKGVER; + else if (MATCH_RESULT_PKGVER != *match) + *match = MATCH_RESULT_ANYTHING; break; default: - if (MATCH_RESULT_FOUND > *match) - *match = MATCH_RESULT_NOTFOUND; - break; } return 0; } @@ -133,10 +133,12 @@ main(int argc, char* argv[]) git_tree* earlier = NULL; git_tree* later = NULL; int relpkg = 1; - enum match_result match = MATCH_RESULT_NEVER; + enum match_result match = MATCH_RESULT_INIT; while (0 == git_revwalk_next(&oid, walker)) { git_commit* commit; try_git(git_commit_lookup(&commit, repo, &oid), "finding commit"); + if (0 == git_commit_parentcount(commit)) + match = MATCH_RESULT_ROOT; if (NULL != earlier) git_tree_free(earlier); earlier = later; @@ -146,17 +148,17 @@ main(int argc, char* argv[]) try_git(git_diff_tree_to_workdir_with_index(&diff, repo, later, &diffopts), "diff"); else try_git(git_diff_tree_to_tree(&diff, repo, later, earlier, &diffopts), "diff"); - if (MATCH_RESULT_NEVER < match) - match = MATCH_RESULT_NEWDIFF; - try_git(git_diff_foreach(diff, NULL, NULL, NULL, &match_line, &match), "searching lines"); + if (MATCH_RESULT_INIT != match) + match = MATCH_RESULT_COMMIT; + try_git(git_diff_foreach(diff, NULL, NULL, NULL, &match_line, &match), "searching history"); git_diff_free(diff); git_commit_free(commit); - if (MATCH_RESULT_FOUND == match) + if (MATCH_RESULT_PKGVER == match) break; - if (MATCH_RESULT_NOTFOUND == match) + if (MATCH_RESULT_ANYTHING == match) relpkg++; } - if (MATCH_RESULT_NEVER == match) { + if (MATCH_RESULT_INIT == match) { dprintf(2, "PKGBUILD not found\n"); exit(1); } |