1.99 MB
/home/fdroid/fdroiddata/tmp/com.econverter.app_2.apk vs.
/home/fdroid/fdroiddata/unsigned/com.econverter.app_2.apk
8.2 KB
APK Signing Block
    
Offset 1, 121 lines modifiedOffset 0, 0 lines modified
1 Key·0x42726577: 
2 0000000000000000000000000000000000000000000000000000000000000000000000 
3 0000000000000000000000000000000000000000000000000000000000000000000000 
4 0000000000000000000000000000000000000000000000000000000000000000000000 
5 0000000000000000000000000000000000000000000000000000000000000000000000 
6 0000000000000000000000000000000000000000000000000000000000000000000000 
7 0000000000000000000000000000000000000000000000000000000000000000000000 
8 0000000000000000000000000000000000000000000000000000000000000000000000 
9 0000000000000000000000000000000000000000000000000000000000000000000000 
10 0000000000000000000000000000000000000000000000000000000000000000000000 
11 0000000000000000000000000000000000000000000000000000000000000000000000 
12 0000000000000000000000000000000000000000000000000000000000000000000000 
13 0000000000000000000000000000000000000000000000000000000000000000000000 
14 0000000000000000000000000000000000000000000000000000000000000000000000 
15 0000000000000000000000000000000000000000000000000000000000000000000000 
16 0000000000000000000000000000000000000000000000000000000000000000000000 
17 0000000000000000000000000000000000000000000000000000000000000000000000 
18 0000000000000000000000000000000000000000000000000000000000000000000000 
19 0000000000000000000000000000000000000000000000000000000000000000000000 
20 0000000000000000000000000000000000000000000000000000000000000000000000 
21 0000000000000000000000000000000000000000000000000000000000000000000000 
22 0000000000000000000000000000000000000000000000000000000000000000000000 
23 0000000000000000000000000000000000000000000000000000000000000000000000 
24 0000000000000000000000000000000000000000000000000000000000000000000000 
25 0000000000000000000000000000000000000000000000000000000000000000000000 
26 0000000000000000000000000000000000000000000000000000000000000000000000 
27 0000000000000000000000000000000000000000000000000000000000000000000000 
28 0000000000000000000000000000000000000000000000000000000000000000000000 
29 000000000000000000000000000000000000000000 
  
30 Key·0x7109871a: 
31 f7050000f3050000b50300002c000000280000000301000020000000907a69782f8c85 
32 98cd0cc05d88089496ec079fdacd36314098d1ee8ff5160d946d030000690300003082 
33 03653082024da003020102020863707fe532bb2ae7300d06092a864886f70d01010b05 
34 003060310b300906035504061302554b310c300a060355040813034f5247310c300a06 
35 0355040713034f524731133011060355040a130a6664726f69642e6f7267310f300d06 
36 0355040b13064644726f6964310f300d060355040313064644726f69643020170d3236 
37 303632373135343331325a180f32303533313131323135343331325a3060310b300906 
38 035504061302554b310c300a060355040813034f5247310c300a060355040713034f52 
39 4731133011060355040a130a6664726f69642e6f7267310f300d060355040b13064644 
40 726f6964310f300d060355040313064644726f696430820122300d06092a864886f70d 
41 01010105000382010f003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6 
42 ba0fce0774e5f2dfe7d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a 
43 4b1c92b26bd6422d7d34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81 
44 954926ca92954b14f8046ec50a095dd5556832565712fd9d41cd934410056864573af7 
45 d8187d1774c6a004b928eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0 
46 b6bf6fb6d63156b21b8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62 
47 df44fe4a73cd3f238002dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c530 
48 83b31e8cfb923799d505bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 
49 a321301f301d0603551d0e04160414ecb0d0226aa2fe884f4897c348146f3ffffc96b7 
50 300d06092a864886f70d01010b0500038201010048373d1fdd119f7858e6e3c2e5c181 
51 b3ed8072b53c4ab90889efb9b8cd0c23eab3e01752c48305ee01f073d5a108e62196d4 
52 ce553bb0022a0055cac40979bccc03c1a6c90ee4baaad9f217f746731470b128bfd3b2 
53 4d67879509be45a91d5042396036d3b05594d1f5055dca470801751296b3c5f4d72ece 
54 c04320cbbb69ee8a6d9d39309916850db9939afdfca7c90755c57a88fe82343d2b02cb 
55 fa45c1467ddc6e81e59fadd39925d9b2e62e85c55625247f04ce42a115ae52a52dec25 
56 f249cf08a392f7efb473a319ea4e410e74bb516475b7c881610fb95a013a9209c4243c 
57 948166bff03e2a50f4c1e6da3bad7c6a918afeeb7472bc45ad09efe63b47200c000000 
58 080000000df0efbe03000000000000000c0100000801000003010000000100009f951a 
59 e4338d0854b7993372119609a1aad086ff8b41ba5aa787ab053dd23c66bee24796e328 
60 6aa0c286c2b2e25ef4b000c754fd2a701c3e9882b5e323490662c00099829e03e10ecc 
61 b618c0932a34e2fecc07215cf475a7818cb81ee91eb3c0a5158039d103ec2db9e69b5d 
62 d666cb259af074ee3f051ea855af40aa0da5f2df8990ef28424c06bf663fb796f2a6d4 
63 37f64249ac07fff028d7c0c84fee432096db1d17c7c31784f7b4bd50349331bc522137 
64 6186c9f69c61e60ca448b90061794018c6ce579acf77aa148d6d6e91c2a33ce2d20e7a 
65 e4d431149275493941c638bafbc90f5b7628889c2cb2d557c2e685aba2f807b32d6aaf 
66 92a3b7814b7340a32601000030820122300d06092a864886f70d01010105000382010f 
67 003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6ba0fce0774e5f2dfe7 
68 d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a4b1c92b26bd6422d7d 
69 34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81954926ca92954b14f8 
70 046ec50a095dd5556832565712fd9d41cd934410056864573af7d8187d1774c6a004b9 
71 28eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0b6bf6fb6d63156b21b 
72 8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62df44fe4a73cd3f2380 
73 02dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c53083b31e8cfb923799d5 
74 05bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 
  
75 Key·0xf05368c0: 
76 f7050000f3050000ad0300002c000000280000000301000020000000907a69782f8c85 
77 98cd0cc05d88089496ec079fdacd36314098d1ee8ff5160d946d030000690300003082 
78 03653082024da003020102020863707fe532bb2ae7300d06092a864886f70d01010b05 
79 003060310b300906035504061302554b310c300a060355040813034f5247310c300a06 
80 0355040713034f524731133011060355040a130a6664726f69642e6f7267310f300d06 
81 0355040b13064644726f6964310f300d060355040313064644726f69643020170d3236 
82 303632373135343331325a180f32303533313131323135343331325a3060310b300906 
83 035504061302554b310c300a060355040813034f5247310c300a060355040713034f52 
84 4731133011060355040a130a6664726f69642e6f7267310f300d060355040b13064644 
85 726f6964310f300d060355040313064644726f696430820122300d06092a864886f70d 
86 01010105000382010f003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6 
87 ba0fce0774e5f2dfe7d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a 
88 4b1c92b26bd6422d7d34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81 
89 954926ca92954b14f8046ec50a095dd5556832565712fd9d41cd934410056864573af7 
90 d8187d1774c6a004b928eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0 
91 b6bf6fb6d63156b21b8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62 
92 df44fe4a73cd3f238002dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c530 
93 83b31e8cfb923799d505bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 
94 a321301f301d0603551d0e04160414ecb0d0226aa2fe884f4897c348146f3ffffc96b7 
95 300d06092a864886f70d01010b0500038201010048373d1fdd119f7858e6e3c2e5c181 
96 b3ed8072b53c4ab90889efb9b8cd0c23eab3e01752c48305ee01f073d5a108e62196d4 
97 ce553bb0022a0055cac40979bccc03c1a6c90ee4baaad9f217f746731470b128bfd3b2 
98 4d67879509be45a91d5042396036d3b05594d1f5055dca470801751296b3c5f4d72ece 
99 c04320cbbb69ee8a6d9d39309916850db9939afdfca7c90755c57a88fe82343d2b02cb 
100 fa45c1467ddc6e81e59fadd39925d9b2e62e85c55625247f04ce42a115ae52a52dec25 
101 f249cf08a392f7efb473a319ea4e410e74bb516475b7c881610fb95a013a9209c4243c 
102 948166bff03e2a50f4c1e6da3bad7c6a918afeeb7472bc45ad09efe63b472018000000 
103 ffffff7f0000000018000000ffffff7f0c0100000801000003010000000100004b78be 
104 edc6e6ad9b5d8231ab5ccb0fc4bf531bb69c374872cc7a4a7e042745420c9f0b3ebac1 
105 07e5d798c48d8395ade60ea95fae3341b5c4d8c80bc1f7e0c949c038ac268987647ce9 
106 227ee7d2b6b0c9cb6373b33fa1d47f43537a8c1f27d9c06efa835ce390559a1d580b04 
107 d95337d01d58131e6eb8ff66aa2a877d2e070bb242ff91c862a5674f6a85a7d2ea9a6c 
108 3b45982ab201c72bcf99db71602f372d4e64b224eba0f98aec13d7afaa8f77fbfaa950 
109 0c0b55f4c3973b5fa624c6c41c69600542bf910073ed32c7eecdbdc3a197a6ddf4ed6f 
110 a6870ac058899923d604ff5cbb792b09394e8e92b3ab94b9da572d74b9972056269d1e 
111 62e3ea85a1b3aafe2601000030820122300d06092a864886f70d01010105000382010f 
112 003082010a0282010100ac74a8f4fb5ff9c1a0338278598eb9c6ba0fce0774e5f2dfe7 
113 d8aff70c0cb2535a834e125f1581127f7a6f5d3f86dc5195fd7a4b1c92b26bd6422d7d 
114 34de63f255b1782446868cb7bfdc3b992ccb233a52ef9c4d5f81954926ca92954b14f8 
115 046ec50a095dd5556832565712fd9d41cd934410056864573af7d8187d1774c6a004b9 
116 28eb712a907ec5944e75acd901cfb09a1ce230815caae69da3a0b6bf6fb6d63156b21b 
117 8922ed1917331c4f1421eaa8dbb232f7832dcc35e7a6e6907f62df44fe4a73cd3f2380 
118 02dfc7a5e2e2fc64ce1596966c7c411f63ad2e19c0339354c53083b31e8cfb923799d5 
119 05bbaa8c2d6bf92187fe3ae13fe30eabe346242d110203010001 
3.03 KB
zipinfo {}
    
Offset 1, 8 lines modifiedOffset 1, 8 lines modified
1 Zip·file·size:·51735186·bytes,·number·of·entries:·1951 Zip·file·size:·51719143·bytes,·number·of·entries:·192
2 -rw-r--r--··0.0·unx·······56·b-·defN·81-Jan-01·01:01·META-INF/com/android/build/gradle/app-metadata.properties2 -rw-r--r--··0.0·unx·······56·b-·defN·81-Jan-01·01:01·META-INF/com/android/build/gradle/app-metadata.properties
3 -rw-r--r--··0.0·unx······120·b-·defN·81-Jan-01·01:01·META-INF/version-control-info.textproto3 -rw-r--r--··0.0·unx······120·b-·defN·81-Jan-01·01:01·META-INF/version-control-info.textproto
4 -rw-r--r--··0.0·unx·····6971·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.prof4 -rw-r--r--··0.0·unx·····6971·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.prof
5 -rw-r--r--··0.0·unx······392·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.profm5 -rw-r--r--··0.0·unx······392·b-·stor·81-Jan-01·01:01·assets/dexopt/baseline.profm
6 -rw-r--r--··0.0·unx·13583992·b-·defN·81-Jan-01·01:01·classes.dex6 -rw-r--r--··0.0·unx·13583992·b-·defN·81-Jan-01·01:01·classes.dex
7 -rw-r--r--··0.0·unx··4065668·b-·defN·81-Jan-01·01:01·classes2.dex7 -rw-r--r--··0.0·unx··4065668·b-·defN·81-Jan-01·01:01·classes2.dex
8 -rw-r--r--··0.0·unx····10096·b-·stor·81-Jan-01·01:01·lib/arm64-v8a/libandroidx.graphics.path.so8 -rw-r--r--··0.0·unx····10096·b-·stor·81-Jan-01·01:01·lib/arm64-v8a/libandroidx.graphics.path.so
Offset 48, 15 lines modifiedOffset 48, 15 lines modified
48 -rw-r--r--··0.0·unx····65392·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/math.so48 -rw-r--r--··0.0·unx····65392·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/math.so
49 -rw-r--r--··0.0·unx····23936·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/mmap.so49 -rw-r--r--··0.0·unx····23936·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/mmap.so
50 -rw-r--r--··0.0·unx····43368·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/zlib.so50 -rw-r--r--··0.0·unx····43368·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap-native/x86_64/zlib.so
51 -rw-r--r--··0.0·unx···600063·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap.imy51 -rw-r--r--··0.0·unx···600063·b-·stor·81-Jan-01·01:01·assets/chaquopy/bootstrap.imy
52 -rw-r--r--··0.0·unx·····2941·b-·defN·81-Jan-01·01:01·assets/chaquopy/build.json52 -rw-r--r--··0.0·unx·····2941·b-·defN·81-Jan-01·01:01·assets/chaquopy/build.json
53 -rw-r--r--··0.0·unx···299427·b-·defN·81-Jan-01·01:01·assets/chaquopy/cacert.pem53 -rw-r--r--··0.0·unx···299427·b-·defN·81-Jan-01·01:01·assets/chaquopy/cacert.pem
54 -rw-r--r--··0.0·unx··2613498·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-arm64-v8a.imy54 -rw-r--r--··0.0·unx··2613498·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-arm64-v8a.imy
55 -rw-r--r--··0.0·unx··1560597·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-common.imy55 -rw-r--r--··0.0·unx··1564835·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-common.imy
56 -rw-r--r--··0.0·unx··2765792·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-x86_64.imy56 -rw-r--r--··0.0·unx··2765792·b-·stor·81-Jan-01·01:01·assets/chaquopy/requirements-x86_64.imy
57 -rw-r--r--··0.0·unx··1491926·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-arm64-v8a.imy57 -rw-r--r--··0.0·unx··1491926·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-arm64-v8a.imy
58 -rw-r--r--··0.0·unx··4307576·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-common.imy58 -rw-r--r--··0.0·unx··4307576·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-common.imy
59 -rw-r--r--··0.0·unx··1526663·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-x86_64.imy59 -rw-r--r--··0.0·unx··1526663·b-·stor·81-Jan-01·01:01·assets/chaquopy/stdlib-x86_64.imy
60 -rw----·····2.4·fat·····1738·b-·defN·81-Jan-01·01:01·DebugProbesKt.bin60 -rw----·····2.4·fat·····1738·b-·defN·81-Jan-01·01:01·DebugProbesKt.bin
61 -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-compose.version61 -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-compose.version
62 -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-ktx.version62 -rw----·····2.4·fat········6·b-·stor·81-Jan-01·01:01·META-INF/androidx.activity_activity-ktx.version
Offset 187, 11 lines modifiedOffset 187, 8 lines modified
187 -rw----·····0.0·fat······225·b-·stor·81-Jan-01·01:01·res/wN.9.png187 -rw----·····0.0·fat······225·b-·stor·81-Jan-01·01:01·res/wN.9.png
188 -rw----·····0.0·fat·····2456·b-·defN·81-Jan-01·01:01·res/xN.xml188 -rw----·····0.0·fat·····2456·b-·defN·81-Jan-01·01:01·res/xN.xml
189 -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/xa.9.png189 -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/xa.9.png
190 -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/z-.9.png190 -rw----·····0.0·fat······221·b-·stor·81-Jan-01·01:01·res/z-.9.png
191 -rw----·····0.0·fat······206·b-·stor·81-Jan-01·01:01·res/zL.png191 -rw----·····0.0·fat······206·b-·stor·81-Jan-01·01:01·res/zL.png
192 -rw----·····0.0·fat······884·b-·stor·81-Jan-01·01:01·res/zz.png192 -rw----·····0.0·fat······884·b-·stor·81-Jan-01·01:01·res/zz.png
193 -rw----·····0.0·fat···415976·b-·stor·81-Jan-01·01:01·resources.arsc193 -rw----·····0.0·fat···415976·b-·stor·81-Jan-01·01:01·resources.arsc
194 -rw----·····2.0·fat····19926·b-·defN·81-Jan-01·01:01·META-INF/57818ACA.SF 
195 -rw----·····2.0·fat·····1344·b-·defN·81-Jan-01·01:01·META-INF/57818ACA.RSA 
196 -rw----·····2.0·fat····19799·b-·defN·81-Jan-01·01:01·META-INF/MANIFEST.MF 
197 195·files,·63280435·bytes·uncompressed,·51379260·bytes·compressed:··18.8%194 192·files,·63243604·bytes·uncompressed,·51367666·bytes·compressed:··18.8%
1.98 MB
assets/chaquopy/requirements-common.imy
6.3 KB
zipinfo {}
    
Offset 1, 10 lines modifiedOffset 1, 10 lines modified
1 Zip·file·size:·1560597·bytes,·number·of·entries:·4861 Zip·file·size:·1564835·bytes,·number·of·entries:·486
2 -rw----·····2.0·fat····34703·b-·defN·80-Feb-01·00:00·six.py2 -rw----·····2.0·fat····34703·b-·defN·80-Feb-01·00:00·six.py
3 -rw----·····2.0·fat···160429·b-·defN·80-Feb-01·00:00·typing_extensions.py3 -rw----·····2.0·fat···165012·b-·defN·80-Feb-01·00:00·typing_extensions.py
4 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·PIL/4 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·PIL/
5 -rw----·····2.0·fat·····3477·b-·defN·80-Feb-01·00:00·PIL/BdfFontFile.py5 -rw----·····2.0·fat·····3477·b-·defN·80-Feb-01·00:00·PIL/BdfFontFile.py
6 -rw----·····2.0·fat····16584·b-·defN·80-Feb-01·00:00·PIL/BlpImagePlugin.py6 -rw----·····2.0·fat····16584·b-·defN·80-Feb-01·00:00·PIL/BlpImagePlugin.py
7 -rw----·····2.0·fat····19758·b-·defN·80-Feb-01·00:00·PIL/BmpImagePlugin.py7 -rw----·····2.0·fat····19758·b-·defN·80-Feb-01·00:00·PIL/BmpImagePlugin.py
8 -rw----·····2.0·fat·····1753·b-·defN·80-Feb-01·00:00·PIL/BufrStubImagePlugin.py8 -rw----·····2.0·fat·····1753·b-·defN·80-Feb-01·00:00·PIL/BufrStubImagePlugin.py
9 -rw----·····2.0·fat·····4604·b-·defN·80-Feb-01·00:00·PIL/ContainerIO.py9 -rw----·····2.0·fat·····4604·b-·defN·80-Feb-01·00:00·PIL/ContainerIO.py
10 -rw----·····2.0·fat·····1792·b-·defN·80-Feb-01·00:00·PIL/CurImagePlugin.py10 -rw----·····2.0·fat·····1792·b-·defN·80-Feb-01·00:00·PIL/CurImagePlugin.py
Offset 245, 34 lines modifiedOffset 245, 34 lines modified
245 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/245 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/
246 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/INSTALLER246 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/INSTALLER
247 -rw----·····2.0·fat·····2409·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/LICENSE247 -rw----·····2.0·fat·····2409·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/LICENSE
248 -rw----·····2.0·fat····32518·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/METADATA248 -rw----·····2.0·fat····32518·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/METADATA
249 -rw----·····2.0·fat·······11·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/top_level.txt249 -rw----·····2.0·fat·······11·b-·defN·80-Feb-01·00:00·defusedxml-0.7.1.dist-info/top_level.txt
250 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/250 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/
251 -rw----·····2.0·fat·····2612·b-·defN·80-Feb-01·00:00·filelock/__init__.py251 -rw----·····2.0·fat·····2612·b-·defN·80-Feb-01·00:00·filelock/__init__.py
252 -rw----·····2.0·fat····22687·b-·defN·80-Feb-01·00:00·filelock/_api.py252 -rw----·····2.0·fat····25025·b-·defN·80-Feb-01·00:00·filelock/_api.py
253 -rw----·····2.0·fat·····8507·b-·defN·80-Feb-01·00:00·filelock/_async_read_write.py253 -rw----·····2.0·fat·····8457·b-·defN·80-Feb-01·00:00·filelock/_async_read_write.py
254 -rw----·····2.0·fat······775·b-·defN·80-Feb-01·00:00·filelock/_error.py254 -rw----·····2.0·fat······765·b-·defN·80-Feb-01·00:00·filelock/_error.py
255 -rw----·····2.0·fat····15497·b-·defN·80-Feb-01·00:00·filelock/_read_write.py255 -rw----·····2.0·fat····17030·b-·defN·80-Feb-01·00:00·filelock/_read_write.py
256 -rw----·····2.0·fat····10329·b-·defN·80-Feb-01·00:00·filelock/_soft.py256 -rw----·····2.0·fat····10329·b-·defN·80-Feb-01·00:00·filelock/_soft.py
257 -rw----·····2.0·fat·····4579·b-·defN·80-Feb-01·00:00·filelock/_unix.py257 -rw----·····2.0·fat·····4505·b-·defN·80-Feb-01·00:00·filelock/_unix.py
258 -rw----·····2.0·fat·····3584·b-·defN·80-Feb-01·00:00·filelock/_util.py258 -rw----·····2.0·fat·····4446·b-·defN·80-Feb-01·00:00·filelock/_util.py
259 -rw----·····2.0·fat·····3943·b-·defN·80-Feb-01·00:00·filelock/_windows.py259 -rw----·····2.0·fat·····3943·b-·defN·80-Feb-01·00:00·filelock/_windows.py
260 -rw----·····2.0·fat····15558·b-·defN·80-Feb-01·00:00·filelock/asyncio.py260 -rw----·····2.0·fat····15795·b-·defN·80-Feb-01·00:00·filelock/asyncio.py
261 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/py.typed261 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/py.typed
262 -rw----·····2.0·fat······522·b-·defN·80-Feb-01·00:00·filelock/version.py262 -rw----·····2.0·fat······522·b-·defN·80-Feb-01·00:00·filelock/version.py
263 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/263 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/
264 -rw----·····2.0·fat······370·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/__init__.py264 -rw----·····2.0·fat······370·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/__init__.py
265 -rw----·····2.0·fat·····8704·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_async.py265 -rw----·····2.0·fat·····8654·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_async.py
266 -rw----·····2.0·fat····35603·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_sync.py266 -rw----·····2.0·fat····40857·b-·defN·80-Feb-01·00:00·filelock/_soft_rw/_sync.py
267 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.4.dist-info/267 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/
268 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·filelock-3.29.4.dist-info/INSTALLER268 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/INSTALLER
269 -rw----·····2.0·fat·····1977·b-·defN·80-Feb-01·00:00·filelock-3.29.4.dist-info/METADATA269 -rw----·····2.0·fat·····1977·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/METADATA
270 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.4.dist-info/licenses/270 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/licenses/
271 -rw----·····2.0·fat·····1088·b-·defN·80-Feb-01·00:00·filelock-3.29.4.dist-info/licenses/LICENSE271 -rw----·····2.0·fat·····1088·b-·defN·80-Feb-01·00:00·filelock-3.29.7.dist-info/licenses/LICENSE
272 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·html2text/272 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·html2text/
273 -rw----·····2.0·fat····37885·b-·defN·80-Feb-01·00:00·html2text/__init__.py273 -rw----·····2.0·fat····37885·b-·defN·80-Feb-01·00:00·html2text/__init__.py
274 -rw----·····2.0·fat·······30·b-·defN·80-Feb-01·00:00·html2text/__main__.py274 -rw----·····2.0·fat·······30·b-·defN·80-Feb-01·00:00·html2text/__main__.py
275 -rw----·····2.0·fat·······63·b-·defN·80-Feb-01·00:00·html2text/_typing.py275 -rw----·····2.0·fat·······63·b-·defN·80-Feb-01·00:00·html2text/_typing.py
276 -rw----·····2.0·fat······519·b-·defN·80-Feb-01·00:00·html2text/_version.py276 -rw----·····2.0·fat······519·b-·defN·80-Feb-01·00:00·html2text/_version.py
277 -rw----·····2.0·fat····10300·b-·defN·80-Feb-01·00:00·html2text/cli.py277 -rw----·····2.0·fat····10300·b-·defN·80-Feb-01·00:00·html2text/cli.py
278 -rw----·····2.0·fat·····4052·b-·defN·80-Feb-01·00:00·html2text/config.py278 -rw----·····2.0·fat·····4052·b-·defN·80-Feb-01·00:00·html2text/config.py
Offset 476, 13 lines modifiedOffset 476, 13 lines modified
476 -rw----·····2.0·fat·····3755·b-·defN·80-Feb-01·00:00·tinycss/tests/test_page3.py476 -rw----·····2.0·fat·····3755·b-·defN·80-Feb-01·00:00·tinycss/tests/test_page3.py
477 -rw----·····2.0·fat····10662·b-·defN·80-Feb-01·00:00·tinycss/tests/test_tokenizer.py477 -rw----·····2.0·fat····10662·b-·defN·80-Feb-01·00:00·tinycss/tests/test_tokenizer.py
478 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/478 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/
479 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/INSTALLER479 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/INSTALLER
480 -rw----·····2.0·fat·····1521·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/LICENSE480 -rw----·····2.0·fat·····1521·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/LICENSE
481 -rw----·····2.0·fat·····1860·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/METADATA481 -rw----·····2.0·fat·····1860·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/METADATA
482 -rw----·····2.0·fat········8·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/top_level.txt482 -rw----·····2.0·fat········8·b-·defN·80-Feb-01·00:00·tinycss-0.4.dist-info/top_level.txt
483 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.15.0.dist-info/483 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/
484 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·typing_extensions-4.15.0.dist-info/INSTALLER484 -rw----·····2.0·fat········4·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/INSTALLER
485 -rw----·····2.0·fat·····3259·b-·defN·80-Feb-01·00:00·typing_extensions-4.15.0.dist-info/METADATA485 -rw----·····2.0·fat·····3310·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/METADATA
486 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.15.0.dist-info/licenses/486 -rw----·····2.0·fat········0·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/licenses/
487 -rw----·····2.0·fat····13936·b-·defN·80-Feb-01·00:00·typing_extensions-4.15.0.dist-info/licenses/LICENSE487 -rw----·····2.0·fat····13936·b-·defN·80-Feb-01·00:00·typing_extensions-4.16.0.dist-info/licenses/LICENSE
488 486·files,·5442858·bytes·uncompressed,·1490547·bytes·compressed:··72.6%488 486·files,·5457532·bytes·uncompressed,·1494785·bytes·compressed:··72.6%
1.6 KB
zipnote «TEMP»/diffoscope_rs6l12hj_unsigned/tmp1xbgz5l0_.zip
    
Offset 789, 27 lines modifiedOffset 789, 27 lines modified
  
789 Filename:·filelock/_soft_rw/_async.py789 Filename:·filelock/_soft_rw/_async.py
790 Comment:·790 Comment:·
  
791 Filename:·filelock/_soft_rw/_sync.py791 Filename:·filelock/_soft_rw/_sync.py
792 Comment:·792 Comment:·
  
793 Filename:·filelock-3.29.4.dist-info/793 Filename:·filelock-3.29.7.dist-info/
794 Comment:·794 Comment:·
  
795 Filename:·filelock-3.29.4.dist-info/INSTALLER795 Filename:·filelock-3.29.7.dist-info/INSTALLER
796 Comment:·796 Comment:·
  
797 Filename:·filelock-3.29.4.dist-info/METADATA797 Filename:·filelock-3.29.7.dist-info/METADATA
798 Comment:·798 Comment:·
  
799 Filename:·filelock-3.29.4.dist-info/licenses/799 Filename:·filelock-3.29.7.dist-info/licenses/
800 Comment:·800 Comment:·
  
801 Filename:·filelock-3.29.4.dist-info/licenses/LICENSE801 Filename:·filelock-3.29.7.dist-info/licenses/LICENSE
802 Comment:·802 Comment:·
  
803 Filename:·html2text/803 Filename:·html2text/
804 Comment:·804 Comment:·
  
805 Filename:·html2text/__init__.py805 Filename:·html2text/__init__.py
806 Comment:·806 Comment:·
Offset 1437, 23 lines modifiedOffset 1437, 23 lines modified
  
1437 Filename:·tinycss-0.4.dist-info/METADATA1437 Filename:·tinycss-0.4.dist-info/METADATA
1438 Comment:·1438 Comment:·
  
1439 Filename:·tinycss-0.4.dist-info/top_level.txt1439 Filename:·tinycss-0.4.dist-info/top_level.txt
1440 Comment:·1440 Comment:·
  
1441 Filename:·typing_extensions-4.15.0.dist-info/1441 Filename:·typing_extensions-4.16.0.dist-info/
1442 Comment:·1442 Comment:·
  
1443 Filename:·typing_extensions-4.15.0.dist-info/INSTALLER1443 Filename:·typing_extensions-4.16.0.dist-info/INSTALLER
1444 Comment:·1444 Comment:·
  
1445 Filename:·typing_extensions-4.15.0.dist-info/METADATA1445 Filename:·typing_extensions-4.16.0.dist-info/METADATA
1446 Comment:·1446 Comment:·
  
1447 Filename:·typing_extensions-4.15.0.dist-info/licenses/1447 Filename:·typing_extensions-4.16.0.dist-info/licenses/
1448 Comment:·1448 Comment:·
  
1449 Filename:·typing_extensions-4.15.0.dist-info/licenses/LICENSE1449 Filename:·typing_extensions-4.16.0.dist-info/licenses/LICENSE
1450 Comment:·1450 Comment:·
  
1451 Zip·file·comment:·1451 Zip·file·comment:·
1.89 MB
zipdetails --redact --walk --utc {}
    
Offset 27, 24782 lines modifiedOffset 27, 24782 lines modified
27 002167·Extract·Zip·Spec······14·(20)·'2.0'27 002167·Extract·Zip·Spec······14·(20)·'2.0'
28 002168·Extract·OS············00·(0)·'MS-DOS'28 002168·Extract·OS············00·(0)·'MS-DOS'
29 002169·General·Purpose·Flag··0800·(2048)29 002169·General·Purpose·Flag··0800·(2048)
30 ·······[Bits·1-2]············0·'Normal·Compression'30 ·······[Bits·1-2]············0·'Normal·Compression'
31 ·······[Bit·11]··············1·'Language·Encoding'31 ·······[Bit·11]··············1·'Language·Encoding'
32 00216B·Compression·Method····0008·(8)·'Deflated'32 00216B·Compression·Method····0008·(8)·'Deflated'
33 00216D·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'33 00216D·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'
34 002171·CRC···················BDD3E18E·(3184779662)34 002171·CRC···················0320E133·(52486451)
35 002175·Compressed·Size·······00009396·(37782)35 002175·Compressed·Size·······00009750·(38736)
36 002179·Uncompressed·Size·····000272AD·(160429)36 002179·Uncompressed·Size·····00028494·(165012)
37 00217D·Filename·Length·······0014·(20)37 00217D·Filename·Length·······0014·(20)
38 00217F·Extra·Length··········0014·(20)38 00217F·Extra·Length··········0014·(20)
39 002181·Filename··············'XXXXXXXXXXXXXXXXXXXX'39 002181·Filename··············'XXXXXXXXXXXXXXXXXXXX'
40 #40 #
41 #·WARNING:·Offset·0x2181:·Filename·'XXXXXXXXXXXXXXXXXXXX'41 #·WARNING:·Offset·0x2181:·Filename·'XXXXXXXXXXXXXXXXXXXX'
42 #··········Zero·length·filename42 #··········Zero·length·filename
43 #43 #
44 002195·Extra·ID·#1···········0001·(1)·'ZIP64'44 002195·Extra·ID·#1···········0001·(1)·'ZIP64'
45 002197···Length··············0010·(16)45 002197···Length··············0010·(16)
46 002199···Uncompressed·Size···00000000000272AD·(160429)46 002199···Uncompressed·Size···0000000000028494·(165012)
47 0021A1···Compressed·Size·····0000000000009396·(37782)47 0021A1···Compressed·Size·····0000000000009750·(38736)
48 0021A9·PAYLOAD48 0021A9·PAYLOAD
Diff chunk too large, falling back to line-by-line diff (1031 lines added, 1031 lines removed)
  
49 00B53F·LOCAL·HEADER·#3·······04034B50·(67324752)49 00B8F9·LOCAL·HEADER·#3·······04034B50·(67324752)
50 00B543·Extract·Zip·Spec······14·(20)·'2.0'50 00B8FD·Extract·Zip·Spec······14·(20)·'2.0'
51 00B544·Extract·OS············00·(0)·'MS-DOS'51 00B8FE·Extract·OS············00·(0)·'MS-DOS'
52 00B545·General·Purpose·Flag··0800·(2048)52 00B8FF·General·Purpose·Flag··0800·(2048)
53 ·······[Bits·1-2]············0·'Normal·Compression'53 ·······[Bits·1-2]············0·'Normal·Compression'
54 ·······[Bit·11]··············1·'Language·Encoding'54 ·······[Bit·11]··············1·'Language·Encoding'
55 00B547·Compression·Method····0008·(8)·'Deflated'55 00B901·Compression·Method····0008·(8)·'Deflated'
56 00B549·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'56 00B903·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'
57 00B54D·CRC···················00000000·(0)57 00B907·CRC···················00000000·(0)
58 00B551·Compressed·Size·······00000002·(2)58 00B90B·Compressed·Size·······00000002·(2)
59 00B555·Uncompressed·Size·····00000000·(0)59 00B90F·Uncompressed·Size·····00000000·(0)
60 00B559·Filename·Length·······0004·(4)60 00B913·Filename·Length·······0004·(4)
61 00B55B·Extra·Length··········0014·(20)61 00B915·Extra·Length··········0014·(20)
62 00B55D·Filename··············'XXXX'62 00B917·Filename··············'XXXX'
63 #63 #
64 #·WARNING:·Offset·0xB55D:·Filename·'XXXX'64 #·WARNING:·Offset·0xB917:·Filename·'XXXX'
65 #··········Zero·length·filename65 #··········Zero·length·filename
66 #66 #
67 00B561·Extra·ID·#1···········0001·(1)·'ZIP64'67 00B91B·Extra·ID·#1···········0001·(1)·'ZIP64'
68 00B563···Length··············0010·(16)68 00B91D···Length··············0010·(16)
69 00B565···Uncompressed·Size···0000000000000000·(0)69 00B91F···Uncompressed·Size···0000000000000000·(0)
70 00B56D···Compressed·Size·····0000000000000002·(2)70 00B927···Compressed·Size·····0000000000000002·(2)
71 00B575·PAYLOAD···············XX71 00B92F·PAYLOAD···············XX
  
72 00B577·LOCAL·HEADER·#4·······04034B50·(67324752)72 00B931·LOCAL·HEADER·#4·······04034B50·(67324752)
73 00B57B·Extract·Zip·Spec······14·(20)·'2.0'73 00B935·Extract·Zip·Spec······14·(20)·'2.0'
74 00B57C·Extract·OS············00·(0)·'MS-DOS'74 00B936·Extract·OS············00·(0)·'MS-DOS'
75 00B57D·General·Purpose·Flag··0800·(2048)75 00B937·General·Purpose·Flag··0800·(2048)
76 ·······[Bits·1-2]············0·'Normal·Compression'76 ·······[Bits·1-2]············0·'Normal·Compression'
77 ·······[Bit·11]··············1·'Language·Encoding'77 ·······[Bit·11]··············1·'Language·Encoding'
78 00B57F·Compression·Method····0008·(8)·'Deflated'78 00B939·Compression·Method····0008·(8)·'Deflated'
79 00B581·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'79 00B93B·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'
80 00B585·CRC···················71F6805A·(1911980122)80 00B93F·CRC···················71F6805A·(1911980122)
81 00B589·Compressed·Size·······000005AA·(1450)81 00B943·Compressed·Size·······000005AA·(1450)
82 00B58D·Uncompressed·Size·····00000D95·(3477)82 00B947·Uncompressed·Size·····00000D95·(3477)
83 00B591·Filename·Length·······0012·(18)83 00B94B·Filename·Length·······0012·(18)
84 00B593·Extra·Length··········0014·(20)84 00B94D·Extra·Length··········0014·(20)
85 00B595·Filename··············'XXXXXXXXXXXXXXXXXX'85 00B94F·Filename··············'XXXXXXXXXXXXXXXXXX'
86 #86 #
87 #·WARNING:·Offset·0xB595:·Filename·'XXXXXXXXXXXXXXXXXX'87 #·WARNING:·Offset·0xB94F:·Filename·'XXXXXXXXXXXXXXXXXX'
88 #··········Zero·length·filename88 #··········Zero·length·filename
89 #89 #
90 00B5A7·Extra·ID·#1···········0001·(1)·'ZIP64'90 00B961·Extra·ID·#1···········0001·(1)·'ZIP64'
91 00B5A9···Length··············0010·(16)91 00B963···Length··············0010·(16)
92 00B5AB···Uncompressed·Size···0000000000000D95·(3477)92 00B965···Uncompressed·Size···0000000000000D95·(3477)
93 00B5B3···Compressed·Size·····00000000000005AA·(1450)93 00B96D···Compressed·Size·····00000000000005AA·(1450)
94 00B5BB·PAYLOAD94 00B975·PAYLOAD
  
95 00BB65·LOCAL·HEADER·#5·······04034B50·(67324752)95 00BF1F·LOCAL·HEADER·#5·······04034B50·(67324752)
96 00BB69·Extract·Zip·Spec······14·(20)·'2.0'96 00BF23·Extract·Zip·Spec······14·(20)·'2.0'
97 00BB6A·Extract·OS············00·(0)·'MS-DOS'97 00BF24·Extract·OS············00·(0)·'MS-DOS'
98 00BB6B·General·Purpose·Flag··0800·(2048)98 00BF25·General·Purpose·Flag··0800·(2048)
99 ·······[Bits·1-2]············0·'Normal·Compression'99 ·······[Bits·1-2]············0·'Normal·Compression'
100 ·······[Bit·11]··············1·'Language·Encoding'100 ·······[Bit·11]··············1·'Language·Encoding'
101 00BB6D·Compression·Method····0008·(8)·'Deflated'101 00BF27·Compression·Method····0008·(8)·'Deflated'
102 00BB6F·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'102 00BF29·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'
103 00BB73·CRC···················4A35A469·(1245029481)103 00BF2D·CRC···················4A35A469·(1245029481)
104 00BB77·Compressed·Size·······00000FC0·(4032)104 00BF31·Compressed·Size·······00000FC0·(4032)
105 00BB7B·Uncompressed·Size·····000040C8·(16584)105 00BF35·Uncompressed·Size·····000040C8·(16584)
106 00BB7F·Filename·Length·······0015·(21)106 00BF39·Filename·Length·······0015·(21)
107 00BB81·Extra·Length··········0014·(20)107 00BF3B·Extra·Length··········0014·(20)
108 00BB83·Filename··············'XXXXXXXXXXXXXXXXXXXXX'108 00BF3D·Filename··············'XXXXXXXXXXXXXXXXXXXXX'
109 #109 #
110 #·WARNING:·Offset·0xBB83:·Filename·'XXXXXXXXXXXXXXXXXXXXX'110 #·WARNING:·Offset·0xBF3D:·Filename·'XXXXXXXXXXXXXXXXXXXXX'
111 #··········Zero·length·filename111 #··········Zero·length·filename
112 #112 #
113 00BB98·Extra·ID·#1···········0001·(1)·'ZIP64'113 00BF52·Extra·ID·#1···········0001·(1)·'ZIP64'
114 00BB9A···Length··············0010·(16)114 00BF54···Length··············0010·(16)
115 00BB9C···Uncompressed·Size···00000000000040C8·(16584)115 00BF56···Uncompressed·Size···00000000000040C8·(16584)
116 00BBA4···Compressed·Size·····0000000000000FC0·(4032)116 00BF5E···Compressed·Size·····0000000000000FC0·(4032)
117 00BBAC·PAYLOAD117 00BF66·PAYLOAD
  
118 00CB6C·LOCAL·HEADER·#6·······04034B50·(67324752)118 00CF26·LOCAL·HEADER·#6·······04034B50·(67324752)
119 00CB70·Extract·Zip·Spec······14·(20)·'2.0'119 00CF2A·Extract·Zip·Spec······14·(20)·'2.0'
120 00CB71·Extract·OS············00·(0)·'MS-DOS'120 00CF2B·Extract·OS············00·(0)·'MS-DOS'
121 00CB72·General·Purpose·Flag··0800·(2048)121 00CF2C·General·Purpose·Flag··0800·(2048)
122 ·······[Bits·1-2]············0·'Normal·Compression'122 ·······[Bits·1-2]············0·'Normal·Compression'
123 ·······[Bit·11]··············1·'Language·Encoding'123 ·······[Bit·11]··············1·'Language·Encoding'
124 00CB74·Compression·Method····0008·(8)·'Deflated'124 00CF2E·Compression·Method····0008·(8)·'Deflated'
125 00CB76·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'125 00CF30·Modification·Time·····00410000·(4259840)·'Fri·Feb··1·00:00:00·1980'
126 00CB7A·CRC···················CAF2DA2B·(3404913195)126 00CF34·CRC···················CAF2DA2B·(3404913195)
127 00CB7E·Compressed·Size·······00001435·(5173)127 00CF38·Compressed·Size·······00001435·(5173)
128 00CB82·Uncompressed·Size·····00004D2E·(19758)128 00CF3C·Uncompressed·Size·····00004D2E·(19758)
129 00CB86·Filename·Length·······0015·(21)129 00CF40·Filename·Length·······0015·(21)
130 00CB88·Extra·Length··········0014·(20)130 00CF42·Extra·Length··········0014·(20)
131 00CB8A·Filename··············'XXXXXXXXXXXXXXXXXXXXX'131 00CF44·Filename··············'XXXXXXXXXXXXXXXXXXXXX'
132 #132 #
133 #·WARNING:·Offset·0xCB8A:·Filename·'XXXXXXXXXXXXXXXXXXXXX'133 #·WARNING:·Offset·0xCF44:·Filename·'XXXXXXXXXXXXXXXXXXXXX'
134 #··········Zero·length·filename134 #··········Zero·length·filename
135 #135 #
136 00CB9F·Extra·ID·#1···········0001·(1)·'ZIP64'136 00CF59·Extra·ID·#1···········0001·(1)·'ZIP64'
137 00CBA1···Length··············0010·(16)137 00CF5B···Length··············0010·(16)
138 00CBA3···Uncompressed·Size···0000000000004D2E·(19758)138 00CF5D···Uncompressed·Size···0000000000004D2E·(19758)
139 00CBAB···Compressed·Size·····0000000000001435·(5173)139 00CF65···Compressed·Size·····0000000000001435·(5173)
140 00CBB3·PAYLOAD140 00CF6D·PAYLOAD
  
141 00DFE8·LOCAL·HEADER·#7·······04034B50·(67324752)141 00E3A2·LOCAL·HEADER·#7·······04034B50·(67324752)
142 00DFEC·Extract·Zip·Spec······14·(20)·'2.0'142 00E3A6·Extract·Zip·Spec······14·(20)·'2.0'
143 00DFED·Extract·OS············00·(0)·'MS-DOS'143 00E3A7·Extract·OS············00·(0)·'MS-DOS'
144 00DFEE·General·Purpose·Flag··0800·(2048)144 00E3A8·General·Purpose·Flag··0800·(2048)
145 ·······[Bits·1-2]············0·'Normal·Compression'145 ·······[Bits·1-2]············0·'Normal·Compression'
146 ·······[Bit·11]··············1·'Language·Encoding'146 ·······[Bit·11]··············1·'Language·Encoding'
147 00DFF0·Compression·Method····0008·(8)·'Deflated'147 00E3AA·Compression·Method····0008·(8)·'Deflated'
Max diff block lines reached; 1894875/1982511 bytes (95.58%) of diff not shown.
30.6 KB
typing_extensions.py
    
Offset 87, 14 lines modifiedOffset 87, 15 lines modified
87 ····'is_protocol',87 ····'is_protocol',
88 ····'is_typeddict',88 ····'is_typeddict',
89 ····'Literal',89 ····'Literal',
90 ····'NewType',90 ····'NewType',
91 ····'overload',91 ····'overload',
92 ····'override',92 ····'override',
93 ····'Protocol',93 ····'Protocol',
 94 ····'sentinel',
94 ····'Sentinel',95 ····'Sentinel',
95 ····'reveal_type',96 ····'reveal_type',
96 ····'runtime',97 ····'runtime',
97 ····'runtime_checkable',98 ····'runtime_checkable',
98 ····'Text',99 ····'Text',
99 ····'TypeAlias',100 ····'TypeAlias',
100 ····'TypeAliasType',101 ····'TypeAliasType',
Offset 144, 38 lines modifiedOffset 145, 141 lines modified
144 ····'Sized',145 ····'Sized',
145 ····'TextIO',146 ····'TextIO',
146 ····'Tuple',147 ····'Tuple',
147 ····'Union',148 ····'Union',
148 ····'ValuesView',149 ····'ValuesView',
149 ····'cast',150 ····'cast',
150 ····'no_type_check',151 ····'no_type_check',
151 ····'no_type_check_decorator', 
152 ]152 ]
  
153 #·for·backward·compatibility153 #·for·backward·compatibility
154 PEP_560·=·True154 PEP_560·=·True
155 GenericMeta·=·type155 GenericMeta·=·type
156 #·Breakpoint:·https://github.com/python/cpython/pull/116129156 #·Breakpoint:·https://github.com/python/cpython/pull/116129
157 _PEP_696_IMPLEMENTED·=·sys.version_info·>=·(3,·13,·0,·"beta")157 _PEP_696_IMPLEMENTED·=·sys.version_info·>=·(3,·13,·0,·"beta")
  
158 #·Added·with·bpo-45166·to·3.10.1+·and·some·3.9·versions158 #·Added·with·bpo-45166·to·3.10.1+·and·some·3.9·versions
159 _FORWARD_REF_HAS_CLASS·=·"__forward_is_class__"·in·typing.ForwardRef.__slots__159 _FORWARD_REF_HAS_CLASS·=·"__forward_is_class__"·in·typing.ForwardRef.__slots__
  
160 #·The·functions·below·are·modified·copies·of·typing·internal·helpers. 
161 #·They·are·needed·by·_ProtocolMeta·and·they·provide·support·for·PEP·646. 
 160 def·_caller(depth=1,·default='__main__'):
 161 ····try:
 162 ········return·sys._getframemodulename(depth·+·1)·or·default
 163 ····except·AttributeError:··#·For·platforms·without·_getframemodulename()
 164 ········pass
 165 ····try:
 166 ········return·sys._getframe(depth·+·1).f_globals.get('__name__',·default)
 167 ····except·(AttributeError,·ValueError):··#·For·platforms·without·_getframe()
 168 ········pass
 169 ····return·None
  
  
 170 #·Placeholder·for·sentinel·methods,·because·sentinels·can·not·have·their·own·sentinels
 171 _sentinel_placeholder·=·object()
  
 172 if·hasattr(builtins,·"sentinel"):··#·3.15+
 173 ····sentinel·=·builtins.sentinel
 174 else:
162 class·_Sentinel:175 ····class·sentinel:
 176 ········"""Create·a·unique·sentinel·object.
  
 177 ········*name*·should·be·the·name·of·the·variable·to·which·the·return·value
 178 ········shall·be·assigned.
 179 ········"""
  
 180 ········def·__init__(
 181 ············self,
 182 ············__name:·str·=·_sentinel_placeholder,
 183 ············__repr:·typing.Optional[str]·=·_sentinel_placeholder,
 184 ············/,
 185 ············*,
 186 ············repr:·typing.Optional[str]·=·None,
 187 ············name:·str·=·_sentinel_placeholder,
 188 ········)·->·None:
 189 ············if·name·is·not·_sentinel_placeholder:
 190 ················warnings.warn(
 191 ····················"Passing·'name'·as·a·keyword·argument·is·deprecated;·"
 192 ····················"pass·it·positionally·instead.",
 193 ····················DeprecationWarning,
 194 ····················stacklevel=2,
 195 ················)
 196 ················__name·=·name
 197 ············if·__name·is·_sentinel_placeholder:
 198 ················raise·TypeError("First·parameter·'name'·is·required")
 199 ············if·__repr·is·not·_sentinel_placeholder:
 200 ················warnings.warn(
 201 ····················"Passing·'repr'·as·a·positional·argument·is·deprecated;·"
 202 ····················"pass·it·by·keyword·instead.",
 203 ····················DeprecationWarning,
 204 ····················stacklevel=2,
 205 ················)
 206 ················repr·=·__repr
  
 207 ············self._name·=·__name
 208 ············self._repr·=·repr·if·repr·is·not·None·else·__name
  
 209 ············#·For·pickling·as·a·singleton:
 210 ············self.__module__·=·_caller()
  
 211 ········def·__init_subclass__(cls):
 212 ············warnings.warn(
 213 ················"Subclassing·sentinel·is·deprecated·"
 214 ················"and·will·be·disallowed·in·Python·3.15",
 215 ················DeprecationWarning,
 216 ················stacklevel=2,
 217 ············)
 218 ············super().__init_subclass__()
  
 219 ········def·__setattr__(self,·attr:·str,·value:·object)·->·None:
 220 ············if·attr·not·in·{"_name",·"_repr",·"__module__"}:
 221 ················warnings.warn(
 222 ····················f"Setting·attribute·{attr!r}·on·sentinel·objects·is·deprecated·"
 223 ····················"and·will·be·disallowed·in·Python·3.15.",
 224 ····················DeprecationWarning,
 225 ····················stacklevel=2,
 226 ················)
 227 ············super().__setattr__(attr,·value)
  
 228 ········@property
 229 ········def·__name__(self)·->·str:
 230 ············return·self._name
  
 231 ········@__name__.setter
 232 ········def·__name__(self,·value:·str)·->·None:
 233 ············self._name·=·value
  
163 ····def·__repr__(self):234 ········def·__repr__(self)·->·str:
164 ········return·"<sentinel>"235 ············return·self._repr
  
 236 ········if·sys.version_info·<·(3,·11):
Max diff block lines reached; 26678/31298 bytes (85.24%) of diff not shown.
16.2 KB
filelock/_api.py
    
Offset 5, 15 lines modifiedOffset 5, 15 lines modified
5 import·logging5 import·logging
6 import·os6 import·os
7 import·sys7 import·sys
8 import·time8 import·time
9 import·warnings9 import·warnings
10 from·abc·import·ABCMeta,·abstractmethod10 from·abc·import·ABCMeta,·abstractmethod
11 from·dataclasses·import·dataclass11 from·dataclasses·import·dataclass
12 from·threading·import·local12 from·threading·import·Lock,·local
13 from·typing·import·TYPE_CHECKING,·Any,·TypeVar13 from·typing·import·TYPE_CHECKING,·Any,·TypeVar
14 from·weakref·import·WeakValueDictionary14 from·weakref·import·WeakValueDictionary
  
15 from·._error·import·Timeout15 from·._error·import·Timeout
16 from·._util·import·break_lock_file16 from·._util·import·break_lock_file
  
17 #:·Sentinel·indicating·that·no·explicit·file·permission·mode·was·passed.17 #:·Sentinel·indicating·that·no·explicit·file·permission·mode·was·passed.
Offset 108, 97 lines modifiedOffset 108, 106 lines modified
  
  
108 _T·=·TypeVar("_T",·bound="BaseFileLock")108 _T·=·TypeVar("_T",·bound="BaseFileLock")
  
  
109 class·FileLockMeta(ABCMeta):109 class·FileLockMeta(ABCMeta):
110 ····_instances:·WeakValueDictionary[str,·BaseFileLock]110 ····_instances:·WeakValueDictionary[str,·BaseFileLock]
 111 ····_instances_lock:·Lock
  
111 ····def·__call__(··#·noqa:·PLR0913112 ····def·__call__(··#·noqa:·PLR0913
112 ········cls:·type[_T],113 ········cls:·type[_T],
113 ········lock_file:·str·|·os.PathLike[str],114 ········lock_file:·str·|·os.PathLike[str],
114 ········timeout:·float·=·-1,115 ········timeout:·float·=·-1,
115 ········mode:·int·=·_UNSET_FILE_MODE,116 ········mode:·int·=·_UNSET_FILE_MODE,
116 ········thread_local:·bool·=·True,··#·noqa:·FBT001,·FBT002117 ········thread_local:·bool·=·True,··#·noqa:·FBT001,·FBT002
117 ········*,118 ········*,
118 ········blocking:·bool·=·True,119 ········blocking:·bool·=·True,
119 ········is_singleton:·bool·=·False,120 ········is_singleton:·bool·=·False,
120 ········poll_interval:·float·=·0.05,121 ········poll_interval:·float·=·0.05,
121 ········lifetime:·float·|·None·=·None,122 ········lifetime:·float·|·None·=·None,
122 ········**kwargs:·Any,··#·capture·remaining·kwargs·for·subclasses··#·noqa:·ANN401123 ········**kwargs:·Any,··#·capture·remaining·kwargs·for·subclasses··#·noqa:·ANN401
123 ····)·->·_T:124 ····)·->·_T:
124 ········if·is_singleton: 
125 ············instance·=·cls._instances.get(str(lock_file)) 
126 ············if·instance: 
127 ················params_to_check·=·{ 
128 ····················"thread_local":·(thread_local,·instance.is_thread_local()), 
129 ····················"timeout":·(timeout,·instance.timeout), 
130 ····················"mode":·(mode,·instance._context.mode),··#·noqa:·SLF001 
131 ····················"blocking":·(blocking,·instance.blocking), 
132 ····················"poll_interval":·(poll_interval,·instance.poll_interval), 
133 ····················"lifetime":·(lifetime,·instance.lifetime), 
134 ················} 
  
135 ················non_matching_params·=·{ 
136 ····················name:·(passed_param,·set_param) 
137 ····················for·name,·(passed_param,·set_param)·in·params_to_check.items() 
138 ····················if·passed_param·!=·set_param 
139 ················} 
140 ················if·not·non_matching_params: 
141 ····················return·instance··#·ty:·ignore[invalid-return-type]··#·https://github.com/astral-sh/ty/issues/3231 
  
142 ················#·parameters·do·not·match;·raise·error 
143 ················msg·=·"Singleton·lock·instances·cannot·be·initialized·with·differing·arguments" 
144 ················msg·+=·"\nNon-matching·arguments:·" 
145 ················for·param_name,·(passed_param,·set_param)·in·non_matching_params.items(): 
146 ····················msg·+=·f"\n\t{param_name}·(existing·lock·has·{set_param}·but·{passed_param}·was·passed)" 
147 ················raise·ValueError(msg) 
  
148 ········#·Workaround·to·make·`__init__`'s·params·optional·in·subclasses 
149 ········#·E.g.·virtualenv·changes·the·signature·of·the·`__init__`·method·in·the·`BaseFileLock`·class·descendant 
150 ········#·(https://github.com/tox-dev/filelock/pull/340) 
  
151 ········all_params·=·{125 ········params·=·{
152 ············"timeout":·timeout,126 ············"timeout":·timeout,
153 ············"mode":·mode,127 ············"mode":·mode,
154 ············"thread_local":·thread_local,128 ············"thread_local":·thread_local,
155 ············"blocking":·blocking,129 ············"blocking":·blocking,
156 ············"is_singleton":·is_singleton,130 ············"is_singleton":·is_singleton,
157 ············"poll_interval":·poll_interval,131 ············"poll_interval":·poll_interval,
158 ············"lifetime":·lifetime,132 ············"lifetime":·lifetime,
159 ············**kwargs,133 ············**kwargs,
160 ········}134 ········}
 135 ········if·not·is_singleton:
 136 ············return·cls._create_instance(lock_file,·params)
  
161 ········present_params·=·inspect.signature(cls.__init__).parameters 
162 ········init_params·=·{key:·value·for·key,·value·in·all_params.items()·if·key·in·present_params}137 ········#·Look·up,·build·and·store·under·one·lock.·Without·it·two·threads·racing·the·first·construction·for·a
 138 ········#·path·both·miss·the·cache·and·each·build·their·own·instance,·so·callers·relying·on·is_singleton·for
 139 ········#·reentrant·locking·across·instances·end·up·with·two·"singletons"·and·acquire()'s·deadlock·check·then
 140 ········#·rejects·a·legitimate·reentrant·acquire;·the·unguarded·writes·to·the·WeakValueDictionary·are·a·data
 141 ········#·race·besides.·ReadWriteLock·and·SoftReadWriteLock·already·guard·their·singleton·caches·this·way.
 142 ········with·cls._instances_lock:
 143 ············if·(instance·:=·cls._instances.get(str(lock_file)))·is·None:
 144 ················instance·=·cls._create_instance(lock_file,·params)
 145 ················cls._instances[str(lock_file)]·=·instance
 146 ················return·instance
  
163 ········instance·=·super().__call__(lock_file,·**init_params)147 ········params_to_check·=·{
 148 ············"thread_local":·(thread_local,·instance.is_thread_local()),
 149 ············"timeout":·(timeout,·instance.timeout),
 150 ············"mode":·(mode,·instance._context.mode),··#·noqa:·SLF001
 151 ············"blocking":·(blocking,·instance.blocking),
 152 ············"poll_interval":·(poll_interval,·instance.poll_interval),
 153 ············"lifetime":·(lifetime,·instance.lifetime),
 154 ········}
  
164 ········if·is_singleton: 
165 ············cls._instances[str(lock_file)]·=·instance155 ········non_matching_params·=·{
 156 ············name:·(passed_param,·set_param)
 157 ············for·name,·(passed_param,·set_param)·in·params_to_check.items()
 158 ············if·passed_param·!=·set_param
 159 ········}
 160 ········if·not·non_matching_params:
 161 ············return·instance··#·ty:·ignore[invalid-return-type]··#·https://github.com/astral-sh/ty/issues/3231
  
166 ········return·instance162 ········#·parameters·do·not·match;·raise·error
 163 ········msg·=·"Singleton·lock·instances·cannot·be·initialized·with·differing·arguments"
 164 ········msg·+=·"\nNon-matching·arguments:·"
 165 ········for·param_name,·(passed_param,·set_param)·in·non_matching_params.items():
 166 ············msg·+=·f"\n\t{param_name}·(existing·lock·has·{set_param}·but·{passed_param}·was·passed)"
 167 ········raise·ValueError(msg)
  
 168 ····def·_create_instance(cls:·type[_T],·lock_file:·str·|·os.PathLike[str],·params:·dict[str,·Any])·->·_T:
 169 ········#·Keep·only·the·params·this·subclass's·__init__·accepts:·virtualenv·narrows·the·signature·of·its
 170 ········#·BaseFileLock·descendant,·so·passing·the·full·set·would·break·it·(https://github.com/tox-dev/filelock/pull/340).
 171 ········present_params·=·inspect.signature(cls.__init__).parameters
 172 ········init_params·=·{key:·value·for·key,·value·in·params.items()·if·key·in·present_params}
 173 ········return·super().__call__(lock_file,·**init_params)
  
  
Max diff block lines reached; 10295/16536 bytes (62.26%) of diff not shown.
1.79 KB
filelock/_async_read_write.py
    
Offset 70, 35 lines modifiedOffset 70, 35 lines modified
70 ········self._lock·=·ReadWriteLock(lock_file,·timeout,·blocking=blocking,·is_singleton=is_singleton)70 ········self._lock·=·ReadWriteLock(lock_file,·timeout,·blocking=blocking,·is_singleton=is_singleton)
71 ········self._loop·=·loop71 ········self._loop·=·loop
72 ········self._owns_executor·=·executor·is·None72 ········self._owns_executor·=·executor·is·None
73 ········self._executor·=·executor·or·ThreadPoolExecutor(max_workers=1)73 ········self._executor·=·executor·or·ThreadPoolExecutor(max_workers=1)
  
74 ····@property74 ····@property
75 ····def·lock_file(self)·->·str:75 ····def·lock_file(self)·->·str:
76 ········""":returns:·the·path·to·the·lock·file."""76 ········"""The·path·to·the·lock·file."""
77 ········return·self._lock.lock_file77 ········return·self._lock.lock_file
  
78 ····@property78 ····@property
79 ····def·timeout(self)·->·float:79 ····def·timeout(self)·->·float:
80 ········""":returns:·the·default·timeout."""80 ········"""The·default·timeout."""
81 ········return·self._lock.timeout81 ········return·self._lock.timeout
  
82 ····@property82 ····@property
83 ····def·blocking(self)·->·bool:83 ····def·blocking(self)·->·bool:
84 ········""":returns:·whether·blocking·is·enabled·by·default."""84 ········"""Whether·blocking·is·enabled·by·default."""
85 ········return·self._lock.blocking85 ········return·self._lock.blocking
  
86 ····@property86 ····@property
87 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:87 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:
88 ········""":returns:·the·event·loop·(or·``None``·for·the·running·loop)."""88 ········"""The·event·loop·(or·``None``·for·the·running·loop)."""
89 ········return·self._loop89 ········return·self._loop
  
90 ····@property90 ····@property
91 ····def·executor(self)·->·futures.Executor:91 ····def·executor(self)·->·futures.Executor:
92 ········""":returns:·the·executor·used·for·``run_in_executor``·(a·dedicated·single-thread·one·if·none·was·supplied)."""92 ········"""The·executor·used·for·``run_in_executor``·(a·dedicated·single-thread·one·if·none·was·supplied)."""
93 ········return·self._executor93 ········return·self._executor
  
94 ····async·def·_run(self,·func:·Callable[...,·object],·*args:·object,·**kwargs:·object)·->·object:94 ····async·def·_run(self,·func:·Callable[...,·object],·*args:·object,·**kwargs:·object)·->·object:
95 ········loop·=·self._loop·or·asyncio.get_running_loop()95 ········loop·=·self._loop·or·asyncio.get_running_loop()
96 ········return·await·loop.run_in_executor(self._executor,·functools.partial(func,·*args,·**kwargs))96 ········return·await·loop.run_in_executor(self._executor,·functools.partial(func,·*args,·**kwargs))
  
97 ····async·def·acquire_read(self,·timeout:·float·=·-1,·*,·blocking:·bool·=·True)·->·AsyncAcquireReadWriteReturnProxy:97 ····async·def·acquire_read(self,·timeout:·float·=·-1,·*,·blocking:·bool·=·True)·->·AsyncAcquireReadWriteReturnProxy:
443 B
filelock/_error.py
    
Offset 15, 14 lines modifiedOffset 15, 14 lines modified
15 ········return·f"The·file·lock·'{self._lock_file}'·could·not·be·acquired."15 ········return·f"The·file·lock·'{self._lock_file}'·could·not·be·acquired."
  
16 ····def·__repr__(self)·->·str:16 ····def·__repr__(self)·->·str:
17 ········return·f"{self.__class__.__name__}({self.lock_file!r})"17 ········return·f"{self.__class__.__name__}({self.lock_file!r})"
  
18 ····@property18 ····@property
19 ····def·lock_file(self)·->·str:19 ····def·lock_file(self)·->·str:
20 ········""":returns:·The·path·of·the·file·lock."""20 ········"""The·path·of·the·file·lock."""
21 ········return·self._lock_file21 ········return·self._lock_file
  
  
22 __all__·=·[22 __all__·=·[
23 ····"Timeout",23 ····"Timeout",
24 ]24 ]
3.05 KB
filelock/_read_write.py
    
Offset 216, 18 lines modifiedOffset 216, 27 lines modified
216 ············if·self._lock_level·>·0:216 ············if·self._lock_level·>·0:
217 ················return·self._validate_reentrant(mode)217 ················return·self._validate_reentrant(mode)
  
218 ········start_time·=·time.perf_counter()218 ········start_time·=·time.perf_counter()
219 ········self._acquire_transaction_lock(blocking=blocking,·timeout=timeout)219 ········self._acquire_transaction_lock(blocking=blocking,·timeout=timeout)
220 ········try:220 ········try:
221 ············return·self._do_acquire_inner(mode,·timeout,·blocking=blocking,·start_time=start_time)221 ············return·self._do_acquire_inner(mode,·timeout,·blocking=blocking,·start_time=start_time)
222 ········except·sqlite3.OperationalError·as·exc:222 ········except·sqlite3.Error·as·exc:
223 ············if·"database·is·locked"·not·in·str(exc): 
224 ················raise223 ············#·A·read·acquire·runs·BEGIN·(a·deferred·transaction·that·takes·no·database·lock)·and·only·then·the
 224 ············#·SELECT·that·actually·takes·the·SHARED·lock.·If·a·writer·grabs·the·EXCLUSIVE·lock·between·the·two,
 225 ············#·the·SELECT·fails·but·BEGIN's·transaction·is·left·open·on·the·shared·connection.·Roll·it·back·here,
 226 ············#·while·we·still·hold·_transaction_lock,·otherwise·the·next·acquire's·BEGIN·dies·with·"cannot·start·a
 227 ············#·transaction·within·a·transaction"·and·the·instance·is·wedged·for·good.·Catch·only·sqlite3.Error:·a
 228 ············#·reentrant-validation·RuntimeError·from·_do_acquire_inner's·double-check·must·not·roll·back,·or·it
 229 ············#·would·drop·a·transaction·another·thread·legitimately·holds·on·the·shared·connection.
 230 ············with·suppress(sqlite3.Error):
 231 ················self._con.rollback()
 232 ············if·isinstance(exc,·sqlite3.OperationalError)·and·"database·is·locked"·in·str(exc):
225 ············raise·Timeout(self.lock_file)·from·None233 ················raise·Timeout(self.lock_file)·from·None
 234 ············raise
226 ········finally:235 ········finally:
227 ············self._transaction_lock.release()236 ············self._transaction_lock.release()
  
228 ····def·_do_acquire_inner(237 ····def·_do_acquire_inner(
229 ········self,238 ········self,
230 ········mode:·Literal["read",·"write"],239 ········mode:·Literal["read",·"write"],
231 ········timeout:·float,240 ········timeout:·float,
Offset 308, 15 lines modifiedOffset 317, 22 lines modified
308 ············else:317 ············else:
309 ················self._lock_level·-=·1318 ················self._lock_level·-=·1
310 ············if·self._lock_level·==·0:319 ············if·self._lock_level·==·0:
311 ················self._current_mode·=·None320 ················self._current_mode·=·None
312 ················self._write_thread_id·=·None321 ················self._write_thread_id·=·None
313 ················should_rollback·=·True322 ················should_rollback·=·True
314 ········if·should_rollback:323 ········if·should_rollback:
 324 ············#·The·rollback·ends·the·transaction·on·the·shared·connection,·so·it·has·to·be·serialized·against
 325 ············#·acquire()'s·BEGIN·the·same·way·acquire()·already·serializes·itself·with·_transaction_lock.·Without
 326 ············#·this,·another·thread·that·sees·lock_level·back·at·0·can·start·its·BEGIN·while·this·rollback's
 327 ············#·transaction·is·still·open·(raising·"cannot·start·a·transaction·within·a·transaction")·or,·in·the
 328 ············#·other·ordering,·have·its·freshly·started·transaction·rolled·back·here,·dropping·the·database·lock
 329 ············#·while·it·still·believes·it·holds·it.
 330 ············with·self._transaction_lock:
315 ············self._con.rollback()331 ················self._con.rollback()
  
316 ····@contextmanager332 ····@contextmanager
317 ····def·read_lock(self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None)·->·Generator[None]:333 ····def·read_lock(self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None)·->·Generator[None]:
318 ········"""334 ········"""
319 ········Context·manager·that·acquires·and·releases·a·shared·read·lock.335 ········Context·manager·that·acquires·and·releases·a·shared·read·lock.
  
320 ········Falls·back·to·instance·defaults·for·*timeout*·and·*blocking*·when·``None``.336 ········Falls·back·to·instance·defaults·for·*timeout*·and·*blocking*·when·``None``.
1.7 KB
filelock/_unix.py
    
Offset 34, 17 lines modifiedOffset 34, 17 lines modified
34 ····else:34 ····else:
35 ········has_fcntl·=·True35 ········has_fcntl·=·True
  
36 ····class·UnixFileLock(BaseFileLock):36 ····class·UnixFileLock(BaseFileLock):
37 ········"""37 ········"""
38 ········Uses·the·:func:`fcntl.flock`·to·hard·lock·the·lock·file·on·unix·systems.38 ········Uses·the·:func:`fcntl.flock`·to·hard·lock·the·lock·file·on·unix·systems.
  
39 ········Lock·file·cleanup:·Unix·and·macOS·delete·the·lock·file·reliably·after·release,·even·in 
40 ········multi-threaded·scenarios.·Unlike·Windows,·Unix·allows·unlinking·files·that·other·processes 
41 ········have·open.39 ········The·lock·file·is·intentionally·left·in·place·after·release.·Unlinking·a·locked·file·on·Unix
 40 ········can·split·waiters·across·different·inodes·and·break·mutual·exclusion·for·processes·that
 41 ········coordinate·via·the·same·path.
42 ········"""42 ········"""
  
43 ········def·_acquire(self)·->·None:··#·noqa:·C901,·PLR091243 ········def·_acquire(self)·->·None:··#·noqa:·C901,·PLR0912
44 ············ensure_directory_exists(self.lock_file)44 ············ensure_directory_exists(self.lock_file)
45 ············open_flags·=·os.O_RDWR·|·os.O_TRUNC45 ············open_flags·=·os.O_RDWR·|·os.O_TRUNC
46 ············o_nofollow·=·getattr(os,·"O_NOFOLLOW",·None)46 ············o_nofollow·=·getattr(os,·"O_NOFOLLOW",·None)
47 ············if·o_nofollow·is·not·None:47 ············if·o_nofollow·is·not·None:
Offset 99, 18 lines modifiedOffset 99, 16 lines modified
99 ············from·.asyncio·import·AsyncSoftFileLock,·BaseAsyncFileLock··#·noqa:·PLC041599 ············from·.asyncio·import·AsyncSoftFileLock,·BaseAsyncFileLock··#·noqa:·PLC0415
  
100 ············self.__class__·=·AsyncSoftFileLock·if·isinstance(self,·BaseAsyncFileLock)·else·SoftFileLock100 ············self.__class__·=·AsyncSoftFileLock·if·isinstance(self,·BaseAsyncFileLock)·else·SoftFileLock
  
101 ········def·_release(self)·->·None:101 ········def·_release(self)·->·None:
102 ············fd·=·cast("int",·self._context.lock_file_fd)102 ············fd·=·cast("int",·self._context.lock_file_fd)
103 ············self._context.lock_file_fd·=·None103 ············self._context.lock_file_fd·=·None
104 ············with·suppress(OSError): 
105 ················Path(self.lock_file).unlink() 
106 ············fcntl.flock(fd,·fcntl.LOCK_UN)104 ············fcntl.flock(fd,·fcntl.LOCK_UN)
107 ············with·suppress(OSError):··#·close·can·raise·EIO·on·FUSE/Docker·bind-mount·filesystems·after·unlink105 ············with·suppress(OSError):··#·close·can·raise·EIO·on·FUSE/Docker·bind-mount·filesystems
108 ················os.close(fd)106 ················os.close(fd)
  
  
109 __all__·=·[107 __all__·=·[
110 ····"UnixFileLock",108 ····"UnixFileLock",
111 ····"has_fcntl",109 ····"has_fcntl",
112 ]110 ]
4.79 KB
filelock/_util.py
    
Offset 1, 44 lines modifiedOffset 1, 47 lines modified
1 from·__future__·import·annotations1 from·__future__·import·annotations
  
2 import·os2 import·os
 3 import·secrets
3 import·stat4 import·stat
4 import·sys5 import·sys
5 from·errno·import·EACCES,·EISDIR6 from·errno·import·EACCES,·EISDIR
6 from·pathlib·import·Path7 from·pathlib·import·Path
  
  
7 def·raise_on_not_writable_file(filename:·str)·->·None:8 def·raise_on_not_writable_file(filename:·str)·->·None:
8 ····"""9 ····"""
9 ····Raise·an·exception·if·attempting·to·open·the·file·for·writing·would·fail.10 ····Raise·an·exception·if·attempting·to·open·the·file·for·writing·would·fail.
  
 11 ····Separates·files·that·can·never·be·written·from·files·that·are·writable·but·currently·locked.
10 ····This·is·done·so·files·that·will·never·be·writable·can·be·separated·from·files·that·are·writable·but·currently 
11 ····locked. 
  
12 ····:param·filename:·file·to·check12 ····:param·filename:·file·to·check
  
13 ····:raises·OSError:·as·if·the·file·was·opened·for·writing.13 ····:raises·OSError:·as·if·the·file·was·opened·for·writing.
  
14 ····"""14 ····"""
15 ····try:··#·use·stat·to·do·exists·+·can·write·to·check·without·race·condition15 ····try:
 16 ········#·lstat,·not·stat:·it·settles·exists-and-writable·in·one·syscall,·and·a·hostile·symlink·planted·at·the·lock
 17 ········#·path·would·otherwise·make·this·inspect·the·link·target,·letting·an·attacker·turn·a·contended·acquire·into·a
 18 ········#·misleading·PermissionError·/·IsADirectoryError·and·probe·that·target's·attributes.·The·real·open·passes
 19 ········#·O_NOFOLLOW·and·refuses·the·symlink·anyway.
16 ········file_stat·=·os.stat(filename)··#·noqa:·PTH11620 ········file_stat·=·os.lstat(filename)
17 ····except·OSError:21 ····except·OSError:
18 ········return··#·swallow·does·not·exist·or·other·errors22 ········return··#·does·not·exist,·or·an·error·the·caller·cannot·act·on
  
19 ····if·file_stat.st_mtime·!=·0:··#·if·os.stat·returns·but·modification·is·zero·that's·an·invalid·os.stat·-·ignore·it23 ····#·No·mtime·guard:·the·old·`if·st_mtime·!=·0`·skip·existed·for·NFS/Linux·quirks·where·os.lstat·could·return·an
 24 ····#·all-zero·struct,·which·it·no·longer·does.·Skipping·on·mtime·0·let·a·read-only·file·or·a·directory·at·the·lock
 25 ····#·path·pass·as·missing,·so·acquire()·blocked·forever·on·an·open·that·cannot·succeed.
20 ········if·not·(file_stat.st_mode·&·stat.S_IWUSR):26 ····if·not·(file_stat.st_mode·&·stat.S_IWUSR):
21 ············raise·PermissionError(EACCES,·"Permission·denied",·filename)27 ········raise·PermissionError(EACCES,·"Permission·denied",·filename)
  
22 ········if·stat.S_ISDIR(file_stat.st_mode):28 ····if·stat.S_ISDIR(file_stat.st_mode):
23 ············if·sys.platform·==·"win32":··#·pragma:·win32·cover29 ········if·sys.platform·==·"win32":··#·pragma:·win32·cover
24 ················#·On·Windows,·this·is·PermissionError 
25 ················raise·PermissionError(EACCES,·"Permission·denied",·filename)30 ············raise·PermissionError(EACCES,·"Permission·denied",·filename)
26 ············else:··#·pragma:·win32·no·cover·#·noqa:·RET506 
27 ················#·On·linux·/·macOS,·this·is·IsADirectoryError 
28 ················raise·IsADirectoryError(EISDIR,·"Is·a·directory",·filename)31 ········raise·IsADirectoryError(EISDIR,·"Is·a·directory",·filename)··#·pragma:·win32·no·cover
  
  
29 def·ensure_directory_exists(filename:·Path·|·str)·->·None:32 def·ensure_directory_exists(filename:·Path·|·str)·->·None:
30 ····"""33 ····"""
31 ····Ensure·the·directory·containing·the·file·exists·(create·it·if·necessary).34 ····Ensure·the·directory·containing·the·file·exists·(create·it·if·necessary).
  
32 ····:param·filename:·file.35 ····:param·filename:·file.
Offset 57, 22 lines modifiedOffset 60, 28 lines modified
57 ····recreated·the·lock·between·the·stale·decision·and·the·rename,·so·we·grabbed·a·live·file·and·must·abort,·leaving·the60 ····recreated·the·lock·between·the·stale·decision·and·the·rename,·so·we·grabbed·a·live·file·and·must·abort,·leaving·the
58 ····renamed·file·in·place·rather·than·rolling·back·(a·rollback·rename·is·itself·racy··same·trade-off·as·the·soft61 ····renamed·file·in·place·rather·than·rolling·back·(a·rollback·rename·is·itself·racy··same·trade-off·as·the·soft
59 ····read/write·marker·break).·The·inode·check·matters·because·filesystems·with·coarse·modification-time·granularity62 ····read/write·marker·break).·The·inode·check·matters·because·filesystems·with·coarse·modification-time·granularity
60 ····(NFS,·FAT)·can·give·a·same-second·recreation·the·old·mtime,·so·mtime·alone·would·not·catch·it·and·a·live·lock·would63 ····(NFS,·FAT)·can·give·a·same-second·recreation·the·old·mtime,·so·mtime·alone·would·not·catch·it·and·a·live·lock·would
61 ····be·unlinked;·the·inode·is·the·reliable·identity,·mirroring·the·token·re-check·in·the·soft·read/write·marker·break.64 ····be·unlinked;·the·inode·is·the·reliable·identity,·mirroring·the·token·re-check·in·the·soft·read/write·marker·break.
62 ····``lstat``·is·used·so·a·hostile·symlink·swapped·in·after·the·decision·is·not·followed.65 ····``lstat``·is·used·so·a·hostile·symlink·swapped·in·after·the·decision·is·not·followed.
  
 66 ····The·break·name·carries·a·random·token·so·it·is·unguessable·and·unique·per·attempt.·Without·it·two·breakers·in·the
 67 ····same·process·share·``<lock>.break.<pid>``,·and·a·second·break·can·rename·a·freshly·recreated·live·lock·onto·that
 68 ····path·in·the·window·between·the·re-verify·``lstat``·above·and·the·``unlink``·below,·so·we·would·delete·a·live·lock
 69 ····the·inode·check·just·approved.·A·private·name·means·nobody·else·can·target·our·break·path,·matching·the·soft
 70 ····read/write·marker·break.
  
63 ····:param·lock_file:·path·to·the·lock·file·to·break.71 ····:param·lock_file:·path·to·the·lock·file·to·break.
64 ····:param·mtime_before:·modification·time·observed·when·the·lock·was·judged·stale.72 ····:param·mtime_before:·modification·time·observed·when·the·lock·was·judged·stale.
65 ····:param·ino_before:·inode·number·observed·when·the·lock·was·judged·stale.73 ····:param·ino_before:·inode·number·observed·when·the·lock·was·judged·stale.
  
66 ····:raises·OSError:·if·the·rename·fails·(e.g.·the·file·vanished·or·is·not·owned·in·a·sticky·directory).74 ····:raises·OSError:·if·the·rename·fails·(e.g.·the·file·vanished·or·is·not·owned·in·a·sticky·directory).
  
67 ····"""75 ····"""
68 ····break_path·=·f"{lock_file}.break.{os.getpid()}"76 ····break_path·=·f"{lock_file}.break.{os.getpid()}.{secrets.token_hex(16)}"
69 ····Path(lock_file).rename(break_path)77 ····Path(lock_file).rename(break_path)
70 ····try:78 ····try:
71 ········st_after·=·os.lstat(break_path)79 ········st_after·=·os.lstat(break_path)
72 ····except·OSError:80 ····except·OSError:
73 ········return81 ········return
74 ····if·st_after.st_mtime·>·mtime_before·or·st_after.st_ino·!=·ino_before:82 ····if·st_after.st_mtime·>·mtime_before·or·st_after.st_ino·!=·ino_before:
75 ········return83 ········return
4.06 KB
filelock/asyncio.py
    
Offset 8, 15 lines modifiedOffset 8, 15 lines modified
8 import·os8 import·os
9 import·time9 import·time
10 from·dataclasses·import·dataclass10 from·dataclasses·import·dataclass
11 from·inspect·import·iscoroutinefunction11 from·inspect·import·iscoroutinefunction
12 from·threading·import·local12 from·threading·import·local
13 from·typing·import·TYPE_CHECKING,·Any,·NoReturn,·TypeVar13 from·typing·import·TYPE_CHECKING,·Any,·NoReturn,·TypeVar
  
14 from·._api·import·_UNSET_FILE_MODE,·BaseFileLock,·FileLockContext,·FileLockMeta14 from·._api·import·_UNSET_FILE_MODE,·BaseFileLock,·FileLockContext,·FileLockMeta,·_canonical
15 from·._error·import·Timeout15 from·._error·import·Timeout
16 from·._soft·import·SoftFileLock16 from·._soft·import·SoftFileLock
17 from·._unix·import·UnixFileLock17 from·._unix·import·UnixFileLock
18 from·._windows·import·WindowsFileLock18 from·._windows·import·WindowsFileLock
  
19 if·TYPE_CHECKING:19 if·TYPE_CHECKING:
20 ····import·sys20 ····import·sys
Offset 110, 14 lines modifiedOffset 110, 16 lines modified
110 ····"""110 ····"""
111 ····Base·class·for·asynchronous·file·locks.111 ····Base·class·for·asynchronous·file·locks.
  
112 ····..·versionadded::·3.15.0112 ····..·versionadded::·3.15.0
  
113 ····"""113 ····"""
  
 114 ····_deadlock_holder_desc:·str·=·"BaseAsyncFileLock·instance·in·this·task"
  
114 ····def·__init__(··#·noqa:·PLR0913115 ····def·__init__(··#·noqa:·PLR0913
115 ········self,116 ········self,
116 ········lock_file:·str·|·os.PathLike[str],117 ········lock_file:·str·|·os.PathLike[str],
117 ········timeout:·float·=·-1,118 ········timeout:·float·=·-1,
118 ········mode:·int·=·_UNSET_FILE_MODE,119 ········mode:·int·=·_UNSET_FILE_MODE,
119 ········thread_local:·bool·=·False,··#·noqa:·FBT001,·FBT002120 ········thread_local:·bool·=·False,··#·noqa:·FBT001,·FBT002
120 ········*,121 ········*,
Offset 177, 35 lines modifiedOffset 179, 35 lines modified
177 ········}179 ········}
178 ········self._context:·AsyncFileLockContext·=·(AsyncThreadLocalFileContext·if·thread_local·else·AsyncFileLockContext)(180 ········self._context:·AsyncFileLockContext·=·(AsyncThreadLocalFileContext·if·thread_local·else·AsyncFileLockContext)(
179 ············**kwargs181 ············**kwargs
180 ········)182 ········)
  
181 ····@property183 ····@property
182 ····def·run_in_executor(self)·->·bool:184 ····def·run_in_executor(self)·->·bool:
183 ········""":returns:·whether·run·in·executor."""185 ········"""Whether·run·in·executor."""
184 ········return·self._context.run_in_executor186 ········return·self._context.run_in_executor
  
185 ····@property187 ····@property
186 ····def·executor(self)·->·futures.Executor·|·None:188 ····def·executor(self)·->·futures.Executor·|·None:
187 ········""":returns:·the·executor."""189 ········"""The·executor."""
188 ········return·self._context.executor190 ········return·self._context.executor
  
189 ····@executor.setter191 ····@executor.setter
190 ····def·executor(self,·value:·futures.Executor·|·None)·->·None:··#·pragma:·no·cover192 ····def·executor(self,·value:·futures.Executor·|·None)·->·None:··#·pragma:·no·cover
191 ········"""193 ········"""
192 ········Change·the·executor.194 ········Change·the·executor.
  
193 ········:param·futures.Executor·|·None·value:·the·new·executor·or·``None``195 ········:param·futures.Executor·|·None·value:·the·new·executor·or·``None``
  
194 ········"""196 ········"""
195 ········self._context.executor·=·value197 ········self._context.executor·=·value
  
196 ····@property198 ····@property
197 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:199 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:
198 ········""":returns:·the·event·loop."""200 ········"""The·event·loop."""
199 ········return·self._context.loop201 ········return·self._context.loop
  
200 ····async·def·acquire(··#·ty:·ignore[invalid-method-override]202 ····async·def·acquire(··#·ty:·ignore[invalid-method-override]
201 ········self,203 ········self,
202 ········timeout:·float·|·None·=·None,204 ········timeout:·float·|·None·=·None,
203 ········poll_interval:·float·|·None·=·None,205 ········poll_interval:·float·|·None·=·None,
204 ········*,206 ········*,
Offset 252, 26 lines modifiedOffset 254, 30 lines modified
  
252 ········if·poll_interval·is·None:254 ········if·poll_interval·is·None:
253 ············poll_interval·=·self._context.poll_interval255 ············poll_interval·=·self._context.poll_interval
  
254 ········#·Increment·the·number·right·at·the·beginning.·We·can·still·undo·it,·if·something·fails.256 ········#·Increment·the·number·right·at·the·beginning.·We·can·still·undo·it,·if·something·fails.
255 ········self._context.lock_counter·+=·1257 ········self._context.lock_counter·+=·1
  
 258 ········canonical·=·_canonical(self.lock_file)
 259 ········self._raise_if_would_deadlock(canonical,·timeout=timeout,·blocking=blocking)
  
256 ········start_time·=·time.perf_counter()260 ········start_time·=·time.perf_counter()
257 ········try:261 ········try:
258 ············await·self._async_poll_until_acquired(262 ············await·self._async_poll_until_acquired(
259 ················blocking=blocking,263 ················blocking=blocking,
260 ················cancel_check=cancel_check,264 ················cancel_check=cancel_check,
261 ················timeout=timeout,265 ················timeout=timeout,
262 ················poll_interval=poll_interval,266 ················poll_interval=poll_interval,
263 ················start_time=start_time,267 ················start_time=start_time,
264 ············)268 ············)
265 ········except·BaseException:··#·Something·did·go·wrong,·so·decrement·the·counter.269 ········except·BaseException:··#·Something·did·go·wrong,·so·decrement·the·counter.
266 ············self._context.lock_counter·=·max(0,·self._context.lock_counter·-·1)270 ············self._undo_acquire(canonical)
267 ············raise271 ············raise
 272 ········self._commit_acquire(canonical)
268 ········return·AsyncAcquireReturnProxy(lock=self)273 ········return·AsyncAcquireReturnProxy(lock=self)
  
269 ····async·def·_async_poll_until_acquired(274 ····async·def·_async_poll_until_acquired(
270 ········self,275 ········self,
271 ········*,276 ········*,
272 ········blocking:·bool,277 ········blocking:·bool,
273 ········cancel_check:·Callable[[],·bool]·|·None,278 ········cancel_check:·Callable[[],·bool]·|·None,
Offset 315, 14 lines modifiedOffset 321, 15 lines modified
  
315 ············if·self._context.lock_counter·==·0·or·force:321 ············if·self._context.lock_counter·==·0·or·force:
316 ················lock_id,·lock_filename·=·id(self),·self.lock_file322 ················lock_id,·lock_filename·=·id(self),·self.lock_file
  
317 ················_LOGGER.debug("Attempting·to·release·lock·%s·on·%s",·lock_id,·lock_filename)323 ················_LOGGER.debug("Attempting·to·release·lock·%s·on·%s",·lock_id,·lock_filename)
318 ················await·self._run_internal_method(self._release)324 ················await·self._run_internal_method(self._release)
319 ················self._context.lock_counter·=·0325 ················self._context.lock_counter·=·0
 326 ················self._drop_registry_entry()
320 ················_LOGGER.debug("Lock·%s·released·on·%s",·lock_id,·lock_filename)327 ················_LOGGER.debug("Lock·%s·released·on·%s",·lock_id,·lock_filename)
  
321 ····async·def·_run_internal_method(self,·method:·Callable[[],·Any])·->·None:328 ····async·def·_run_internal_method(self,·method:·Callable[[],·Any])·->·None:
322 ········if·iscoroutinefunction(method):329 ········if·iscoroutinefunction(method):
323 ············await·method()330 ············await·method()
324 ········elif·self.run_in_executor:331 ········elif·self.run_in_executor:
325 ············await·asyncio.get_running_loop().run_in_executor(self.executor,·method)332 ············await·asyncio.get_running_loop().run_in_executor(self.executor,·method)
422 B
filelock/version.py
    
Offset 14, 11 lines modifiedOffset 14, 11 lines modified
14 version:·str14 version:·str
15 __version__:·str15 __version__:·str
16 __version_tuple__:·tuple[int·|·str,·...]16 __version_tuple__:·tuple[int·|·str,·...]
17 version_tuple:·tuple[int·|·str,·...]17 version_tuple:·tuple[int·|·str,·...]
18 commit_id:·str·|·None18 commit_id:·str·|·None
19 __commit_id__:·str·|·None19 __commit_id__:·str·|·None
  
20 __version__·=·version·=·'3.29.4'20 __version__·=·version·=·'3.29.7'
21 __version_tuple__·=·version_tuple·=·(3,·29,·4)21 __version_tuple__·=·version_tuple·=·(3,·29,·7)
  
22 __commit_id__·=·commit_id·=·None22 __commit_id__·=·commit_id·=·None
1.8 KB
filelock/_soft_rw/_async.py
    
Offset 79, 35 lines modifiedOffset 79, 35 lines modified
79 ············poll_interval=poll_interval,79 ············poll_interval=poll_interval,
80 ········)80 ········)
81 ········self._loop·=·loop81 ········self._loop·=·loop
82 ········self._executor·=·executor82 ········self._executor·=·executor
  
83 ····@property83 ····@property
84 ····def·lock_file(self)·->·str:84 ····def·lock_file(self)·->·str:
85 ········""":returns:·the·path·to·the·lock·file·passed·to·the·constructor."""85 ········"""The·path·to·the·lock·file·passed·to·the·constructor."""
86 ········return·self._lock.lock_file86 ········return·self._lock.lock_file
  
87 ····@property87 ····@property
88 ····def·timeout(self)·->·float:88 ····def·timeout(self)·->·float:
89 ········""":returns:·the·default·timeout·applied·when·``acquire_read``·/·``acquire_write``·is·called·without·one."""89 ········"""The·default·timeout·applied·when·``acquire_read``·/·``acquire_write``·is·called·without·one."""
90 ········return·self._lock.timeout90 ········return·self._lock.timeout
  
91 ····@property91 ····@property
92 ····def·blocking(self)·->·bool:92 ····def·blocking(self)·->·bool:
93 ········""":returns:·whether·``acquire_*``·defaults·to·blocking;·``False``·makes·contention·raise·immediately."""93 ········"""Whether·``acquire_*``·defaults·to·blocking;·``False``·makes·contention·raise·immediately."""
94 ········return·self._lock.blocking94 ········return·self._lock.blocking
  
95 ····@property95 ····@property
96 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:96 ····def·loop(self)·->·asyncio.AbstractEventLoop·|·None:
97 ········""":returns:·the·event·loop·used·for·``run_in_executor``,·or·``None``·for·the·running·loop."""97 ········"""The·event·loop·used·for·``run_in_executor``,·or·``None``·for·the·running·loop."""
98 ········return·self._loop98 ········return·self._loop
  
99 ····@property99 ····@property
100 ····def·executor(self)·->·futures.Executor·|·None:100 ····def·executor(self)·->·futures.Executor·|·None:
101 ········""":returns:·the·executor·used·for·``run_in_executor``,·or·``None``·for·the·default·executor."""101 ········"""The·executor·used·for·``run_in_executor``,·or·``None``·for·the·default·executor."""
102 ········return·self._executor102 ········return·self._executor
  
103 ····async·def·acquire_read(103 ····async·def·acquire_read(
104 ········self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None104 ········self,·timeout:·float·|·None·=·None,·*,·blocking:·bool·|·None·=·None
105 ····)·->·AsyncAcquireSoftReadWriteReturnProxy:105 ····)·->·AsyncAcquireSoftReadWriteReturnProxy:
106 ········"""106 ········"""
107 ········Acquire·a·shared·read·lock.107 ········Acquire·a·shared·read·lock.
14.3 KB
filelock/_soft_rw/_sync.py
    
Offset 29, 14 lines modifiedOffset 29, 19 lines modified
  
  
29 _Mode·=·Literal["read",·"write"]29 _Mode·=·Literal["read",·"write"]
30 _BREAK_SUFFIX·=·".break"30 _BREAK_SUFFIX·=·".break"
31 _MAX_MARKER_SIZE·=·102431 _MAX_MARKER_SIZE·=·1024
32 _O_NOFOLLOW·=·getattr(os,·"O_NOFOLLOW",·0)32 _O_NOFOLLOW·=·getattr(os,·"O_NOFOLLOW",·0)
33 _O_NONBLOCK·=·getattr(os,·"O_NONBLOCK",·0)33 _O_NONBLOCK·=·getattr(os,·"O_NONBLOCK",·0)
 34 #·Retargeting·os.utime·to·an·open·fd·lets·the·heartbeat·refresh·the·exact·inode·it·just·verified·instead·of
 35 #·re-resolving·the·path;·Windows·read-only·handles·cannot·set·times·that·way,·so·keep·it·Unix-only.
 36 _SUPPORTS_UTIME_FD·=·sys.platform·!=·"win32"·and·os.utime·in·os.supports_fd
 37 #·os.utime·follows·symlinks·unless·told·not·to;·not·every·platform·can·refuse·the·follow,·so·probe·support.
 38 _SUPPORTS_UTIME_NOFOLLOW·=·os.utime·in·os.supports_follow_symlinks
34 #·dirfd-relative·I/O·is·a·Unix-only·optimization;·Windows·cannot·``os.open()``·a·directory·at·all,·and39 #·dirfd-relative·I/O·is·a·Unix-only·optimization;·Windows·cannot·``os.open()``·a·directory·at·all,·and
35 #·its·``os``·module·skips·dir_fd·support·entirely.·When·disabled,·callers·fall·back·to·full-path·ops.40 #·its·``os``·module·skips·dir_fd·support·entirely.·When·disabled,·callers·fall·back·to·full-path·ops.
36 _SUPPORTS_DIR_FD·=·sys.platform·!=·"win32"·and·os.open·in·os.supports_dir_fd41 _SUPPORTS_DIR_FD·=·sys.platform·!=·"win32"·and·os.open·in·os.supports_dir_fd
  
37 _all_instances:·WeakValueDictionary[Path,·SoftReadWriteLock]·=·WeakValueDictionary()42 _all_instances:·WeakValueDictionary[Path,·SoftReadWriteLock]·=·WeakValueDictionary()
38 _all_instances_lock·=·threading.Lock()43 _all_instances_lock·=·threading.Lock()
39 _atexit_registered·=·False44 _atexit_registered·=·False
Offset 370, 15 lines modifiedOffset 375, 65 lines modified
370 ········#·token·check·in·the·heartbeat·callback·would·catch·any·re-acquisition·race,·but·joining·first375 ········#·token·check·in·the·heartbeat·callback·would·catch·any·re-acquisition·race,·but·joining·first
371 ········#·removes·even·that·theoretical·race.376 ········#·removes·even·that·theoretical·race.
372 ········hold.heartbeat_stop.set()377 ········hold.heartbeat_stop.set()
373 ········hold.heartbeat_thread.join(timeout=self.heartbeat_interval·+·1.0)378 ········hold.heartbeat_thread.join(timeout=self.heartbeat_interval·+·1.0)
374 ········if·hold.is_reader:379 ········if·hold.is_reader:
375 ············_unlink(hold.marker_name,·dir_fd=self._readers_dir_fd)380 ············_unlink(hold.marker_name,·dir_fd=self._readers_dir_fd)
376 ········else:381 ········else:
377 ············_unlink(hold.marker_name)382 ············self._unlink_writer_marker_if_ours(hold.token)
  
 383 ····def·_unlink_writer_marker_if_ours(self,·token:·str)·->·None:
 384 ········#·Remove·the·writer·marker·only·while·it·still·carries·our·token.·If·this·holder·was·paused·long
 385 ········#·enough·(a·stop-the-world·GC·pause,·SIGSTOP,·a·suspended·VM)·for·a·peer·to·evict·the·marker·as
 386 ········#·stale·and·claim·the·writer·slot·itself,·the·file·now·at·<path>.write·is·the·peer's·live·marker;
 387 ········#·unlinking·it·by·path·would·let·a·second·writer·through·and·break·mutual·exclusion.·The·state·lock
 388 ········#·serializes·this·against·a·concurrent·break/claim,·and·the·heartbeat·is·already·stopped,·so·the
 389 ········#·token·we·read·is·authoritative.·Mirrors·the·token·re-check·the·stale-break·path·already·does.
 390 ········with·self._locks.state:
 391 ············read·=·_read_marker(self._paths.write)
 392 ············if·read·is·None:
 393 ················return
 394 ············info,·_·=·read
 395 ············if·info·is·None·or·not·hmac.compare_digest(info.token,·token):
 396 ················return
 397 ············_unlink(self._paths.write)
  
 398 ····def·_claim_writer_marker(self,·token:·str)·->·bool:
 399 ········#·Claim·the·writer·slot·for·``token``.·Must·be·called·holding·``self._locks.state``.·Evicts·a
 400 ········#·stale·marker·first,·then·refuses·to·claim·while·a·live·``.write``·exists·so·a·peer·holding·the
 401 ········#·slot·is·waited·out·instead·of·overwritten.
 402 ········_break_stale_marker(self._paths.write,·stale_threshold=self.stale_threshold,·now=time.time())
 403 ········if·_file_exists(self._paths.write):
 404 ············return·False
 405 ········try:
 406 ············_atomic_create_marker(self._paths.write,·token)
 407 ········except·FileExistsError:
 408 ············return·False
 409 ········return·True
  
 410 ····def·_touch_writer_marker_if_ours(self,·token:·str)·->·bool:
 411 ········#·Refresh·the·writer·marker·through·a·single·O_NOFOLLOW·fd,·but·only·while·it·still·carries·our
 412 ········#·token.·Returns·False·when·the·marker·is·gone·or·now·belongs·to·a·peer·that·reclaimed·the·slot,
 413 ········#·so·the·caller·can·re-claim·rather·than·keep·a·stranger's·marker·alive.·Mirrors·_refresh_marker.
 414 ········fd·=·_open_marker(self._paths.write)
 415 ········if·fd·is·None:
 416 ············return·False
 417 ········try:
 418 ············try:
 419 ················data·=·os.read(fd,·_MAX_MARKER_SIZE·+·1)
 420 ············except·OSError:··#·pragma:·no·cover·-·e.g.·EAGAIN·from·a·hostile·FIFO·that·has·a·writer·attached
 421 ················return·False
 422 ············info·=·_parse_marker_bytes(data)
 423 ············if·info·is·None·or·not·hmac.compare_digest(info.token,·token):
 424 ················return·False
 425 ············with·suppress(OSError):
 426 ················_touch(self._paths.write,·fd=fd)
 427 ············return·True
 428 ········finally:
 429 ············os.close(fd)
  
378 ····@classmethod430 ····@classmethod
379 ····def·get_lock(431 ····def·get_lock(
380 ········cls,432 ········cls,
381 ········lock_file:·str·|·os.PathLike[str],433 ········lock_file:·str·|·os.PathLike[str],
382 ········timeout:·float·=·-1,434 ········timeout:·float·=·-1,
383 ········*,435 ········*,
Offset 499, 38 lines modifiedOffset 554, 39 lines modified
499 ····)·->·tuple[str,·bool]:554 ····)·->·tuple[str,·bool]:
500 ········#·Phase·2·scans·readers/·via·dirfd·(where·supported),·so·we·need·it·open·even·though·writers·never555 ········#·Phase·2·scans·readers/·via·dirfd·(where·supported),·so·we·need·it·open·even·though·writers·never
501 ········#·create·files·inside.556 ········#·create·files·inside.
502 ········self._open_readers_dir()557 ········self._open_readers_dir()
  
503 ········def·try_claim_writer()·->·bool:558 ········def·try_claim_writer()·->·bool:
504 ············with·self._locks.state:559 ············with·self._locks.state:
 560 ················return·self._claim_writer_marker(token)
505 ················_break_stale_marker(self._paths.write,·stale_threshold=self.stale_threshold,·now=time.time()) 
506 ················if·_file_exists(self._paths.write): 
507 ····················return·False 
508 ················try: 
509 ····················_atomic_create_marker(self._paths.write,·token) 
510 ················except·FileExistsError: 
511 ····················return·False 
512 ············return·True 
  
513 ········def·readers_drained_touching()·->·bool:561 ········def·readers_drained_touching()·->·bool:
514 ············with·self._locks.state:562 ············with·self._locks.state:
515 ················#·Refresh·our·writer·marker·on·every·scan·iteration.·Otherwise·phase·2·can·exceed563 ················#·Refresh·our·writer·marker·every·scan·iteration·so·phase·2·does·not·exceed
516 ················#·``stale_threshold``·under·contention·and·a·peer·would·treat·us·as·stale·and·evict·us. 
517 ················with·suppress(OSError): 
518 ····················_touch(self._paths.write)564 ················#·``stale_threshold``·under·contention·and·get·evicted.·The·refresh·only·happens·while
 565 ················#·the·marker·is·still·ours:·if·we·were·paused·past·``stale_threshold``·a·peer·can·evict
 566 ················#·the·stale·marker·and·reclaim·``.write``·with·its·own·token,·and·touching·that·path
 567 ················#·blindly·would·keep·the·peer's·live·marker·alive·and·let·this·acquire·finish·as·though
 568 ················#·we·still·held·the·slot,·admitting·a·second·writer.·When·the·claim·is·no·longer·ours·we
 569 ················#·re-claim·the·slot·here·(waiting·behind·the·peer·if·it·currently·holds·it)·rather·than
 570 ················#·trusting·the·foreign·marker,·mirroring·the·token·re-check·the·stale-break·and·release
 571 ················#·paths·already·rely·on.
 572 ················if·not·self._touch_writer_marker_if_ours(token)·and·not·self._claim_writer_marker(token):
 573 ····················return·False
519 ················self._break_stale_readers(time.time())574 ················self._break_stale_readers(time.time())
520 ················return·not·self._any_readers()575 ················return·not·self._any_readers()
  
521 ········self._wait_for(try_claim_writer,·deadline=deadline,·blocking=blocking)576 ········self._wait_for(try_claim_writer,·deadline=deadline,·blocking=blocking)
522 ········try:577 ········try:
523 ············self._wait_for(readers_drained_touching,·deadline=deadline,·blocking=blocking)578 ············self._wait_for(readers_drained_touching,·deadline=deadline,·blocking=blocking)
524 ········except·Timeout:579 ········except·Timeout:
525 ············#·Give·up·our·writer·claim·so·readers·can·make·progress·again.580 ············#·Give·up·our·writer·claim·so·readers·can·make·progress·again,·but·only·while·the·marker·is
526 ············_unlink(self._paths.write)581 ············#·still·ours:·a·peer·may·have·evicted·it·as·stale·and·claimed·the·slot·while·phase·2·waited.
Max diff block lines reached; 7310/14583 bytes (50.13%) of diff not shown.
583 B
filelock-3.29.4.dist-info/METADATA vs.
filelock-3.29.7.dist-info/METADATA
Files 99% similar despite different names
    
Offset 1, 10 lines modifiedOffset 1, 10 lines modified
1 Metadata-Version:·2.41 Metadata-Version:·2.4
2 Name:·filelock2 Name:·filelock
3 Version:·3.29.43 Version:·3.29.7
4 Summary:·A·platform·independent·file·lock.4 Summary:·A·platform·independent·file·lock.
5 Project-URL:·Documentation,·https://py-filelock.readthedocs.io5 Project-URL:·Documentation,·https://py-filelock.readthedocs.io
6 Project-URL:·Homepage,·https://github.com/tox-dev/py-filelock6 Project-URL:·Homepage,·https://github.com/tox-dev/py-filelock
7 Project-URL:·Source,·https://github.com/tox-dev/py-filelock7 Project-URL:·Source,·https://github.com/tox-dev/py-filelock
8 Project-URL:·Tracker,·https://github.com/tox-dev/py-filelock/issues8 Project-URL:·Tracker,·https://github.com/tox-dev/py-filelock/issues
9 Maintainer-email:·Bernát·Gábor·<gaborjbernat@gmail.com>9 Maintainer-email:·Bernát·Gábor·<gaborjbernat@gmail.com>
10 License-Expression:·MIT10 License-Expression:·MIT
123 B
filelock-3.29.4.dist-info/licenses/LICENSE vs.
filelock-3.29.7.dist-info/licenses/LICENSE
Files identical despite different names
1.5 KB
typing_extensions-4.15.0.dist-info/METADATA vs.
typing_extensions-4.16.0.dist-info/METADATA
Files 95% similar despite different names
    
Offset 1, 10 lines modifiedOffset 1, 10 lines modified
1 Metadata-Version:·2.41 Metadata-Version:·2.4
2 Name:·typing_extensions2 Name:·typing_extensions
3 Version:·4.15.03 Version:·4.16.0
4 Summary:·Backported·and·Experimental·Type·Hints·for·Python·3.9+4 Summary:·Backported·and·Experimental·Type·Hints·for·Python·3.9+
5 Keywords:·annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing5 Keywords:·annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing
6 Author-email:·"Guido·van·Rossum,·Jukka·Lehtosalo,·Łukasz·Langa,·Michael·Lee"·<levkivskyi@gmail.com>6 Author-email:·"Guido·van·Rossum,·Jukka·Lehtosalo,·Łukasz·Langa,·Michael·Lee"·<levkivskyi@gmail.com>
7 Requires-Python:·>=3.97 Requires-Python:·>=3.9
8 Description-Content-Type:·text/markdown8 Description-Content-Type:·text/markdown
9 License-Expression:·PSF-2.09 License-Expression:·PSF-2.0
10 Classifier:·Development·Status·::·5·-·Production/Stable10 Classifier:·Development·Status·::·5·-·Production/Stable
Offset 15, 14 lines modifiedOffset 15, 15 lines modified
15 Classifier:·Programming·Language·::·Python·::·3·::·Only15 Classifier:·Programming·Language·::·Python·::·3·::·Only
16 Classifier:·Programming·Language·::·Python·::·3.916 Classifier:·Programming·Language·::·Python·::·3.9
17 Classifier:·Programming·Language·::·Python·::·3.1017 Classifier:·Programming·Language·::·Python·::·3.10
18 Classifier:·Programming·Language·::·Python·::·3.1118 Classifier:·Programming·Language·::·Python·::·3.11
19 Classifier:·Programming·Language·::·Python·::·3.1219 Classifier:·Programming·Language·::·Python·::·3.12
20 Classifier:·Programming·Language·::·Python·::·3.1320 Classifier:·Programming·Language·::·Python·::·3.13
21 Classifier:·Programming·Language·::·Python·::·3.1421 Classifier:·Programming·Language·::·Python·::·3.14
 22 Classifier:·Programming·Language·::·Python·::·3.15
22 Classifier:·Topic·::·Software·Development23 Classifier:·Topic·::·Software·Development
23 License-File:·LICENSE24 License-File:·LICENSE
24 Project-URL:·Bug·Tracker,·https://github.com/python/typing_extensions/issues25 Project-URL:·Bug·Tracker,·https://github.com/python/typing_extensions/issues
25 Project-URL:·Changes,·https://github.com/python/typing_extensions/blob/main/CHANGELOG.md26 Project-URL:·Changes,·https://github.com/python/typing_extensions/blob/main/CHANGELOG.md
26 Project-URL:·Documentation,·https://typing-extensions.readthedocs.io/27 Project-URL:·Documentation,·https://typing-extensions.readthedocs.io/
27 Project-URL:·Home,·https://github.com/python/typing_extensions28 Project-URL:·Home,·https://github.com/python/typing_extensions
28 Project-URL:·Q·&·A,·https://github.com/python/typing/discussions29 Project-URL:·Q·&·A,·https://github.com/python/typing/discussions
141 B
typing_extensions-4.15.0.dist-info/licenses/LICENSE vs.
typing_extensions-4.16.0.dist-info/licenses/LICENSE
Files identical despite different names
1.31 KB
assets/chaquopy/build.json
1.26 KB
Pretty-printed
Similarity: 0.9974747474747474% Differences: {"'assets'": "{'requirements-common.imy': '4c74433aa491a080c63cbde07849d20fb5c81ef2'}"}
    
Offset 24, 15 lines modifiedOffset 24, 15 lines modified
24 ········"bootstrap-native/x86_64/java/chaquopy.so":·"b0881d1c98f61e911520da1a2b0b32bb53ab67fc",24 ········"bootstrap-native/x86_64/java/chaquopy.so":·"b0881d1c98f61e911520da1a2b0b32bb53ab67fc",
25 ········"bootstrap-native/x86_64/math.so":·"69a601b4a7fa608cf58ce045f448bea54535cc42",25 ········"bootstrap-native/x86_64/math.so":·"69a601b4a7fa608cf58ce045f448bea54535cc42",
26 ········"bootstrap-native/x86_64/mmap.so":·"2f016d6e034494e9f5640551d95067b3c64b7a3f",26 ········"bootstrap-native/x86_64/mmap.so":·"2f016d6e034494e9f5640551d95067b3c64b7a3f",
27 ········"bootstrap-native/x86_64/zlib.so":·"c048fc69bbe744b6373c1b4452033a008906c9e8",27 ········"bootstrap-native/x86_64/zlib.so":·"c048fc69bbe744b6373c1b4452033a008906c9e8",
28 ········"bootstrap.imy":·"f14958d91fd38af6ab975ae9d9c8b3a360750e04",28 ········"bootstrap.imy":·"f14958d91fd38af6ab975ae9d9c8b3a360750e04",
29 ········"cacert.pem":·"2c68212e96605210eddf740291862bdf59398aef",29 ········"cacert.pem":·"2c68212e96605210eddf740291862bdf59398aef",
30 ········"requirements-arm64-v8a.imy":·"afeb10e3f5e16cebbf786daf85943e0890aafa51",30 ········"requirements-arm64-v8a.imy":·"afeb10e3f5e16cebbf786daf85943e0890aafa51",
31 ········"requirements-common.imy":·"1d88cefbb48d6476598d9a6e45030e1606aae465",31 ········"requirements-common.imy":·"4c74433aa491a080c63cbde07849d20fb5c81ef2",
32 ········"requirements-x86_64.imy":·"8bfb07af2fae9103b6a976ab797f21aeced8fd08",32 ········"requirements-x86_64.imy":·"8bfb07af2fae9103b6a976ab797f21aeced8fd08",
33 ········"stdlib-arm64-v8a.imy":·"d60e450b23fe4cba7286096b6c9c3b26a52f0490",33 ········"stdlib-arm64-v8a.imy":·"d60e450b23fe4cba7286096b6c9c3b26a52f0490",
34 ········"stdlib-common.imy":·"033a7b880b2364a5a416c169c5560745d64ede55",34 ········"stdlib-common.imy":·"033a7b880b2364a5a416c169c5560745d64ede55",
35 ········"stdlib-x86_64.imy":·"ec7f1fc8b2bcd08959ddb9ca2ece8083821b9856"35 ········"stdlib-x86_64.imy":·"ec7f1fc8b2bcd08959ddb9ca2ece8083821b9856"
36 ····},36 ····},
37 ····"extract_packages":·[37 ····"extract_packages":·[
38 ········"ebook_converter"38 ········"ebook_converter"