# HG changeset patch # User Siddharth Agarwal # Date 2015-03-19 17:18:05 # 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 --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -4066,7 +4066,7 @@ def identify(ui, repo, source=None, rev= ('', '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 --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -17,6 +17,7 @@ from i18n import _ 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 @@ def _applydiff(ui, fp, patcher, backend, 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 --git a/tests/test-import-git.t b/tests/test-import-git.t --- a/tests/test-import-git.t +++ b/tests/test-import-git.t @@ -626,6 +626,33 @@ Prefix with strip, renames, creates etc 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 @@ Prefix with strip, renames, creates etc 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