A merge into a directory with a file external shows the following problems:
1) mergeinfo at the directory is not inherited (and all files and subdirectories get their own inheritable mergeinfo). 2) mergeinfo is added to the external file. The mergeinfo at the external file is just wrong and useless, and 1) will cause problems on a reintegrate merge. A use case and an example are following. Use case: I would like to place different types of branches into different directories, e.g. ^/branches/feature/my-feature, ^/branches/release/1.0. The developers should follow different codeline policies on each type of branch, and the correct codeline policy should be automatically added to each working copy of a new branch. The policies are stored as: ^/CodelinePolicy.txt (trunk codeline policy) ^/branches/feature/CodelinePolicy.txt ^/branches/release/CodelinePolicy.txt svn ps svn:externals '../CodelinePolicy.txt CodelinePolicy.txt' trunk would do the trick. Whenever a new branch is being created: svn cp ^/trunk ^/branches/feature/new-feature-branch svn cp ^/trunk ^/branches/release/new-release-branch the correct CodelinePolicy would be shown in each WC of the new branches. Currently, this would cause non-inheritable mergeinfo on the root directory of each branch so that a reintegrate merge of a feature branch to the trunk will fail with "Missing ranges". Example: $ svn -q --version 1.6.12 $ svn mkdir trunk trunk/dir A trunk A trunk\dir $ echo x >trunk/x.txt $ echo d >trunk/dir/d.txt $ svn add trunk/x.txt trunk/dir/d.txt A trunk\x.txt A trunk\dir\d.txt $ svn ci -m 'initial trunk' Adding trunk Adding trunk\dir Adding trunk\dir\d.txt Adding trunk\x.txt Transmitting file data .. Committed revision 1. $ echo e >e.txt $ svn add e.txt A e.txt $ svn ps svn:externals '../e.txt r.txt' trunk property 'svn:externals' set on 'trunk' $ svn ci -m 'file external r.txt on trunk referring to e.txt in parent dir' Adding e.txt Sending trunk Transmitting file data . Committed revision 2. $ svn cp trunk branch A branch $ svn ci -m 'branch created from trunk' Adding branch Adding branch\dir Adding branch\x.txt Committed revision 3. $ svn up Fetching external item into 'trunk\r.txt' E trunk\r.txt Updated external to revision 3. Fetching external item into 'branch\r.txt' E branch\r.txt Updated external to revision 3. Updated to revision 3. $ cd trunk $ echo xx >>x.txt $ svn ci -m 'trunk/x.txt changed' Sending trunk\x.txt Transmitting file data . Committed revision 4. $ cd ../branch $ svn merge ^/trunk --- Merging r3 through r4 into 'x.txt': U x.txt $ svn st M . M X r.txt MM x.txt M dir $ svn diff Property changes on: . ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk:r3-4* Property changes on: r.txt ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/r.txt:r3-4 Index: x.txt =================================================================== --- x.txt (revision 3) +++ x.txt (working copy) @@ -1 +1,2 @@ x +xx Property changes on: x.txt ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/x.txt:r3-4 Property changes on: dir ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/dir:r3-4 $ svn ci -m 'merge of trunk to branch, strange mergeinfo' Sending branch Sending branch\dir Sending branch\x.txt Sending branch\r.txt Transmitting file data . Committed revision 5. $ svn diff -c 5 Index: x.txt =================================================================== --- x.txt (revision 4) +++ x.txt (revision 5) @@ -1 +1,2 @@ x +xx Property changes on: x.txt ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/x.txt:r3-4 Property changes on: dir ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/dir:r3-4 Property changes on: . ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk:r3-4* $ svn diff -c 5 ../e.txt Property changes on: ..\e.txt ___________________________________________________________________ Added: svn:mergeinfo Merged /trunk/r.txt:r3-4 $