f4d89f26ce
Oh, I am an idiot. Repeating the same check against the first element of pathspec array as many times as the pathspec array has elements in it would not do us any good. This patch allows you to specify more than one pathspec to diff-tree family and have them actually used. Signed-off-by: Junio C Hamano <junkio@cox.net> ;) Signed-off-by: Linus Torvalds <torvalds@osdl.org>
64 lines
1.2 KiB
C
64 lines
1.2 KiB
C
/*
|
|
* Copyright (C) 2005 Junio C Hamano
|
|
*/
|
|
#include "cache.h"
|
|
#include "diff.h"
|
|
#include "diffcore.h"
|
|
#include "delta.h"
|
|
|
|
struct path_spec {
|
|
const char *spec;
|
|
int len;
|
|
};
|
|
|
|
static int matches_pathspec(const char *name, struct path_spec *s, int cnt)
|
|
{
|
|
int i;
|
|
int namelen;
|
|
|
|
if (cnt == 0)
|
|
return 1;
|
|
|
|
namelen = strlen(name);
|
|
for (i = 0; i < cnt; i++) {
|
|
int len = s[i].len;
|
|
if (! strncmp(s[i].spec, name, len) &&
|
|
len <= namelen &&
|
|
(name[len] == 0 || name[len] == '/'))
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void diffcore_pathspec(const char **pathspec)
|
|
{
|
|
struct diff_queue_struct *q = &diff_queued_diff;
|
|
int i, speccnt;
|
|
struct diff_queue_struct outq;
|
|
struct path_spec *spec;
|
|
|
|
outq.queue = NULL;
|
|
outq.nr = outq.alloc = 0;
|
|
|
|
for (i = 0; pathspec[i]; i++)
|
|
;
|
|
speccnt = i;
|
|
spec = xmalloc(sizeof(*spec) * speccnt);
|
|
for (i = 0; pathspec[i]; i++) {
|
|
spec[i].spec = pathspec[i];
|
|
spec[i].len = strlen(pathspec[i]);
|
|
}
|
|
|
|
for (i = 0; i < q->nr; i++) {
|
|
struct diff_filepair *p = q->queue[i];
|
|
if (matches_pathspec(p->one->path, spec, speccnt) ||
|
|
matches_pathspec(p->two->path, spec, speccnt))
|
|
diff_q(&outq, p);
|
|
else
|
|
free(p);
|
|
}
|
|
free(q->queue);
|
|
*q = outq;
|
|
return;
|
|
}
|