histedit: delete histedit statefile on any exception during abort
When an user aborts a histedit, many things could go wrong. At a minimum, after
a histedit abort failure, their repository should be out of that state. We've
found situations where the user could not exit the histedit state without
manually deleting the histedit state file. This patch ensures that if any
exception happens during an abort, the histedit statefile will be deleted so
that users are out of the histedit state and can at least manually get the repo
back to a workable condition.
This runs with TZ="GMT"
$ hg init
$ echo "test-parse-date" > a
$ hg add a
$ hg ci -d "2006-02-01 13:00:30" -m "rev 0"
$ echo "hi!" >> a
$ hg ci -d "2006-02-01 13:00:30 -0500" -m "rev 1"
$ hg tag -d "2006-04-15 13:30" "Hi"
$ hg backout --merge -d "2006-04-15 13:30 +0200" -m "rev 3" 1
reverting a
created new head
changeset 3:107ce1ee2b43 backs out changeset 1:25a1420a55f8
merging with changeset 3:107ce1ee2b43
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -d "1150000000 14400" -m "rev 4 (merge)"
$ echo "fail" >> a
$ hg ci -d "should fail" -m "fail"
abort: invalid date: 'should fail'
[255]
$ hg ci -d "100000000000000000 1400" -m "fail"
abort: date exceeds 32 bits: 100000000000000000
[255]
$ hg ci -d "100000 1400000" -m "fail"
abort: impossible time zone offset: 1400000
[255]
Check with local timezone other than GMT and with DST
$ TZ="PST+8PDT"
$ export TZ
PST=UTC-8 / PDT=UTC-7
$ hg debugrebuildstate
$ echo "a" > a
$ hg ci -d "2006-07-15 13:30" -m "summer@UTC-7"
$ hg debugrebuildstate
$ echo "b" > a
$ hg ci -d "2006-07-15 13:30 +0500" -m "summer@UTC+5"
$ hg debugrebuildstate
$ echo "c" > a
$ hg ci -d "2006-01-15 13:30" -m "winter@UTC-8"
$ hg debugrebuildstate
$ echo "d" > a
$ hg ci -d "2006-01-15 13:30 +0500" -m "winter@UTC+5"
$ hg log --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
Test issue1014 (fractional timezones)
$ hg debugdate "1000000000 -16200" # 0430
internal: 1000000000 -16200
standard: Sun Sep 09 06:16:40 2001 +0430
$ hg debugdate "1000000000 -15300" # 0415
internal: 1000000000 -15300
standard: Sun Sep 09 06:01:40 2001 +0415
$ hg debugdate "1000000000 -14400" # 0400
internal: 1000000000 -14400
standard: Sun Sep 09 05:46:40 2001 +0400
$ hg debugdate "1000000000 0" # GMT
internal: 1000000000 0
standard: Sun Sep 09 01:46:40 2001 +0000
$ hg debugdate "1000000000 14400" # -0400
internal: 1000000000 14400
standard: Sat Sep 08 21:46:40 2001 -0400
$ hg debugdate "1000000000 15300" # -0415
internal: 1000000000 15300
standard: Sat Sep 08 21:31:40 2001 -0415
$ hg debugdate "1000000000 16200" # -0430
internal: 1000000000 16200
standard: Sat Sep 08 21:16:40 2001 -0430
$ hg debugdate "Sat Sep 08 21:16:40 2001 +0430"
internal: 999967600 -16200
standard: Sat Sep 08 21:16:40 2001 +0430
$ hg debugdate "Sat Sep 08 21:16:40 2001 -0430"
internal: 1000000000 16200
standard: Sat Sep 08 21:16:40 2001 -0430
Test 12-hours times
$ hg debugdate "2006-02-01 1:00:30PM +0000"
internal: 1138798830 0
standard: Wed Feb 01 13:00:30 2006 +0000
$ hg debugdate "1:00:30PM" > /dev/null
Normal range
$ hg log -d -1
Negative range
$ hg log -d "--2"
abort: -2 must be nonnegative (see "hg help dates")
[255]
Whitespace only
$ hg log -d " "
abort: dates cannot consist entirely of whitespace
[255]
Test date formats with '>' or '<' accompanied by space characters
$ hg log -d '>' --template '{date|date}\n'
abort: invalid day spec, use '>DATE'
[255]
$ hg log -d '<' --template '{date|date}\n'
abort: invalid day spec, use '<DATE'
[255]
$ hg log -d ' >' --template '{date|date}\n'
abort: invalid day spec, use '>DATE'
[255]
$ hg log -d ' <' --template '{date|date}\n'
abort: invalid day spec, use '<DATE'
[255]
$ hg log -d '> ' --template '{date|date}\n'
abort: invalid day spec, use '>DATE'
[255]
$ hg log -d '< ' --template '{date|date}\n'
abort: invalid day spec, use '<DATE'
[255]
$ hg log -d ' > ' --template '{date|date}\n'
abort: invalid day spec, use '>DATE'
[255]
$ hg log -d ' < ' --template '{date|date}\n'
abort: invalid day spec, use '<DATE'
[255]
$ hg log -d '>02/01' --template '{date|date}\n'
$ hg log -d '<02/01' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d ' >02/01' --template '{date|date}\n'
$ hg log -d ' <02/01' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d '> 02/01' --template '{date|date}\n'
$ hg log -d '< 02/01' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d ' > 02/01' --template '{date|date}\n'
$ hg log -d ' < 02/01' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d '>02/01 ' --template '{date|date}\n'
$ hg log -d '<02/01 ' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d ' >02/01 ' --template '{date|date}\n'
$ hg log -d ' <02/01 ' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d '> 02/01 ' --template '{date|date}\n'
$ hg log -d '< 02/01 ' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
$ hg log -d ' > 02/01 ' --template '{date|date}\n'
$ hg log -d ' < 02/01 ' --template '{date|date}\n'
Sun Jan 15 13:30:00 2006 +0500
Sun Jan 15 13:30:00 2006 -0800
Sat Jul 15 13:30:00 2006 +0500
Sat Jul 15 13:30:00 2006 -0700
Sun Jun 11 00:26:40 2006 -0400
Sat Apr 15 13:30:00 2006 +0200
Sat Apr 15 13:30:00 2006 +0000
Wed Feb 01 13:00:30 2006 -0500
Wed Feb 01 13:00:30 2006 +0000
Test issue 3764 (interpreting 'today' and 'yesterday')
$ echo "hello" >> a
>>> import datetime
>>> today = datetime.date.today().strftime("%b %d")
>>> yesterday = (datetime.date.today() - datetime.timedelta(days=1)).strftime("%b %d")
>>> dates = open('dates', 'w')
>>> dates.write(today + '\n')
>>> dates.write(yesterday + '\n')
>>> dates.close()
$ hg ci -d "`sed -n '1p' dates`" -m "today is a good day to code"
$ hg log -d today --template '{desc}\n'
today is a good day to code
$ echo "goodbye" >> a
$ hg ci -d "`sed -n '2p' dates`" -m "the time traveler's code"
$ hg log -d yesterday --template '{desc}\n'
the time traveler's code
$ echo "foo" >> a
$ hg commit -d now -m 'Explicitly committed now.'
$ hg log -d today --template '{desc}\n'
Explicitly committed now.
today is a good day to code