git-tar-tree: no more void pointer arithmetic
[git.git] / builtin-add.c
index 089c7a8..bfbbb1b 100644 (file)
@@ -8,90 +8,11 @@
 #include "cache.h"
 #include "builtin.h"
 #include "dir.h"
+#include "cache-tree.h"
 
 static const char builtin_add_usage[] =
 "git-add [-n] [-v] <filepattern>...";
 
-static int common_prefix(const char **pathspec)
-{
-       const char *path, *slash, *next;
-       int prefix;
-
-       if (!pathspec)
-               return 0;
-
-       path = *pathspec;
-       slash = strrchr(path, '/');
-       if (!slash)
-               return 0;
-
-       prefix = slash - path + 1;
-       while ((next = *++pathspec) != NULL) {
-               int len = strlen(next);
-               if (len >= prefix && !memcmp(path, next, len))
-                       continue;
-               for (;;) {
-                       if (!len)
-                               return 0;
-                       if (next[--len] != '/')
-                               continue;
-                       if (memcmp(path, next, len+1))
-                               continue;
-                       prefix = len + 1;
-                       break;
-               }
-       }
-       return prefix;
-}
-
-static int match_one(const char *match, const char *name, int namelen)
-{
-       int matchlen;
-
-       /* If the match was just the prefix, we matched */
-       matchlen = strlen(match);
-       if (!matchlen)
-               return 1;
-
-       /*
-        * If we don't match the matchstring exactly,
-        * we need to match by fnmatch
-        */
-       if (strncmp(match, name, matchlen))
-               return !fnmatch(match, name, 0);
-
-       /*
-        * If we did match the string exactly, we still
-        * need to make sure that it happened on a path
-        * component boundary (ie either the last character
-        * of the match was '/', or the next character of
-        * the name was '/' or the terminating NUL.
-        */
-       return  match[matchlen-1] == '/' ||
-               name[matchlen] == '/' ||
-               !name[matchlen];
-}
-
-static int match(const char **pathspec, const char *name, int namelen, int prefix, char *seen)
-{
-       int retval;
-       const char *match;
-
-       name += prefix;
-       namelen -= prefix;
-
-       for (retval = 0; (match = *pathspec++) != NULL; seen++) {
-               if (retval & *seen)
-                       continue;
-               match += prefix;
-               if (match_one(match, name, namelen)) {
-                       retval = 1;
-                       *seen = 1;
-               }
-       }
-       return retval;
-}
-
 static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
 {
        char *seen;
@@ -107,7 +28,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
        i = dir->nr;
        while (--i >= 0) {
                struct dir_entry *entry = *src++;
-               if (!match(pathspec, entry->name, entry->len, prefix, seen)) {
+               if (!match_pathspec(pathspec, entry->name, entry->len, prefix, seen)) {
                        free(entry);
                        continue;
                }
@@ -123,7 +44,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 
                /* Existing file? We must have ignored it */
                match = pathspec[i];
-               if (!lstat(match, &st))
+               if (!match[0] || !lstat(match, &st))
                        continue;
                die("pathspec '%s' did not match any files", match);
        }
@@ -197,10 +118,11 @@ static int add_file_to_index(const char *path, int verbose)
                die("unable to add %s to index",path);
        if (verbose)
                printf("add '%s'\n", path);
+       cache_tree_invalidate_path(active_cache_tree, path);
        return 0;
 }
 
-static struct cache_file cache_file;
+static struct lock_file lock_file;
 
 int cmd_add(int argc, const char **argv, char **envp)
 {
@@ -212,9 +134,9 @@ int cmd_add(int argc, const char **argv, char **envp)
 
        git_config(git_default_config);
 
-       newfd = hold_index_file_for_update(&cache_file, get_index_file());
+       newfd = hold_lock_file_for_update(&lock_file, get_index_file());
        if (newfd < 0)
-               die("unable to create new cachefile");
+               die("unable to create new index file");
 
        if (read_cache() < 0)
                die("index file corrupt");
@@ -259,7 +181,7 @@ int cmd_add(int argc, const char **argv, char **envp)
 
        if (active_cache_changed) {
                if (write_cache(newfd, active_cache, active_nr) ||
-                   commit_index_file(&cache_file))
+                   commit_lock_file(&lock_file))
                        die("Unable to write new index file");
        }