Stefan Beller <sbeller@xxxxxxxxxx> writes: > +static int parse_objfind_opt(struct diff_options *opt, const char *arg) > +{ > + struct object_id oid; > + > + if (get_oid(arg, &oid)) > + return error("unable to resolve '%s'", arg); > + > + if (!opt->objfind) > + opt->objfind = xcalloc(1, sizeof(*opt->objfind)); > + > + opt->pickaxe = ""; /* trigger pickaxe */ Hmmm. This feels like an ugly hack to me. Do we declare that "git log -S''" never matches anything right now (if that is the case the I do not think there is any compatibility issues)? > diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c > index 9476bd2108..0d0c697ae7 100644 > --- a/diffcore-pickaxe.c > +++ b/diffcore-pickaxe.c > @@ -124,13 +124,21 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o, > mmfile_t mf1, mf2; > int ret; > > - if (!o->pickaxe[0]) > - return 0; > - > /* ignore unmerged */ > if (!DIFF_FILE_VALID(p->one) && !DIFF_FILE_VALID(p->two)) > return 0; > > + if (o->objfind) { > + if ((DIFF_FILE_VALID(p->one) && > + oidset_contains(o->objfind, &p->one->oid)) || > + (DIFF_FILE_VALID(p->two) && > + oidset_contains(o->objfind, &p->two->oid))) > + return 1; > + } > + > + if (!o->pickaxe[0]) > + return 0; > + Very nice. With just one place, the code covers both cases with and without pickaxe-all option in effect.