Daniel Sahlberg wrote:
I'veĀ been trying to dig into shelving and bug 4827. I've been debugging the regression test from Julian. Please excuse me if I'm making up terms for things called something else, I'm still new at this.

Thank you for digging into this.  Sorry for being slow to respond.

As I understand it, Subversion is:
1. Checking a new WC for the shelf (.svn/experimental/shelves/v3/<encoded name>-version.wc) 2. Applying the changes from the "normal" WC to the shelf-WC using the delta editor

The file to be shelved is:
$Rev: 1$\n
New line\n
(where the actual change is the new line - I like Julian's self-explanatory test code!)

The base file is :
$Rev$\n

In step 1 keyword expansion occurs so the file in the "shelf-WC":
$Rev: 1$\n

The problem seems to be that the patching in step 2 is putting the changes in the position relative to the base file and not considering the keyword expansion. So the file in the "shelf-WC" after patching is
$Rev: New line\n
This file matches the "actual" checksum.

The "expected" checksum is based on this file:
$Rev$\n
New line\n
(which doesn't exist except in my mail).

I guess there are two ways forward:
* To prevent keyword expansion in the "shelf-WC"

That's the better option.  Details follow.

* To make sure the delta editor applies the patch relative to the expanded keyword (in this case three bytes later in the file).

Before I try to make a patch out of this I would like to ask which way would be prefered. It the "shelf-WC" supposed to be just like any other WC (in that case keyword expanded), or should it receive special treatment to work better with the delta editor?

The shelf-WC should not do keyword expansion and EOL-style conversion. (EOL-style conversion is the other kind of non-committable local change that goes side-by-side with keyword expansion.) The design of shelving-v3 is that only committable changes, which means changes that are representable in the "editor API", are to be stored in a shelf [1]. The shelf-WC has no purpose other than for the shelving code to store changes to it and extract the same changes from it. When a change is shelved from the main WC, keywords should be unexpanded and EOL-style normalized to "repository form". When a change is replayed from a shelf-WC back to the main WC, any required keyword expansion and EOL-style conversion should be applied to the main WC at that point.

If I remember correctly, the interface for getting changes out of the main WC used the commit editor, so that must be returning keywords and EOL style to repository form already. The two areas that need to be checked and fixed are (1) the "checkout" code (which you have observed is expanding keywords), which, from memory, I think probably has an option that can be passed in the client "config" to suppress that functionality; and (2) the code being used to apply the patch (coming from the main WC) to the shelf WC, which, from memory, is code that I had to write and might not have such an option and might have inconsistent behaviour.

If you can do anything towards making it work as intended, that would be great.

Don't hesitate to follow up with questions here or on the #svn-dev channel (which I access these days through Matrix [2], and is still also accessible in Freenode IRC). I forgot I had marked your message for attention this time. I usually would respond much quicker.

Thanks,
- Julian


[1] If there is ever a future enhancement to this design to enable shelving WC-only kinds of local changes, I envisage it would be done by adding another layer of "editor API" on top of the existing one, that has the job of supporting WC-only kinds of local changes, which could conceivably include keyword expansion and EOL-style.

[2] #svn-dev via Matrix: https://matrix.to/#/#freenode_#svn-dev:matrix.org

Reply via email to