##// END OF EJS Templates
inotify: server: new data structure to keep track of changes....
inotify: server: new data structure to keep track of changes. == Rationale for the new structure == Current structure was a dictionary tree. One directory was tracked as a dictionary: - keys: file/subdir name - values: - for a file, the status (a/r/m/...) - for a subdir, the directory representing the subdir It allowed efficient lookups, no matter of the type of the terminal leaf: for part in path.split('/'): tree = tree[part] However, there is no way to represent a directory and a file with the same name because keys are conflicting in the dictionary. Concrete example: Initial state: root dir |- foo (file) |- bar (file) # data state is: {'foo': 'n', 'bar': 'n'} Remove foo: root dir |- bar (file) # Data becomes {'foo': 'r'} until next commit. Add foo, as a directory, and foo/barbar file: root dir |- bar (file) |-> foo (dir) |- barbar (file) # New state should be represented as: {'foo': {'barbar': 'a'}, 'bar': 'n'} however, the key "foo" is already used and represents the old file. The dirstate: D foo A foo/barbar cannot be represented, hence the need for a new structure. == The new structure == 'directory' class. Represents one directory level. * Notable attributes: Two dictionaries: - 'files' Maps filename -> status for the current dir. - 'dirs' Maps subdir's name -> directory object representing the subdir * methods - walk(), formerly server.walk - lookup(), old server.lookup - dir(), old server.dir This new class allows embedding all the tree walks/lookups in its own class, instead of having everything mixed together in server. Incidently, since files and directories are not stored in the same dictionaries, we are solving the previous key conflict problem. The small drawback is that lookup operation is a bit more complex: for a path a/b/c/d/e we have to check twice the leaf, if e is a directory or a file.

File last commit:

r8940:01ada7b1 default
r9115:b55d4471 default
Show More
test-merge-tools.out
528 lines | 10.3 KiB | text/plain | TextLexer
/ tests / test-merge-tools.out
Mads Kiilerich
test-merge-tools...
r7731 # revision 0
adding f
# revision 1
# revision 2
created new head
# revision 3 - simple to merge
created new head
Tool selection
# default is internal merge:
[merge-tools]
# hg update -C 1
# hg merge -r 2
merging f
warning: conflicts during merge.
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
<<<<<<< local
revision 1
=======
revision 2
>>>>>>> other
space
# hg stat
M f
? f.orig
# simplest hgrc using false for merge:
[merge-tools]
false.whatever=
# hg update -C 1
# hg merge -r 2
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# true with higher .priority gets precedence:
[merge-tools]
false.whatever=
true.priority=1
# hg update -C 1
# hg merge -r 2
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
# unless lowered on command line:
[merge-tools]
false.whatever=
true.priority=1
# hg update -C 1
# hg merge -r 2 --config merge-tools.true.priority=-7
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# or false set higher on command line:
[merge-tools]
false.whatever=
true.priority=1
# hg update -C 1
# hg merge -r 2 --config merge-tools.false.priority=117
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# or true.executable not found in PATH:
[merge-tools]
false.whatever=
true.priority=1
# hg update -C 1
# hg merge -r 2 --config merge-tools.true.executable=nonexistingmergetool
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# or true.executable with bogus path:
[merge-tools]
false.whatever=
true.priority=1
# hg update -C 1
# hg merge -r 2 --config merge-tools.true.executable=/bin/nonexistingmergetool
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# but true.executable set to cat found in PATH works:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2
revision 1
space
revision 0
space
revision 2
space
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
# and true.executable set to cat with path works:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
Patrick Mezard
test-merge-tools: windows fixes...
r8539 # hg merge -r 2 --config merge-tools.true.executable=cat
Mads Kiilerich
test-merge-tools...
r7731 revision 1
space
revision 0
space
revision 2
space
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
Tool selection and merge-patterns
Mads Kiilerich
test-merge-tools: Don't use tac...
r7769 # merge-patterns specifies new tool false:
Mads Kiilerich
test-merge-tools...
r7731 [merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
Mads Kiilerich
test-merge-tools: Don't use tac...
r7769 # hg merge -r 2 --config merge-patterns.f=false
Mads Kiilerich
test-merge-tools...
r7731 merging f
Mads Kiilerich
test-merge-tools: Don't use tac...
r7769 merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
Mads Kiilerich
test-merge-tools: Don't use tac...
r7769 ? f.orig
Mads Kiilerich
test-merge-tools...
r7731
# merge-patterns specifies executable not found in PATH and gets warning:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool
couldn't find merge tool true specified for f
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
# merge-patterns specifies executable with bogus path and gets warning:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/bin/nonexistingmergetool
Mads Kiilerich
Make util.find_exe alway returns existing file, fixing issue1459...
r7732 couldn't find merge tool true specified for f
Mads Kiilerich
test-merge-tools...
r7731 merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig
Mads Kiilerich
test-merge-tools: test ui.merge functionality and selection of internal tools
r7846 ui.merge overrules priority
# ui.merge specifies false:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=false
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Lee Cantey
Fix for merge changes introduced in rev 9fe7e6acf525
r7859 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools: test ui.merge functionality and selection of internal tools
r7846 # cat f
revision 1
space
# hg stat
M f
? f.orig
# ui.merge specifies internal:fail:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:fail
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Lee Cantey
Fix for merge changes introduced in rev 9fe7e6acf525
r7859 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools: test ui.merge functionality and selection of internal tools
r7846 # cat f
revision 1
space
# hg stat
M f
# ui.merge specifies internal:local:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:local
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
# ui.merge specifies internal:other:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:other
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 2
space
# hg stat
M f
Mads Kiilerich
test merge-tools internal:dump and internal:prompt
r8901 # ui.merge specifies internal:prompt:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:prompt
Mads Kiilerich
ui.prompt: Show prompt and selection in non-interactive mode...
r8940 no tool found to merge f
keep (l)ocal or take (o)ther? l
Mads Kiilerich
test merge-tools internal:dump and internal:prompt
r8901 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
# ui.merge specifies internal:dump:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:dump
merging f
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
# cat f
revision 1
space
# hg stat
M f
? f.base
? f.local
? f.orig
? f.other
f.base:
revision 0
space
f.local:
revision 1
space
f.other:
revision 2
space
Mads Kiilerich
test-merge-tools: test ui.merge functionality and selection of internal tools
r7846 # ui.merge specifies internal:other but is overruled by pattern for false:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
merging f
merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Lee Cantey
Fix for merge changes introduced in rev 9fe7e6acf525
r7859 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools: test ui.merge functionality and selection of internal tools
r7846 # cat f
revision 1
space
# hg stat
M f
? f.orig
Mads Kiilerich
test-merge-tools...
r7731 Premerge
# Default is silent simplemerge:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 3
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
revision 3
# hg stat
M f
# .premerge=True is same:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 3 --config merge-tools.true.premerge=True
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
revision 3
# hg stat
M f
# .premerge=False executes merge-tool:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
# hg merge -r 3 --config merge-tools.true.premerge=False
revision 1
space
revision 0
space
revision 0
space
revision 3
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
Tool execution
# set tools.args explicit to include $base $local $other $output:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
==> ... <==
revision 0
space
==> ... <==
revision 1
space
==> ... <==
revision 2
space
==> ... <==
revision 1
space
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
revision 1
space
# hg stat
M f
# Merge with "echo mergeresult > $local":
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
mergeresult
# hg stat
M f
# - and $local is the file f:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
mergeresult
# hg stat
M f
# Merge with "echo mergeresult > $output" - the variable is a bit magic:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
merging f
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
# cat f
mergeresult
# hg stat
M f
Merge post-processing
# cat is a bad merge-tool and doesn't change:
[merge-tools]
false.whatever=
true.priority=1
true.executable=cat
# hg update -C 1
Patrick Mezard
test-merge-tools: windows fixes...
r8539 # hg merge -y -r 2 --config merge-tools.true.checkchanged=1
Mads Kiilerich
test-merge-tools...
r7731 revision 1
space
revision 0
space
revision 2
space
merging f
Mads Kiilerich
ui.prompt: Show prompt and selection in non-interactive mode...
r8940 output file f appears unchanged
was merge successful (yn)? n
Mads Kiilerich
test-merge-tools...
r7731 merging f failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon
Mads Kiilerich
test-merge-tools...
r7731 # cat f
revision 1
space
# hg stat
M f
? f.orig