On Thu, Oct 13, 2016 at 2:15 AM, Eric Johnson <e...@tibco.com> wrote: > Your constraints, as currently specified, seem to require actual logic.... > > Thoughts follow your email. > > > On 10/12/16 1:44 PM, Rob Hofer wrote: >> >> We have a rather common use case where we have an svn:auto-props rule set >> globally (set on root of repository) to define source code files as text >> based, but also have some files provided by 3rd parties which compress or >> encrypt similar files with the same file extension (which we have no control >> over), and hence we want to set an svn:auto-props rule locally on those >> directories to make those files binary type. But the hierarchical >> svn:auto-props rules add properties from multiple definitions of the same >> match filter (*.v), and result is a conflicting set of properties that block >> the add at the client (eol-style with mime-type=octet-stream). >> >> For example, a binary and text based Verilog file (*.v): >> %> file binary.v >> binary.v: gzip compressed data, was "binary.v", from Unix, last modified: >> Mon Feb 18 19:44:25 2013, max compression >> %> file text.v >> text.v: ASCII text >> >> The RDC auto-props for this directory shows these Verilog and VHDL types >> (local directory expects binary types, global are source-code text files). >> %> svn propget svn:auto-props --show-inherited-props . >> http://crsvn/gsadc - *.v = svn:eol-style=LF;svn:keywords=Id Revision >> Date Author URL;svn:mime-type=text/x-verilog >> . - *.v = svn:needs-lock;svn:mime-type=application/octet-stream >> >> Adding the files to SVN control fails, unless --no-auto-props is used >> (undesirable work around): >> %> svn add binary.v >> svn: E200009: Can't set 'svn:eol-style': file '/module/lay/binary.v' has >> binary mime type property >> %> svn add --no-auto-props binary.v >> A (bin) binary.v >> %> svn add text.v >> svn: E200009: Can't set 'svn:eol-style': file '/module/lay/text.v' has >> binary mime type property >> %> svn add --no-auto-props text.v >> A text.v >> >> Subversion auto-detects the binary file and at least sets the mime-type, >> but other properties are missing because --no-auto-props is the only way to >> add the files without error. >> %> svn proplist -v binary.v >> Properties on 'binary.v': >> svn:mime-type >> application/octet-stream >> %> svn proplist -v text.v >> >> %> svn --version >> svn, version 1.9.4 (r1740329) >> compiled May 18 2016, 12:05:49 on x86_64-unknown-linux-gnu >> >> (Incidentally, the commit will fail because our hook is checking these >> svn:auto-props rules and the file must match the binary rules or the text >> rule, based on the mime-type). So the only way today to add these files to >> SVN is to use --no-auto-props on add, and go into the server and disable the >> pre-commit hook during the commit, then put the pre-commit hook back. Since >> a pre-commit hook is the only way to enforce the use of auto-props >> correctly, disabling the hook is not an optimal solution. Once added to SVN, >> the issue never comes up again because the properties do not change, and the >> pre-commit hook checks the modifications on future commits based upon the >> mime-type (binary or text rules). The issue is only during the initial add >> to SVN due to conflicting properties being applied to the file based on how >> the svn:auto-props definitions are being interpreted. >> >> Proposed solution: >> 1. Make lower level svn:auto-props rules completely override upstream >> ones, rather than additively merging properties, for rules with same exact >> match filter (local *.v redefines upstream *.v completely). >> 2. Make SVN ignore properties such as eol-style and keywords when the >> mime-type is a binary type rather than issue a fatal error to the >> user/client (warning instead that some properties are being ignored). >> 3. Provide a subtractive property rule to undo an upstream property. E.g., >> svn:eol-style=none, or svn:keyword=none, such that a lower level rule can >> unset a property defined upstream (and make svn:eol-style=none behave same >> as if svn:eol-style was not applied at all). >> >> Note: Before RDC svn:auto-props (pre 1.8), this use case required having >> two entries in the ~/.subversion/config, with one always commented out. When >> encountering one type or the other (text or binary), user would have to >> uncomment/comment the proper auto-props rule in their config file before the >> add, and then change their config back for the normal case. This was very >> unwieldly and required careful synchronization of all user runtime config >> files and hook scripts and manual intervention by the user during adds. >> Hierarchical RDC properties should eliminate this problem, but it falls a >> little short because of how hierarchical RDC svn:auto-props rules merge >> mutually exclusive properties together. I believe this is very similar to >> multiple matches in the ~/.subversion/config runtime file, for example a *.v >> rule and a *-rtl.v rule could collide, except now it is possible to have the >> very same rule filter (*.v) defined in more than one location in the >> subversion hierarchy. See proposed solution #1 as my desired behavior from >> the SVN client. > > > > Only a few options I see: > > - different repositories for the binary files vs. the text format. > > - improved hook scripts to enforce your desired constraints based on the > content of the incoming added file, rather than just the extension. You > could also create a client side script / tool to check before a commit.
Another workaround might be to separate the binary *.v files into a separate directory, completely separated from the textual *.v world (so they are in mutually exclusive parts of the repo). So you can set the correct svn:auto-props applicable to each. FWIW, I think you have a valid usecase, though it's a bit unusual. Of your proposed solutions, I think 1 and 2 are not possible (1 breaks backwards compatibility; and 2 is too risky: failing in this case is the safest behavior). But your 3rd suggestions (introducing some way to subtract or negate svn:auto-props) sounds like it could be a useful enhancement (though I'm not sure how we would define the syntax, without breaking backwards compatibility -- but maybe as a separate new property or something). So: feel free to enter this suggestion / feature request in our issue tracker. (for the record: filing an issue will not magically make it happen -- this is largely a volunteer-driven project -- but at least that way we don't lose track of the request) -- Johan