auto-detect changed prefix and/or changed build flags
[gitweb.git] / checkout-index.c
index 7b78715417039fe1d43699270cdc3d5adf6d2e9c..ea40bc29bed17fbd6e3326edaa6fb3c38b742de6 100644 (file)
@@ -39,6 +39,7 @@
 #include "cache.h"
 #include "strbuf.h"
 #include "quote.h"
+#include "cache-tree.h"
 
 #define CHECKOUT_ALL 4
 static const char *prefix;
@@ -133,7 +134,7 @@ static int checkout_file(const char *name)
 static int checkout_all(void)
 {
        int i, errs = 0;
-       struct cache_entry* last_ce = 0;
+       struct cache_entry* last_ce = NULL;
 
        for (i = 0; i < active_nr ; i++) {
                struct cache_entry *ce = active_cache[i];
@@ -167,7 +168,7 @@ static int checkout_all(void)
 static const char checkout_cache_usage[] =
 "git-checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]|all] [--prefix=<string>] [--temp] [--] <file>...";
 
-static struct cache_file cache_file;
+static struct lock_file lock_file;
 
 int main(int argc, char **argv)
 {
@@ -210,9 +211,8 @@ int main(int argc, char **argv)
                if (!strcmp(arg, "-u") || !strcmp(arg, "--index")) {
                        state.refresh_cache = 1;
                        if (newfd < 0)
-                               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("cannot open index.lock file.");
                        continue;
@@ -261,7 +261,7 @@ int main(int argc, char **argv)
                 */
                if (state.refresh_cache) {
                        close(newfd); newfd = -1;
-                       rollback_index_file(&cache_file);
+                       rollback_lock_file(&lock_file);
                }
                state.refresh_cache = 0;
        }
@@ -269,12 +269,16 @@ int main(int argc, char **argv)
        /* Check out named files first */
        for ( ; i < argc; i++) {
                const char *arg = argv[i];
+               const char *p;
 
                if (all)
                        die("git-checkout-index: don't mix '--all' and explicit filenames");
                if (read_from_stdin)
                        die("git-checkout-index: don't mix '--stdin' and explicit filenames");
-               checkout_file(prefix_path(prefix, prefix_length, arg));
+               p = prefix_path(prefix, prefix_length, arg);
+               checkout_file(p);
+               if (p < arg || p > arg + strlen(arg))
+                       free((char*)p);
        }
 
        if (read_from_stdin) {
@@ -284,6 +288,8 @@ int main(int argc, char **argv)
                strbuf_init(&buf);
                while (1) {
                        char *path_name;
+                       const char *p;
+
                        read_line(&buf, stdin, line_termination);
                        if (buf.eof)
                                break;
@@ -291,7 +297,10 @@ int main(int argc, char **argv)
                                path_name = unquote_c_style(buf.buf, NULL);
                        else
                                path_name = buf.buf;
-                       checkout_file(prefix_path(prefix, prefix_length, path_name));
+                       p = prefix_path(prefix, prefix_length, path_name);
+                       checkout_file(p);
+                       if (p < path_name || p > path_name + strlen(path_name))
+                               free((char *)p);
                        if (path_name != buf.buf)
                                free(path_name);
                }
@@ -302,7 +311,7 @@ int main(int argc, char **argv)
 
        if (0 <= newfd &&
            (write_cache(newfd, active_cache, active_nr) ||
-            commit_index_file(&cache_file)))
-               die("Unable to write new cachefile");
+            commit_lock_file(&lock_file)))
+               die("Unable to write new index file");
        return 0;
 }