Mercurial > hg
changeset 24390:72d7d390ef5d
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!)
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Thu, 19 Mar 2015 10:18:05 -0700 |
parents | 93d3e1a8bfb0 |
children | 6c3a93e690c7 |
files | mercurial/commands.py mercurial/patch.py tests/test-import-git.t |
diffstat | 3 files changed, 35 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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