sapling/tests/test-origbackup-conflict.t
Mark Thomas 0af395f454 scmutil: handle conflicting files and dirs in origbackuppath
When ui.origbackuppath is set, .orig files are stored outside of the working
copy.  However conflicts can occur when files or directories end up having the
same name.  These conflicts cause Mercurial to abort, even if they've been
created as a result of different backups.

Make sure we always replace files or directories in the origbackuppath if
they conflict with another file or directory.

Test Plan:
Add new unit test for conflicting paths.

Differential Revision: https://phab.mercurial-scm.org/D680
2017-10-02 14:05:30 -07:00

119 lines
3.0 KiB
Perl

Set up repo
$ cat << EOF >> $HGRCPATH
> [ui]
> origbackuppath=.hg/origbackups
> [merge]
> checkunknown=warn
> EOF
$ hg init repo
$ cd repo
$ echo base > base
$ hg add base
$ hg commit -m "base"
Make a dir named b that contains a file
$ mkdir -p b
$ echo c1 > b/c
$ hg add b/c
$ hg commit -m "c1"
$ hg bookmark c1
Peform an update that causes b/c to be backed up
$ hg up -q 0
$ mkdir -p b
$ echo c2 > b/c
$ hg up --verbose c1
resolving manifests
b/c: replacing untracked file
getting b/c
creating directory: $TESTTMP/repo/.hg/origbackups/b
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark c1)
$ test -f .hg/origbackups/b/c
Make a file named b
$ hg up -q 0
$ echo b1 > b
$ hg add b
$ hg commit -m b1
created new head
$ hg bookmark b1
Perform an update that causes b to be backed up - it should replace the backup b dir
$ hg up -q 0
$ echo b2 > b
$ hg up --verbose b1
resolving manifests
b: replacing untracked file
getting b
removing conflicting directory: $TESTTMP/repo/.hg/origbackups/b
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark b1)
$ test -f .hg/origbackups/b
Perform an update the causes b/c to be backed up again - it should replace the backup b file
$ hg up -q 0
$ mkdir b
$ echo c3 > b/c
$ hg up --verbose c1
resolving manifests
b/c: replacing untracked file
getting b/c
creating directory: $TESTTMP/repo/.hg/origbackups/b
removing conflicting file: $TESTTMP/repo/.hg/origbackups/b
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark c1)
$ test -d .hg/origbackups/b
Cause a symlink to be backed up that points to a valid location from the backup dir
$ hg up -q 0
$ mkdir ../sym-link-target
$ ln -s ../../../sym-link-target b
$ hg up b1
b: replacing untracked file
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark b1)
$ readlink .hg/origbackups/b
../../../sym-link-target
Perform an update that causes b/c to be backed up again - it should not go into the target dir
$ hg up -q 0
$ mkdir b
$ echo c4 > b/c
$ hg up --verbose c1
resolving manifests
b/c: replacing untracked file
getting b/c
creating directory: $TESTTMP/repo/.hg/origbackups/b
removing conflicting file: $TESTTMP/repo/.hg/origbackups/b
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark c1)
$ cat .hg/origbackups/b/c
c4
$ ls ../sym-link-target
Incorrectly configure origbackuppath to be under a file
$ echo data > .hg/badorigbackups
$ hg up -q 0
$ mkdir b
$ echo c5 > b/c
$ hg up --verbose c1 --config ui.origbackuppath=.hg/badorigbackups
resolving manifests
b/c: replacing untracked file
getting b/c
creating directory: $TESTTMP/repo/.hg/badorigbackups/b
abort: Not a directory: '$TESTTMP/repo/.hg/badorigbackups/b'
[255]
$ cat .hg/badorigbackups
data