Merge branch 'jc/rw-prefix'
authorJunio C Hamano <junkio@cox.net>
Sun, 18 Jun 2006 00:56:52 +0000 (17:56 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 18 Jun 2006 00:56:52 +0000 (17:56 -0700)
* jc/rw-prefix:
  read-tree: reorganize bind_merge code.
  write-tree: --prefix=<path>
  read-tree: --prefix=<path>/ option.

1  2 
Documentation/git-read-tree.txt
builtin-read-tree.c
cache-tree.c
write-tree.c

Simple merge
index bb50fbd274e2d7e73fc3c6f86a73bd22f636400e,fb1d6829d9e62de541a00dd7c1ab6d7041099255..04506da892c1bfb198c706e166efe8a2bf6cf1be
@@@ -409,10 -367,11 +410,11 @@@ static int unpack_trees(merge_fn_t fn
        if (len) {
                posns = xmalloc(len * sizeof(struct tree_entry_list *));
                for (i = 0; i < len; i++) {
 -                      posns[i] = ((struct tree *) posn->item)->entries;
 +                      posns[i] = create_tree_entry_list((struct tree *) posn->item);
                        posn = posn->next;
                }
-               if (unpack_trees_rec(posns, len, "", fn, &indpos))
+               if (unpack_trees_rec(posns, len, prefix ? prefix : "",
+                                    fn, &indpos))
                        return -1;
        }
  
@@@ -851,13 -782,13 +875,13 @@@ static void prime_cache_tree(void
  
  }
  
- static const char read_tree_usage[] = "git-read-tree (<sha> | -m [--aggressive] [-u | -i] <sha1> [<sha2> [<sha3>]])";
+ static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] <sha1> [<sha2> [<sha3>]])";
  
 -static struct cache_file cache_file;
 +static struct lock_file lock_file;
  
 -int main(int argc, char **argv)
 +int cmd_read_tree(int argc, const char **argv, char **envp)
  {
 -      int i, newfd, reset, stage = 0;
 +      int i, newfd, stage = 0;
        unsigned char sha1[20];
        merge_fn_t fn = NULL;
  
                        continue;
                }
  
 -              /* This differs from "-m" in that we'll silently ignore unmerged entries */
+               /* "--prefix=<subdirectory>/" means keep the current index
+                *  entries and put the entries from the tree under the
+                * given subdirectory.
+                */
+               if (!strncmp(arg, "--prefix=", 9)) {
+                       if (stage || merge || prefix)
+                               usage(read_tree_usage);
+                       prefix = arg + 9;
+                       merge = 1;
+                       stage = 1;
+                       if (read_cache_unmerged())
+                               die("you need to resolve your current index first");
+                       continue;
+               }
 +              /* This differs from "-m" in that we'll silently ignore
 +               * unmerged entries and overwrite working tree files that
 +               * correspond to them.
 +               */
                if (!strcmp(arg, "--reset")) {
-                       if (stage || merge)
+                       if (stage || merge || prefix)
                                usage(read_tree_usage);
                        reset = 1;
                        merge = 1;
         * valid cache-tree because the index must match exactly
         * what came from the tree.
         */
-       if (trees && trees->item && (!merge || (stage == 2))) {
 -      if (trees->item && !prefix && (!merge || (stage == 2))) {
++      if (trees && trees->item && !prefix && (!merge || (stage == 2))) {
                cache_tree_free(&active_cache_tree);
                prime_cache_tree();
        }
diff --cc cache-tree.c
Simple merge
diff --cc write-tree.c
index d6a605893dcbb4d8d65979309cf9ce1199aa8279,895e7a359d108312918c27d98c7b529f2e25e300..bd07da6183b25470b00b9a2eedef29b7275760ec
@@@ -8,10 -8,12 +8,12 @@@
  #include "cache-tree.h"
  
  static int missing_ok = 0;
+ static char *prefix = NULL;
  
- static const char write_tree_usage[] = "git-write-tree [--missing-ok]";
+ static const char write_tree_usage[] =
+ "git-write-tree [--missing-ok] [--prefix=<prefix>/]";
  
 -static struct cache_file cache_file;
 +static struct lock_file lock_file;
  
  int main(int argc, char **argv)
  {
  
        setup_git_directory();
  
 -      newfd = hold_index_file_for_update(&cache_file, get_index_file());
 +      newfd = hold_lock_file_for_update(&lock_file, get_index_file());
        entries = read_cache();
-       if (argc == 2) {
-               if (!strcmp(argv[1], "--missing-ok"))
+       while (1 < argc) {
+               char *arg = argv[1];
+               if (!strcmp(arg, "--missing-ok"))
                        missing_ok = 1;
+               else if (!strncmp(arg, "--prefix=", 9))
+                       prefix = arg + 9;
                else
                        die(write_tree_usage);
+               argc--; argv++;
        }
-       
        if (argc > 2)
                die("too many options");