check-code: catch Python 'is' comparing number or string literals
The Python 'is' operator compares object identity, so it should
definitely not be applied to string or number literals, which Python
implementations are free to represent with a temporary object.
This should catch the following kinds of bogus expressions (examples):
x is 'foo' x is not 'foo'
x is "bar" x is not "bar"
x is 42 x is not 42
x is -36 x is not -36
As originally proposed by Martin Geisler, amended with catching
negative numbers.
Set up a repo
$ echo "[ui]" >> $HGRCPATH
$ echo "interactive=true" >> $HGRCPATH
$ echo "[extensions]" >> $HGRCPATH
$ echo "record=" >> $HGRCPATH
$ hg init a
$ cd a
Select no files
$ touch empty-rw
$ hg add empty-rw
$ hg record empty-rw<<EOF
> n
> EOF
diff --git a/empty-rw b/empty-rw
new file mode 100644
examine changes to 'empty-rw'? [Ynsfdaq?]
no changes to record
$ hg tip -p
changeset: -1:000000000000
tag: tip
user:
date: Thu Jan 01 00:00:00 1970 +0000
Select files but no hunks
$ hg record empty-rw<<EOF
> y
> n
> EOF
diff --git a/empty-rw b/empty-rw
new file mode 100644
examine changes to 'empty-rw'? [Ynsfdaq?]
abort: empty commit message
[255]
$ hg tip -p
changeset: -1:000000000000
tag: tip
user:
date: Thu Jan 01 00:00:00 1970 +0000
Record empty file
$ hg record -d '0 0' -m empty empty-rw<<EOF
> y
> y
> EOF
diff --git a/empty-rw b/empty-rw
new file mode 100644
examine changes to 'empty-rw'? [Ynsfdaq?]
$ hg tip -p
changeset: 0:c0708cf4e46e
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: empty
Summary shows we updated to the new cset
$ hg summary
parent: 0:c0708cf4e46e tip
empty
branch: default
commit: (clean)
update: (current)
Rename empty file
$ hg mv empty-rw empty-rename
$ hg record -d '1 0' -m rename<<EOF
> y
> EOF
diff --git a/empty-rw b/empty-rename
rename from empty-rw
rename to empty-rename
examine changes to 'empty-rw' and 'empty-rename'? [Ynsfdaq?]
$ hg tip -p
changeset: 1:d695e8dcb197
tag: tip
user: test
date: Thu Jan 01 00:00:01 1970 +0000
summary: rename
Copy empty file
$ hg cp empty-rename empty-copy
$ hg record -d '2 0' -m copy<<EOF
> y
> EOF
diff --git a/empty-rename b/empty-copy
copy from empty-rename
copy to empty-copy
examine changes to 'empty-rename' and 'empty-copy'? [Ynsfdaq?]
$ hg tip -p
changeset: 2:1d4b90bea524
tag: tip
user: test
date: Thu Jan 01 00:00:02 1970 +0000
summary: copy
Delete empty file
$ hg rm empty-copy
$ hg record -d '3 0' -m delete<<EOF
> y
> EOF
diff --git a/empty-copy b/empty-copy
deleted file mode 100644
examine changes to 'empty-copy'? [Ynsfdaq?]
$ hg tip -p
changeset: 3:b39a238f01a1
tag: tip
user: test
date: Thu Jan 01 00:00:03 1970 +0000
summary: delete
Add binary file
$ hg bundle --base -2 tip.bundle
1 changesets found
$ hg add tip.bundle
$ hg record -d '4 0' -m binary<<EOF
> y
> EOF
diff --git a/tip.bundle b/tip.bundle
new file mode 100644
this is a binary file
examine changes to 'tip.bundle'? [Ynsfdaq?]
$ hg tip -p
changeset: 4:ad816da3711e
tag: tip
user: test
date: Thu Jan 01 00:00:04 1970 +0000
summary: binary
diff -r b39a238f01a1 -r ad816da3711e tip.bundle
Binary file tip.bundle has changed
Change binary file
$ hg bundle --base -2 tip.bundle
1 changesets found
$ hg record -d '5 0' -m binary-change<<EOF
> y
> EOF
diff --git a/tip.bundle b/tip.bundle
this modifies a binary file (all or nothing)
examine changes to 'tip.bundle'? [Ynsfdaq?]
$ hg tip -p
changeset: 5:dccd6f3eb485
tag: tip
user: test
date: Thu Jan 01 00:00:05 1970 +0000
summary: binary-change
diff -r ad816da3711e -r dccd6f3eb485 tip.bundle
Binary file tip.bundle has changed
Rename and change binary file
$ hg mv tip.bundle top.bundle
$ hg bundle --base -2 top.bundle
1 changesets found
$ hg record -d '6 0' -m binary-change-rename<<EOF
> y
> EOF
diff --git a/tip.bundle b/top.bundle
rename from tip.bundle
rename to top.bundle
this modifies a binary file (all or nothing)
examine changes to 'tip.bundle' and 'top.bundle'? [Ynsfdaq?]
$ hg tip -p
changeset: 6:7fa44105f5b3
tag: tip
user: test
date: Thu Jan 01 00:00:06 1970 +0000
summary: binary-change-rename
diff -r dccd6f3eb485 -r 7fa44105f5b3 tip.bundle
Binary file tip.bundle has changed
diff -r dccd6f3eb485 -r 7fa44105f5b3 top.bundle
Binary file top.bundle has changed
Add plain file
$ for i in 1 2 3 4 5 6 7 8 9 10; do
> echo $i >> plain
> done
$ hg add plain
$ hg record -d '7 0' -m plain plain<<EOF
> y
> y
> EOF
diff --git a/plain b/plain
new file mode 100644
examine changes to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 7:11fb457c1be4
tag: tip
user: test
date: Thu Jan 01 00:00:07 1970 +0000
summary: plain
diff -r 7fa44105f5b3 -r 11fb457c1be4 plain
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plain Thu Jan 01 00:00:07 1970 +0000
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
Modify end of plain file
$ echo 11 >> plain
$ hg record -d '8 0' -m end plain <<EOF
> y
> y
> EOF
diff --git a/plain b/plain
1 hunks, 1 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -8,3 +8,4 @@
8
9
10
+11
record this change to 'plain'? [Ynsfdaq?]
Modify end of plain file, no EOL
$ hg tip --template '{node}' >> plain
$ hg record -d '9 0' -m noeol plain <<EOF
> y
> y
> EOF
diff --git a/plain b/plain
1 hunks, 1 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -9,3 +9,4 @@
9
10
11
+7264f99c5f5ff3261504828afa4fb4d406c3af54
\ No newline at end of file
record this change to 'plain'? [Ynsfdaq?]
Modify end of plain file, add EOL
$ echo >> plain
$ hg record -d '10 0' -m eol plain <<EOF
> y
> y
> y
> EOF
diff --git a/plain b/plain
1 hunks, 1 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -9,4 +9,4 @@
9
10
11
-7264f99c5f5ff3261504828afa4fb4d406c3af54
\ No newline at end of file
+7264f99c5f5ff3261504828afa4fb4d406c3af54
record this change to 'plain'? [Ynsfdaq?]
Modify beginning, trim end, record both
$ rm plain
$ for i in 2 2 3 4 5 6 7 8 9 10; do
> echo $i >> plain
> done
$ hg record -d '10 0' -m begin-and-end plain <<EOF
> y
> y
> y
> EOF
diff --git a/plain b/plain
2 hunks, 3 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -1,4 +1,4 @@
-1
+2
2
3
4
record change 1/2 to 'plain'? [Ynsfdaq?]
@@ -8,5 +8,3 @@
8
9
10
-11
-7264f99c5f5ff3261504828afa4fb4d406c3af54
record change 2/2 to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 11:efca65c9b09e
tag: tip
user: test
date: Thu Jan 01 00:00:10 1970 +0000
summary: begin-and-end
diff -r cd07d48e8cbe -r efca65c9b09e plain
--- a/plain Thu Jan 01 00:00:10 1970 +0000
+++ b/plain Thu Jan 01 00:00:10 1970 +0000
@@ -1,4 +1,4 @@
-1
+2
2
3
4
@@ -8,5 +8,3 @@
8
9
10
-11
-7264f99c5f5ff3261504828afa4fb4d406c3af54
Trim beginning, modify end
$ rm plain
> for i in 4 5 6 7 8 9 10.new; do
> echo $i >> plain
> done
Record end
$ hg record -d '11 0' -m end-only plain <<EOF
> y
> n
> y
> EOF
diff --git a/plain b/plain
2 hunks, 4 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -1,9 +1,6 @@
-2
-2
-3
4
5
6
7
8
9
record change 1/2 to 'plain'? [Ynsfdaq?]
@@ -4,7 +1,7 @@
4
5
6
7
8
9
-10
+10.new
record change 2/2 to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 12:7d1e66983c15
tag: tip
user: test
date: Thu Jan 01 00:00:11 1970 +0000
summary: end-only
diff -r efca65c9b09e -r 7d1e66983c15 plain
--- a/plain Thu Jan 01 00:00:10 1970 +0000
+++ b/plain Thu Jan 01 00:00:11 1970 +0000
@@ -7,4 +7,4 @@
7
8
9
-10
+10.new
Record beginning
$ hg record -d '12 0' -m begin-only plain <<EOF
> y
> y
> EOF
diff --git a/plain b/plain
1 hunks, 3 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -1,6 +1,3 @@
-2
-2
-3
4
5
6
record this change to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 13:a09fc62a0e61
tag: tip
user: test
date: Thu Jan 01 00:00:12 1970 +0000
summary: begin-only
diff -r 7d1e66983c15 -r a09fc62a0e61 plain
--- a/plain Thu Jan 01 00:00:11 1970 +0000
+++ b/plain Thu Jan 01 00:00:12 1970 +0000
@@ -1,6 +1,3 @@
-2
-2
-3
4
5
6
Add to beginning, trim from end
$ rm plain
$ for i in 1 2 3 4 5 6 7 8 9; do
> echo $i >> plain
> done
Record end
$ hg record --traceback -d '13 0' -m end-again plain<<EOF
> y
> n
> y
> EOF
diff --git a/plain b/plain
2 hunks, 4 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -1,6 +1,9 @@
+1
+2
+3
4
5
6
7
8
9
record change 1/2 to 'plain'? [Ynsfdaq?]
@@ -1,7 +4,6 @@
4
5
6
7
8
9
-10.new
record change 2/2 to 'plain'? [Ynsfdaq?]
Add to beginning, middle, end
$ rm plain
$ for i in 1 2 3 4 5 5.new 5.reallynew 6 7 8 9 10 11; do
> echo $i >> plain
> done
Record beginning, middle
$ hg record -d '14 0' -m middle-only plain <<EOF
> y
> y
> y
> n
> EOF
diff --git a/plain b/plain
3 hunks, 7 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -1,2 +1,5 @@
+1
+2
+3
4
5
record change 1/3 to 'plain'? [Ynsfdaq?]
@@ -1,6 +4,8 @@
4
5
+5.new
+5.reallynew
6
7
8
9
record change 2/3 to 'plain'? [Ynsfdaq?]
@@ -3,4 +8,6 @@
6
7
8
9
+10
+11
record change 3/3 to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 15:7d137997f3a6
tag: tip
user: test
date: Thu Jan 01 00:00:14 1970 +0000
summary: middle-only
diff -r c0b8e5fb0be6 -r 7d137997f3a6 plain
--- a/plain Thu Jan 01 00:00:13 1970 +0000
+++ b/plain Thu Jan 01 00:00:14 1970 +0000
@@ -1,5 +1,10 @@
+1
+2
+3
4
5
+5.new
+5.reallynew
6
7
8
Record end
$ hg record -d '15 0' -m end-only plain <<EOF
> y
> y
> EOF
diff --git a/plain b/plain
1 hunks, 2 lines changed
examine changes to 'plain'? [Ynsfdaq?]
@@ -9,3 +9,5 @@
7
8
9
+10
+11
record this change to 'plain'? [Ynsfdaq?]
$ hg tip -p
changeset: 16:4959e3ff13eb
tag: tip
user: test
date: Thu Jan 01 00:00:15 1970 +0000
summary: end-only
diff -r 7d137997f3a6 -r 4959e3ff13eb plain
--- a/plain Thu Jan 01 00:00:14 1970 +0000
+++ b/plain Thu Jan 01 00:00:15 1970 +0000
@@ -9,3 +9,5 @@
7
8
9
+10
+11
$ mkdir subdir
$ cd subdir
$ echo a > a
$ hg ci -d '16 0' -Amsubdir
adding subdir/a
$ echo a >> a
$ hg record -d '16 0' -m subdir-change a <<EOF
> y
> y
> EOF
diff --git a/subdir/a b/subdir/a
1 hunks, 1 lines changed
examine changes to 'subdir/a'? [Ynsfdaq?]
@@ -1,1 +1,2 @@
a
+a
record this change to 'subdir/a'? [Ynsfdaq?]
$ hg tip -p
changeset: 18:40698cd490b2
tag: tip
user: test
date: Thu Jan 01 00:00:16 1970 +0000
summary: subdir-change
diff -r 661eacdc08b9 -r 40698cd490b2 subdir/a
--- a/subdir/a Thu Jan 01 00:00:16 1970 +0000
+++ b/subdir/a Thu Jan 01 00:00:16 1970 +0000
@@ -1,1 +1,2 @@
a
+a
$ echo a > f1
$ echo b > f2
$ hg add f1 f2
$ hg ci -mz -d '17 0'
$ echo a >> f1
$ echo b >> f2
Help, quit
$ hg record <<EOF
> ?
> q
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
y - record this change
n - skip this change
s - skip remaining changes to this file
f - record remaining changes to this file
d - done, skip remaining changes and files
a - record all changes to all remaining files
q - quit, recording no changes
? - display help
examine changes to 'subdir/f1'? [Ynsfdaq?]
abort: user quit
[255]
Skip
$ hg record <<EOF
> s
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
diff --git a/subdir/f2 b/subdir/f2
1 hunks, 1 lines changed
examine changes to 'subdir/f2'? [Ynsfdaq?] abort: response expected
[255]
No
$ hg record <<EOF
> n
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
diff --git a/subdir/f2 b/subdir/f2
1 hunks, 1 lines changed
examine changes to 'subdir/f2'? [Ynsfdaq?] abort: response expected
[255]
f, quit
$ hg record <<EOF
> f
> q
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
diff --git a/subdir/f2 b/subdir/f2
1 hunks, 1 lines changed
examine changes to 'subdir/f2'? [Ynsfdaq?]
abort: user quit
[255]
s, all
$ hg record -d '18 0' -mx <<EOF
> s
> a
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
diff --git a/subdir/f2 b/subdir/f2
1 hunks, 1 lines changed
examine changes to 'subdir/f2'? [Ynsfdaq?]
$ hg tip -p
changeset: 20:d2d8c25276a8
tag: tip
user: test
date: Thu Jan 01 00:00:18 1970 +0000
summary: x
diff -r 25eb2a7694fb -r d2d8c25276a8 subdir/f2
--- a/subdir/f2 Thu Jan 01 00:00:17 1970 +0000
+++ b/subdir/f2 Thu Jan 01 00:00:18 1970 +0000
@@ -1,1 +1,2 @@
b
+b
f
$ hg record -d '19 0' -my <<EOF
> f
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
$ hg tip -p
changeset: 21:1013f51ce32f
tag: tip
user: test
date: Thu Jan 01 00:00:19 1970 +0000
summary: y
diff -r d2d8c25276a8 -r 1013f51ce32f subdir/f1
--- a/subdir/f1 Thu Jan 01 00:00:18 1970 +0000
+++ b/subdir/f1 Thu Jan 01 00:00:19 1970 +0000
@@ -1,1 +1,2 @@
a
+a
Preserve chmod +x
$ chmod +x f1
$ echo a >> f1
$ hg record -d '20 0' -mz <<EOF
> y
> y
> y
> EOF
diff --git a/subdir/f1 b/subdir/f1
old mode 100644
new mode 100755
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
@@ -1,2 +1,3 @@
a
a
+a
record this change to 'subdir/f1'? [Ynsfdaq?]
$ hg tip --config diff.git=True -p
changeset: 22:5df857735621
tag: tip
user: test
date: Thu Jan 01 00:00:20 1970 +0000
summary: z
diff --git a/subdir/f1 b/subdir/f1
old mode 100644
new mode 100755
--- a/subdir/f1
+++ b/subdir/f1
@@ -1,2 +1,3 @@
a
a
+a
Preserve execute permission on original
$ echo b >> f1
$ hg record -d '21 0' -maa <<EOF
> y
> y
> y
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
@@ -1,3 +1,4 @@
a
a
a
+b
record this change to 'subdir/f1'? [Ynsfdaq?]
$ hg tip --config diff.git=True -p
changeset: 23:a4ae36a78715
tag: tip
user: test
date: Thu Jan 01 00:00:21 1970 +0000
summary: aa
diff --git a/subdir/f1 b/subdir/f1
--- a/subdir/f1
+++ b/subdir/f1
@@ -1,3 +1,4 @@
a
a
a
+b
Preserve chmod -x
$ chmod -x f1
$ echo c >> f1
$ hg record -d '22 0' -mab <<EOF
> y
> y
> y
> EOF
diff --git a/subdir/f1 b/subdir/f1
old mode 100755
new mode 100644
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
@@ -2,3 +2,4 @@
a
a
b
+c
record this change to 'subdir/f1'? [Ynsfdaq?]
$ hg tip --config diff.git=True -p
changeset: 24:1460f6e47966
tag: tip
user: test
date: Thu Jan 01 00:00:22 1970 +0000
summary: ab
diff --git a/subdir/f1 b/subdir/f1
old mode 100755
new mode 100644
--- a/subdir/f1
+++ b/subdir/f1
@@ -2,3 +2,4 @@
a
a
b
+c
$ cd ..
Abort early when a merge is in progress
$ hg up 4
1 files updated, 0 files merged, 5 files removed, 0 files unresolved
$ touch iwillmergethat
$ hg add iwillmergethat
$ hg branch thatbranch
marked working directory as branch thatbranch
$ hg ci -m'new head'
$ hg up default
5 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg merge thatbranch
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg record -m'will abort'
abort: cannot partially commit a merge (use "hg commit" instead)
[255]
$ hg up -C
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
With win32text
$ echo '[extensions]' >> .hg/hgrc
$ echo 'win32text = ' >> .hg/hgrc
$ echo '[decode]' >> .hg/hgrc
$ echo '** = cleverdecode:' >> .hg/hgrc
$ echo '[encode]' >> .hg/hgrc
$ echo '** = cleverencode:' >> .hg/hgrc
$ echo '[patch]' >> .hg/hgrc
$ echo 'eol = crlf' >> .hg/hgrc
Ignore win32text deprecation warning for now:
$ echo '[win32text]' >> .hg/hgrc
$ echo 'warn = no' >> .hg/hgrc
$ echo d >> subdir/f1
$ hg record -d '23 0' -mw1 <<EOF
> y
> y
> EOF
diff --git a/subdir/f1 b/subdir/f1
1 hunks, 1 lines changed
examine changes to 'subdir/f1'? [Ynsfdaq?]
@@ -3,3 +3,4 @@
a
b
c
+d
record this change to 'subdir/f1'? [Ynsfdaq?]
$ hg tip -p
changeset: 26:5bacc1f6e9cf
tag: tip
parent: 24:1460f6e47966
user: test
date: Thu Jan 01 00:00:23 1970 +0000
summary: w1
diff -r 1460f6e47966 -r 5bacc1f6e9cf subdir/f1
--- a/subdir/f1 Thu Jan 01 00:00:22 1970 +0000
+++ b/subdir/f1 Thu Jan 01 00:00:23 1970 +0000
@@ -3,3 +3,4 @@
a
b
c
+d