# HG changeset patch # User Siddharth Agarwal # Date 1426785485 25200 # Node ID 72d7d390ef5d4ebdd7e65aa3751d1791bb7771d6 # Parent 93d3e1a8bfb0cadb5451366f760a8517ae9cf0e7 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!) diff -r 93d3e1a8bfb0 -r 72d7d390ef5d mercurial/commands.py --- 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, diff -r 93d3e1a8bfb0 -r 72d7d390ef5d mercurial/patch.py --- 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] diff -r 93d3e1a8bfb0 -r 72d7d390ef5d tests/test-import-git.t --- 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 . - < 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/ - < 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/ - < diff --git a/foo/a b/foo/a > new file mode 100644 > --- /dev/null