# HG changeset patch # User Robin Farine # Date 1138064229 -46800 # Node ID 94c179a92f4a9572312587839263f167d4d00227 # Parent 3f214984fd9e25c30a16399f22012fc1a3ac58e2 copy/rename '.' or '..' correctly diff -r 3f214984fd9e -r 94c179a92f4a mercurial/commands.py --- a/mercurial/commands.py Tue Jan 24 13:50:40 2006 +1300 +++ b/mercurial/commands.py Tue Jan 24 13:57:09 2006 +1300 @@ -856,12 +856,11 @@ def targetpathfn(pat, dest, srcs): if os.path.isdir(pat): - if pat.endswith(os.sep): - pat = pat[:-len(os.sep)] + abspfx = util.canonpath(repo.root, cwd, pat) if destdirexists: - striplen = len(os.path.split(pat)[0]) + striplen = len(os.path.split(abspfx)[0]) else: - striplen = len(pat) + striplen = len(abspfx) if striplen: striplen += len(os.sep) res = lambda p: os.path.join(dest, p[striplen:]) @@ -875,34 +874,36 @@ if util.patkind(pat, None)[0]: # a mercurial pattern res = lambda p: os.path.join(dest, os.path.basename(p)) - elif len(util.canonpath(repo.root, cwd, pat)) < len(srcs[0][0]): - # A directory. Either the target path contains the last - # component of the source path or it does not. - def evalpath(striplen): - score = 0 - for s in srcs: - t = os.path.join(dest, s[1][striplen:]) - if os.path.exists(t): - score += 1 - return score + else: + abspfx = util.canonpath(repo.root, cwd, pat) + if len(abspfx) < len(srcs[0][0]): + # A directory. Either the target path contains the last + # component of the source path or it does not. + def evalpath(striplen): + score = 0 + for s in srcs: + t = os.path.join(dest, s[0][striplen:]) + if os.path.exists(t): + score += 1 + return score - if pat.endswith(os.sep): - pat = pat[:-len(os.sep)] - striplen = len(pat) + len(os.sep) - if os.path.isdir(os.path.join(dest, os.path.split(pat)[1])): - score = evalpath(striplen) - striplen1 = len(os.path.split(pat)[0]) - if striplen1: - striplen1 += len(os.sep) - if evalpath(striplen1) > score: - striplen = striplen1 - res = lambda p: os.path.join(dest, p[striplen:]) - else: - # a file - if destdirexists: - res = lambda p: os.path.join(dest, os.path.basename(p)) + striplen = len(abspfx) + if striplen: + striplen += len(os.sep) + if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])): + score = evalpath(striplen) + striplen1 = len(os.path.split(abspfx)[0]) + if striplen1: + striplen1 += len(os.sep) + if evalpath(striplen1) > score: + striplen = striplen1 + res = lambda p: os.path.join(dest, p[striplen:]) else: - res = lambda p: dest + # a file + if destdirexists: + res = lambda p: os.path.join(dest, os.path.basename(p)) + else: + res = lambda p: dest return res @@ -934,7 +935,7 @@ for targetpath, srcs in copylist: for abssrc, relsrc, exact in srcs: - copy(abssrc, relsrc, targetpath(relsrc), exact) + copy(abssrc, relsrc, targetpath(abssrc), exact) if errors: ui.warn(_('(consider using --after)\n')) diff -r 3f214984fd9e -r 94c179a92f4a tests/test-rename --- a/tests/test-rename Tue Jan 24 13:50:40 2006 +1300 +++ b/tests/test-rename Tue Jan 24 13:57:09 2006 +1300 @@ -134,3 +134,21 @@ hg rename d1/* d2/* d3 hg status hg update -C + +echo "# move a whole subtree with \"hg rename .\"" +mkdir d3 +(cd d1; hg rename . ../d3) +hg status +hg update -C + +echo "# move a whole subtree with \"hg rename --after .\"" +mkdir d3 +mv d1/* d3 +(cd d1; hg rename --after . ../d3) +hg status +hg update -C + +echo "# move the parent tree with \"hg rename ..\"" +(cd d1/d11; hg rename .. ../../d3) +hg status +hg update -C diff -r 3f214984fd9e -r 94c179a92f4a tests/test-rename.out --- a/tests/test-rename.out Tue Jan 24 13:50:40 2006 +1300 +++ b/tests/test-rename.out Tue Jan 24 13:57:09 2006 +1300 @@ -181,3 +181,54 @@ R d1/b R d1/ba R d1/d11/a1 +# move a whole subtree with "hg rename ." +copying a to ../d3/d1/a +copying b to ../d3/d1/b +copying ba to ../d3/d1/ba +copying d11/a1 to ../d3/d1/d11/a1 +removing a +removing b +removing ba +removing d11/a1 +A d3/d1/a +A d3/d1/b +A d3/d1/ba +A d3/d1/d11/a1 +R d1/a +R d1/b +R d1/ba +R d1/d11/a1 +# move a whole subtree with "hg rename --after ." +copying a to ../d3/a +copying b to ../d3/b +copying ba to ../d3/ba +copying d11/a1 to ../d3/d11/a1 +removing a +removing b +removing ba +removing d11/a1 +A d3/a +A d3/b +A d3/ba +A d3/d11/a1 +R d1/a +R d1/b +R d1/ba +R d1/d11/a1 +# move the parent tree with "hg rename .." +copying ../a to ../../d3/a +copying ../b to ../../d3/b +copying ../ba to ../../d3/ba +copying a1 to ../../d3/d11/a1 +removing ../a +removing ../b +removing ../ba +removing a1 +A d3/a +A d3/b +A d3/ba +A d3/d11/a1 +R d1/a +R d1/b +R d1/ba +R d1/d11/a1