4587: rbt patch failed to work for svn merge change

totoroliu

What version are you running?

RBTools 0.7.10
svn, version 1.9.3 (r1718519)

What steps will reproduce the problem?

  1. Prepare 2 SVN branches:
    merge-source branch and merge-destination branch,
    where SVN Relative URL level must be different.
    eg.
    http://xxx.com/svn/svntest/TestProject/trunk
    http://xxx.com/svn/svntest/TestProject/branches/4.x/br_4-0_test02/trunk

////////////////////////////
/ Prepare svn merge change /
////////////////////////////
2. At the merge-source branch, create a new folder and a new file that merge-destination branch doesn't have.
eg.

$ svn diff
Index: test/test01
===================================================================
--- test/test01 (nonexistent)
+++ test/test01 (revision 19438)
@@ -0,0 +1 @@
+test01

  1. At the merge-source branch, commit the change above:
svn commit

//////////////////////////////////
/ Prepare reviewboard patch file /
//////////////////////////////////
4. At the merge-destination branch, run:

svn merge -c $REVISION $merge-source_branch_url

  1. At the merge-destination branch, run rbt diff --svn-show-copies-as-adds=y
$ rbt diff --svn-show-copies-as-adds=y --debug
$ rbt diff --svn-show-copies-as-adds=y --debug
>>> RBTools 0.7.10
>>> Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609]
>>> Running on Linux-4.4.0-96-generic-x86_64-with-Ubuntu-16.04-xenial
>>> Home = /home/rickliu
>>> Current directory = /tmp/br_4-0_rtest02_trunk
>>> Command line: rbt diff --svn-show-copies-as-adds=y --debug
>>> Running: tf vc help
>>> Checking for a Subversion repository...
>>> Running: svn --non-interactive info
>>> Running: diff --version
>>> Running: svn --non-interactive --version -q
>>> repository info: Path: http://xxx.com/svn/svntest, Base path: /TestProject/branches/4.x/br_4-0_test02/trunk, Supports changesets: False
>>> Making HTTP GET request to http://172.16.182.156/api/
>>> Running: svn --non-interactive info
>>> Running: diff --version
>>> Running: svn --non-interactive --version -q
>>> repository info: Path: http://xxx.com/svn/svntest, Base path: /TestProject/branches/4.x/br_4-0_test02/trunk, Supports changesets: False
>>> Running: svn --non-interactive diff --diff-cmd=diff --notice-ancestry -r BASE --show-copies-as-adds
>>> Running: svn --non-interactive info test/test01
>>> Running: svn --non-interactive info test
>>> Running: svn --non-interactive info .
>>> Running: svn --non-interactive diff --diff-cmd=diff --notice-ancestry -r BASE --show-copies-as-adds --no-diff-deleted
>>> Running: svn --non-interactive info test/test01
>>> Running: svn --non-interactive info test/test01
>>> Running: svn --non-interactive info .
>>> Running: svn --non-interactive info .
>>> Running: svn --non-interactive info .
Index: /TestProject/branches/4.x/br_4-0_test02/trunk/test/test01
===================================================================
--- /TestProject/trunk/test/test01  (nonexistent)
+++ /TestProject/branches/4.x/br_4-0_test02/trunk/test/test01   (working copy)
@@ -0,0 +1 @@
+test01
Index: /TestProject/branches/4.x/br_4-0_test02/trunk
===================================================================
--- /TestProject/branches/4.x/br_4-0_test02/trunk   (revision 19436)
+++ /TestProject/branches/4.x/br_4-0_test02/trunk   (working copy)

Property changes on: .
___________________________________________________________________
Added: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /TestProject/trunk:r19438

////////////
/ rbt post /
////////////
5. Post and publish the change to Reviewboard server

/////////////
/ rbt patch /
/////////////
6. At different local directory, svn checkout merge-destination branch again.
7. At merge-destination branch, run rbt patch:

$ rbt patch --debug 20459
>>> RBTools 0.7.10
>>> Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609]
>>> Running on Linux-4.4.0-96-generic-x86_64-with-Ubuntu-16.04-xenial
>>> Home = /home/rickliu
>>> Current directory = /tmp/br_4-0_test02_trunk
>>> Command line: rbt patch --debug 20459
>>> Running: tf vc help
>>> Checking for a Subversion repository...
>>> Running: svn --non-interactive info
>>> Running: diff --version
>>> Running: svn --non-interactive --version -q
>>> repository info: Path: http://xxxx.com/svn/svntest, Base path: /TestProject/branches/4.x/br_4-0_test02/trunk, Supports changesets: False
>>> Making HTTP GET request to http://172.16.182.156/api/
>>> Making HTTP GET request to http://172.16.182.156/api/repositories/?tool=Subversion
>>> Cached response for HTTP GET http://172.16.182.156/api/repositories/?tool=Subversion expired and was modified
>>> Making HTTP GET request to http://172.16.182.156/api/review-requests/20459/diffs/
>>> Cached response for HTTP GET http://172.16.182.156/api/review-requests/20459/diffs/ expired and was modified
>>> Making HTTP GET request to http://172.16.182.156/api/review-requests/20459/diffs/1/
>>> Cached response for HTTP GET http://172.16.182.156/api/review-requests/20459/diffs/1/ expired and was not modified
>>> Making HTTP GET request to http://172.16.182.156/api/review-requests/20459/diffs/1/
>>> Cached response for HTTP GET http://172.16.182.156/api/review-requests/20459/diffs/1/ expired and was not modified
Patch is being applied from request 20459 with diff revision 1.
>>> Running: svn --non-interactive patch --strip=6 /tmp/tmpsLJ9Sd
Traceback (most recent call last):
  File "/usr/local/bin/rbt", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/rbtools/commands/main.py", line 133, in main
    command.run_from_argv([RB_MAIN, command_name] + args)
  File "/usr/local/lib/python2.7/dist-packages/rbtools/commands/__init__.py", line 678, in run_from_argv
    exit_code = self.main(*args) or 0
  File "/usr/local/lib/python2.7/dist-packages/rbtools/commands/patch.py", line 196, in main
    revert=self.options.revert_patch)
  File "/usr/local/lib/python2.7/dist-packages/rbtools/commands/patch.py", line 101, in apply_patch
    base_dir, self.options.px, revert=revert)
  File "/usr/local/lib/python2.7/dist-packages/rbtools/clients/svn.py", line 797, in apply_patch
    rc, patch_output = self._run_svn(cmd, return_error_code=True)
  File "/usr/local/lib/python2.7/dist-packages/rbtools/clients/svn.py", line 881, in _run_svn
    return execute(cmdline, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/rbtools/utils/process.py", line 161, in execute
    raise Exception('Failed to execute command: %s\n%s' % (command, data))
Exception: Failed to execute command: ['svn', '--non-interactive', u'patch', u'--strip=6', u'/tmp/tmpsLJ9Sd']
svn: E195018: Cannot strip 6 components from '/TestProject/trunk_rick/test/test01'

What is the expected output? What do you see instead?

rbt patch should correctly patch the change according to the diff file,
but received python exception.

What operating system are you using?

Ubuntu 16.04.03 LTS

Attach the debug out from the command.

$ rbt <command> --debug <args>
<debug output>

Please provide any additional information below.

The root cause of this issue is the DIFF generated from "rbt diff" has different level of strip.

Index: /TestProject/branches/4.x/br_4-0_ricktest02/trunk/test/test01
===================================================================
--- /TestProject/trunk_rick/test/test01	(nonexistent)
+++ /TestProject/branches/4.x/br_4-0_ricktest02/trunk/test/test01	(working copy)
@@ -0,0 +1 @@
+test01
Index: /TestProject/branches/4.x/br_4-0_ricktest02/trunk
===================================================================
--- /TestProject/branches/4.x/br_4-0_ricktest02/trunk	(revision 19436)
+++ /TestProject/branches/4.x/br_4-0_ricktest02/trunk	(working copy)
Property changes on: .
___________________________________________________________________
Added: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /TestProject/trunk_rick:r19438