patch._applydiff: resolve prefix with respect to the cwd
This has several advantages compared to resolving it relative to the root:
- '--prefix .' works as expected.
- consistent with upcoming 'hg diff' option to produce relative patches
(I made sure to put in the (glob) annotations this time!)
--- a/mercurial/commands.py Fri Mar 20 00:22:37 2015 +0900
+++ b/mercurial/commands.py Thu Mar 19 10:18:05 2015 -0700
@@ -4066,7 +4066,7 @@
('', 'exact', None,
_('apply patch to the nodes from which it was generated')),
('', 'prefix', '',
- _('apply patch to directory relative to the root'), _('DIR')),
+ _('apply patch to subdirectory'), _('DIR')),
('', 'import-branch', None,
_('use any branch information in patch (implied by --exact)'))] +
commitopts + commitopts2 + similarityopts,
--- a/mercurial/patch.py Fri Mar 20 00:22:37 2015 +0900
+++ b/mercurial/patch.py Thu Mar 19 10:18:05 2015 -0700
@@ -17,6 +17,7 @@
from node import hex, short
import cStringIO
import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
+import pathutil
gitre = re.compile('diff --git a/(.*) b/(.*)')
tabsplitter = re.compile(r'(\t+|[^\t]+)')
@@ -1795,8 +1796,10 @@
eolmode='strict'):
if prefix:
- # clean up double slashes, lack of trailing slashes, etc
- prefix = util.normpath(prefix) + '/'
+ prefix = pathutil.canonpath(backend.repo.root, backend.repo.getcwd(),
+ prefix)
+ if prefix != '':
+ prefix += '/'
def pstrip(p):
return pathtransform(p, strip - 1, prefix)[1]
--- a/tests/test-import-git.t Fri Mar 20 00:22:37 2015 +0900
+++ b/tests/test-import-git.t Thu Mar 19 10:18:05 2015 -0700
@@ -626,6 +626,33 @@
adding dir/d
adding dir/dir2/b
adding dir/dir2/c
+
+prefix '.' is the same as no prefix
+ $ hg import --no-commit --prefix . - <<EOF
+ > diff --git a/dir/a b/dir/a
+ > --- /dev/null
+ > +++ b/dir/a
+ > @@ -0,0 +1 @@
+ > +aaaa
+ > diff --git a/dir/d b/dir/d
+ > --- a/dir/d
+ > +++ b/dir/d
+ > @@ -1,1 +1,2 @@
+ > d
+ > +dddd
+ > EOF
+ applying patch from stdin
+ $ cat dir/a
+ aaaa
+ $ cat dir/d
+ d
+ dddd
+ $ hg revert -aC
+ forgetting dir/a (glob)
+ reverting dir/d (glob)
+ $ rm dir/a
+
+prefix with default strip
$ hg import --no-commit --prefix dir/ - <<EOF
> diff --git a/a b/a
> --- /dev/null
@@ -649,10 +676,10 @@
forgetting dir/a (glob)
reverting dir/d (glob)
$ rm dir/a
-(test that prefixes are relative to the root)
+(test that prefixes are relative to the cwd)
$ mkdir tmpdir
$ cd tmpdir
- $ hg import --no-commit -p2 --prefix dir/ - <<EOF
+ $ hg import --no-commit -p2 --prefix ../dir/ - <<EOF
> diff --git a/foo/a b/foo/a
> new file mode 100644
> --- /dev/null