Mercurial > hgrepos > DevTools > mercurial-extensions
annotate tests/lib-stat.py @ 389:fa2e44e749ab
Handle all special and function characters in the timestamps database.
Escape all characters in the range \x00-\x1f and \x7f and all characters in
",@#<|=>".
Also do not normalize CR-LF combinations within an escaped field.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sun, 04 Aug 2019 09:08:35 +0200 |
| parents | 7ec353866f70 |
| children | 379050873141 |
| 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()) |
