X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=diff-helper.c;h=3c39c96d7e854f784e2c2dd06182fd0ec6e586a6;hb=d6db01075b65da2b8584a0450619390893aae103;hp=ea9aefab2887f43e6b3c34e5c9d2034996b8e6f2;hpb=e99d59ff0bff349ef205cef1076e0354c8130680;p=git.git diff --git a/diff-helper.c b/diff-helper.c index ea9aefab..3c39c96d 100644 --- a/diff-helper.c +++ b/diff-helper.c @@ -8,6 +8,8 @@ static int detect_rename = 0; static int diff_score_opt = 0; +static int generate_patch = 1; +static const char *pickaxe = NULL; static int parse_oneside_change(const char *cp, int *mode, unsigned char *sha1, char *path) @@ -20,7 +22,8 @@ static int parse_oneside_change(const char *cp, int *mode, cp++; } *mode = m; - if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6)) + if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6) && + strncmp(cp, "\ttree\t", 6) && strncmp(cp, " tree ", 6)) return -1; cp += 6; if (get_sha1_hex(cp, sha1)) @@ -44,11 +47,13 @@ static int parse_diff_raw_output(const char *buf) diff_unmerge(cp + 1); break; case '+': - parse_oneside_change(cp, &new_mode, new_sha1, path); + if (parse_oneside_change(cp, &new_mode, new_sha1, path)) + return -1; diff_addremove('+', new_mode, new_sha1, path, NULL); break; case '-': - parse_oneside_change(cp, &old_mode, old_sha1, path); + if (parse_oneside_change(cp, &old_mode, old_sha1, path)) + return -1; diff_addremove('-', old_mode, old_sha1, path, NULL); break; case '*': @@ -64,7 +69,8 @@ static int parse_diff_raw_output(const char *buf) new_mode = (new_mode << 3) | (ch - '0'); cp++; } - if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6)) + if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6) && + strncmp(cp, "\ttree\t", 6) && strncmp(cp, " tree ", 6)) return -1; cp += 6; if (get_sha1_hex(cp, old_sha1)) @@ -88,7 +94,7 @@ static int parse_diff_raw_output(const char *buf) } static const char *diff_helper_usage = - "git-diff-helper [-z] [-R] [-M] paths..."; + "git-diff-helper [-z] [-R] [-M] [-C] [-S] paths..."; int main(int ac, const char **av) { struct strbuf sb; @@ -102,17 +108,28 @@ int main(int ac, const char **av) { reverse = 1; else if (av[1][1] == 'z') line_termination = 0; + else if (av[1][1] == 'p') /* hidden from the help */ + generate_patch = 0; else if (av[1][1] == 'M') { detect_rename = 1; diff_score_opt = diff_scoreopt_parse(av[1]); } + else if (av[1][1] == 'C') { + detect_rename = 2; + diff_score_opt = diff_scoreopt_parse(av[1]); + } + else if (av[1][1] == 'S') { + pickaxe = av[1] + 2; + } else usage(diff_helper_usage); ac--; av++; } /* the remaining parameters are paths patterns */ - diff_setup(detect_rename, diff_score_opt, reverse, -1, av+1, ac-1); + diff_setup(detect_rename, diff_score_opt, pickaxe, + reverse, (generate_patch ? -1 : line_termination), + av+1, ac-1); while (1) { int status;