annotate tests/lib-stat.py @ 417:45d77d512ac2

FIX: PY3 compat: convert native string in the "amend" description to a byte string
author Franz Glasner <fzglas.hg@dom66.de>
date Sun, 05 Sep 2021 16:21:15 +0200
parents 379050873141
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
1 """Cross-platform file modification check.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
2
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
3 This is because the stat(1) utility has incompatible cross-platform usage.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
4
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
5 Usage: lib-stat.py [ OPTIONS ] FILE ...
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
6
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
7 Options:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
8
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
9 -c TS, --check=TS Assert that the given timestamp TS matches the given
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
10 FILE's modtime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
11 -d TS, --differs=TS Assert that the given timestamp TS differs from the
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
12 given FILE's modtime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
13
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
14 If no option is given print the modification time for each FILE to stdout.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
15
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
16 """
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
17
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
18 from __future__ import absolute_import, print_function
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
19
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
20
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
21 import datetime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
22 import getopt
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
23 import os
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
24 import sys
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
25
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
26
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
27 class FloatTimesInStat(object):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
28 """Context manager to ensure that stat returns float values.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
29
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
30 For 3.7 <= Mercurial < 4.6: Mercurial calls :func:`os.stat_float_times`
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
31 for `stat` and friends to return :class:`int` values.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
32
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
33 Temporarily fix this.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
34
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
35 """
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
36
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
37 __slots__ = ("_do_reset",)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
38
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
39 def __init__(self):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
40 self._do_reset = False
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
41
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
42 def __enter__(self):
408
379050873141 PY3: Later PY3 versions do not have os.stat_float_times(): check whether it exists before using it
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
43 if hasattr(os, "stat_float_times"):
379050873141 PY3: Later PY3 versions do not have os.stat_float_times(): check whether it exists before using it
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
44 if not os.stat_float_times():
379050873141 PY3: Later PY3 versions do not have os.stat_float_times(): check whether it exists before using it
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
45 os.stat_float_times(True)
379050873141 PY3: Later PY3 versions do not have os.stat_float_times(): check whether it exists before using it
Franz Glasner <fzglas.hg@dom66.de>
parents: 278
diff changeset
46 self._do_reset = True
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
47 return self
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
48
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
49 def __exit__(self, *args):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
50 if self._do_reset:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
51 os.stat_float_times(False)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
52
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
53
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
54 def to_isoformat(t):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
55 """Return the POSIX timestamp `t` formatted in full ISO format.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
56
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
57 `t` is expected to be in the UTC timezone.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
58
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
59 """
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
60 dt = datetime.datetime.utcfromtimestamp(t)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
61 if dt.utcoffset() is None:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
62 return dt.isoformat() + "Z"
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
63 else:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
64 return dt.isoformat()
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
65
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
66
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
67 def main():
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
68 opt_check = None
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
69 opt_differs = None
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
70
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
71 opts, args = getopt.getopt(sys.argv[1:],
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
72 "c:d:",
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
73 ["check=",
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
74 "differs="])
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
75 for opt, val in opts:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
76 if opt in ("-c", "--check"):
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
77 opt_check = val
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
78 elif opt in ("-d", "--differs"):
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
79 opt_differs = val
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
80 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
81 assert False
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
82
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
83 if opt_check:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
84 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
85 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
86 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
87 tss = to_isoformat(st.st_mtime)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
88 if tss != opt_check:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
89 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
90 "mtime does not match for file `{filename}': expected {expected}, current: {current}".format(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
91 filename=f,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
92 expected=opt_check,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
93 current=tss),
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
94 file=sys.stderr)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
95 return 1
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
96 elif opt_differs:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
97 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
98 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
99 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
100 tss = to_isoformat(st.st_mtime)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
101 if tss == opt_differs:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
102 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
103 "mtime does not differ for file `{filename}': {timestamp}".format(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
104 filename=f,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
105 timestamp=tss),
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
106 file=sys.stderr)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
107 return 1
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
108 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
109 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
110 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
111 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
112 print(to_isoformat(st.st_mtime))
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
113 return 0
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
114
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
115
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
116 if __name__ == "__main__":
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
117 sys.exit(main())