annotate tests/lib-stat.py @ 372:79192d0078dc

Provide a "pats" (patterns) argument to _do_restore_timestamps() to be used for FILE parameters given on the command line. "pats" are used for filtering too. It could be implemented by giving an intersectmater to the given matcher parameter.
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 05 Mar 2019 16:23:40 +0100
parents 7ec353866f70
children 379050873141
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):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
43 if not 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
44 os.stat_float_times(True)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
45 self._do_reset = True
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
46 return self
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
47
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
48 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
49 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
50 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
51
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 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
54 """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
55
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
56 `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
57
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 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
60 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
61 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
62 else:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
63 return dt.isoformat()
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
64
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 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
67 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
68 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
69
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
70 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
71 "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
72 ["check=",
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
73 "differs="])
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
74 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
75 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
76 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
77 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
78 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
79 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
80 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
81
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
82 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
83 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
84 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
85 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
86 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
87 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
88 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
89 "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
90 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
102 "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
103 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
104 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
105 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
106 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
107 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
108 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
109 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
110 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
111 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
112 return 0
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
113
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 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
116 sys.exit(main())