Skip to content

Commit

Permalink
pickaxe: factor out pickaxe
Browse files Browse the repository at this point in the history
Move the duplicate diff queue loop into its own function that accepts
a match function: has_changes() for -S and diff_grep() for -G.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and gitster committed Oct 7, 2011
1 parent db99cb7 commit 8a94151
Showing 1 changed file with 43 additions and 67 deletions.
110 changes: 43 additions & 67 deletions diffcore-pickaxe.c
Expand Up @@ -8,6 +8,46 @@
#include "xdiff-interface.h"
#include "kwset.h"

typedef int (*pickaxe_fn)(struct diff_filepair *p, struct diff_options *o, regex_t *regexp, kwset_t kws);

static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
regex_t *regexp, kwset_t kws, pickaxe_fn fn)
{
int i;
struct diff_queue_struct outq;

DIFF_QUEUE_CLEAR(&outq);

if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
/* Showing the whole changeset if needle exists */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (fn(p, o, regexp, kws))
return; /* do not munge the queue */
}

/*
* Otherwise we will clear the whole queue by copying
* the empty outq at the end of this function, but
* first clear the current entries in the queue.
*/
for (i = 0; i < q->nr; i++)
diff_free_filepair(q->queue[i]);
} else {
/* Showing only the filepairs that has the needle */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (fn(p, o, regexp, kws))
diff_q(&outq, p);
else
diff_free_filepair(p);
}
}

free(q->queue);
*q = outq;
}

struct diffgrep_cb {
regex_t *regexp;
int hit;
Expand Down Expand Up @@ -96,12 +136,8 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,

static void diffcore_pickaxe_grep(struct diff_options *o)
{
struct diff_queue_struct *q = &diff_queued_diff;
int i, err;
int err;
regex_t regex;
struct diff_queue_struct outq;
outq.queue = NULL;
outq.nr = outq.alloc = 0;

err = regcomp(&regex, o->pickaxe, REG_EXTENDED | REG_NEWLINE);
if (err) {
Expand All @@ -111,36 +147,8 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
die("invalid log-grep regex: %s", errbuf);
}

if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
/* Showing the whole changeset if needle exists */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (diff_grep(p, o, &regex, NULL))
goto out; /* do not munge the queue */
}
pickaxe(&diff_queued_diff, o, &regex, NULL, diff_grep);

/*
* Otherwise we will clear the whole queue by copying
* the empty outq at the end of this function, but
* first clear the current entries in the queue.
*/
for (i = 0; i < q->nr; i++)
diff_free_filepair(q->queue[i]);
} else {
/* Showing only the filepairs that has the needle */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (diff_grep(p, o, &regex, NULL))
diff_q(&outq, p);
else
diff_free_filepair(p);
}
}

free(q->queue);
*q = outq;

out:
regfree(&regex);
return;
}
Expand Down Expand Up @@ -213,13 +221,9 @@ static void diffcore_pickaxe_count(struct diff_options *o)
{
const char *needle = o->pickaxe;
int opts = o->pickaxe_opts;
struct diff_queue_struct *q = &diff_queued_diff;
unsigned long len = strlen(needle);
int i;
regex_t regex, *regexp = NULL;
kwset_t kws = NULL;
struct diff_queue_struct outq;
DIFF_QUEUE_CLEAR(&outq);

if (opts & DIFF_PICKAXE_REGEX) {
int err;
Expand All @@ -238,36 +242,8 @@ static void diffcore_pickaxe_count(struct diff_options *o)
kwsprep(kws);
}

if (opts & DIFF_PICKAXE_ALL) {
/* Showing the whole changeset if needle exists */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (has_changes(p, o, regexp, kws))
goto out; /* do not munge the queue */
}

/* otherwise we will clear the whole queue
* by copying the empty outq at the end of this
* function, but first clear the current entries
* in the queue.
*/
for (i = 0; i < q->nr; i++)
diff_free_filepair(q->queue[i]);
}
else
/* Showing only the filepairs that has the needle */
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
if (has_changes(p, o, regexp, kws))
diff_q(&outq, p);
else
diff_free_filepair(p);
}

free(q->queue);
*q = outq;
pickaxe(&diff_queued_diff, o, regexp, kws, has_changes);

out:
if (opts & DIFF_PICKAXE_REGEX)
regfree(&regex);
else
Expand Down

0 comments on commit 8a94151

Please sign in to comment.