/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/timestamp.py

  • Committer: Gustav Hartvigsson
  • Date: 2021-01-09 21:36:27 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20210109213627-h1xwcutzy9m7a99b
Added 'Case Preserving Working Tree Use Cases' from Canonical Wiki

* Addod a page from the Canonical Bazaar wiki
  with information on the scmeatics of case
  perserving filesystems an a case insensitive
  filesystem works.
  
  * Needs re-work, but this will do as it is the
    same inforamoton as what was on the linked
    page in the currint documentation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2007, 2008, 2009, 2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
import calendar
18
18
import time
 
19
import re
19
20
 
20
 
from bzrlib import osutils
 
21
from . import osutils
21
22
 
22
23
 
23
24
def format_highres_date(t, offset=0):
33
34
    this will return a date stamp for right now,
34
35
    formatted for the local timezone.
35
36
 
36
 
    >>> from bzrlib.osutils import format_date
 
37
    >>> from breezy.osutils import format_date
37
38
    >>> format_date(1120153132.350850105, 0)
38
39
    'Thu 2005-06-30 17:38:52 +0000'
39
40
    >>> format_highres_date(1120153132.350850105, 0)
56
57
        offset = 0
57
58
    tt = time.gmtime(t + offset)
58
59
 
59
 
    return (osutils.weekdays[tt[6]] +
60
 
            time.strftime(" %Y-%m-%d %H:%M:%S", tt)
 
60
    return (osutils.weekdays[tt[6]] + time.strftime(" %Y-%m-%d %H:%M:%S", tt) +
61
61
            # Get the high-res seconds, but ignore the 0
62
 
            + ('%.9f' % (t - int(t)))[1:]
63
 
            + ' %+03d%02d' % (offset / 3600, (offset / 60) % 60))
 
62
            ('%.9f' % (t - int(t)))[1:] +
 
63
            ' %+03d%02d' % (offset / 3600, (offset / 60) % 60))
64
64
 
65
65
 
66
66
def unpack_highres_date(date):
72
72
    :param date: A date formated by format_highres_date
73
73
    :type date: string
74
74
 
75
 
    >>> import time, random
76
 
    >>> unpack_highres_date('Thu 2005-06-30 12:38:52.350850105 -0500')
77
 
    (1120153132.3508501, -18000)
78
 
    >>> unpack_highres_date('Thu 2005-06-30 17:38:52.350850105 +0000')
79
 
    (1120153132.3508501, 0)
80
 
    >>> unpack_highres_date('Thu 2005-06-30 19:38:52.350850105 +0200')
81
 
    (1120153132.3508501, 7200)
82
 
    >>> unpack_highres_date('Sun 2006-07-09 12:35:38.867522001 +0530')
83
 
    (1152428738.867522, 19800)
84
 
    >>> from bzrlib.osutils import local_time_offset
85
 
    >>> t = time.time()
86
 
    >>> o = local_time_offset()
87
 
    >>> t2, o2 = unpack_highres_date(format_highres_date(t, o))
88
 
    >>> t == t2
89
 
    True
90
 
    >>> o == o2
91
 
    True
92
 
    >>> t -= 24*3600*365*2 # Start 2 years ago
93
 
    >>> o = -12*3600
94
 
    >>> for count in xrange(500):
95
 
    ...   t += random.random()*24*3600*30
96
 
    ...   o = ((o/3600 + 13) % 25 - 12)*3600 # Add 1 wrap around from [-12, 12]
97
 
    ...   date = format_highres_date(t, o)
98
 
    ...   t2, o2 = unpack_highres_date(date)
99
 
    ...   if t != t2 or o != o2:
100
 
    ...      print 'Failed on date %r, %s,%s diff:%s' % (date, t, o, t2-t)
101
 
    ...      break
102
 
 
103
75
    """
104
76
    # Weekday parsing is locale sensitive, so drop the weekday
105
77
    space_loc = date.find(' ')
138
110
    """
139
111
    if offset % 60 != 0:
140
112
        raise ValueError(
141
 
        "can't represent timezone %s offset by fractional minutes" % offset)
 
113
            "can't represent timezone %s offset by fractional minutes" % offset)
142
114
    # so that we don't need to do calculations on pre-epoch times,
143
115
    # which doesn't work with win32 python gmtime, we always
144
116
    # give the epoch in utc
147
119
    if secs + offset < 0:
148
120
        from warnings import warn
149
121
        warn("gmtime of negative time (%s, %s) may not work on Windows" %
150
 
                (secs, offset))
 
122
             (secs, offset))
151
123
    return osutils.format_date(secs, offset=offset,
152
 
            date_fmt='%Y-%m-%d %H:%M:%S')
 
124
                               date_fmt='%Y-%m-%d %H:%M:%S')
 
125
 
 
126
 
 
127
# Format for patch dates: %Y-%m-%d %H:%M:%S [+-]%H%M
 
128
# Groups: 1 = %Y-%m-%d %H:%M:%S; 2 = [+-]%H; 3 = %M
 
129
RE_PATCHDATE = re.compile(
 
130
    "(\\d+-\\d+-\\d+\\s+\\d+:\\d+:\\d+)\\s*([+-]\\d\\d)(\\d\\d)$")
 
131
RE_PATCHDATE_NOOFFSET = re.compile("\\d+-\\d+-\\d+\\s+\\d+:\\d+:\\d+$")
153
132
 
154
133
 
155
134
def parse_patch_date(date_str):
157
136
 
158
137
    Inverse of format_patch_date.
159
138
    """
160
 
    secs_str = date_str[:-6]
161
 
    offset_str = date_str[-5:]
162
 
    if len(offset_str) != 5:
163
 
        raise ValueError(
164
 
            "invalid timezone %r" % offset_str)
165
 
    offset_hours, offset_mins = offset_str[:3], offset_str[3:]
166
 
    offset = int(offset_hours) * 3600 + int(offset_mins) * 60
 
139
    match = RE_PATCHDATE.match(date_str)
 
140
    if match is None:
 
141
        if RE_PATCHDATE_NOOFFSET.match(date_str) is not None:
 
142
            raise ValueError("time data %r is missing a timezone offset"
 
143
                             % date_str)
 
144
        else:
 
145
            raise ValueError("time data %r does not match format " % date_str +
 
146
                             "'%Y-%m-%d %H:%M:%S %z'")
 
147
    secs_str = match.group(1)
 
148
    offset_hours, offset_mins = int(match.group(2)), int(match.group(3))
 
149
    if abs(offset_hours) >= 24 or offset_mins >= 60:
 
150
        raise ValueError("invalid timezone %r" %
 
151
                         (match.group(2) + match.group(3)))
 
152
    offset = offset_hours * 3600 + offset_mins * 60
167
153
    tm_time = time.strptime(secs_str, '%Y-%m-%d %H:%M:%S')
168
154
    # adjust seconds according to offset before converting to POSIX
169
155
    # timestamp, to avoid edge problems