Hello, 

This is my first time posting to this mailing list so apologies for any newbie 
mistakes. I couldn't find a bug report discussing this particular issue and 
while I'm fairly certain this isn't intended behavior, I wanted to post to 
users@ just in case there was some strange reasoning for why this is supposed 
to happen. 

I'll give the gist of what the issue is and then I'll post the sequence of 
commands I used to reproduce the entire issue, with some intermediate diffs to 
show whats going on. 

Essentially, I have a full checkout of trunk containing the following directory 
structure: 



file1.txt 
my-project/fileA.txt 
not-my-project/fileA.txt 



Then we have a copy of trunk, called "my-branch" which has everything checked 
out except for not-my-project. 
We make a sequence of commits in trunks, each of which is followed by a sync 
merge from trunk to my-branch. The first commit changes "file1.txt" and the 
mergeinfo reflects a full merge (good). The next two commits involve changes to 
not-my-project, and the mergeinfo of my-branch reflects these revisions as 
non-inheritable (so, partially merged. also good). Finally, we make a commit to 
"file1.txt" again, but when merging that over, the mergeinfo in my-branch 
suddenly reverse-merges the non-inheritable ranges and merges them as 
inheritable, despite the fact that these revisions have not had their changes 
brought in (we still don't have not-my-project checked out). The consequence is 
that SVN now thinks that my-branch has had not-my-project updated and a 
subsequent reintegrate merge from my-branch to trunk reverses all of the 
changes made in trunk to match what it looked like on the creation of 
my-branch. It does this with no complaints. Here is all of the steps I did to 
recreate that: 

Steps for creating trunk and my-branch: 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc$ svn co 
file:///home/awilton/svnplayground/repo/bug_repo . 
Checked out revision 0. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn mkdir trunk 
A trunk 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn mkdir branches 
A branches 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn commit -m "Created trunk and 
branches." 
Adding branches 
Adding trunk 
Committing transaction... 
Committed revision 1. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn up 
Updating '.': 
At revision 1. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ cd trunk 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo file1 > file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn add file1.txt 
A file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn mkdir my-project 
A my-project 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn mkdir not-my-project 
A not-my-project 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo my file > 
my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo not my file > 
not-my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn add 
my-project/fileA.txt 
A my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn add 
not-my-project/fileA.txt 
A not-my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn stat 
A file1.txt 
A my-project 
A my-project/fileA.txt 
A not-my-project 
A not-my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn commit -m "Set up 
trunk." 
Adding file1.txt 
Adding my-project 
Adding my-project/fileA.txt 
Adding not-my-project 
Adding not-my-project/fileA.txt 
Transmitting file data ...done 
Committing transaction... 
Committed revision 2. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd .. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn up 
Updating '.': 
At revision 2. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ svn cp ^/trunk 
^/branches/my-branch -m "Created my-branch from trunk" 
Committing transaction... 
Committed revision 3. 
awilton@metompkin:~/svnplayground/bug_repo_wc$ cd branches/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches$ svn up my-branch 
--set-depth=files 
Updating 'my-branch': 
A my-branch 
A my-branch/file1.txt 
Updated to revision 3. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches$ cd my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
my-project --set-depth=infinity 
Updating 'my-project': 
A my-project 
A my-project/fileA.txt 
Updated to revision 3. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ ls 
file1.txt my-project 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ ls 
my-project/ 
fileA.txt 

BQ_END

Change 1 to trunk, changing a shared file, "file1.txt": 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cd 
../../trunk/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo change 1 to file1 > 
file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn commit -m "Changed 
file1 in trunk" 
Sending file1.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 4. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd ../branches/my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
Updating '.': 
At revision 4. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn merge 
^/trunk 
--- Merging r3 through r4 into '.': 
U file1.txt 
--- Recording mergeinfo for merge of r3 through r4 into '.': 
U . 
--- Recording mergeinfo for merge of r3 through r4 into 'file1.txt': 
U file1.txt 
--- Eliding mergeinfo from 'file1.txt': 
U file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn diff 
Index: file1.txt 
=================================================================== 
--- file1.txt (revision 4) 
+++ file1.txt (working copy) 
@@ -1 +1 @@ 
-file1 
+change 1 to file1 
Index: . 
=================================================================== 
--- . (revision 4) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Added: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /trunk:r3-4 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn commit -m 
"Merge from trunk to my-branch." 
Sending . 
Sending file1.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 5. 

BQ_END

Change 2 to trunk, changing a file not checked out in my-branch, 
"not-my-project/fileA.txt": 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cd 
../../trunk/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn up 
Updating '.': 
At revision 5. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo change 1 to not my 
file > not-my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn commit -m "not my file 
changed." 
Sending not-my-project/fileA.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 6. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd ../branches/my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
Updating '.': 
At revision 6. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn merge 
^/trunk 
--- Merging r5 through r6 into '.': 
Skipped missing target: 'not-my-project' 
U not-my-project/fileA.txt 
--- Recording mergeinfo for merge of r5 through r6 into '.': 
U . 
Summary of conflicts: 
Skipped paths: 1 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn diff 
Index: . 
=================================================================== 
--- . (revision 6) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Modified: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /trunk:r5-6* 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn commit -m 
"Merge from trunk to my-branch." 
Sending . 
Committing transaction... 
Committed revision 7. 

BQ_END

Change 3 to trunk, changing a file checked out in my-branch, "file1.txt" and a 
file not checked out in my-branch, "not-my-project/fileA.txt": 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cd 
../../trunk/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo change 2 to file1 > 
file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo change 2 to not my 
file > not-my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn commit -m "Changed 
file1 and not my file." 
Sending file1.txt 
Sending not-my-project/fileA.txt 
Transmitting file data ..done 
Committing transaction... 
Committed revision 8. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd ../branches/my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
Updating '.': 
At revision 8. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn merge 
^/trunk 
--- Merging r7 through r8 into '.': 
U file1.txt 
Skipped missing target: 'not-my-project' 
U not-my-project/fileA.txt 
--- Recording mergeinfo for merge of r5 through r8 into '.': 
U . 
--- Recording mergeinfo for merge of r5 through r8 into 'file1.txt': 
G file1.txt 
Summary of conflicts: 
Skipped paths: 1 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn diff 
Index: file1.txt 
=================================================================== 
--- file1.txt (revision 8) 
+++ file1.txt (working copy) 
@@ -1 +1 @@ 
-change 1 to file1 
+change 2 to file1 

Property changes on: file1.txt 
___________________________________________________________________ 
Added: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /trunk/file1.txt:r3-8 
Index: . 
=================================================================== 
--- . (revision 8) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Modified: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /trunk:r7-8* 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn commit -m 
"Merge from trunk to my-branch." 
Sending . 
Sending file1.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 9. 

BQ_END

Change 4 on trunk, changing a file checked out in my-branch, "file1.txt". 
Notice that after the merge, revisions 5-8* are reverse-merged and then merged 
with inheritability, despite not-my-project changes missing in this branch not 
being brought over (because its not checked out): 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cd 
../../trunk 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn up 
Updating '.': 
At revision 9. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ echo change 3 file1 > 
file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn commit -m "Changed 
file1 on trunk." 
Sending file1.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 10. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd ../branches/my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
Updating '.': 
At revision 10. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn merge 
^/trunk 
--- Merging r9 through r10 into '.': 
U file1.txt 
--- Recording mergeinfo for merge of r5 through r10 into '.': 
U . 
--- Recording mergeinfo for merge of r5 through r10 into 'file1.txt': 
U file1.txt 
--- Eliding mergeinfo from 'file1.txt': 
U file1.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn diff 
Index: file1.txt 
=================================================================== 
--- file1.txt (revision 10) 
+++ file1.txt (working copy) 
@@ -1 +1 @@ 
-change 2 to file1 
+change 3 file1 

Property changes on: file1.txt 
___________________________________________________________________ 
Deleted: svn:mergeinfo 
## -0,1 +0,0 ## 
Reverse-merged /trunk/file1.txt:r3-8 
Index: . 
=================================================================== 
--- . (revision 10) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Modified: svn:mergeinfo 
## -0,1 +0,1 ## 
Reverse-merged /trunk:r5-8* 
Merged /trunk:r5-10 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn commit -m 
"Merge from trunk to my-branch." 
Sending . 
Sending file1.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 11. 

BQ_END

We change a file in my-project, and then try to merge from my-branch to trunk, 
but the changes made to not-my-project are reversed, no questions: 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ echo change 1 
to my file > my-project/fileA.txt 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn commit -m 
"Changed my file in my-branch" 
Sending my-project/fileA.txt 
Transmitting file data .done 
Committing transaction... 
Committed revision 12. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
Updating '.': 
At revision 12. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cd 
../../trunk/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn up 
Updating '.': 
At revision 12. 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn merge 
^/branches/my-branch 
--- Merging differences between repository URLs into '.': 
U my-project/fileA.txt 
U not-my-project/fileA.txt 
--- Recording mergeinfo for merge between repository URLs into '.': 
U . 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn diff 
Index: my-project/fileA.txt 
=================================================================== 
--- my-project/fileA.txt (revision 12) 
+++ my-project/fileA.txt (working copy) 
@@ -1 +1 @@ 
-my file 
+change 1 to my file 
Index: not-my-project/fileA.txt 
=================================================================== 
--- not-my-project/fileA.txt (revision 12) 
+++ not-my-project/fileA.txt (working copy) 
@@ -1 +1 @@ 
-change 2 to not my file 
+not my file 
Index: . 
=================================================================== 
--- . (revision 12) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Added: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /branches/my-branch:r3-12 

BQ_END

A further demonstration of the issue. We revert the local changes made by the 
merge locally. Then we checkout not-my-project in my-branch and attempt another 
sync merge from trunk to my-branch. Because not-my-project has been marked as 
having had all changes merged to it, the changes in trunk on that subtree are 
not brought over: 

BQ_BEGIN

awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ svn revert -R . 
Reverted '.' 
Reverted 'not-my-project/fileA.txt' 
Reverted 'my-project/fileA.txt' 
awilton@metompkin:~/svnplayground/bug_repo_wc/trunk$ cd ../branches/my-branch/ 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn up 
--set-depth=infinity 
Updating '.': 
A not-my-project 
A not-my-project/fileA.txt 
Updated to revision 12. 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn merge 
^/trunk 
--- Recording mergeinfo for merge of r11 through r12 into '.': 
U . 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ svn diff 
Index: . 
=================================================================== 
--- . (revision 12) 
+++ . (working copy) 

Property changes on: . 
___________________________________________________________________ 
Modified: svn:mergeinfo 
## -0,0 +0,1 ## 
Merged /trunk:r11-12 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cat 
not-my-project/fileA.txt 
not my file 
awilton@metompkin:~/svnplayground/bug_repo_wc/branches/my-branch$ cat 
../../trunk/not-my-project/fileA.txt 
change 2 to not my file 

BQ_END

And thats the bug. To be even more explicit, it seems that the only time it 
reverse merges those previously non-inheritable revisions, is if the most 
recent changeset being brought over doesn't include changes to not-my-project. 
It's almost like SVN merge uses whether the revision range of the actual 
changeset is inheritable to determine whether the revision ranges of all 
eligible revisions are inheritabile, which in this use case is incorrect. The 
newest revisions should be inheritable, but the old ones need to stay 
non-inheritable so that SVN doesn't accidentally think that 
branches/my-branch/not-my-project has the newest changes from 
trunk/not-my-project. 

I am using Ubuntu 16.04 with SVN 1.13. I have also confirmed this bug on SVN 
1.9 (thats what the rest of my company uses). Here is my svn version info: 

BQ_BEGIN

$ svn --version 
svn, version 1.13.0 (r1867053) 
compiled Apr 23 2020, 15:50:58 on x86_64-unknown-linux-gnu 

Copyright (C) 2019 The Apache Software Foundation. 
This software consists of contributions made by many people; 
see the NOTICE file for more information. 
Subversion is open source software, see http://subversion.apache.org/ 

The following repository access (RA) modules are available: 

* ra_svn : Module for accessing a repository using the svn network protocol. 
- handles 'svn' scheme 
* ra_local : Module for accessing a repository on local disk. 
- handles 'file' scheme 

The following authentication credential caches are available: 

* GPG-Agent 

BQ_END

I am not subscirbed to the @user list and neither are my colleagues who are 
CC'ed in this email. Could we all be CC'ed on any followup emails? 

Thank you, 
Alex Wilton 

CONFIDENTIALITY NOTICE: This communication may contain private, confidential 
and privileged material for the sole use of the intended recipient. If you are 
not the intended recipient, please delete this e-mail and any attachments 
permanently.

Reply via email to