>>>>> "LT" == Linus Torvalds <[EMAIL PROTECTED]> writes:
LT> Damn, my cunning plan is some good stuff.
I really like this a lot. It is *so* *simple*, clear, flexible
and an example of elegance. This is one of the things I would
happily say "Sheeeeeeeeeeeeeesh! Why didn't *I* think of *THAT*
LT> NOTE NOTE NOTE! I could make "read-tree" do some of these nontrivial
LT> merges, but I ended up deciding that only the "matches in all three
LT> states" thing collapses by default.
* Understood and agreed.
LT> Damn, I'm good.
* Agreed ;-). Wholeheartedly.
So what's next? Certainly I'd immediately drop (and I would
imagine you would as well) both C or Perl version of
The userland merge policies need ways to extract the stage
information and manipulate them. Am I correct to say that you
mean by "ls-files -l" the extracting part?
LT> I should make "ls-files" have a "-l" format, which shows the
LT> index and the mode for each file too.
You probably meant "ls-tree". You used the word "mode" but it
already shows the mode so I take it to mean "stage". Perhaps
something like this?
$ ls-tree -l -r 49c200191ba2e3cd61978672a59c90e392f54b8b
100644 blob fe2a4177a760fd110e78788734f167bd633be8de COPYING
100644 blob b39b4ea37586693dd707d1d0750a9b580350ec50:1 man/frotz.6
100644 blob b39b4ea37586693dd707d1d0750a9b580350ec50:2 man/frotz.6
100664 blob eeed997e557fb079f38961354473113ca0d0b115:3 man/frotz.6
The above example shows that COPYING has merged successfully,
and O and A have the same contents and B has something different
Assuming that you would be working on that, I'd like to take the
dircache manipulation part. Let's think about the minimally
necessary set of operations:
* The merge policy decides to take one of the existing stage.
In this case we need a way to register a known mode/sha1 at a
path. We already have this as "update-cache --cacheinfo".
We just need to make sure that when "update-cache" puts
things at stage 0 it clears other stages as well.
* The merge policy comes up with a desired blob somewhere on
the filesystem (perhaps by running an external merge
program). It wants to register it as the result of the
We could do this today by first storing the "desired blob"
in a temporary file somewhere in the path the dircache
controls, "update-cache --add" the temporary file, ls-tree to
find its mode/sha1, "update-cache --remove" the temporary
file and finally "update-cache --cacheinfo" the mode/sha1.
This is workable but clumsy. How about:
$ update-cache --graft [--add] desired-blob path
to say "I want to register mode/sha1 from desired-blob, which
may not be of verify_path() satisfying name, at path in the
* The merge policy decides to delete the path.
We could do this today by first stashing away the file at the
path if it exists, "update-cache --remove" it, and restore
if necessary. This is again workable but clumsy. How about:
$ update-cache --force-remove path
to mean "I want to remove the path from dircache even though
it may exist in my working tree"?
So it all boils down to update-cache. The new things to be
* An explicit update-cache always removes stage 1/2/3 entries
associated with the named path.
* update-cache --graft
* update-cache --force-remove
Am I on the right track?
You might want to go even lower level by letting them say
* update-cache --register-stage mode sha1 stage path
Registers the mode/sha1 at stage for path. Does not look at
the working tree. stage is [0-3]
* update-cache --delete-stage stage-list path
Removes the entry at named stages for path. Does not look at
the working tree. stage-list is either [0-3](,[0-3])+ or
bitmask (i.e. (1 << stage-number) ORed together). The former
would probably be easier to work with by scripts
* write-blob path
Hashes and registers the file at path (regardless of what
verify_path() says) and writes the resulting blob's mode/sha1
to the standard output.
If you take this lower-level approach, an explicit update-cache
would not clear stage1/2/3.
My preference is the former, not so low-level, interface.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html