o ]Lb6.@sddlmZmZddlZddlZddlZddlmZddlm Z m Z m Z e j r=ddl mZmZmZmZmZmZeeefZdZedZdd d Zdd d ZdddZddZdddZdddZddZdS))absolute_importprint_functionN)_)encodingerrorpycompat)CallableDictIterableOptionalTupleUnion)s%Y-%m-%dT%H:%M:%Ss%Y-%m-%dT%H:%Ms%Y-%m-%dT%H%M%Ss %Y-%m-%dT%H%Ms%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%Ms%Y-%m-%d %H%M%Ss %Y-%m-%d %H%Ms%Y-%m-%d %I:%M:%S%prs%Y-%m-%d %I:%M%p%Y-%m-%ds%m-%ds%m/%ds%m/%d/%ys%m/%d/%Ys%a %b %d %H:%M:%S %Ys%a %b %d %I:%M:%S%p %Ys%a, %d %b %Y %H:%M:%Ss%b %d %H:%M:%S %Ys%b %d %I:%M:%S%p %Ys%b %d %H:%M:%Ss%b %d %I:%M:%S%ps %b %d %H:%Ms %b %d %I:%M%ps%b %d %Ys%b %ds%H:%M:%Ss %I:%M:%S%ps%H:%Ms%I:%M%p)s%Ys%Y-%ms%bs%b %YcCsf|durt}|dkrtd}tjtd||dtj|tj|}|jd|j}||fS)zmReturn a unix timestamp (or the current time) as a (unixtime, offset) tuple based off the local timezone.Nrscheck your clocksnegative timestamp: %d)hintiQ) timerr InputErrordatetimeutcfromtimestamp fromtimestampdaysseconds) timestamprdeltatzr:/usr/lib/python3/dist-packages/mercurial/utils/dateutil.pymakedateLs  r%a %b %d %H:%M:%S %Y %1%2c Cs|pt\}}d|vsd|vsd|vr@|dkrdpd}t|d}t|d\}}|dd}|dd ||f}|dd |}||}|d krKd }n|d krQd }td ddtj|d}t|t |} | S)arepresent a (unixtime, offset) tuple as a localized time. unixtime is seconds since the epoch, and offset is the time zone's number of seconds away from UTC. >>> datestr((0, 0)) 'Thu Jan 01 00:00:00 1970 +0000' >>> datestr((42, 0)) 'Thu Jan 01 00:00:42 1970 +0000' >>> datestr((-42, 0)) 'Wed Dec 31 23:59:18 1969 +0000' >>> datestr((0x7fffffff, 0)) 'Tue Jan 19 03:14:07 2038 +0000' >>> datestr((-0x80000000, 0)) 'Fri Dec 13 20:45:52 1901 +0000' s%1s%2s%zr-+<s%1%2s%c%02ds%02di)r) rabsdivmodreplacer timedeltar strtolocalstrftime strfromlocal) dateformattrsignminutesqrdsrrrdatestr^s   r6cCs t|ddS)z1turn (timestamp, tzoff) tuple into iso 8631 date.rr.)r6)r-rrr shortdates r8cCst|}|ds|drd|ddfSt|dkrZ|ddvrZ|d drZ|dd kr5d p6d }t|d d }t|d d}| |d|d|ddfS|dro|d d rod|dd fSt|dkr|ddvr|ddkr|ddr|d dr|dd krd pd }t|dd}t|d d}| |d|d|ddfSd|fS)zVfind a trailing timezone, if any, in string, and return a (offset, remainder) pairsGMTsUTCrNs+-r!r%r"Zi:)rbytestrendswithrstriplenisdigitint)r5r0hoursr1rrr parsetimezones, (&   "rIc s|duri}t|\}}d}dD]'}t|}fdd|D}|s5|d|||7}d|d7qd }qtt|t}tt |} |dur^tt |} | | }| |fS| |} | |fS) z~parse a localized time string and return a (unixtime, offset) tuple. if the string cannot be parsed, ValueError is raised.NF)SMHIdmbyYcsg|] }d|vrdqS)%Tr).0pr7rr szstrdate..@s@%rT) rIrrBrstrptimerr,rGcalendartimegmmktime) stringr.defaultsoffsetr-usenowpartfound timetuple localunixtimeunixtimerr7rstrdates*  rbc Cs|duri}|s dSt|trt|dkr|Std|s t}|}|dks.|tdkr1tS|dks;|tdkrIt j d}t |}n|dksS|tdkrft j t jd d  d}t |}z tt|d \}}Wnbtyt}i}d D])}||}|dur|d d dvrd}nd}t|d|d d } || f||<q|D]} z t|| |\}}Wn ttfyYqwn ttdt|Ynw|dks|dkrttd||dks|dkrttd|||fS)aparse a localized date/time and return a (unixtime, offset) tuple. The date may be a "unixtime offset" string or in one of the specified formats. If the date already is a (unixtime, offset) tuple, it is returned. >>> parsedate(b' today ') == parsedate( ... datetime.date.today().strftime('%b %d').encode('ascii')) True >>> parsedate(b'yesterday ') == parsedate( ... (datetime.date.today() - datetime.timedelta(days=1) ... ).strftime('%b %d').encode('ascii')) True >>> now, tz = makedate() >>> strnow, strtz = parsedate(b'now') >>> (strnow - now) < 1 True >>> tz == strtz True >>> parsedate(b'2000 UTC', formats=extendeddateformats) (946684800, 0) N)rrrsinvalid date formatsnowstodayz%b %ds yesterdayr%)r )rMrNrOrLrKrJrsHMSs001rPsinvalid date: %rr$r#sdate exceeds 32 bits: %di ;isimpossible time zone offset: %d) isinstancetuplerErProgrammingErrordefaultdateformatsstriprrrr-todayr+rr*r)maprGsplit ValueErrorgetr6rb OverflowError ParseErrorrrB) r-formatsbiaswhenr[nowrZr]bnr.rrr parsedatesf       "rwc sdd}dd}|}|sttd|dddkr8|dd s*ttd ||dd fd d S|ddd kr[|dd sMttd||dd fdd S|dddkrz t|dd }Wntyttd|dd w|dkrttd|dd td|ddfdd Sd|vr|d\}}||||fdd S||||fdd S)aGReturn a function that matches a given date match specifier Formats include: '{date}' match a given date to the accuracy provided '<{date}' on or before a given date '>{date}' on or after a given date >>> p1 = parsedate(b"10:29:59") >>> p2 = parsedate(b"10:30:00") >>> p3 = parsedate(b"10:30:59") >>> p4 = parsedate(b"10:31:00") >>> p5 = parsedate(b"Sep 15 10:30:00 1999") >>> f = matchdate(b"10:30") >>> f(p1[0]) False >>> f(p2[0]) True >>> f(p3[0]) True >>> f(p4[0]) False >>> f(p5[0]) False cSsddd}t|t|dS)Nrd)rNrMr)rwextendeddateformats)r-r4rrrlowerQs zmatchdate..lowerc Ssbddddd}dD]}z||d<t|t|dWStjy$Yq wd|d<t|t|dS) Ns12s23s59)rNrLrKrJ)s31s30s29rMrs28)rwrxrrp)r-r4rrrrupperVszmatchdate..uppers+dates cannot consist entirely of whitespacerr%lzmatchdate..>sinvalid day spec, use '>DATE'c|kSr|rr}rrrrqrr sinvalid day spec: %ss,%s must be nonnegative (see 'hg help dates')icrr|rr}rrrr|rs to c|ko|kSr|rr}startstoprrrcrr|rr}rrrrr)rirrrrGrmrrl)r-ryrzrarur)rrrsr matchdate3sF       rr|)Nr)NN) __future__rrrVrri18nrrrr TYPE_CHECKINGtypingr r r r r rfloatrGhgdaterhrxrr6r8rIrbrwrrrrrs$   "   & $ + Z