Re: [PATCH 2/2] diff_index: honor in-index, not working-tree, .gitattributes
- From
Jay Soffian <jaysoffian@gmail.com>
- Date
- Sep 23, 2011, 05:37 UTC
- Message-ID
- <CAG+J_Dyh=t2VAZ6rAqcF2meEgBCN5c+J_m_YvVQbKfvXeJ8WGA@mail.gmail.com>
- In-Reply-To
- <CAG+J_DzUQ3OGfiX=vHVGC7SHvwToVjD7uwFyDa8Tq6t7YwX12Q@mail.gmail.com>
On Thu, Sep 22, 2011 at 8:38 PM, Jay Soffian <jaysoffian@gmail.com> wrote:
Show 12 quoted lines
> On Thu, Sep 22, 2011 at 6:39 PM, Junio C Hamano <gitster@pobox.com> wrote: > >> I think the logical conclusion of assuming that we will keep the "single >> source only" semantics (which I think we will, by the way, unless I hear a >> concrete proposal to how we apply attributes from more than one sources in >> what way to which side of the diff) is that a patch might be an >> improvement over the current behaviour if it teaches "diff-tree" to read >> from the tree and populate the in-core index (never writing it out to >> $GIT_DIR/index) from the postimage tree (i.e. "diff preimage postimage" or >> "diff -R postimage preimage") when it is run in a bare repository. > > Okay, I can give that a try.
This area of git is still black magic to me. My best guess is something like this:
diff --git a/tree-diff.c b/tree-diff.c index b3cc2e4753..6fd84eb2bb 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -5,6 +5,8 @@ #include "diff.h" #include "diffcore.h" #include "tree.h" +#include "attr.h" +#include "unpack-trees.h" static void show_entry(struct diff_options *opt, const char *prefix, struct tree_desc *desc, struct strbuf *base); @@ -280,6 +282,19 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha die("unable to read destination tree (%s)", sha1_to_hex(new)); init_tree_desc(&t1, tree1, size1); init_tree_desc(&t2, tree2, size2); + + if (is_bare_repository()) { + struct unpack_trees_options unpack_opts; + memset(&unpack_opts, 0, sizeof(unpack_opts)); + unpack_opts.index_only = 1; + unpack_opts.head_idx = -1; + unpack_opts.src_index = &the_index; + unpack_opts.dst_index = &the_index; + unpack_opts.fn = oneway_merge; + if (unpack_trees(1, DIFF_OPT_TST(opt, REVERSE_DIFF) ? &t1 : &t2, &unpack_opts) == 0) + git_attr_set_direction(GIT_ATTR_INDEX, &the_index); + } + retval = diff_tree(&t1, &t2, base, opt); if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) { init_tree_desc(&t1, tree1, size1); (And in case gmail line wraps that -- https://gist.github.com/1236806) Am I barking up the right tree? (Obviously still needs tests, and maybe an --[no]-tree-attributes option.) j.