author | Matt Harbison <matt_harbison@yahoo.com> |
Wed, 14 Aug 2024 03:25:16 -0400 | |
changeset 51801 | 62b25293b620 |
parent 51743 | 55677d115045 |
child 51863 | f4733654f144 |
permissions | -rw-r--r-- |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36588
diff
changeset
|
1 |
# util.py - Mercurial utility functions relative to dates |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 |
# |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36588
diff
changeset
|
3 |
# Copyright 2018 Boris Feld <boris.feld@octobus.net> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 |
# |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
10263 | 6 |
# GNU General Public License version 2 or any later version. |
1082 | 7 |
|
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
8 |
|
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
9 |
import calendar |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
10 |
import datetime |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
11 |
import time |
3769 | 12 |
|
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
13 |
from typing import ( |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
14 |
Callable, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
15 |
Dict, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
16 |
Iterable, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
17 |
Optional, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
18 |
Tuple, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
19 |
Union, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
20 |
) |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
21 |
|
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36588
diff
changeset
|
22 |
from ..i18n import _ |
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36588
diff
changeset
|
23 |
from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
24 |
encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
25 |
error, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
26 |
pycompat, |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
27 |
) |
3769 | 28 |
|
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
29 |
# keeps pyflakes happy |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
30 |
assert [ |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
31 |
Callable, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
32 |
Dict, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
33 |
Iterable, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
34 |
Optional, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
35 |
Tuple, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
36 |
Union, |
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
37 |
] |
46641
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
38 |
|
51285
9d3721552b6c
pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50752
diff
changeset
|
39 |
hgdate = Tuple[float, int] # (unixtime, offset) |
46641
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
40 |
|
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
41 |
# used by parsedate |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
42 |
defaultdateformats = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
43 |
b'%Y-%m-%dT%H:%M:%S', # the 'real' ISO8601 |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
44 |
b'%Y-%m-%dT%H:%M', # without seconds |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
45 |
b'%Y-%m-%dT%H%M%S', # another awful but legal variant without : |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
46 |
b'%Y-%m-%dT%H%M', # without seconds |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
47 |
b'%Y-%m-%d %H:%M:%S', # our common legal variant |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
48 |
b'%Y-%m-%d %H:%M', # without seconds |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
49 |
b'%Y-%m-%d %H%M%S', # without : |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
50 |
b'%Y-%m-%d %H%M', # without seconds |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
51 |
b'%Y-%m-%d %I:%M:%S%p', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
52 |
b'%Y-%m-%d %H:%M', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
53 |
b'%Y-%m-%d %I:%M%p', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
54 |
b'%Y-%m-%d', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
55 |
b'%m-%d', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
56 |
b'%m/%d', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 |
b'%m/%d/%y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 |
b'%m/%d/%Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
59 |
b'%a %b %d %H:%M:%S %Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
60 |
b'%a %b %d %I:%M:%S%p %Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
61 |
b'%a, %d %b %Y %H:%M:%S', # GNU coreutils "/bin/date --rfc-2822" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
62 |
b'%b %d %H:%M:%S %Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
63 |
b'%b %d %I:%M:%S%p %Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
64 |
b'%b %d %H:%M:%S', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
65 |
b'%b %d %I:%M:%S%p', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
66 |
b'%b %d %H:%M', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
67 |
b'%b %d %I:%M%p', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
68 |
b'%b %d %Y', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
69 |
b'%b %d', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
70 |
b'%H:%M:%S', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 |
b'%I:%M:%S%p', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
72 |
b'%H:%M', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 |
b'%I:%M%p', |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
74 |
) |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
75 |
|
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
76 |
extendeddateformats = defaultdateformats + ( |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
77 |
b"%Y", |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
78 |
b"%Y-%m", |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
79 |
b"%b", |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
80 |
b"%b %Y", |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
81 |
) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
82 |
|
36362
01e29e885600
util: add a file object proxy that can read at most N bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36266
diff
changeset
|
83 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
84 |
def makedate(timestamp: Optional[float] = None) -> hgdate: |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
85 |
"""Return a unix timestamp (or the current time) as a (unixtime, |
51743
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
86 |
offset) tuple based off the local timezone. |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
87 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
88 |
>>> import os, time |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
89 |
>>> os.environ['TZ'] = 'Asia/Novokuznetsk' |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
90 |
>>> time.tzset() |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
91 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
92 |
>>> def dtu(*a): |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
93 |
... return datetime.datetime(*a, tzinfo=datetime.timezone.utc) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
94 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
95 |
# Old winter timezone, +7 |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
96 |
>>> makedate(dtu(2010, 1, 1, 5, 0, 0).timestamp()) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
97 |
(1262322000.0, -25200) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
98 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
99 |
# Same timezone in summer, +7, so no DST |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
100 |
>>> makedate(dtu(2010, 7, 1, 5, 0, 0).timestamp()) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
101 |
(1277960400.0, -25200) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
102 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
103 |
# Changing to new winter timezone, from +7 to +6 (ae04af1ce78d testcase) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
104 |
>>> makedate(dtu(2010, 10, 30, 20, 0, 0).timestamp() - 1) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
105 |
(1288468799.0, -25200) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
106 |
>>> makedate(dtu(2010, 10, 30, 20, 0, 0).timestamp()) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
107 |
(1288468800.0, -21600) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
108 |
>>> makedate(dtu(2011, 1, 1, 5, 0, 0).timestamp()) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
109 |
(1293858000.0, -21600) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
110 |
|
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
111 |
# Introducing DST, changing +6 to +7 |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
112 |
>>> makedate(dtu(2011, 3, 26, 20, 0, 0).timestamp() - 1) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
113 |
(1301169599.0, -21600) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
114 |
>>> makedate(dtu(2011, 3, 26, 20, 0, 0).timestamp()) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
115 |
(1301169600.0, -25200) |
55677d115045
utils: test coverage of makedate
Mads Kiilerich <mads@kiilerich.com>
parents:
51287
diff
changeset
|
116 |
""" |
19287
8b04e1344111
util: add an optional timestamp parameter to makedate
Bryan O'Sullivan <bryano@fb.com>
parents:
19286
diff
changeset
|
117 |
if timestamp is None: |
8b04e1344111
util: add an optional timestamp parameter to makedate
Bryan O'Sullivan <bryano@fb.com>
parents:
19286
diff
changeset
|
118 |
timestamp = time.time() |
19286
78501209488a
util: rename ct variable in makedate to timestamp
Bryan O'Sullivan <bryano@fb.com>
parents:
19211
diff
changeset
|
119 |
if timestamp < 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
120 |
hint = _(b"check your clock") |
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
121 |
raise error.InputError( |
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
122 |
_(b"negative timestamp: %d") % timestamp, hint=hint |
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
123 |
) |
50752
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
124 |
tz = round( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
125 |
timestamp |
50752
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
126 |
- datetime.datetime.fromtimestamp( |
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
127 |
timestamp, |
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
128 |
) |
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
129 |
.replace(tzinfo=datetime.timezone.utc) |
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
130 |
.timestamp() |
faccec1edc2c
utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
Mads Kiilerich <mads@kiilerich.com>
parents:
48875
diff
changeset
|
131 |
) |
19286
78501209488a
util: rename ct variable in makedate to timestamp
Bryan O'Sullivan <bryano@fb.com>
parents:
19211
diff
changeset
|
132 |
return timestamp, tz |
1329
8f06817bf266
Allow files to be opened in text mode, even on Windows.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1321
diff
changeset
|
133 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
134 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
135 |
def datestr( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
136 |
date: Optional[hgdate] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
137 |
format: bytes = b'%a %b %d %H:%M:%S %Y %1%2', |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
138 |
) -> bytes: |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
139 |
"""represent a (unixtime, offset) tuple as a localized time. |
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
140 |
unixtime is seconds since the epoch, and offset is the time zone's |
28865
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
141 |
number of seconds away from UTC. |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
142 |
|
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
143 |
>>> datestr((0, 0)) |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
144 |
'Thu Jan 01 00:00:00 1970 +0000' |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
145 |
>>> datestr((42, 0)) |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
146 |
'Thu Jan 01 00:00:42 1970 +0000' |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
147 |
>>> datestr((-42, 0)) |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
148 |
'Wed Dec 31 23:59:18 1969 +0000' |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
149 |
>>> datestr((0x7fffffff, 0)) |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
150 |
'Tue Jan 19 03:14:07 2038 +0000' |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
151 |
>>> datestr((-0x80000000, 0)) |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
152 |
'Fri Dec 13 20:45:52 1901 +0000' |
16255662446d
util: add doctest to datestr()
Adrian Buehlmann <adrian@cadifra.com>
parents:
28864
diff
changeset
|
153 |
""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
154 |
t, tz = date or makedate() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
155 |
if b"%1" in format or b"%2" in format or b"%z" in format: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
156 |
sign = (tz > 0) and b"-" or b"+" |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8938
diff
changeset
|
157 |
minutes = abs(tz) // 60 |
27066
6f1f8e88f036
util.datestr: use divmod()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27016
diff
changeset
|
158 |
q, r = divmod(minutes, 60) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 |
format = format.replace(b"%z", b"%1%2") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
160 |
format = format.replace(b"%1", b"%c%02d" % (sign, q)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
161 |
format = format.replace(b"%2", b"%02d" % r) |
28825
87c6ad2251d8
date: reallow negative timestamp, fix for Windows buggy gmtime() (issue2513)
Florent Gallaire <fgallaire@gmail.com>
parents:
28818
diff
changeset
|
162 |
d = t - tz |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
163 |
if d > 0x7FFFFFFF: |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
164 |
d = 0x7FFFFFFF |
28864
b0811a9fe67c
date: fix boundary check of negative integer
Florent Gallaire <fgallaire@gmail.com>
parents:
28835
diff
changeset
|
165 |
elif d < -0x80000000: |
b0811a9fe67c
date: fix boundary check of negative integer
Florent Gallaire <fgallaire@gmail.com>
parents:
28835
diff
changeset
|
166 |
d = -0x80000000 |
28825
87c6ad2251d8
date: reallow negative timestamp, fix for Windows buggy gmtime() (issue2513)
Florent Gallaire <fgallaire@gmail.com>
parents:
28818
diff
changeset
|
167 |
# Never use time.gmtime() and datetime.datetime.fromtimestamp() |
87c6ad2251d8
date: reallow negative timestamp, fix for Windows buggy gmtime() (issue2513)
Florent Gallaire <fgallaire@gmail.com>
parents:
28818
diff
changeset
|
168 |
# because they use the gmtime() system call which is buggy on Windows |
87c6ad2251d8
date: reallow negative timestamp, fix for Windows buggy gmtime() (issue2513)
Florent Gallaire <fgallaire@gmail.com>
parents:
28818
diff
changeset
|
169 |
# for negative values. |
87c6ad2251d8
date: reallow negative timestamp, fix for Windows buggy gmtime() (issue2513)
Florent Gallaire <fgallaire@gmail.com>
parents:
28818
diff
changeset
|
170 |
t = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=d) |
31449
756175623f2e
py3: call strftime() with native str type
Yuya Nishihara <yuya@tcha.org>
parents:
31448
diff
changeset
|
171 |
s = encoding.strtolocal(t.strftime(encoding.strfromlocal(format))) |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
172 |
return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
173 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
174 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
175 |
def shortdate(date: Optional[hgdate] = None) -> bytes: |
6134
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
176 |
"""turn (timestamp, tzoff) tuple into iso 8631 date.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
177 |
return datestr(date, format=b'%Y-%m-%d') |
6134
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
178 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
179 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
180 |
def parsetimezone(s: bytes) -> Tuple[Optional[int], bytes]: |
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
181 |
"""find a trailing timezone, if any, in string, and return a |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43781
diff
changeset
|
182 |
(offset, remainder) pair""" |
36551
98d4c642d7f2
py3: fix string slicing in util.parsetimezone()
Yuya Nishihara <yuya@tcha.org>
parents:
36539
diff
changeset
|
183 |
s = pycompat.bytestr(s) |
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
184 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 |
if s.endswith(b"GMT") or s.endswith(b"UTC"): |
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
186 |
return 0, s[:-3].rstrip() |
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
187 |
|
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
188 |
# Unix-style timezones [+-]hhmm |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
189 |
if len(s) >= 5 and s[-5] in b"+-" and s[-4:].isdigit(): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
190 |
sign = (s[-5] == b"+") and 1 or -1 |
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
191 |
hours = int(s[-4:-2]) |
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
192 |
minutes = int(s[-2:]) |
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
193 |
return -sign * (hours * 60 + minutes) * 60, s[:-5].rstrip() |
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
194 |
|
29637
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
195 |
# ISO8601 trailing Z |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 |
if s.endswith(b"Z") and s[-2:-1].isdigit(): |
29637
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
197 |
return 0, s[:-1] |
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
198 |
|
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
199 |
# ISO8601-style [+-]hh:mm |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
200 |
if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
201 |
len(s) >= 6 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
202 |
and s[-6] in b"+-" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 |
and s[-3] == b":" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
204 |
and s[-5:-3].isdigit() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
205 |
and s[-2:].isdigit() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
206 |
): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 |
sign = (s[-6] == b"+") and 1 or -1 |
29637
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
208 |
hours = int(s[-5:-3]) |
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
209 |
minutes = int(s[-2:]) |
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
210 |
return -sign * (hours * 60 + minutes) * 60, s[:-6] |
46b2ccce7fde
date: parse ISO-style Z and +hh:mm timezone specs
Matt Mackall <mpm@selenic.com>
parents:
29636
diff
changeset
|
211 |
|
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
212 |
return None, s |
26126
7b625baed995
util: extract function that parses timezone string
Yuya Nishihara <yuya@tcha.org>
parents:
26098
diff
changeset
|
213 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
214 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
215 |
def strdate( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
216 |
string: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
217 |
format: bytes, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
218 |
defaults: Optional[Dict[bytes, Tuple[bytes, bytes]]] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
219 |
) -> hgdate: |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
220 |
"""parse a localized time string and return a (unixtime, offset) tuple. |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
221 |
if the string cannot be parsed, ValueError is raised.""" |
31465
da83f12d7a88
util: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31453
diff
changeset
|
222 |
if defaults is None: |
da83f12d7a88
util: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31453
diff
changeset
|
223 |
defaults = {} |
31393
8b6927eb7efd
util: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31368
diff
changeset
|
224 |
|
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
225 |
# NOTE: unixtime = localunixtime + offset |
29636
84ef4517de03
date: refactor timezone parsing
Matt Mackall <mpm@selenic.com>
parents:
29613
diff
changeset
|
226 |
offset, date = parsetimezone(string) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
227 |
|
3812 | 228 |
# add missing elements from defaults |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
229 |
usenow = False # default to using biased defaults |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
230 |
for part in ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
231 |
b"S", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
232 |
b"M", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 |
b"HI", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
234 |
b"d", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
235 |
b"mb", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
236 |
b"yY", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
237 |
): # decreasing specificity |
32154
52e222eef646
py3: use pycompat.bytestr instead of bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32153
diff
changeset
|
238 |
part = pycompat.bytestr(part) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
239 |
found = [True for p in part if (b"%" + p) in format] |
3812 | 240 |
if not found: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 |
date += b"@" + defaults[part][usenow] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
242 |
format += b"@%" + part[0] |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
243 |
else: |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
244 |
# We've found a specific time element, less specific time |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
245 |
# elements are relative to today |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
246 |
usenow = True |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
247 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
248 |
timetuple = time.strptime( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
249 |
encoding.strfromlocal(date), encoding.strfromlocal(format) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
250 |
) |
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
251 |
localunixtime = int(calendar.timegm(timetuple)) |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
252 |
if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
253 |
# local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
254 |
unixtime = int(time.mktime(timetuple)) |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
255 |
offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
256 |
else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
257 |
unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
258 |
return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
259 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
260 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
261 |
def parsedate( |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
262 |
date: Union[bytes, hgdate], |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
263 |
formats: Optional[Iterable[bytes]] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
264 |
bias: Optional[Dict[bytes, bytes]] = None, |
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
265 |
) -> hgdate: |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
266 |
"""parse a localized date/time and return a (unixtime, offset) tuple. |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
267 |
|
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
268 |
The date may be a "unixtime offset" string or in one of the specified |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
269 |
formats. If the date already is a (unixtime, offset) tuple, it is returned. |
18537
ae60735e37d2
dates: support 'today' and 'yesterday' in parsedate (issue3764)
Paul Cavallaro <ptc@fb.com>
parents:
18326
diff
changeset
|
270 |
|
34362
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
271 |
>>> parsedate(b' today ') == parsedate( |
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
272 |
... datetime.date.today().strftime('%b %d').encode('ascii')) |
18537
ae60735e37d2
dates: support 'today' and 'yesterday' in parsedate (issue3764)
Paul Cavallaro <ptc@fb.com>
parents:
18326
diff
changeset
|
273 |
True |
34362
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
274 |
>>> parsedate(b'yesterday ') == parsedate( |
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
275 |
... (datetime.date.today() - datetime.timedelta(days=1) |
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
276 |
... ).strftime('%b %d').encode('ascii')) |
18537
ae60735e37d2
dates: support 'today' and 'yesterday' in parsedate (issue3764)
Paul Cavallaro <ptc@fb.com>
parents:
18326
diff
changeset
|
277 |
True |
18614
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
278 |
>>> now, tz = makedate() |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
279 |
>>> strnow, strtz = parsedate(b'now') |
18614
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
280 |
>>> (strnow - now) < 1 |
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
281 |
True |
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
282 |
>>> tz == strtz |
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
283 |
True |
43781
b65bd4b61d78
dateutil: correct default for Ymd in parsedate
Jun Wu <quark@fb.com>
parents:
43506
diff
changeset
|
284 |
>>> parsedate(b'2000 UTC', formats=extendeddateformats) |
b65bd4b61d78
dateutil: correct default for Ymd in parsedate
Jun Wu <quark@fb.com>
parents:
43506
diff
changeset
|
285 |
(946684800, 0) |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
286 |
""" |
26311
60dd8e3977f0
util: avoid mutable default arguments
Siddharth Agarwal <sid0@fb.com>
parents:
26267
diff
changeset
|
287 |
if bias is None: |
60dd8e3977f0
util: avoid mutable default arguments
Siddharth Agarwal <sid0@fb.com>
parents:
26267
diff
changeset
|
288 |
bias = {} |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
289 |
if not date: |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
290 |
return 0, 0 |
46641
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
291 |
if isinstance(date, tuple): |
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
292 |
if len(date) == 2: |
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
293 |
return date |
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
294 |
else: |
15c2f9220ae8
typing: add type annotations to mercurial/utils/dateutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46419
diff
changeset
|
295 |
raise error.ProgrammingError(b"invalid date format") |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
296 |
if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
297 |
formats = defaultdateformats |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
298 |
date = date.strip() |
18537
ae60735e37d2
dates: support 'today' and 'yesterday' in parsedate (issue3764)
Paul Cavallaro <ptc@fb.com>
parents:
18326
diff
changeset
|
299 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
300 |
if date == b'now' or date == _(b'now'): |
18614
b2586e2cc67a
parsedate: understand "now" as a shortcut for the current time
Augie Fackler <raf@durin42.com>
parents:
18603
diff
changeset
|
301 |
return makedate() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
302 |
if date == b'today' or date == _(b'today'): |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
303 |
date = datetime.date.today().strftime('%b %d') |
34362
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
304 |
date = encoding.strtolocal(date) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
305 |
elif date == b'yesterday' or date == _(b'yesterday'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
306 |
date = (datetime.date.today() - datetime.timedelta(days=1)).strftime( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
307 |
r'%b %d' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
308 |
) |
34362
b76937fafe8a
py3: work around bytes/unicode divergence in parsedate()
Yuya Nishihara <yuya@tcha.org>
parents:
34361
diff
changeset
|
309 |
date = encoding.strtolocal(date) |
18537
ae60735e37d2
dates: support 'today' and 'yesterday' in parsedate (issue3764)
Paul Cavallaro <ptc@fb.com>
parents:
18326
diff
changeset
|
310 |
|
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
311 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
312 |
when, offset = map(int, date.split(b' ')) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
313 |
except ValueError: |
3812 | 314 |
# fill out defaults |
315 |
now = makedate() |
|
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
316 |
defaults = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
317 |
for part in (b"d", b"mb", b"yY", b"HI", b"M", b"S"): |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
318 |
# this piece is for rounding the specific end of unknowns |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
319 |
b = bias.get(part) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
320 |
if b is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
321 |
if part[0:1] in b"HMS": |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
322 |
b = b"00" |
3812 | 323 |
else: |
43781
b65bd4b61d78
dateutil: correct default for Ymd in parsedate
Jun Wu <quark@fb.com>
parents:
43506
diff
changeset
|
324 |
# year, month, and day start from 1 |
b65bd4b61d78
dateutil: correct default for Ymd in parsedate
Jun Wu <quark@fb.com>
parents:
43506
diff
changeset
|
325 |
b = b"1" |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
326 |
|
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
327 |
# this piece is for matching the generic end to today's date |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
328 |
n = datestr(now, b"%" + part[0:1]) |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
329 |
|
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
330 |
defaults[part] = (b, n) |
3812 | 331 |
|
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
332 |
for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
333 |
try: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
334 |
when, offset = strdate(date, format, defaults) |
6087
12856a1742dc
better handle errors with date parsing (issue983)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5917
diff
changeset
|
335 |
except (ValueError, OverflowError): |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
336 |
pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
337 |
else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
338 |
break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
339 |
else: |
36539
0c2eeaca0577
util: use pycompat.bytestr() on repr() in date parse abort
Augie Fackler <augie@google.com>
parents:
36525
diff
changeset
|
340 |
raise error.ParseError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
341 |
_(b'invalid date: %r') % pycompat.bytestr(date) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
342 |
) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
343 |
# validate explicit (probably user-specified) date and |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
344 |
# time zone offset. values must fit in signed 32 bits for |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
345 |
# current 32-bit linux runtimes. timezones go from UTC-12 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
346 |
# to UTC+14 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
347 |
if when < -0x80000000 or when > 0x7FFFFFFF: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 |
raise error.ParseError(_(b'date exceeds 32 bits: %d') % when) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
349 |
if offset < -50400 or offset > 43200: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
350 |
raise error.ParseError(_(b'impossible time zone offset: %d') % offset) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
351 |
return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
352 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
353 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
354 |
def matchdate(date: bytes) -> Callable[[float], bool]: |
3812 | 355 |
"""Return a function that matches a given date match specifier |
356 |
||
357 |
Formats include: |
|
358 |
||
359 |
'{date}' match a given date to the accuracy provided |
|
360 |
||
361 |
'<{date}' on or before a given date |
|
362 |
||
363 |
'>{date}' on or after a given date |
|
364 |
||
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
365 |
>>> p1 = parsedate(b"10:29:59") |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
366 |
>>> p2 = parsedate(b"10:30:00") |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
367 |
>>> p3 = parsedate(b"10:30:59") |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
368 |
>>> p4 = parsedate(b"10:31:00") |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
369 |
>>> p5 = parsedate(b"Sep 15 10:30:00 1999") |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
370 |
>>> f = matchdate(b"10:30") |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
371 |
>>> f(p1[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
372 |
False |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
373 |
>>> f(p2[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
374 |
True |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
375 |
>>> f(p3[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
376 |
True |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
377 |
>>> f(p4[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
378 |
False |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
379 |
>>> f(p5[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
380 |
False |
3812 | 381 |
""" |
382 |
||
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
383 |
def lower(date: bytes) -> float: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
384 |
d = {b'mb': b"1", b'd': b"1"} |
6230
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
385 |
return parsedate(date, extendeddateformats, d)[0] |
3812 | 386 |
|
51287
f15cb5111a1e
pytype: move some type comment to proper annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51285
diff
changeset
|
387 |
def upper(date: bytes) -> float: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
388 |
d = {b'mb': b"12", b'HI': b"23", b'M': b"59", b'S': b"59"} |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
389 |
for days in (b"31", b"30", b"29"): |
3812 | 390 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
391 |
d[b"d"] = days |
3812 | 392 |
return parsedate(date, extendeddateformats, d)[0] |
36234 | 393 |
except error.ParseError: |
3812 | 394 |
pass |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 |
d[b"d"] = b"28" |
3812 | 396 |
return parsedate(date, extendeddateformats, d)[0] |
397 |
||
7953
8c6f823efcc9
Correct a bug on date formats with '>' or '<' accompanied by space characters.
Justin Peng <justin.peng.sw@gmail.com>
parents:
7948
diff
changeset
|
398 |
date = date.strip() |
13780
bc7b5d1c1999
util: dates cannot consist entirely of whitespace (issue2732)
Idan Kamara <idankk86@gmail.com>
parents:
13734
diff
changeset
|
399 |
|
bc7b5d1c1999
util: dates cannot consist entirely of whitespace (issue2732)
Idan Kamara <idankk86@gmail.com>
parents:
13734
diff
changeset
|
400 |
if not date: |
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
401 |
raise error.InputError( |
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
402 |
_(b"dates cannot consist entirely of whitespace") |
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
403 |
) |
40256 | 404 |
elif date[0:1] == b"<": |
13869
b470894c33f8
date: fixup breakage from ">" fix
Matt Mackall <mpm@selenic.com>
parents:
13867
diff
changeset
|
405 |
if not date[1:]: |
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
406 |
raise error.InputError(_(b"invalid day spec, use '<DATE'")) |
3812 | 407 |
when = upper(date[1:]) |
408 |
return lambda x: x <= when |
|
40256 | 409 |
elif date[0:1] == b">": |
13869
b470894c33f8
date: fixup breakage from ">" fix
Matt Mackall <mpm@selenic.com>
parents:
13867
diff
changeset
|
410 |
if not date[1:]: |
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
411 |
raise error.InputError(_(b"invalid day spec, use '>DATE'")) |
3812 | 412 |
when = lower(date[1:]) |
413 |
return lambda x: x >= when |
|
40256 | 414 |
elif date[0:1] == b"-": |
3812 | 415 |
try: |
416 |
days = int(date[1:]) |
|
417 |
except ValueError: |
|
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
418 |
raise error.InputError(_(b"invalid day spec: %s") % date[1:]) |
13889
9a96efc4af8a
util: make 'hg log -d --2' abort (issue2734)
Yun Lee <yunlee.bj@gmail.com>
parents:
13886
diff
changeset
|
419 |
if days < 0: |
46419
6894c9ef4dcd
errors: use InputError for incorrectly formatted dates
Martin von Zweigbergk <martinvonz@google.com>
parents:
45942
diff
changeset
|
420 |
raise error.InputError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 |
_(b"%s must be nonnegative (see 'hg help dates')") % date[1:] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40256
diff
changeset
|
422 |
) |
3812 | 423 |
when = makedate()[0] - days * 3600 * 24 |
3813 | 424 |
return lambda x: x >= when |
40256 | 425 |
elif b" to " in date: |
426 |
a, b = date.split(b" to ") |
|
3812 | 427 |
start, stop = lower(a), upper(b) |
428 |
return lambda x: x >= start and x <= stop |
|
429 |
else: |
|
430 |
start, stop = lower(date), upper(date) |
|
431 |
return lambda x: x >= start and x <= stop |