- if (argc != 2)
- usage("read-tree <key>");
- if (get_sha1_hex(argv[1], sha1) < 0)
- usage("read-tree <key>");
- sha1_file_directory = getenv(DB_ENVIRONMENT);
- if (!sha1_file_directory)
- sha1_file_directory = DEFAULT_DB_ENVIRONMENT;
- if (unpack(sha1) < 0)
- usage("unpack failed");
+ newfd = open(".git/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600);
+ if (newfd < 0)
+ die("unable to create new cachefile");
+ atexit(remove_lock_file);
+ remove_lock = 1;
+
+ for (i = 1; i < argc; i++) {
+ const char *arg = argv[i];
+
+ /* "-m" stands for "merge" current directory cache */
+ if (!strcmp(arg, "-m")) {
+ if (active_cache)
+ die("read-tree: cannot merge old cache on top of new");
+ if (read_cache() < 0)
+ die("read-tree: corrupt directory cache");
+ continue;
+ }
+ if (get_sha1_hex(arg, sha1) < 0)
+ usage("read-tree [-m] <sha1>");
+ if (read_tree(sha1, "", 0) < 0)
+ die("failed to unpack tree object %s", arg);
+ }
+ if (write_cache(newfd, active_cache, active_nr) ||
+ rename(".git/index.lock", ".git/index"))
+ die("unable to write new index file");
+ remove_lock = 0;