diffcore-pathspec.con commit diff: --full-index (80b1e51)
   1/*
   2 * Copyright (C) 2005 Junio C Hamano
   3 */
   4#include "cache.h"
   5#include "diff.h"
   6#include "diffcore.h"
   7
   8struct path_spec {
   9        const char *spec;
  10        int len;
  11};
  12
  13static int matches_pathspec(const char *name, struct path_spec *s, int cnt)
  14{
  15        int i;
  16        int namelen;
  17
  18        if (cnt == 0)
  19                return 1;
  20
  21        namelen = strlen(name);
  22        for (i = 0; i < cnt; i++) {
  23                int len = s[i].len;
  24                if (namelen < len)
  25                        continue;
  26                if (memcmp(s[i].spec, name, len))
  27                        continue;
  28                if (s[i].spec[len-1] == '/' ||
  29                    name[len] == 0 ||
  30                    name[len] == '/')
  31                        return 1;
  32                if (!len)
  33                        return 1;
  34        }
  35        return 0;
  36}
  37
  38void diffcore_pathspec(const char **pathspec)
  39{
  40        struct diff_queue_struct *q = &diff_queued_diff;
  41        int i, speccnt;
  42        struct diff_queue_struct outq;
  43        struct path_spec *spec;
  44
  45        outq.queue = NULL;
  46        outq.nr = outq.alloc = 0;
  47
  48        for (i = 0; pathspec[i]; i++)
  49                ;
  50        speccnt = i;
  51        spec = xmalloc(sizeof(*spec) * speccnt);
  52        for (i = 0; pathspec[i]; i++) {
  53                spec[i].spec = pathspec[i];
  54                spec[i].len = strlen(pathspec[i]);
  55        }
  56
  57        for (i = 0; i < q->nr; i++) {
  58                struct diff_filepair *p = q->queue[i];
  59                if (matches_pathspec(p->two->path, spec, speccnt))
  60                        diff_q(&outq, p);
  61                else
  62                        diff_free_filepair(p);
  63        }
  64        free(q->queue);
  65        *q = outq;
  66        return;
  67}