diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -470,7 +470,7 @@ def copy(ui, repo, pats, opts, rename=Fa if len(pats) == 1: raise util.Abort(_('no destination specified')) dest = pats.pop() - destdirexists = os.path.isdir(dest) + destdirexists = os.path.isdir(dest) and not os.path.islink(dest) if not destdirexists: if len(pats) > 1 or util.patkind(pats[0], None)[0]: raise util.Abort(_('with multiple sources, destination must be an ' diff --git a/tests/test-symlink-basic b/tests/test-symlink-basic --- a/tests/test-symlink-basic +++ b/tests/test-symlink-basic @@ -38,3 +38,13 @@ echo '% copies' hg cp -v dangling dangling2 hg st -Cmard $TESTDIR/readlink.py dangling dangling2 + +echo '% issue995' +hg up -C +mkdir dir +ln -s dir dirlink +hg ci -qAm 'add dirlink' +mkdir newdir +mv dir newdir/dir +mv dirlink newdir/dirlink +hg mv -A dirlink newdir/dirlink diff --git a/tests/test-symlink-basic.out b/tests/test-symlink-basic.out --- a/tests/test-symlink-basic.out +++ b/tests/test-symlink-basic.out @@ -27,3 +27,5 @@ A dangling2 dangling dangling -> void dangling2 -> void +% issue995 +0 files updated, 0 files merged, 1 files removed, 0 files unresolved