aboutsummaryrefslogtreecommitdiffstats
path: root/checkout-index.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-09-07 17:26:23 -0700
committerJunio C Hamano <junkio@cox.net>2005-09-07 17:45:20 -0700
commit215a7ad1ef790467a4cd3f0dcffbd6e5f04c38f7 (patch)
tree6bc7aa4f652d0ef49108d9e30a7ea7fbf8e44639 /checkout-index.c
parent99977bd5fdeabbd0608a70e9411c243007ec4ea2 (diff)
downloadgit-215a7ad1ef790467a4cd3f0dcffbd6e5f04c38f7.tar.gz
Big tool rename.
As promised, this is the "big tool rename" patch. The primary differences since 0.99.6 are: (1) git-*-script are no more. The commands installed do not have any such suffix so users do not have to remember if something is implemented as a shell script or not. (2) Many command names with 'cache' in them are renamed with 'index' if that is what they mean. There are backward compatibility symblic links so that you and Porcelains can keep using the old names, but the backward compatibility support is expected to be removed in the near future. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'checkout-index.c')
-rw-r--r--checkout-index.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/checkout-index.c b/checkout-index.c
new file mode 100644
index 0000000000..f32513c507
--- /dev/null
+++ b/checkout-index.c
@@ -0,0 +1,151 @@
+/*
+ * Check-out files from the "current cache directory"
+ *
+ * Copyright (C) 2005 Linus Torvalds
+ *
+ * Careful: order of argument flags does matter. For example,
+ *
+ * git-checkout-index -a -f file.c
+ *
+ * Will first check out all files listed in the cache (but not
+ * overwrite any old ones), and then force-checkout "file.c" a
+ * second time (ie that one _will_ overwrite any old contents
+ * with the same filename).
+ *
+ * Also, just doing "git-checkout-index" does nothing. You probably
+ * meant "git-checkout-index -a". And if you want to force it, you
+ * want "git-checkout-index -f -a".
+ *
+ * Intuitiveness is not the goal here. Repeatability is. The
+ * reason for the "no arguments means no work" thing is that
+ * from scripts you are supposed to be able to do things like
+ *
+ * find . -name '*.h' -print0 | xargs -0 git-checkout-index -f --
+ *
+ * which will force all existing *.h files to be replaced with
+ * their cached copies. If an empty command line implied "all",
+ * then this would force-refresh everything in the cache, which
+ * was not the point.
+ *
+ * Oh, and the "--" is just a good idea when you know the rest
+ * will be filenames. Just so that you wouldn't have a filename
+ * of "-a" causing problems (not possible in the above example,
+ * but get used to it in scripting!).
+ */
+#include "cache.h"
+
+static struct checkout state = {
+ .base_dir = "",
+ .base_dir_len = 0,
+ .force = 0,
+ .quiet = 0,
+ .not_new = 0,
+ .refresh_cache = 0,
+};
+
+static int checkout_file(const char *name)
+{
+ int pos = cache_name_pos(name, strlen(name));
+ if (pos < 0) {
+ if (!state.quiet) {
+ pos = -pos - 1;
+ fprintf(stderr,
+ "git-checkout-index: %s is %s.\n",
+ name,
+ (pos < active_nr &&
+ !strcmp(active_cache[pos]->name, name)) ?
+ "unmerged" : "not in the cache");
+ }
+ return -1;
+ }
+ return checkout_entry(active_cache[pos], &state);
+}
+
+static int checkout_all(void)
+{
+ int i;
+
+ for (i = 0; i < active_nr ; i++) {
+ struct cache_entry *ce = active_cache[i];
+ if (ce_stage(ce))
+ continue;
+ if (checkout_entry(ce, &state) < 0)
+ return -1;
+ }
+ return 0;
+}
+
+static const char checkout_cache_usage[] =
+"git-checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=<string>] [--] <file>...";
+
+static struct cache_file cache_file;
+
+int main(int argc, char **argv)
+{
+ int i, force_filename = 0;
+ int newfd = -1;
+
+ if (read_cache() < 0) {
+ die("invalid cache");
+ }
+
+ for (i = 1; i < argc; i++) {
+ const char *arg = argv[i];
+ if (!force_filename) {
+ if (!strcmp(arg, "-a")) {
+ checkout_all();
+ continue;
+ }
+ if (!strcmp(arg, "--")) {
+ force_filename = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-f")) {
+ state.force = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-q")) {
+ state.quiet = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-n")) {
+ state.not_new = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-u")) {
+ state.refresh_cache = 1;
+ if (newfd < 0)
+ newfd = hold_index_file_for_update
+ (&cache_file,
+ get_index_file());
+ if (newfd < 0)
+ die("cannot open index.lock file.");
+ continue;
+ }
+ if (!memcmp(arg, "--prefix=", 9)) {
+ state.base_dir = arg+9;
+ state.base_dir_len = strlen(state.base_dir);
+ continue;
+ }
+ if (arg[0] == '-')
+ usage(checkout_cache_usage);
+ }
+ if (state.base_dir_len) {
+ /* when --prefix is specified we do not
+ * want to update cache.
+ */
+ if (state.refresh_cache) {
+ close(newfd); newfd = -1;
+ rollback_index_file(&cache_file);
+ }
+ state.refresh_cache = 0;
+ }
+ checkout_file(arg);
+ }
+
+ if (0 <= newfd &&
+ (write_cache(newfd, active_cache, active_nr) ||
+ commit_index_file(&cache_file)))
+ die("Unable to write new cachefile");
+ return 0;
+}