Merge branch 'jc/read-tree-ignore'
authorJunio C Hamano <junkio@cox.net>
Wed, 13 Dec 2006 19:10:24 +0000 (11:10 -0800)
committerJunio C Hamano <junkio@cox.net>
Wed, 13 Dec 2006 19:10:24 +0000 (11:10 -0800)
* jc/read-tree-ignore:
read-tree: document --exclude-per-directory
Loosen "working file will be lost" check in Porcelain-ish
read-tree: further loosen "working file will be lost" check.

1  2 
git-merge.sh
unpack-trees.c
diff --combined git-merge.sh
index 2f3d936b9c901bb1bebca3cdb34113a4f1f87b01,397b33f8d33b67018669cb4610a2051407fc3eb7..c895a04f6be0e09670af71532558abe994369a64
@@@ -188,9 -188,8 +188,9 @@@ els
        # in this loop.
        merge_name=$(for remote
                do
 -                      rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) &&
 -                      bh=$(git show-ref -s --verify "refs/heads/$remote") &&
 +                      rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) ||
 +                      continue ;# not something we can merge
 +                      bh=$(git show-ref -s --verify "refs/heads/$remote" 2>/dev/null)
                        if test "$rh" = "$bh"
                        then
                                echo "$rh               branch '$remote' of ."
@@@ -265,7 -264,7 +265,7 @@@ f,*
        echo "Updating $(git-rev-parse --short $head)..$(git-rev-parse --short $1)"
        git-update-index --refresh 2>/dev/null
        new_head=$(git-rev-parse --verify "$1^0") &&
-       git-read-tree -u -v -m $head "$new_head" &&
+       git-read-tree -v -m -u --exclude-per-directory=.gitignore $head "$new_head" &&
        finish "$new_head" "Fast forward"
        dropsave
        exit 0
  case "$best_strategy" in
  '')
        restorestate
 -      echo >&2 "No merge strategy handled the merge."
 +      case "$use_strategies" in
 +      ?*' '?*)
 +              echo >&2 "No merge strategy handled the merge."
 +              ;;
 +      *)
 +              echo >&2 "Merge with strategy $use_strategies failed."
 +              ;;
 +      esac
        exit 2
        ;;
  "$wt_strategy")
diff --combined unpack-trees.c
index 47aa804a86d735d0fa84718708877ace962094bf,79d21e2e8dd89f6e0560a2aded03f5bf3eb77f78..b8689ebc86bb69c21fd650572c55a4c3d246a183
@@@ -1,6 -1,7 +1,7 @@@
  #include <signal.h>
  #include <sys/time.h>
  #include "cache.h"
+ #include "dir.h"
  #include "tree.h"
  #include "tree-walk.h"
  #include "cache-tree.h"
@@@ -77,6 -78,12 +78,12 @@@ static int unpack_trees_rec(struct tree
  {
        int baselen = strlen(base);
        int src_size = len + 1;
+       int i_stk = i_stk;
+       int retval = 0;
+       if (o->dir)
+               i_stk = push_exclude_per_directory(o->dir, base, strlen(base));
        do {
                int i;
                const char *first;
                }
                /* No name means we're done */
                if (!first)
-                       return 0;
+                       goto leave_directory;
  
                pathlen = strlen(first);
                ce_size = cache_entry_size(baselen + pathlen);
                        newbase[baselen + pathlen] = '/';
                        newbase[baselen + pathlen + 1] = '\0';
                        if (unpack_trees_rec(subposns, len, newbase, o,
-                                            indpos, df_conflict_list))
-                               return -1;
+                                            indpos, df_conflict_list)) {
+                               retval = -1;
+                               goto leave_directory;
+                       }
                        free(newbase);
                }
                free(subposns);
                free(src);
        } while (1);
+  leave_directory:
+       if (o->dir)
+               pop_exclude_per_directory(o->dir, i_stk);
+       return retval;
  }
  
  /* Unlink the last component and attempt to remove leading
@@@ -370,7 -384,7 +384,7 @@@ int unpack_trees(struct object_list *tr
        int i;
        struct object_list *posn = trees;
        struct tree_entry_list df_conflict_list;
 -      struct cache_entry df_conflict_entry;
 +      static struct cache_entry *dfc;
  
        memset(&df_conflict_list, 0, sizeof(df_conflict_list));
        df_conflict_list.next = &df_conflict_list;
        state.refresh_cache = 1;
  
        o->merge_size = len;
 -      memset(&df_conflict_entry, 0, sizeof(df_conflict_entry));
 -      o->df_conflict_entry = &df_conflict_entry;
 +
 +      if (!dfc)
 +              dfc = xcalloc(1, sizeof(struct cache_entry) + 1);
 +      o->df_conflict_entry = dfc;
  
        if (len) {
                posns = xmalloc(len * sizeof(struct tree_entry_list *));
@@@ -458,7 -470,7 +472,7 @@@ static void invalidate_ce_path(struct c
  
  /*
   * We do not want to remove or overwrite a working tree file that
-  * is not tracked.
+  * is not tracked, unless it is ignored.
   */
  static void verify_absent(const char *path, const char *action,
                struct unpack_trees_options *o)
  
        if (o->index_only || o->reset || !o->update)
                return;
-       if (!lstat(path, &st))
+       if (!lstat(path, &st) && !(o->dir && excluded(o->dir, path)))
                die("Untracked working tree file '%s' "
                    "would be %s by merge.", path, action);
  }