Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/dirstate/status.rs @ 45892:06b64fabf91c
copies: cache the ancestor checking call when tracing copy
A good share of the time spent in this function is spent doing ancestors
checking. To avoid spending time in duplicated call, we cache the result of
calls.
In the slower case, this provide a quite significant performance boost. Below
are the result for a set of selected pairs (many of them pathological):
(And further down is another table that summarize the current state of filelog
based vs changeset base copy tracing)
The benchmark have been configured to be killed after 6 minutes of runtime,
which mean that any detect slower than 2 minutes will be marked as "killed".
This drop some useful information about how much slower these case are? but also
prevent 99% of the benchmark time to be spent on case that can be labelled "very
slow" anyway.
Repo Case Source-Rev Dest-Rev Old-Time New-Time Difference Factor
------------------------------------------------------------------------------------------------------------------------------------
mercurial x_revs_x_added_0_copies ad6b123de1c7 39cfcef4f463 : 0.000044 s, 0.000044 s, +0.000000 s, ? 1.0000
mercurial x_revs_x_added_x_copies 2b1c78674230 0c1d10351869 : 0.000138 s, 0.000138 s, +0.000000 s, ? 1.0000
mercurial x000_revs_x000_added_x_copies 81f8ff2a9bf2 dd3267698d84 : 0.005067 s, 0.005052 s, -0.000015 s, ? 0.9970
pypy x_revs_x_added_0_copies aed021ee8ae8 099ed31b181b : 0.000218 s, 0.000219 s, +0.000001 s, ? 1.0046
pypy x_revs_x000_added_0_copies 4aa4e1f8e19a 359343b9ac0e : 0.000053 s, 0.000055 s, +0.000002 s, ? 1.0377
pypy x_revs_x_added_x_copies ac52eb7bbbb0 72e022663155 : 0.000125 s, 0.000128 s, +0.000003 s, ? 1.0240
pypy x_revs_x00_added_x_copies c3b14617fbd7 ace7255d9a26 : 0.001098 s, 0.001089 s, -0.000009 s, ? 0.9918
pypy x_revs_x000_added_x000_copies df6f7a526b60 a83dc6a2d56f : 0.017546 s, 0.017407 s, -0.000139 s, ? 0.9921
pypy x000_revs_xx00_added_0_copies 89a76aede314 2f22446ff07e : 0.096723 s, 0.094175 s, -0.002548 s, ? 0.9737
pypy x000_revs_x000_added_x_copies 8a3b5bfd266e 2c68e87c3efe : 0.271796 s, 0.238009 s, -0.033787 s, ? 0.8757
pypy x000_revs_x000_added_x000_copies 89a76aede314 7b3dda341c84 : 0.128602 s, 0.125876 s, -0.002726 s, ? 0.9788
pypy x0000_revs_x_added_0_copies d1defd0dc478 c9cb1334cc78 : 7.086742 s, 3.581556 s, -3.505186 s, ? 0.5054
pypy x0000_revs_xx000_added_0_copies bf2c629d0071 4ffed77c095c : 0.016634 s, 0.016721 s, +0.000087 s, ? 1.0052
pypy x0000_revs_xx000_added_x000_copies 08ea3258278e d9fa043f30c0 : 0.254225 s, 0.242367 s, -0.011858 s, ? 0.9534
netbeans x_revs_x_added_0_copies fb0955ffcbcd a01e9239f9e7 : 0.000166 s, 0.000165 s, -0.000001 s, ? 0.9940
netbeans x_revs_x000_added_0_copies 6f360122949f 20eb231cc7d0 : 0.000118 s, 0.000114 s, -0.000004 s, ? 0.9661
netbeans x_revs_x_added_x_copies 1ada3faf6fb6 5a39d12eecf4 : 0.000296 s, 0.000296 s, +0.000000 s, ? 1.0000
netbeans x_revs_x00_added_x_copies 35be93ba1e2c 9eec5e90c05f : 0.001137 s, 0.001124 s, -0.000013 s, ? 0.9886
netbeans x000_revs_xx00_added_0_copies eac3045b4fdd 51d4ae7f1290 : 0.014133 s, 0.013060 s, -0.001073 s, ? 0.9241
netbeans x000_revs_x000_added_x_copies e2063d266acd 6081d72689dc : 0.016988 s, 0.017112 s, +0.000124 s, ? 1.0073
netbeans x000_revs_x000_added_x000_copies ff453e9fee32 411350406ec2 : 0.676361 s, 0.660350 s, -0.016011 s, ? 0.9763
netbeans x0000_revs_xx000_added_x000_copies 588c2d1ced70 1aad62e59ddd : 12.515149 s, 10.032499 s, -2.482650 s, ? 0.8016
mozilla-central x_revs_x_added_0_copies 3697f962bb7b 7015fcdd43a2 : 0.000186 s, 0.000189 s, +0.000003 s, ? 1.0161
mozilla-central x_revs_x000_added_0_copies dd390860c6c9 40d0c5bed75d : 0.000459 s, 0.000462 s, +0.000003 s, ? 1.0065
mozilla-central x_revs_x_added_x_copies 8d198483ae3b 14207ffc2b2f : 0.000273 s, 0.000270 s, -0.000003 s, ? 0.9890
mozilla-central x_revs_x00_added_x_copies 98cbc58cc6bc 446a150332c3 : 0.001503 s, 0.001474 s, -0.000029 s, ? 0.9807
mozilla-central x_revs_x000_added_x000_copies 3c684b4b8f68 0a5e72d1b479 : 0.004862 s, 0.004806 s, -0.000056 s, ? 0.9885
mozilla-central x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 0.088291 s, 0.085150 s, -0.003141 s, ? 0.9644
mozilla-central x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 0.007113 s, 0.007064 s, -0.000049 s, ? 0.9931
mozilla-central x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 0.004687 s, 0.004741 s, +0.000054 s, ? 1.0115
mozilla-central x000_revs_x000_added_x000_copies 7c97034feb78 4407bd0c6330 : 0.198710 s, 0.190133 s, -0.008577 s, ? 0.9568
mozilla-central x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 0.036068 s, 0.035651 s, -0.000417 s, ? 0.9884
mozilla-central x0000_revs_xx000_added_x000_copies f78c615a656c 96a38b690156 : 0.465362 s, 0.440694 s, -0.024668 s, ? 0.9470
mozilla-central x00000_revs_x0000_added_x0000_copies 6832ae71433c 4c222a1d9a00 : 24.519684 s, 18.454163 s, -6.065521 s, ? 0.7526
mozilla-central x00000_revs_x00000_added_x000_copies 76caed42cf7c 1daa622bbe42 : 42.711897 s, 31.562719 s, -11.149178 s, ? 0.7390
mozilla-try x_revs_x_added_0_copies aaf6dde0deb8 9790f499805a : 0.001201 s, 0.001189 s, -0.000012 s, ? 0.9900
mozilla-try x_revs_x000_added_0_copies d8d0222927b4 5bb8ce8c7450 : 0.001216 s, 0.001204 s, -0.000012 s, ? 0.9901
mozilla-try x_revs_x_added_x_copies 092fcca11bdb 936255a0384a : 0.000595 s, 0.000586 s, -0.000009 s, ? 0.9849
mozilla-try x_revs_x00_added_x_copies b53d2fadbdb5 017afae788ec : 0.001856 s, 0.001845 s, -0.000011 s, ? 0.9941
mozilla-try x_revs_x000_added_x000_copies 20408ad61ce5 6f0ee96e21ad : 0.064936 s, 0.063822 s, -0.001114 s, ? 0.9828
mozilla-try x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 0.090601 s, 0.088038 s, -0.002563 s, ? 0.9717
mozilla-try x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 0.007510 s, 0.007389 s, -0.000121 s, ? 0.9839
mozilla-try x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 0.004911 s, 0.004868 s, -0.000043 s, ? 0.9912
mozilla-try x000_revs_x000_added_x000_copies 1346fd0130e4 4c65cbdabc1f : 0.233231 s, 0.222450 s, -0.010781 s, ? 0.9538
mozilla-try x0000_revs_x_added_0_copies 63519bfd42ee a36a2a865d92 : 0.419989 s, 0.370675 s, -0.049314 s, ? 0.8826
mozilla-try x0000_revs_x_added_x_copies 9fe69ff0762d bcabf2a78927 : 0.401521 s, 0.358020 s, -0.043501 s, ? 0.8917
mozilla-try x0000_revs_xx000_added_x_copies 156f6e2674f2 4d0f2c178e66 : 0.179555 s, 0.145235 s, -0.034320 s, ? 0.8089
mozilla-try x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 0.038004 s, 0.037606 s, -0.000398 s, ? 0.9895
mozilla-try x0000_revs_xx000_added_x000_copies 89294cd501d9 7ccb2fc7ccb5 : 52.838482 s, 7.382439 s, -45.456043 s, ? 0.1397
mozilla-try x0000_revs_x0000_added_x0000_copies e928c65095ed e951f4ad123a : 8.705874 s, 7.273506 s, -1.432368 s, ? 0.8355
mozilla-try x00000_revs_x00000_added_0_copies dc8a3ca7010e d16fde900c9c : 1.126708 s, 1.074593 s, -0.052115 s, ? 0.9537
mozilla-try x00000_revs_x0000_added_x0000_copies 8d3fafa80d4b eb884023b810 : 83.854020 s, 27.746195 s, -56.107825 s, ? 0.3309
Below is a table comparing the runtime of the current "filelog centric"
algorithm, with the "changeset centric" one, we just modified.
The changeset centric algorithm is a significant win in many scenario, but they
are still various cases where it is quite slower. When many revision has to be
considered the cost of retrieving the copy information, creating new
dictionaries, merging dictionaries and checking if revision are ancestors of
each other can slow things down.
The rest of this series, will introduce a rust version of the copy tracing code
to deal with most of theses issues.
Repo Case Source-Rev Dest-Rev filelog sidedata Difference Factor
---------------------------------------------------------------------------------------------------------------------------------------
mercurial x_revs_x_added_0_copies ad6b123de1c7 39cfcef4f463 : 0.000914 s, 0.000044 s, - 0.000870 s, ? 0.048140
mercurial x_revs_x_added_x_copies 2b1c78674230 0c1d10351869 : 0.001812 s, 0.000138 s, - 0.001674 s, ? 0.076159
mercurial x000_revs_x000_added_x_copies 81f8ff2a9bf2 dd3267698d84 : 0.017954 s, 0.005052 s, - 0.012902 s, ? 0.281386
pypy x_revs_x_added_0_copies aed021ee8ae8 099ed31b181b : 0.001509 s, 0.000219 s, - 0.001290 s, ? 0.145129
pypy x_revs_x000_added_0_copies 4aa4e1f8e19a 359343b9ac0e : 0.206881 s, 0.000055 s, - 0.206826 s, ? 0.000266
pypy x_revs_x_added_x_copies ac52eb7bbbb0 72e022663155 : 0.016951 s, 0.000128 s, - 0.016823 s, ? 0.007551
pypy x_revs_x00_added_x_copies c3b14617fbd7 ace7255d9a26 : 0.019096 s, 0.001089 s, - 0.018007 s, ? 0.057028
pypy x_revs_x000_added_x000_copies df6f7a526b60 a83dc6a2d56f : 0.762506 s, 0.017407 s, - 0.745099 s, ? 0.022829
pypy x000_revs_xx00_added_0_copies 89a76aede314 2f22446ff07e : 1.179211 s, 0.094175 s, - 1.085036 s, ? 0.079863
pypy x000_revs_x000_added_x_copies 8a3b5bfd266e 2c68e87c3efe : 1.249058 s, 0.238009 s, - 1.011049 s, ? 0.190551
pypy x000_revs_x000_added_x000_copies 89a76aede314 7b3dda341c84 : 1.614107 s, 0.125876 s, - 1.488231 s, ? 0.077985
pypy x0000_revs_x_added_0_copies d1defd0dc478 c9cb1334cc78 : 0.001064 s, 3.581556 s, + 3.580492 s, ? 3366.124060
pypy x0000_revs_xx000_added_0_copies bf2c629d0071 4ffed77c095c : 1.061275 s, 0.016721 s, - 1.044554 s, ? 0.015756
pypy x0000_revs_xx000_added_x000_copies 08ea3258278e d9fa043f30c0 : 1.341119 s, 0.242367 s, - 1.098752 s, ? 0.180720
netbeans x_revs_x_added_0_copies fb0955ffcbcd a01e9239f9e7 : 0.027803 s, 0.000165 s, - 0.027638 s, ? 0.005935
netbeans x_revs_x000_added_0_copies 6f360122949f 20eb231cc7d0 : 0.130014 s, 0.000114 s, - 0.129900 s, ? 0.000877
netbeans x_revs_x_added_x_copies 1ada3faf6fb6 5a39d12eecf4 : 0.024990 s, 0.000296 s, - 0.024694 s, ? 0.011845
netbeans x_revs_x00_added_x_copies 35be93ba1e2c 9eec5e90c05f : 0.052201 s, 0.001124 s, - 0.051077 s, ? 0.021532
netbeans x000_revs_xx00_added_0_copies eac3045b4fdd 51d4ae7f1290 : 0.037642 s, 0.013060 s, - 0.024582 s, ? 0.346953
netbeans x000_revs_x000_added_x_copies e2063d266acd 6081d72689dc : 0.197086 s, 0.017112 s, - 0.179974 s, ? 0.086825
netbeans x000_revs_x000_added_x000_copies ff453e9fee32 411350406ec2 : 0.935148 s, 0.660350 s, - 0.274798 s, ? 0.706145
netbeans x0000_revs_xx000_added_x000_copies 588c2d1ced70 1aad62e59ddd : 3.920674 s, 10.032499 s, + 6.111825 s, ? 2.558871
mozilla-central x_revs_x_added_0_copies 3697f962bb7b 7015fcdd43a2 : 0.024232 s, 0.000189 s, - 0.024043 s, ? 0.007800
mozilla-central x_revs_x000_added_0_copies dd390860c6c9 40d0c5bed75d : 0.141483 s, 0.000462 s, - 0.141021 s, ? 0.003265
mozilla-central x_revs_x_added_x_copies 8d198483ae3b 14207ffc2b2f : 0.025775 s, 0.000270 s, - 0.025505 s, ? 0.010475
mozilla-central x_revs_x00_added_x_copies 98cbc58cc6bc 446a150332c3 : 0.084922 s, 0.001474 s, - 0.083448 s, ? 0.017357
mozilla-central x_revs_x000_added_x000_copies 3c684b4b8f68 0a5e72d1b479 : 0.194784 s, 0.004806 s, - 0.189978 s, ? 0.024673
mozilla-central x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 2.161103 s, 0.085150 s, - 2.075953 s, ? 0.039401
mozilla-central x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 0.089347 s, 0.007064 s, - 0.082283 s, ? 0.079063
mozilla-central x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 0.732171 s, 0.004741 s, - 0.727430 s, ? 0.006475
mozilla-central x000_revs_x000_added_x000_copies 7c97034feb78 4407bd0c6330 : 1.157287 s, 0.190133 s, - 0.967154 s, ? 0.164292
mozilla-central x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 6.726568 s, 0.035651 s, - 6.690917 s, ? 0.005300
mozilla-central x0000_revs_xx000_added_x000_copies f78c615a656c 96a38b690156 : 3.266229 s, 0.440694 s, - 2.825535 s, ? 0.134924
mozilla-central x00000_revs_x0000_added_x0000_copies 6832ae71433c 4c222a1d9a00 : 15.860534 s, 18.454163 s, + 2.593629 s, ? 1.163527
mozilla-central x00000_revs_x00000_added_x000_copies 76caed42cf7c 1daa622bbe42 : 20.450475 s, 31.562719 s, +11.112244 s, ? 1.543373
mozilla-try x_revs_x_added_0_copies aaf6dde0deb8 9790f499805a : 0.080442 s, 0.001189 s, - 0.079253 s, ? 0.014781
mozilla-try x_revs_x000_added_0_copies d8d0222927b4 5bb8ce8c7450 : 0.497672 s, 0.001204 s, - 0.496468 s, ? 0.002419
mozilla-try x_revs_x_added_x_copies 092fcca11bdb 936255a0384a : 0.021183 s, 0.000586 s, - 0.020597 s, ? 0.027664
mozilla-try x_revs_x00_added_x_copies b53d2fadbdb5 017afae788ec : 0.230991 s, 0.001845 s, - 0.229146 s, ? 0.007987
mozilla-try x_revs_x000_added_x000_copies 20408ad61ce5 6f0ee96e21ad : 1.118461 s, 0.063822 s, - 1.054639 s, ? 0.057062
mozilla-try x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 2.206083 s, 0.088038 s, - 2.118045 s, ? 0.039907
mozilla-try x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 0.089404 s, 0.007389 s, - 0.082015 s, ? 0.082647
mozilla-try x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 0.733043 s, 0.004868 s, - 0.728175 s, ? 0.006641
mozilla-try x000_revs_x000_added_x000_copies 1346fd0130e4 4c65cbdabc1f : 1.163367 s, 0.222450 s, - 0.940917 s, ? 0.191212
mozilla-try x0000_revs_x_added_0_copies 63519bfd42ee a36a2a865d92 : 0.085456 s, 0.370675 s, + 0.285219 s, ? 4.337612
mozilla-try x0000_revs_x_added_x_copies 9fe69ff0762d bcabf2a78927 : 0.083601 s, 0.358020 s, + 0.274419 s, ? 4.282485
mozilla-try x0000_revs_xx000_added_x_copies 156f6e2674f2 4d0f2c178e66 : 7.366614 s, 0.145235 s, - 7.221379 s, ? 0.019715
mozilla-try x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 6.664464 s, 0.037606 s, - 6.626858 s, ? 0.005643
mozilla-try x0000_revs_xx000_added_x000_copies 89294cd501d9 7ccb2fc7ccb5 : 7.467836 s, 7.382439 s, - 0.085397 s, ? 0.988565
mozilla-try x0000_revs_x0000_added_x0000_copies e928c65095ed e951f4ad123a : 9.801294 s, 7.273506 s, - 2.527788 s, ? 0.742097
mozilla-try x00000_revs_x_added_0_copies 6a320851d377 1ebb79acd503 : 0.091886 s, killed
mozilla-try x00000_revs_x00000_added_0_copies dc8a3ca7010e d16fde900c9c : 26.491140 s, 1.074593 s, -25.416547 s, ? 0.040564
mozilla-try x00000_revs_x_added_x_copies 5173c4b6f97c 95d83ee7242d : 0.092863 s, killed
mozilla-try x00000_revs_x000_added_x_copies 9126823d0e9c ca82787bb23c : 0.226823 s, killed
mozilla-try x00000_revs_x0000_added_x0000_copies 8d3fafa80d4b eb884023b810 : 18.914630 s, 27.746195 s, + 8.831565 s, ? 1.466917
mozilla-try x00000_revs_x00000_added_x0000_copies 1b661134e2ca 1ae03d022d6d : 21.198903 s, killed
mozilla-try x00000_revs_x00000_added_x000_copies 9b2a99adc05e 8e29777b48e6 : 24.952268 s, killed
Differential Revision: https://phab.mercurial-scm.org/D9296
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 02 Nov 2020 11:03:56 +0100 |
parents | 5c736ba5dc27 |
children | fd47483f1645 |
rev | line source |
---|---|
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
1 // status.rs |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
2 // |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
3 // Copyright 2019 Raphaël Gomès <rgomes@octobus.net> |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
4 // |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
7 |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
8 //! Rust implementation of dirstate.status (dirstate.py). |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
9 //! It is currently missing a lot of functionality compared to the Python one |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
10 //! and will only be triggered in narrow cases. |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
11 |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
12 #[cfg(feature = "dirstate-tree")] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
13 use crate::dirstate::dirstate_tree::iter::StatusShortcut; |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
14 #[cfg(not(feature = "dirstate-tree"))] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
15 use crate::utils::path_auditor::PathAuditor; |
43605
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
16 use crate::{ |
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
17 dirstate::SIZE_FROM_OTHER_PARENT, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
18 filepatterns::PatternFileWarning, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
19 matchers::{get_ignore_function, Matcher, VisitChildrenSet}, |
43605
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
20 utils::{ |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
21 files::{find_dirs, HgMetadata}, |
44523
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
22 hg_path::{ |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
23 hg_path_to_path_buf, os_string_to_hg_path_buf, HgPath, HgPathBuf, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
24 HgPathError, |
44523
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
25 }, |
43605
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
26 }, |
44527
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44526
diff
changeset
|
27 CopyMap, DirstateEntry, DirstateMap, EntryState, FastHashMap, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
28 PatternError, |
43605
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
29 }; |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
30 use lazy_static::lazy_static; |
44541
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44539
diff
changeset
|
31 use micro_timer::timed; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
32 use rayon::prelude::*; |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
33 use std::{ |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
34 borrow::Cow, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
35 collections::HashSet, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
36 fs::{read_dir, DirEntry}, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
37 io::ErrorKind, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
38 ops::Deref, |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44562
diff
changeset
|
39 path::{Path, PathBuf}, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
40 }; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
41 |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
42 /// Wrong type of file from a `BadMatch` |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
43 /// Note: a lot of those don't exist on all platforms. |
44536
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
44 #[derive(Debug, Copy, Clone)] |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
45 pub enum BadType { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
46 CharacterDevice, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
47 BlockDevice, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
48 FIFO, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
49 Socket, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
50 Directory, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
51 Unknown, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
52 } |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
53 |
44529
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
54 impl ToString for BadType { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
55 fn to_string(&self) -> String { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
56 match self { |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
57 BadType::CharacterDevice => "character device", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
58 BadType::BlockDevice => "block device", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
59 BadType::FIFO => "fifo", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
60 BadType::Socket => "socket", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
61 BadType::Directory => "directory", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
62 BadType::Unknown => "unknown", |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
63 } |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
64 .to_string() |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
65 } |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
66 } |
f96b28aa4b79
rust-status: update rust-cpython bridge to account for the changes in core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44528
diff
changeset
|
67 |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
68 /// Was explicitly matched but cannot be found/accessed |
44536
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
69 #[derive(Debug, Copy, Clone)] |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
70 pub enum BadMatch { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
71 OsError(i32), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
72 BadType(BadType), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
73 } |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
74 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
75 /// Enum used to dispatch new status entries into the right collections. |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
76 /// Is similar to `crate::EntryState`, but represents the transient state of |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
77 /// entries during the lifetime of a command. |
44536
f8a9922a02cb
rust-status: move to recursive traversal to prepare for parallel traversal
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
78 #[derive(Debug, Copy, Clone)] |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
79 pub enum Dispatch { |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
80 Unsure, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
81 Modified, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
82 Added, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
83 Removed, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
84 Deleted, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
85 Clean, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
86 Unknown, |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
87 Ignored, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
88 /// Empty dispatch, the file is not worth listing |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
89 None, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
90 /// Was explicitly matched but cannot be found/accessed |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
91 Bad(BadMatch), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
92 Directory { |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
93 /// True if the directory used to be a file in the dmap so we can say |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
94 /// that it's been removed. |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
95 was_file: bool, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
96 }, |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
97 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
98 |
43915
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43818
diff
changeset
|
99 type IoResult<T> = std::io::Result<T>; |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
100 |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44562
diff
changeset
|
101 /// `Box<dyn Trait>` is syntactic sugar for `Box<dyn Trait, 'static>`, so add |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44562
diff
changeset
|
102 /// an explicit lifetime here to not fight `'static` bounds "out of nowhere". |
e62052d0f377
rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44562
diff
changeset
|
103 type IgnoreFnType<'a> = Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a>; |
43915
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43818
diff
changeset
|
104 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
105 /// We have a good mix of owned (from directory traversal) and borrowed (from |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
106 /// the dirstate/explicit) paths, this comes up a lot. |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
107 pub type HgPathCow<'a> = Cow<'a, HgPath>; |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
108 |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
109 /// A path with its computed ``Dispatch`` information |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
110 type DispatchedPath<'a> = (HgPathCow<'a>, Dispatch); |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
111 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
112 /// The conversion from `HgPath` to a real fs path failed. |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
113 /// `22` is the error code for "Invalid argument" |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
114 const INVALID_PATH_DISPATCH: Dispatch = Dispatch::Bad(BadMatch::OsError(22)); |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
115 |
43604
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
116 /// Dates and times that are outside the 31-bit signed range are compared |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
117 /// modulo 2^31. This should prevent hg from behaving badly with very large |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
118 /// files or corrupt dates while still having a high probability of detecting |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
119 /// changes. (issue2608) |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
120 /// TODO I haven't found a way of having `b` be `Into<i32>`, since `From<u64>` |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
121 /// is not defined for `i32`, and there is no `As` trait. This forces the |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
122 /// caller to cast `b` as `i32`. |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
123 fn mod_compare(a: i32, b: i32) -> bool { |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
124 a & i32::max_value() != b & i32::max_value() |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
125 } |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
126 |
44523
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
127 /// Return a sorted list containing information about the entries |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
128 /// in the directory. |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
129 /// |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
130 /// * `skip_dot_hg` - Return an empty vec if `path` contains a `.hg` directory |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
131 fn list_directory( |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
132 path: impl AsRef<Path>, |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
133 skip_dot_hg: bool, |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
134 ) -> std::io::Result<Vec<(HgPathBuf, DirEntry)>> { |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
135 let mut results = vec![]; |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
136 let entries = read_dir(path.as_ref())?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
137 |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
138 for entry in entries { |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
139 let entry = entry?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
140 let filename = os_string_to_hg_path_buf(entry.file_name())?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
141 let file_type = entry.file_type()?; |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
142 if skip_dot_hg && filename.as_bytes() == b".hg" && file_type.is_dir() { |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
143 return Ok(vec![]); |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
144 } else { |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44926
diff
changeset
|
145 results.push((filename, entry)) |
44523
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
146 } |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
147 } |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
148 |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
149 results.sort_unstable_by_key(|e| e.0.clone()); |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
150 Ok(results) |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
151 } |
0d97bcb3cee9
rust-status: add util for listing a directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44193
diff
changeset
|
152 |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
153 /// The file corresponding to the dirstate entry was found on the filesystem. |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
154 fn dispatch_found( |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
155 filename: impl AsRef<HgPath>, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
156 entry: DirstateEntry, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
157 metadata: HgMetadata, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
158 copy_map: &CopyMap, |
44524
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
159 options: StatusOptions, |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
160 ) -> Dispatch { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
161 let DirstateEntry { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
162 state, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
163 mode, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
164 mtime, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
165 size, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
166 } = entry; |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
167 |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
168 let HgMetadata { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
169 st_mode, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
170 st_size, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
171 st_mtime, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
172 .. |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
173 } = metadata; |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
174 |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
175 match state { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
176 EntryState::Normal => { |
43604
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
177 let size_changed = mod_compare(size, st_size as i32); |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
178 let mode_changed = |
44524
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
179 (mode ^ st_mode as i32) & 0o100 != 0o000 && options.check_exec; |
43604
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
180 let metadata_changed = size >= 0 && (size_changed || mode_changed); |
43605
8210c3f46912
rust: introduce SIZE_FROM_OTHER_PARENT constant
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43604
diff
changeset
|
181 let other_parent = size == SIZE_FROM_OTHER_PARENT; |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44926
diff
changeset
|
182 |
43604
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
183 if metadata_changed |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
184 || other_parent |
51cd86735608
rust-status: refactor dispatch case for normal files
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43603
diff
changeset
|
185 || copy_map.contains_key(filename.as_ref()) |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
186 { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
187 Dispatch::Modified |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44926
diff
changeset
|
188 } else if mod_compare(mtime, st_mtime as i32) |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44926
diff
changeset
|
189 || st_mtime == options.last_normal_time |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44926
diff
changeset
|
190 { |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
191 // the file may have just been marked as normal and |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
192 // it may have changed in the same second without |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
193 // changing its size. This can happen if we quickly |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
194 // do multiple commits. Force lookup, so we don't |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
195 // miss such a racy file change. |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
196 Dispatch::Unsure |
44524
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
197 } else if options.list_clean { |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
198 Dispatch::Clean |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
199 } else { |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
200 Dispatch::None |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
201 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
202 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
203 EntryState::Merged => Dispatch::Modified, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
204 EntryState::Added => Dispatch::Added, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
205 EntryState::Removed => Dispatch::Removed, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
206 EntryState::Unknown => Dispatch::Unknown, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
207 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
208 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
209 |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
210 /// The file corresponding to this Dirstate entry is missing. |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
211 fn dispatch_missing(state: EntryState) -> Dispatch { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
212 match state { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
213 // File was removed from the filesystem during commands |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
214 EntryState::Normal | EntryState::Merged | EntryState::Added => { |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
215 Dispatch::Deleted |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
216 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
217 // File was removed, everything is normal |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
218 EntryState::Removed => Dispatch::Removed, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
219 // File is unknown to Mercurial, everything is normal |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
220 EntryState::Unknown => Dispatch::Unknown, |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
221 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
222 } |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
223 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
224 fn dispatch_os_error(e: &std::io::Error) -> Dispatch { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
225 Dispatch::Bad(BadMatch::OsError( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
226 e.raw_os_error().expect("expected real OS error"), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
227 )) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
228 } |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
229 |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
230 lazy_static! { |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
231 static ref DEFAULT_WORK: HashSet<&'static HgPath> = { |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
232 let mut h = HashSet::new(); |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
233 h.insert(HgPath::new(b"")); |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
234 h |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
235 }; |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
236 } |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
237 |
44524
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
238 #[derive(Debug, Copy, Clone)] |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
239 pub struct StatusOptions { |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
240 /// Remember the most recent modification timeslot for status, to make |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
241 /// sure we won't miss future size-preserving file content modifications |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
242 /// that happen within the same timeslot. |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
243 pub last_normal_time: i64, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
244 /// Whether we are on a filesystem with UNIX-like exec flags |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
245 pub check_exec: bool, |
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
246 pub list_clean: bool, |
44527
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44526
diff
changeset
|
247 pub list_unknown: bool, |
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44526
diff
changeset
|
248 pub list_ignored: bool, |
44838
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
249 /// Whether to collect traversed dirs for applying a callback later. |
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
250 /// Used by `hg purge` for example. |
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
251 pub collect_traversed_dirs: bool, |
44527
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44526
diff
changeset
|
252 } |
1debb5894b39
rust-status: add function for sequential traversal of the working directory
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44526
diff
changeset
|
253 |
44562
ece43c79333e
rust-core: add missing `Debug` traits
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44541
diff
changeset
|
254 #[derive(Debug)] |
44525
f13d19549efd
rust-status: rename `StatusResult` to `DirstateStatus`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44524
diff
changeset
|
255 pub struct DirstateStatus<'a> { |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
256 pub modified: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
257 pub added: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
258 pub removed: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
259 pub deleted: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
260 pub clean: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
261 pub ignored: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
262 pub unknown: Vec<HgPathCow<'a>>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
263 pub bad: Vec<(HgPathCow<'a>, BadMatch)>, |
44838
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
264 /// Only filled if `collect_traversed_dirs` is `true` |
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
265 pub traversed: Vec<HgPathBuf>, |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
266 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
267 |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
268 #[derive(Debug)] |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
269 pub enum StatusError { |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
270 /// Generic IO error |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
271 IO(std::io::Error), |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
272 /// An invalid path that cannot be represented in Mercurial was found |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
273 Path(HgPathError), |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
274 /// An invalid "ignore" pattern was found |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
275 Pattern(PatternError), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
276 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
277 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
278 pub type StatusResult<T> = Result<T, StatusError>; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
279 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
280 impl From<PatternError> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
281 fn from(e: PatternError) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
282 StatusError::Pattern(e) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
283 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
284 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
285 impl From<HgPathError> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
286 fn from(e: HgPathError) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
287 StatusError::Path(e) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
288 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
289 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
290 impl From<std::io::Error> for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
291 fn from(e: std::io::Error) -> Self { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
292 StatusError::IO(e) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
293 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
294 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
295 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
296 impl ToString for StatusError { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
297 fn to_string(&self) -> String { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
298 match self { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
299 StatusError::IO(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
300 StatusError::Path(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
301 StatusError::Pattern(e) => e.to_string(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
302 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
303 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
304 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
305 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
306 /// Gives information about which files are changed in the working directory |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
307 /// and how, compared to the revision we're based on |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
308 pub struct Status<'a, M: Matcher + Sync> { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
309 dmap: &'a DirstateMap, |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
310 pub(crate) matcher: &'a M, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
311 root_dir: PathBuf, |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
312 pub(crate) options: StatusOptions, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
313 ignore_fn: IgnoreFnType<'a>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
314 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
315 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
316 impl<'a, M> Status<'a, M> |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
317 where |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
318 M: Matcher + Sync, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
319 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
320 pub fn new( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
321 dmap: &'a DirstateMap, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
322 matcher: &'a M, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
323 root_dir: PathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
324 ignore_files: Vec<PathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
325 options: StatusOptions, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
326 ) -> StatusResult<(Self, Vec<PatternFileWarning>)> { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
327 // Needs to outlive `dir_ignore_fn` since it's captured. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
328 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
329 let (ignore_fn, warnings): (IgnoreFnType, _) = |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
330 if options.list_ignored || options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
331 get_ignore_function(ignore_files, &root_dir)? |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
332 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
333 (Box::new(|&_| true), vec![]) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
334 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
335 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
336 Ok(( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
337 Self { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
338 dmap, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
339 matcher, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
340 root_dir, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
341 options, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
342 ignore_fn, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
343 }, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
344 warnings, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
345 )) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
346 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
347 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
348 /// Is the path ignored? |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
349 pub fn is_ignored(&self, path: impl AsRef<HgPath>) -> bool { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
350 (self.ignore_fn)(path.as_ref()) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
351 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
352 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
353 /// Is the path or one of its ancestors ignored? |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
354 pub fn dir_ignore(&self, dir: impl AsRef<HgPath>) -> bool { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
355 // Only involve ignore mechanism if we're listing unknowns or ignored. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
356 if self.options.list_ignored || self.options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
357 if self.is_ignored(&dir) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
358 true |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
359 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
360 for p in find_dirs(dir.as_ref()) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
361 if self.is_ignored(p) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
362 return true; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
363 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
364 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
365 false |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
366 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
367 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
368 true |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
369 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
370 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
371 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
372 /// Get stat data about the files explicitly specified by the matcher. |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
373 /// Returns a tuple of the directories that need to be traversed and the |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
374 /// files with their corresponding `Dispatch`. |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
375 /// TODO subrepos |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
376 #[timed] |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
377 pub fn walk_explicit( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
378 &self, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
379 traversed_sender: crossbeam::Sender<HgPathBuf>, |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
380 ) -> (Vec<DispatchedPath<'a>>, Vec<DispatchedPath<'a>>) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
381 self.matcher |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
382 .file_set() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
383 .unwrap_or(&DEFAULT_WORK) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
384 .par_iter() |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
385 .flat_map(|&filename| -> Option<_> { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
386 // TODO normalization |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
387 let normalized = filename; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
388 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
389 let buf = match hg_path_to_path_buf(normalized) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
390 Ok(x) => x, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
391 Err(_) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
392 return Some(( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
393 Cow::Borrowed(normalized), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
394 INVALID_PATH_DISPATCH, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
395 )) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
396 } |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
397 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
398 let target = self.root_dir.join(buf); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
399 let st = target.symlink_metadata(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
400 let in_dmap = self.dmap.get(normalized); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
401 match st { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
402 Ok(meta) => { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
403 let file_type = meta.file_type(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
404 return if file_type.is_file() || file_type.is_symlink() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
405 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
406 if let Some(entry) = in_dmap { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
407 return Some(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
408 Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
409 dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
410 &normalized, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
411 *entry, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
412 HgMetadata::from_metadata(meta), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
413 &self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
414 self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
415 ), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
416 )); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
417 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
418 Some(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
419 Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
420 Dispatch::Unknown, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
421 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
422 } else if file_type.is_dir() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
423 if self.options.collect_traversed_dirs { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
424 traversed_sender |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
425 .send(normalized.to_owned()) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
426 .expect("receiver should outlive sender"); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
427 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
428 Some(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
429 Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
430 Dispatch::Directory { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
431 was_file: in_dmap.is_some(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
432 }, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
433 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
434 } else { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
435 Some(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
436 Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
437 Dispatch::Bad(BadMatch::BadType( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
438 // TODO do more than unknown |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
439 // Support for all `BadType` variant |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
440 // varies greatly between platforms. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
441 // So far, no tests check the type and |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
442 // this should be good enough for most |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
443 // users. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
444 BadType::Unknown, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
445 )), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
446 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
447 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
448 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
449 Err(_) => { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
450 if let Some(entry) = in_dmap { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
451 return Some(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
452 Cow::Borrowed(normalized), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
453 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
454 )); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
455 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
456 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
457 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
458 None |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
459 }) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
460 .partition(|(_, dispatch)| match dispatch { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
461 Dispatch::Directory { .. } => true, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
462 _ => false, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
463 }) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
464 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
465 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
466 /// Walk the working directory recursively to look for changes compared to |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
467 /// the current `DirstateMap`. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
468 /// |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
469 /// This takes a mutable reference to the results to account for the |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
470 /// `extend` in timings |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
471 #[timed] |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
472 pub fn traverse( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
473 &self, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
474 path: impl AsRef<HgPath>, |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
475 old_results: &FastHashMap<HgPathCow<'a>, Dispatch>, |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
476 results: &mut Vec<DispatchedPath<'a>>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
477 traversed_sender: crossbeam::Sender<HgPathBuf>, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
478 ) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
479 // The traversal is done in parallel, so use a channel to gather |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
480 // entries. `crossbeam::Sender` is `Sync`, while `mpsc::Sender` |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
481 // is not. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
482 let (files_transmitter, files_receiver) = |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
483 crossbeam::channel::unbounded(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
484 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
485 self.traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
486 &files_transmitter, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
487 path, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
488 &old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
489 traversed_sender, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
490 ); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
491 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
492 // Disconnect the channel so the receiver stops waiting |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
493 drop(files_transmitter); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
494 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
495 let new_results = files_receiver |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
496 .into_iter() |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
497 .par_bridge() |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
498 .map(|(f, d)| (Cow::Owned(f), d)); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
499 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
500 results.par_extend(new_results); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
501 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
502 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
503 /// Dispatch a single entry (file, folder, symlink...) found during |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
504 /// `traverse`. If the entry is a folder that needs to be traversed, it |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
505 /// will be handled in a separate thread. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
506 fn handle_traversed_entry<'b>( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
507 &'a self, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
508 scope: &rayon::Scope<'b>, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
509 files_sender: &'b crossbeam::Sender<(HgPathBuf, Dispatch)>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
510 old_results: &'a FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
511 filename: HgPathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
512 dir_entry: DirEntry, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
513 traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
514 ) -> IoResult<()> |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
515 where |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
516 'a: 'b, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
517 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
518 let file_type = dir_entry.file_type()?; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
519 let entry_option = self.dmap.get(&filename); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
520 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
521 if filename.as_bytes() == b".hg" { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
522 // Could be a directory or a symlink |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
523 return Ok(()); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
524 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
525 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
526 if file_type.is_dir() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
527 self.handle_traversed_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
528 scope, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
529 files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
530 old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
531 entry_option, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
532 filename, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
533 traversed_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
534 ); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
535 } else if file_type.is_file() || file_type.is_symlink() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
536 if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
537 if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
538 || self.matcher.matches(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
539 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
540 let metadata = dir_entry.metadata()?; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
541 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
542 .send(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
543 filename.to_owned(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
544 dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
545 &filename, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
546 *entry, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
547 HgMetadata::from_metadata(metadata), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
548 &self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
549 self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
550 ), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
551 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
552 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
553 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
554 } else if (self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
555 || self.matcher.matches(&filename)) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
556 && !self.is_ignored(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
557 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
558 if (self.options.list_ignored |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
559 || self.matcher.exact_match(&filename)) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
560 && self.dir_ignore(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
561 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
562 if self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
563 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
564 .send((filename.to_owned(), Dispatch::Ignored)) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
565 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
566 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
567 } else if self.options.list_unknown { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
568 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
569 .send((filename.to_owned(), Dispatch::Unknown)) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
570 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
571 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
572 } else if self.is_ignored(&filename) && self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
573 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
574 .send((filename.to_owned(), Dispatch::Ignored)) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
575 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
576 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
577 } else if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
578 // Used to be a file or a folder, now something else. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
579 if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
580 || self.matcher.matches(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
581 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
582 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
583 .send((filename.to_owned(), dispatch_missing(entry.state))) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
584 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
585 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
586 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
587 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
588 Ok(()) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
589 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
590 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
591 /// A directory was found in the filesystem and needs to be traversed |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
592 fn handle_traversed_dir<'b>( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
593 &'a self, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
594 scope: &rayon::Scope<'b>, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
595 files_sender: &'b crossbeam::Sender<(HgPathBuf, Dispatch)>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
596 old_results: &'a FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
597 entry_option: Option<&'a DirstateEntry>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
598 directory: HgPathBuf, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
599 traversed_sender: crossbeam::Sender<HgPathBuf>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
600 ) where |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
601 'a: 'b, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
602 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
603 scope.spawn(move |_| { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
604 // Nested `if` until `rust-lang/rust#53668` is stable |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
605 if let Some(entry) = entry_option { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
606 // Used to be a file, is now a folder |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
607 if self.matcher.matches_everything() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
608 || self.matcher.matches(&directory) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
609 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
610 files_sender |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
611 .send(( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
612 directory.to_owned(), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
613 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
614 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
615 .unwrap(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
616 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
617 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
618 // Do we need to traverse it? |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
619 if !self.is_ignored(&directory) || self.options.list_ignored { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
620 self.traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
621 files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
622 directory, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
623 &old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
624 traversed_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
625 ) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
626 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
627 }); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
628 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
629 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
630 /// Decides whether the directory needs to be listed, and if so handles the |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
631 /// entries in a separate thread. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
632 fn traverse_dir( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
633 &self, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
634 files_sender: &crossbeam::Sender<(HgPathBuf, Dispatch)>, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
635 directory: impl AsRef<HgPath>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
636 old_results: &FastHashMap<Cow<HgPath>, Dispatch>, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
637 traversed_sender: crossbeam::Sender<HgPathBuf>, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
638 ) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
639 let directory = directory.as_ref(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
640 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
641 if self.options.collect_traversed_dirs { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
642 traversed_sender |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
643 .send(directory.to_owned()) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
644 .expect("receiver should outlive sender"); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
645 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
646 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
647 let visit_entries = match self.matcher.visit_children_set(directory) { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
648 VisitChildrenSet::Empty => return, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
649 VisitChildrenSet::This | VisitChildrenSet::Recursive => None, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
650 VisitChildrenSet::Set(set) => Some(set), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
651 }; |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
652 let buf = match hg_path_to_path_buf(directory) { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
653 Ok(b) => b, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
654 Err(_) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
655 files_sender |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
656 .send((directory.to_owned(), INVALID_PATH_DISPATCH)) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
657 .expect("receiver should outlive sender"); |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
658 return; |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
659 } |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
660 }; |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
661 let dir_path = self.root_dir.join(buf); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
662 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
663 let skip_dot_hg = !directory.as_bytes().is_empty(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
664 let entries = match list_directory(dir_path, skip_dot_hg) { |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
665 Err(e) => { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
666 files_sender |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
667 .send((directory.to_owned(), dispatch_os_error(&e))) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
668 .expect("receiver should outlive sender"); |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
669 return; |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
670 } |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
671 Ok(entries) => entries, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
672 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
673 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
674 rayon::scope(|scope| { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
675 for (filename, dir_entry) in entries { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
676 if let Some(ref set) = visit_entries { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
677 if !set.contains(filename.deref()) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
678 continue; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
679 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
680 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
681 // TODO normalize |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
682 let filename = if directory.is_empty() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
683 filename.to_owned() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
684 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
685 directory.join(&filename) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
686 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
687 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
688 if !old_results.contains_key(filename.deref()) { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
689 match self.handle_traversed_entry( |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
690 scope, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
691 files_sender, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
692 old_results, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
693 filename, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
694 dir_entry, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
695 traversed_sender.clone(), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
696 ) { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
697 Err(e) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
698 files_sender |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
699 .send(( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
700 directory.to_owned(), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
701 dispatch_os_error(&e), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
702 )) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
703 .expect("receiver should outlive sender"); |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
704 } |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
705 Ok(_) => {} |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
706 } |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
707 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
708 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
709 }) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
710 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
711 |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
712 /// Add the files in the dirstate to the results. |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
713 /// |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
714 /// This takes a mutable reference to the results to account for the |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
715 /// `extend` in timings |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
716 #[cfg(feature = "dirstate-tree")] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
717 #[timed] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
718 pub fn extend_from_dmap(&self, results: &mut Vec<DispatchedPath<'a>>) { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
719 results.par_extend( |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
720 self.dmap |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
721 .fs_iter(self.root_dir.clone()) |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
722 .par_bridge() |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
723 .filter(|(path, _)| self.matcher.matches(path)) |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
724 .map(move |(filename, shortcut)| { |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
725 let entry = match shortcut { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
726 StatusShortcut::Entry(e) => e, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
727 StatusShortcut::Dispatch(d) => { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
728 return (Cow::Owned(filename), d) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
729 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
730 }; |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
731 let filename_as_path = match hg_path_to_path_buf(&filename) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
732 { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
733 Ok(f) => f, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
734 Err(_) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
735 return ( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
736 Cow::Owned(filename), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
737 INVALID_PATH_DISPATCH, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
738 ) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
739 } |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
740 }; |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
741 let meta = self |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
742 .root_dir |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
743 .join(filename_as_path) |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
744 .symlink_metadata(); |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
745 |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
746 match meta { |
45615
d5407b2e7689
rust: leverage improved match ergonomics
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45610
diff
changeset
|
747 Ok(m) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
748 if !(m.file_type().is_file() |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
749 || m.file_type().is_symlink()) => |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
750 { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
751 ( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
752 Cow::Owned(filename), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
753 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
754 ) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
755 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
756 Ok(m) => { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
757 let dispatch = dispatch_found( |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
758 &filename, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
759 entry, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
760 HgMetadata::from_metadata(m), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
761 &self.dmap.copy_map, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
762 self.options, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
763 ); |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
764 (Cow::Owned(filename), dispatch) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
765 } |
45615
d5407b2e7689
rust: leverage improved match ergonomics
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45610
diff
changeset
|
766 Err(e) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
767 if e.kind() == ErrorKind::NotFound |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
768 || e.raw_os_error() == Some(20) => |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
769 { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
770 // Rust does not yet have an `ErrorKind` for |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
771 // `NotADirectory` (errno 20) |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
772 // It happens if the dirstate contains `foo/bar` |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
773 // and foo is not a |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
774 // directory |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
775 ( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
776 Cow::Owned(filename), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
777 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
778 ) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
779 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
780 Err(e) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
781 (Cow::Owned(filename), dispatch_os_error(&e)) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
782 } |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
783 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
784 }), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
785 ); |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
786 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
787 |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
788 /// Add the files in the dirstate to the results. |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
789 /// |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
790 /// This takes a mutable reference to the results to account for the |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
791 /// `extend` in timings |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
792 #[cfg(not(feature = "dirstate-tree"))] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
793 #[timed] |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
794 pub fn extend_from_dmap(&self, results: &mut Vec<DispatchedPath<'a>>) { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
795 results.par_extend(self.dmap.par_iter().map( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
796 move |(filename, entry)| { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
797 let filename: &HgPath = filename; |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
798 let filename_as_path = match hg_path_to_path_buf(filename) { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
799 Ok(f) => f, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
800 Err(_) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
801 return ( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
802 Cow::Borrowed(filename), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
803 INVALID_PATH_DISPATCH, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
804 ) |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
805 } |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
806 }; |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
807 let meta = |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
808 self.root_dir.join(filename_as_path).symlink_metadata(); |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
809 match meta { |
45615
d5407b2e7689
rust: leverage improved match ergonomics
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45610
diff
changeset
|
810 Ok(m) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
811 if !(m.file_type().is_file() |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
812 || m.file_type().is_symlink()) => |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
813 { |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
814 ( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
815 Cow::Borrowed(filename), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
816 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
817 ) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
818 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
819 Ok(m) => ( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
820 Cow::Borrowed(filename), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
821 dispatch_found( |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
822 filename, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
823 *entry, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
824 HgMetadata::from_metadata(m), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
825 &self.dmap.copy_map, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
826 self.options, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
827 ), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
828 ), |
45615
d5407b2e7689
rust: leverage improved match ergonomics
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45610
diff
changeset
|
829 Err(e) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
830 if e.kind() == ErrorKind::NotFound |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
831 || e.raw_os_error() == Some(20) => |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
832 { |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
833 // Rust does not yet have an `ErrorKind` for |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
834 // `NotADirectory` (errno 20) |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
835 // It happens if the dirstate contains `foo/bar` |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
836 // and foo is not a |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
837 // directory |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
838 ( |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
839 Cow::Borrowed(filename), |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
840 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
841 ) |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
842 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
843 Err(e) => (Cow::Borrowed(filename), dispatch_os_error(&e)), |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
844 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
845 }, |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
846 )); |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
847 } |
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
848 |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
849 /// Checks all files that are in the dirstate but were not found during the |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
850 /// working directory traversal. This means that the rest must |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
851 /// be either ignored, under a symlink or under a new nested repo. |
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
852 /// |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
853 /// This takes a mutable reference to the results to account for the |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
854 /// `extend` in timings |
45610
496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45358
diff
changeset
|
855 #[cfg(not(feature = "dirstate-tree"))] |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
856 #[timed] |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
857 pub fn handle_unknowns(&self, results: &mut Vec<DispatchedPath<'a>>) { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
858 let to_visit: Vec<(&HgPath, &DirstateEntry)> = |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
859 if results.is_empty() && self.matcher.matches_everything() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
860 self.dmap.iter().map(|(f, e)| (f.deref(), e)).collect() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
861 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
862 // Only convert to a hashmap if needed. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
863 let old_results: FastHashMap<_, _> = |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
864 results.iter().cloned().collect(); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
865 self.dmap |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
866 .iter() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
867 .filter_map(move |(f, e)| { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
868 if !old_results.contains_key(f.deref()) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
869 && self.matcher.matches(f) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
870 { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
871 Some((f.deref(), e)) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
872 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
873 None |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
874 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
875 }) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
876 .collect() |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
877 }; |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
878 |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
879 let path_auditor = PathAuditor::new(&self.root_dir); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
880 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
881 let new_results = to_visit.into_par_iter().filter_map( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
882 |(filename, entry)| -> Option<_> { |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
883 // Report ignored items in the dmap as long as they are not |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
884 // under a symlink directory. |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
885 if path_auditor.check(filename) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
886 // TODO normalize for case-insensitive filesystems |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
887 let buf = match hg_path_to_path_buf(filename) { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
888 Ok(x) => x, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
889 Err(_) => { |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
890 return Some(( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
891 Cow::Owned(filename.to_owned()), |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
892 INVALID_PATH_DISPATCH, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
893 )); |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
894 } |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
895 }; |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
896 Some(( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
897 Cow::Owned(filename.to_owned()), |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
898 match self.root_dir.join(&buf).symlink_metadata() { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
899 // File was just ignored, no links, and exists |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
900 Ok(meta) => { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
901 let metadata = HgMetadata::from_metadata(meta); |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
902 dispatch_found( |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
903 filename, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
904 *entry, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
905 metadata, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
906 &self.dmap.copy_map, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
907 self.options, |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
908 ) |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
909 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
910 // File doesn't exist |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
911 Err(_) => dispatch_missing(entry.state), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
912 }, |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
913 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
914 } else { |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
915 // It's either missing or under a symlink directory which |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
916 // we, in this case, report as missing. |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
917 Some(( |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
918 Cow::Owned(filename.to_owned()), |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
919 dispatch_missing(entry.state), |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
920 )) |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
921 } |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
922 }, |
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
923 ); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
924 |
45862
5c736ba5dc27
rust-status: don't bubble up os errors, translate them to bad matches
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45615
diff
changeset
|
925 results.par_extend(new_results); |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
926 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
927 } |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
928 |
44541
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44539
diff
changeset
|
929 #[timed] |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
930 pub fn build_response<'a>( |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
931 results: impl IntoIterator<Item = DispatchedPath<'a>>, |
44838
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
932 traversed: Vec<HgPathBuf>, |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
933 ) -> (Vec<HgPathCow<'a>>, DirstateStatus<'a>) { |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
934 let mut lookup = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
935 let mut modified = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
936 let mut added = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
937 let mut removed = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
938 let mut deleted = vec![]; |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
939 let mut clean = vec![]; |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
940 let mut ignored = vec![]; |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
941 let mut unknown = vec![]; |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
942 let mut bad = vec![]; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
943 |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
944 for (filename, dispatch) in results.into_iter() { |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
945 match dispatch { |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
946 Dispatch::Unknown => unknown.push(filename), |
43602
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
947 Dispatch::Unsure => lookup.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
948 Dispatch::Modified => modified.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
949 Dispatch::Added => added.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
950 Dispatch::Removed => removed.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
951 Dispatch::Deleted => deleted.push(filename), |
889ac87e8bfd
rust-status: improve status performance
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43456
diff
changeset
|
952 Dispatch::Clean => clean.push(filename), |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
953 Dispatch::Ignored => ignored.push(filename), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
954 Dispatch::None => {} |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
955 Dispatch::Bad(reason) => bad.push((filename, reason)), |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
956 Dispatch::Directory { .. } => {} |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
957 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
958 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
959 |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
960 ( |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
961 lookup, |
44525
f13d19549efd
rust-status: rename `StatusResult` to `DirstateStatus`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44524
diff
changeset
|
962 DirstateStatus { |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
963 modified, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
964 added, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
965 removed, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
966 deleted, |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
967 clean, |
44526
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
968 ignored, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
969 unknown, |
61709b844420
rust-status: add missing variants to `Dispatch` enum
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44525
diff
changeset
|
970 bad, |
44838
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
971 traversed, |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
972 }, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
973 ) |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
974 } |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
975 |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
976 /// Get the status of files in the working directory. |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
977 /// |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
978 /// This is the current entry-point for `hg-core` and is realistically unusable |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
979 /// outside of a Python context because its arguments need to provide a lot of |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
980 /// information that will not be necessary in the future. |
44541
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44539
diff
changeset
|
981 #[timed] |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
982 pub fn status<'a>( |
43915
8c77826116f7
rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43818
diff
changeset
|
983 dmap: &'a DirstateMap, |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
984 matcher: &'a (impl Matcher + Sync), |
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
985 root_dir: PathBuf, |
44597
e62052d0f377
rust-status: only involve ignore mechanism when needed
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44562
diff
changeset
|
986 ignore_files: Vec<PathBuf>, |
44524
483fce658e43
rust-status: refactor options into a `StatusOptions` struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44523
diff
changeset
|
987 options: StatusOptions, |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
988 ) -> StatusResult<( |
45112
470d306e616c
rust-status: improve documentation and readability
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45111
diff
changeset
|
989 (Vec<HgPathCow<'a>>, DirstateStatus<'a>), |
44528
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
990 Vec<PatternFileWarning>, |
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44527
diff
changeset
|
991 )> { |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
992 let (status, warnings) = |
45111
7528699c6ccb
rust-status: refactor status into a struct
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
993 Status::new(dmap, matcher, root_dir, ignore_files, options)?; |
44838
c802ec4f7196
rust-status: collect traversed directories if required
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44837
diff
changeset
|
994 |
45113
98817e5daca7
hg-core: define a `dirstate_status` `Operation`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45112
diff
changeset
|
995 Ok((status.run()?, warnings)) |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
996 } |