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.
Eric.