Merge branch 'cb/partial-commit-relative-pathspec'
authorJunio C Hamano <gitster@pobox.com>
Thu, 11 Aug 2011 18:04:28 +0000 (11:04 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Aug 2011 18:04:28 +0000 (11:04 -0700)
* cb/partial-commit-relative-pathspec:
commit: allow partial commits with relative paths

builtin/commit.c
builtin/ls-files.c
cache.h
setup.c
index e1af9b19f0be71484ae9341762dc2bf89cabb70c..cb738574f729e91ff239f12db3f3f1ef1ef9570c 100644 (file)
@@ -256,8 +256,10 @@ static int list_paths(struct string_list *list, const char *with_tree,
                ;
        m = xcalloc(1, i);
 
-       if (with_tree)
-               overlay_tree_on_cache(with_tree, prefix);
+       if (with_tree) {
+               const char *max_prefix = pathspec_prefix(prefix, pattern);
+               overlay_tree_on_cache(with_tree, max_prefix);
+       }
 
        for (i = 0; i < active_nr; i++) {
                struct cache_entry *ce = active_cache[i];
index 15701233e29b240cfa1abdb56bd489306e74c677..0e98bff0c46035162fc424418cc434b52299c1cc 100644 (file)
@@ -276,41 +276,6 @@ static void prune_cache(const char *prefix)
        active_nr = last;
 }
 
-static const char *pathspec_prefix(const char *prefix)
-{
-       const char **p, *n, *prev;
-       unsigned long max;
-
-       if (!pathspec) {
-               max_prefix_len = prefix ? strlen(prefix) : 0;
-               return prefix;
-       }
-
-       prev = NULL;
-       max = PATH_MAX;
-       for (p = pathspec; (n = *p) != NULL; p++) {
-               int i, len = 0;
-               for (i = 0; i < max; i++) {
-                       char c = n[i];
-                       if (prev && prev[i] != c)
-                               break;
-                       if (!c || c == '*' || c == '?')
-                               break;
-                       if (c == '/')
-                               len = i+1;
-               }
-               prev = n;
-               if (len < max) {
-                       max = len;
-                       if (!max)
-                               break;
-               }
-       }
-
-       max_prefix_len = max;
-       return max ? xmemdupz(prev, max) : NULL;
-}
-
 static void strip_trailing_slash_from_submodules(void)
 {
        const char **p;
@@ -576,7 +541,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
                strip_trailing_slash_from_submodules();
 
        /* Find common prefix for all pathspec's */
-       max_prefix = pathspec_prefix(prefix);
+       max_prefix = pathspec_prefix(prefix, pathspec);
+       max_prefix_len = max_prefix ? strlen(max_prefix) : 0;
 
        /* Treat unmatching pathspec elements as errors */
        if (pathspec && error_unmatch) {
diff --git a/cache.h b/cache.h
index f49eaf92638340425f6bbd8f659bb779865a69a0..b33ba73197b8713df752d44db19c78d2285635ab 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -441,6 +441,7 @@ extern void set_git_work_tree(const char *tree);
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
 extern const char **get_pathspec(const char *prefix, const char **pathspec);
+extern const char *pathspec_prefix(const char *prefix, const char **pathspec);
 extern void setup_work_tree(void);
 extern const char *setup_git_directory_gently(int *);
 extern const char *setup_git_directory(void);
diff --git a/setup.c b/setup.c
index 5ea5502e4881a806ebb3aa9fd38f146cf9f65cf9..2c51a9a4c7665ce786e58e312c55f9f8b4bca6ae 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -264,6 +264,38 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
        return pathspec;
 }
 
+const char *pathspec_prefix(const char *prefix, const char **pathspec)
+{
+       const char **p, *n, *prev;
+       unsigned long max;
+
+       if (!pathspec)
+               return prefix ? xmemdupz(prefix, strlen(prefix)) : NULL;
+
+       prev = NULL;
+       max = PATH_MAX;
+       for (p = pathspec; (n = *p) != NULL; p++) {
+               int i, len = 0;
+               for (i = 0; i < max; i++) {
+                       char c = n[i];
+                       if (prev && prev[i] != c)
+                               break;
+                       if (!c || c == '*' || c == '?')
+                               break;
+                       if (c == '/')
+                               len = i+1;
+               }
+               prev = n;
+               if (len < max) {
+                       max = len;
+                       if (!max)
+                               break;
+               }
+       }
+
+       return max ? xmemdupz(prev, max) : NULL;
+}
+
 /*
  * Test if it looks like we're at a git directory.
  * We want to see: