Staging
v0.5.1
Revision 1ed91937e5cd59fdbdfa5f15f6fac132d2b21ce0 authored by Junio C Hamano on 15 December 2005, 01:30:03 UTC, committed by Junio C Hamano on 15 December 2005, 01:30:03 UTC
Oh, I hate to do this but I ended up merging big usage string
cleanups from Fredrik, git-am enhancements that made a lot of
sense for non mbox users from HPA, and rebase changes (done
independently by me and Lukas) among other things, so git is
still in perpetual state of 1.0rc.  1.0 will probably be next
Wednesday, but who knows.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2 parent s a957207 + 294c695
Raw File
diffcore-pathspec.c
/*
 * Copyright (C) 2005 Junio C Hamano
 */
#include "cache.h"
#include "diff.h"
#include "diffcore.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 (namelen < len)
			continue;
		if (memcmp(s[i].spec, name, len))
			continue;
		if (s[i].spec[len-1] == '/' ||
		    name[len] == 0 ||
		    name[len] == '/')
			return 1;
		if (!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->two->path, spec, speccnt))
			diff_q(&outq, p);
		else
			diff_free_filepair(p);
	}
	free(q->queue);
	*q = outq;
	return;
}
back to top