mercurial/scmutil.py
author Rapha?l Gom?s <rgomes@octobus.net>
Tue, 07 Jan 2025 17:34:25 +0100
changeset 52838 e52dc683bf6b
parent 52677 b7afc38468bd
permissions -rw-r--r--
rust-pyo3: switch over to the pyo3 `InnerRevlog` This does many things that would involve a lot of churn if done separately: - Move the ancestors, revision and dagops modules to use the new `SharedByPyObject` instead of the old `UnsafePyLeaked` - Move the ancestors and discovery Python tests to using PyO3 - Change all calls to `importrust` to use `pyo3=True`, where applicable # Benchmarks I've run a bunch of benchmarks that involve revlog use. The TL;DR is that the pyo3 code is basically always very slightly faster if/when it's not within the noise levels. Here is the report: ``` ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 8.425445 ~~~~~ after: 8.170007 (-3.03%, -0.26) ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 8.328969 ~~~~~ after: 8.193693 (-1.62%, -0.14) ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.318721 ~~~~~ after: 0.317050 ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.315603 ~~~~~ after: 0.311842 (-1.19%, -0.00) ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 15.422452 ~~~~~ after: 15.417195 ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 15.424805 ~~~~~ after: 15.417188 ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 8.447181 ~~~~~ after: 8.279321 (-1.99%, -0.17) ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 8.399840 ~~~~~ after: 8.310752 (-1.06%, -0.09) ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.352319 ~~~~~ after: 0.353375 ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.322006 ~~~~~ after: 0.323852 ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 16.183304 ~~~~~ after: 16.177351 ### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 16.169041 ~~~~~ after: 16.173200 ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.559746 ~~~~~ after: 0.548727 (-1.97%, -0.01) ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.551662 ~~~~~ after: 0.548478 ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.294767 ~~~~~ after: 0.291008 (-1.28%, -0.00) ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.290598 ~~~~~ after: 0.288139 ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.128753 ~~~~~ after: 0.127942 ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.128310 ~~~~~ after: 0.128236 ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 4.968975 ~~~~~ after: 4.804225 (-3.32%, -0.16) ### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 5.038150 ~~~~~ after: 4.821872 (-4.29%, -0.22) ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.560542 ~~~~~ after: 0.557323 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.554099 ~~~~~ after: 0.553200 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.292676 ~~~~~ after: 0.292513 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.288629 ~~~~~ after: 0.287737 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.223442 ~~~~~ after: 0.223168 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.223376 ~~~~~ after: 0.222181 ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 4.691464 ~~~~~ after: 4.567641 (-2.64%, -0.12) ### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 4.700062 ~~~~~ after: 4.616739 (-1.77%, -0.08) ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.708915 ~~~~~ after: 0.697581 (-1.60%, -0.01) ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.698667 ~~~~~ after: 0.693792 ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.302459 ~~~~~ after: 0.296517 (-1.96%, -0.01) ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.297432 ~~~~~ after: 0.293347 (-1.37%, -0.00) ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.200229 ~~~~~ after: 0.199035 ### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.199995 ~~~~~ after: 0.199130 ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.712384 ~~~~~ after: 0.703804 (-1.20%, -0.01) ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 0.704736 ~~~~~ after: 0.699944 ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.300989 ~~~~~ after: 0.300870 ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.296388 ~~~~~ after: 0.295122 ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.323753 ~~~~~ after: 0.328260 (+1.39%, +0.00) ### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.326091 ~~~~~ after: 0.325825 ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 36.797693 ~~~~~ after: 35.395390 (-3.81%, -1.40) ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 36.400602 ~~~~~ after: 35.793828 (-1.67%, -0.61) ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.303372 ~~~~~ after: 0.302275 ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.300228 ~~~~~ after: 0.299014 ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 133.610273 ~~~~~ after: 134.082667 ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 133.560602 ~~~~~ after: 133.560186 ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 32.279654 ~~~~~ after: 31.937365 (-1.06%, -0.34) ### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 32.393790 ~~~~~ after: 32.059161 (-1.03%, -0.33) ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 36.750314 ~~~~~ after: 35.659837 (-2.97%, -1.09) ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 36.132511 ~~~~~ after: 35.533999 (-1.66%, -0.60) ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.426249 ~~~~~ after: 0.427237 ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.297567 ~~~~~ after: 0.297548 ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 135.684726 ~~~~~ after: 135.554733 ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 135.521429 ~~~~~ after: 135.471735 ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 32.138181 ~~~~~ after: 31.376612 (-2.37%, -0.76) ### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 32.436170 ~~~~~ after: 31.800662 (-1.96%, -0.64) ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 56.412651 ~~~~~ after: 55.968979 ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 57.291139 ~~~~~ after: 55.623600 (-2.91%, -1.67) ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.305015 ~~~~~ after: 0.302645 ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.299651 ~~~~~ after: 0.296140 (-1.17%, -0.00) ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 372.603646 ~~~~~ after: 379.958592 (+1.97%, +7.35) ### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 372.571283 ~~~~~ after: 376.975082 (+1.18%, +4.40) ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 57.900620 ~~~~~ after: 56.628974 (-2.20%, -1.27) ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 56.772457 ~~~~~ after: 56.219994 ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.497401 ~~~~~ after: 0.498934 ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.298446 ~~~~~ after: 0.297411 ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 376.794500 ~~~~~ after: 377.126872 ### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 377.108643 ~~~~~ after: 378.355222 ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 58.211350 ~~~~~ after: 56.179941 (-3.49%, -2.03) ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 1.221867 ~~~~~ after: 1.171836 (-4.09%, -0.05) ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = yes # benchmark.variants.rev = none before: 169.190180 ~~~~~ after: 167.816681 ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.command.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.resource-usage = default # benchmark.variants.reuse-external-delta-parent = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = unbundle # benchmark.variants.validate = default # benchmark.variants.verbosity = quiet before: 70.573063 ~~~~~ after: 70.149730 ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 2469.554928 ~~~~~ after: 2459.756854 ### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 63.259498 ~~~~~ after: 62.934324 ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 52.009024 ~~~~~ after: 51.021327 (-1.90%, -0.99) ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 52.021120 ~~~~~ after: 51.187100 (-1.60%, -0.83) ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.316214 ~~~~~ after: 0.313213 ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.314039 ~~~~~ after: 0.309434 (-1.47%, -0.00) ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 419.229602 ~~~~~ after: 418.731461 ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 419.121169 ~~~~~ after: 418.893086 ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 52.298052 ~~~~~ after: 51.680823 (-1.18%, -0.62) ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 51.979719 ~~~~~ after: 50.517619 (-2.81%, -1.46) ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.542347 ~~~~~ after: 0.541494 ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.361585 ~~~~~ after: 0.359601 ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 424.435573 ~~~~~ after: 425.054393 ### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 425.369579 ~~~~~ after: 424.182501 ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.169597 ~~~~~ after: 16.809620 (-2.10%, -0.36) ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.052174 ~~~~~ after: 16.873865 (-1.05%, -0.18) ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.300405 ~~~~~ after: 0.296493 (-1.30%, -0.00) ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.296907 ~~~~~ after: 0.291884 (-1.69%, -0.01) ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 76.353166 ~~~~~ after: 76.315550 ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 76.304418 ~~~~~ after: 76.314896 ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 41.448226 ~~~~~ after: 39.696075 (-4.23%, -1.75) ### data-env-vars.name = netbeans-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 41.489911 ~~~~~ after: 40.213760 (-3.08%, -1.28) ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.276211 ~~~~~ after: 16.934238 (-1.98%, -0.34) ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.275566 ~~~~~ after: 17.151560 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.363647 ~~~~~ after: 0.364217 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.292249 ~~~~~ after: 0.293737 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 77.242740 ~~~~~ after: 77.165247 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 77.189009 ~~~~~ after: 77.153971 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 40.341299 ~~~~~ after: 40.604985 ### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 40.585503 ~~~~~ after: 40.820806 ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.515332 ~~~~~ after: 17.190762 (-1.85%, -0.32) ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.343596 ~~~~~ after: 17.050369 (-1.69%, -0.29) ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.316108 ~~~~~ after: 0.315292 ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.311521 ~~~~~ after: 0.307919 (-1.16%, -0.00) ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 80.169792 ~~~~~ after: 80.090093 ### data-env-vars.name = netbeans-2019-11-07-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 80.168257 ~~~~~ after: 80.203922 ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.471723 ~~~~~ after: 17.104498 (-2.10%, -0.37) ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 17.351268 ~~~~~ after: 17.039244 (-1.80%, -0.31) ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.379920 ~~~~~ after: 0.380529 ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.306940 ~~~~~ after: 0.308172 ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 81.143787 ~~~~~ after: 81.205227 ### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 81.208757 ~~~~~ after: 81.201285 ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.409354 ~~~~~ after: 1.384783 (-1.74%, -0.02) ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.395327 ~~~~~ after: 1.379295 (-1.15%, -0.02) ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.305516 ~~~~~ after: 0.301302 (-1.38%, -0.00) ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.300681 ~~~~~ after: 0.296424 (-1.42%, -0.00) ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.228350 ~~~~~ after: 1.225184 ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.227250 ~~~~~ after: 1.226652 ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 10.441251 ~~~~~ after: 10.233845 (-1.99%, -0.21) ### data-env-vars.name = pypy-2018-08-01-ds2-pnm # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 10.477187 ~~~~~ after: 10.518723 ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.406229 ~~~~~ after: 1.383834 (-1.59%, -0.02) ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.404700 ~~~~~ after: 1.386296 (-1.31%, -0.02) ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.303247 ~~~~~ after: 0.304695 ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.295575 ~~~~~ after: 0.294873 ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.614998 ~~~~~ after: 1.619019 ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.608089 ~~~~~ after: 1.613761 ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 10.494740 ~~~~~ after: 10.183642 (-2.96%, -0.31) ### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog # benchmark.name = hg.perf.unbundle # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = default # benchmark.variants.revs = any-10000-extra-rev # benchmark.variants.source = default before: 10.153362 ~~~~~ after: 10.208118 ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.613760 ~~~~~ after: 1.595667 (-1.12%, -0.02) ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.601770 ~~~~~ after: 1.589591 ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.300656 ~~~~~ after: 0.299511 ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.298116 ~~~~~ after: 0.34f44a ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.451637 ~~~~~ after: 1.449828 ### data-env-vars.name = pypy-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.447463 ~~~~~ after: 1.447144 ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.618347 ~~~~~ after: 1.593819 (-1.52%, -0.02) ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.610104 ~~~~~ after: 1.591181 (-1.18%, -0.02) ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.299082 ~~~~~ after: 0.302411 (+1.11%, +0.00) ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.294385 ~~~~~ after: 0.294103 ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.896348 ~~~~~ after: 1.892661 ### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 1.897075 ~~~~~ after: 1.896864 ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.823667 ~~~~~ after: 1.791246 (-1.78%, -0.03) ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.820555 ~~~~~ after: 1.765854 (-3.00%, -0.05) ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.340665 ~~~~~ after: 0.336729 (-1.16%, -0.00) ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.335204 ~~~~~ after: 0.333865 ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.262541 ~~~~~ after: 0.261794 ### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.261495 ~~~~~ after: 0.260879 ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.856138 ~~~~~ after: 1.784902 (-3.84%, -0.07) ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.cat # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.files = all-root # benchmark.variants.output = plain # benchmark.variants.rev = tip before: 1.811432 ~~~~~ after: 1.782845 (-1.58%, -0.03) ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.343215 ~~~~~ after: 0.341859 ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.command.log # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.limit-rev = 1000 # benchmark.variants.patch = no # benchmark.variants.rev = none before: 0.332617 ~~~~~ after: 0.331202 ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rhg # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.590326 ~~~~~ after: 0.590407 ### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.read-revisions # bin-env-vars.hg.flavor = rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.order = default # benchmark.variants.revlog = manifestlog before: 0.589567 ~~~~~ after: 0.588821 ```
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     1
# scmutil.py - Mercurial core utility functions
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46672
diff changeset
     3
#  Copyright Olivia Mackall <olivia@selenic.com>
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     4
#
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
     7
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51802
diff changeset
     8
from __future__ import annotations
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
     9
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
    10
import binascii
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    11
import errno
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    12
import glob
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    13
import os
41650
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41649
diff changeset
    14
import posixpath
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    15
import re
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
    16
import subprocess
51725
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    17
import typing
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
    18
import weakref
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    19
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    20
from typing import (
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    21
    Callable,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    22
    Dict,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    23
    Iterable,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    24
    Iterator,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    25
    List,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    26
    Optional,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    27
    Set,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    28
    Tuple,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    29
)
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    30
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    31
from .i18n import _
32658
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
    32
from .node import (
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
    33
    bin,
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
    34
    hex,
39894
d739f423bf06 repo: look up nullrev context by revnum, not symbolic name
Martin von Zweigbergk <martinvonz@google.com>
parents: 39891
diff changeset
    35
    nullrev,
34327
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
    36
    short,
32658
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
    37
    wdirrev,
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
    38
)
43654
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
    39
from .thirdparty import attr
51725
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    40
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    41
# Force pytype to use the non-vendored package
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    42
if typing.TYPE_CHECKING:
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    43
    # noinspection PyPackageRequirements
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    44
    import attr
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51699
diff changeset
    45
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    46
from . import (
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
    47
    copies as copiesmod,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    48
    encoding,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    49
    error,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    50
    match as matchmod,
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
    51
    obsolete,
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
    52
    obsutil,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    53
    pathutil,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    54
    phases,
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
    55
    policy,
30305
af7c60988f6e py3: make scmutil.rcpath() return bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30109
diff changeset
    56
    pycompat,
45482
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
    57
    requirements as requirementsmod,
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30639
diff changeset
    58
    revsetlang,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    59
    similar,
39897
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39894
diff changeset
    60
    smartset,
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    61
    typelib,
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
    62
    url,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    63
    util,
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
    64
    vfs,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    65
)
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
    66
52451
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52098
diff changeset
    67
from .interfaces import status as istatus
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52098
diff changeset
    68
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
    69
from .utils import (
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44038
diff changeset
    70
    hashutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37094
diff changeset
    71
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
    72
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
    73
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
    74
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34620
diff changeset
    75
if pycompat.iswindows:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    76
    from . import scmwindows as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
    77
else:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
    78
    from . import scmposix as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
    79
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    80
if typing.TYPE_CHECKING:
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    81
    from . import (
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    82
        ui as uimod,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    83
    )
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    84
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43365
diff changeset
    85
parsers = policy.importmod('parsers')
52838
e52dc683bf6b rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52677
diff changeset
    86
rustrevlog = policy.importrust('revlog', pyo3=True)
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
    87
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30309
diff changeset
    88
termsize = scmplatform.termsize
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
    89
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
    90
43654
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
    91
@attr.s(slots=True, repr=False)
52451
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52098
diff changeset
    92
class status(istatus.Status):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
    93
    """Struct with a list of files per status.
43654
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
    94
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
    95
    The 'deleted', 'unknown' and 'ignored' properties are only
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
    96
    relevant to the working copy.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
    97
    """
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
    98
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
    99
    modified = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   100
    added = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   101
    removed = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   102
    deleted = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   103
    unknown = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   104
    ignored = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   105
    clean = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   106
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   107
    def __iter__(self) -> Iterator[List[bytes]]:
43654
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   108
        yield self.modified
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   109
        yield self.added
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   110
        yield self.removed
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   111
        yield self.deleted
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   112
        yield self.unknown
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   113
        yield self.ignored
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   114
        yield self.clean
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
   115
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   116
    def __repr__(self) -> str:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   117
        return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   118
            r'<status modified=%s, added=%s, removed=%s, deleted=%s, '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   119
            r'unknown=%s, ignored=%s, clean=%s>'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   120
        ) % tuple(pycompat.sysstr(stringutil.pprint(v)) for v in self)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   121
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
   122
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   123
def itersubrepos(ctx1, ctx2):
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   124
    """find subrepos in ctx1 or ctx2"""
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   125
    # Create a (subpath, ctx) mapping where we prefer subpaths from
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   126
    # ctx1. The subpaths from ctx2 are important when the .hgsub file
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   127
    # has been modified (in ctx2) but not yet committed (in ctx1).
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   128
    subpaths = dict.fromkeys(ctx2.substate, ctx2)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   129
    subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   130
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   131
    missing = set()
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   132
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   133
    for subpath in ctx2.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   134
        if subpath not in ctx1.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   135
            del subpaths[subpath]
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   136
            missing.add(subpath)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   137
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   138
    for subpath, ctx in sorted(subpaths.items()):
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   139
        yield subpath, ctx.sub(subpath)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
   140
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   141
    # Yield an empty subrepo based on ctx1 for anything only in ctx2.  That way,
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   142
    # status and diff will have an accurate result when it does
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   143
    # 'sub.{status|diff}(rev2)'.  Otherwise, the ctx2 subrepo is compared
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   144
    # against itself.
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   145
    for subpath in missing:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   146
        yield subpath, ctx2.nullsub(subpath, ctx1)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
   147
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   148
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   149
def nochangesfound(ui: uimod.ui, repo, excluded=None) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   150
    """Report no changes for push/pull, excluded is None or a list of
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   151
    nodes excluded from the push/pull.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   152
    """
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   153
    secretlist = []
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   154
    if excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   155
        for n in excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   156
            ctx = repo[n]
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   157
            if ctx.phase() >= phases.secret and not ctx.extinct():
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   158
                secretlist.append(n)
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
   159
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
   160
    if secretlist:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   161
        ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   162
            _(b"no changes found (ignored %d secret changesets)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   163
            % len(secretlist)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   164
        )
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
   165
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   166
        ui.status(_(b"no changes found\n"))
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
   167
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   168
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   169
def callcatch(ui: uimod.ui, func: Callable[[], int]) -> int:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   170
    """call func() with global exception handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   171
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   172
    return func() if no exception happens. otherwise do some error handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   173
    and return an exit code accordingly. does not handle all exceptions.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   174
    """
45826
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   175
    coarse_exit_code = -1
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   176
    detailed_exit_code = -1
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   177
    try:
32041
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
   178
        try:
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
   179
            return func()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   180
        except:  # re-raises
32041
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
   181
            ui.traceback()
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
   182
            raise
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   183
    # Global exception handling, alphabetically
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   184
    # Mercurial-specific first, followed by built-in and library exceptions
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   185
    except error.LockHeld as inst:
45828
e0dbfbd4062c errors: set detailed exit code to 20 for locking errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45827
diff changeset
   186
        detailed_exit_code = 20
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   187
        if inst.errno == errno.ETIMEDOUT:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   188
            reason = _(b'timed out waiting for lock held by %r') % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   189
                pycompat.bytestr(inst.locker)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   190
            )
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   191
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   192
            reason = _(b'lock held by %r') % inst.locker
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   193
        ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   194
            _(b"abort: %s: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   195
            % (inst.desc or stringutil.forcebytestr(inst.filename), reason)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   196
        )
32088
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
   197
        if not inst.locker:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   198
            ui.error(_(b"(lock might be very busy)\n"))
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   199
    except error.LockUnavailable as inst:
45828
e0dbfbd4062c errors: set detailed exit code to 20 for locking errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45827
diff changeset
   200
        detailed_exit_code = 20
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   201
        ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   202
            _(b"abort: could not lock %s: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   203
            % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   204
                inst.desc or stringutil.forcebytestr(inst.filename),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   205
                encoding.strtolocal(inst.strerror),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   206
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   207
        )
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   208
    except error.RepoError as inst:
48368
8c4881c07f57 errors: use detailed exit code for RepoLookupError
Martin von Zweigbergk <martinvonz@google.com>
parents: 48367
diff changeset
   209
        if isinstance(inst, error.RepoLookupError):
8c4881c07f57 errors: use detailed exit code for RepoLookupError
Martin von Zweigbergk <martinvonz@google.com>
parents: 48367
diff changeset
   210
            detailed_exit_code = 10
45906
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45895
diff changeset
   211
        ui.error(_(b"abort: %s\n") % inst)
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   212
        if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
            ui.error(_(b"(%s)\n") % inst.hint)
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   214
    except error.ResponseError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
        ui.error(_(b"abort: %s") % inst.args[0])
36661
b76248e51605 scmutil: avoid using basestring and add explicit handling of unicodes
Augie Fackler <augie@google.com>
parents: 36658
diff changeset
   216
        msg = inst.args[1]
52653
b3e68fd7864b pyupgrade: primitive types directly where possible
Matt Harbison <matt_harbison@yahoo.com>
parents: 52651
diff changeset
   217
        if isinstance(msg, str):
36661
b76248e51605 scmutil: avoid using basestring and add explicit handling of unicodes
Augie Fackler <augie@google.com>
parents: 36658
diff changeset
   218
            msg = pycompat.sysbytes(msg)
46672
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46417
diff changeset
   219
        if msg is None:
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46417
diff changeset
   220
            ui.error(b"\n")
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46417
diff changeset
   221
        elif not isinstance(msg, bytes):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   222
            ui.error(b" %r\n" % (msg,))
36695
c442c4a92ae8 scmutil: fix oversight in b76248e51605c6 where I forgot to use msg
Augie Fackler <augie@google.com>
parents: 36661
diff changeset
   223
        elif not msg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   224
            ui.error(_(b" empty string\n"))
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   225
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
            ui.error(b"\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg)))
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   227
    except error.CensoredNodeError as inst:
45906
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45895
diff changeset
   228
        ui.error(_(b"abort: file censored %s\n") % inst)
32659
7b17f9de6d3e revlog: map rev(wdirid) to WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 32658
diff changeset
   229
    except error.WdirUnsupported:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
        ui.error(_(b"abort: working directory revision cannot be specified\n"))
47293
7a769ac49637 errors: catch the new Error class in scmutil and chgserver
Martin von Zweigbergk <martinvonz@google.com>
parents: 47291
diff changeset
   231
    except error.Error as inst:
47289
33c0c25d0b0f errors: let each Abort subclass define its error code
Martin von Zweigbergk <martinvonz@google.com>
parents: 47128
diff changeset
   232
        if inst.detailed_exit_code is not None:
33c0c25d0b0f errors: let each Abort subclass define its error code
Martin von Zweigbergk <martinvonz@google.com>
parents: 47128
diff changeset
   233
            detailed_exit_code = inst.detailed_exit_code
47291
d9c71bbe20f7 errors: make InterventionRequired subclass Abort
Martin von Zweigbergk <martinvonz@google.com>
parents: 47289
diff changeset
   234
        if inst.coarse_exit_code is not None:
d9c71bbe20f7 errors: make InterventionRequired subclass Abort
Martin von Zweigbergk <martinvonz@google.com>
parents: 47289
diff changeset
   235
            coarse_exit_code = inst.coarse_exit_code
45885
600aec73f309 errors: format "abort: " text in a new Abort.format() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 45884
diff changeset
   236
        ui.error(inst.format())
45825
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
   237
    except error.WorkerError as inst:
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
   238
        # Don't print a message -- the worker already should have
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
   239
        return inst.status_code
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   240
    except ImportError as inst:
45906
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45895
diff changeset
   241
        ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
   242
        m = stringutil.forcebytestr(inst).split()[-1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   243
        if m in b"mpatch bdiff".split():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
            ui.error(_(b"(did you forget to compile extensions?)\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   245
        elif m in b"zlib".split():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   246
            ui.error(_(b"(is your Python install correct?)\n"))
45838
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   247
    except util.urlerr.httperror as inst:
45839
ebee234d952a errors: set detailed exit code to 100 for some remote errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45838
diff changeset
   248
        detailed_exit_code = 100
45838
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   249
        ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   250
    except util.urlerr.urlerror as inst:
45839
ebee234d952a errors: set detailed exit code to 100 for some remote errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45838
diff changeset
   251
        detailed_exit_code = 100
45838
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   252
        try:  # usually it is in the form (errno, strerror)
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   253
            reason = inst.reason.args[1]
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   254
        except (AttributeError, IndexError):
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   255
            # it might be anything, for example a string
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   256
            reason = inst.reason
48934
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   257
        if isinstance(reason, str):
45838
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   258
            # SSLError of Python 2.7.9 contains a unicode
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   259
            reason = encoding.unitolocal(reason)
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45828
diff changeset
   260
        ui.error(_(b"abort: error: %s\n") % stringutil.forcebytestr(reason))
52640
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52451
diff changeset
   261
    except OSError as inst:
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50916
diff changeset
   262
        if hasattr(inst, "args") and inst.args and inst.args[0] == errno.EPIPE:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   263
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   264
        elif getattr(inst, "strerror", None):  # common IOError or OSError
41420
b6673e9bdcf6 dispatch: quote filename in IOError as well
Yuya Nishihara <yuya@tcha.org>
parents: 41419
diff changeset
   265
            if getattr(inst, "filename", None) is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   266
                ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   267
                    _(b"abort: %s: '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   268
                    % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   269
                        encoding.strtolocal(inst.strerror),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   270
                        stringutil.forcebytestr(inst.filename),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   271
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   272
                )
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   273
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
                ui.error(_(b"abort: %s\n") % encoding.strtolocal(inst.strerror))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   275
        else:  # suspicious IOError
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   276
            raise
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   277
    except MemoryError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
        ui.error(_(b"abort: out of memory\n"))
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   279
    except SystemExit as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   280
        # Commands shouldn't sys.exit directly, but give a return code.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   281
        # Just in case catch this and and pass exit code to caller.
45826
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   282
        detailed_exit_code = 254
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   283
        coarse_exit_code = inst.code
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   284
45826
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   285
    if ui.configbool(b'ui', b'detailed-exit-code'):
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   286
        return detailed_exit_code
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   287
    else:
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45825
diff changeset
   288
        return coarse_exit_code
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30417
diff changeset
   289
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   290
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   291
def checknewlabel(repo, lbl: bytes, kind) -> None:
19070
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
   292
    # Do not use the "kind" parameter in ui output.
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
   293
    # It makes strings difficult to translate.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   294
    if lbl in [b'tip', b'.', b'null']:
45845
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   295
        raise error.InputError(_(b"the name '%s' is reserved") % lbl)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   296
    for c in (b':', b'\0', b'\n', b'\r'):
17821
361ab1e2086f scmutil: add bad character checking to checknewlabel
Kevin Bullock <kbullock@ringworld.org>
parents: 17817
diff changeset
   297
        if c in lbl:
45845
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   298
            raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   299
                _(b"%r cannot be used in a name") % pycompat.bytestr(c)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   300
            )
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
   301
    try:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
   302
        int(lbl)
49968
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49450
diff changeset
   303
        if b'_' in lbl:
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49450
diff changeset
   304
            # If label contains underscores, Python might consider it an
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49450
diff changeset
   305
            # integer (with "_" as visual separators), but we do not.
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49450
diff changeset
   306
            # See PEP 515 - Underscores in Numeric Literals.
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49450
diff changeset
   307
            raise ValueError
45845
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   308
        raise error.InputError(_(b"cannot use an integer as a name"))
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
   309
    except ValueError:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
   310
        pass
36145
4f3e989536c3 label: enforce the lack of leading or trailing white space
Boris Feld <boris.feld@octobus.net>
parents: 36137
diff changeset
   311
    if lbl.strip() != lbl:
45845
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   312
        raise error.InputError(
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   313
            _(b"leading or trailing whitespace in name %r") % lbl
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
   314
        )
17817
b17be267b59c scmutil: add function to validate new branch, tag, and bookmark names
Kevin Bullock <kbullock@ringworld.org>
parents: 17768
diff changeset
   315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   316
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   317
def checkfilename(f: bytes) -> None:
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
   318
    '''Check that the filename f is an acceptable filename for a tracked file'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
    if b'\r' in f or b'\n' in f:
45844
3175b0e0058b errors: use InputError for errors about bad paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 45841
diff changeset
   320
        raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
            _(b"'\\n' and '\\r' disallowed in filenames: %r")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   322
            % pycompat.bytestr(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   323
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   324
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
   325
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   326
def checkportable(ui: uimod.ui, f: bytes) -> None:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
   327
    '''Check if filename f is portable and warn or abort depending on config'''
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
   328
    checkfilename(f)
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   329
    abort, warn = checkportabilityalert(ui)
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   330
    if abort or warn:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
   331
        msg = util.checkwinfilename(f)
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
   332
        if msg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
            msg = b"%s: %s" % (msg, procutil.shellquote(f))
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   334
            if abort:
45844
3175b0e0058b errors: use InputError for errors about bad paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 45841
diff changeset
   335
                raise error.InputError(msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   336
            ui.warn(_(b"warning: %s\n") % msg)
14068
04ce8fa1015d add: notify when adding a file that would cause a case-folding collision
Kevin Gessner <kevin@kevingessner.com>
parents: 14067
diff changeset
   337
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   338
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   339
def checkportabilityalert(ui: uimod.ui) -> Tuple[bool, bool]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   340
    """check if the user's config requests nothing, a warning, or abort for
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   341
    non-portable filenames"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
    val = ui.config(b'ui', b'portablefilenames')
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
   343
    lval = val.lower()
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36836
diff changeset
   344
    bval = stringutil.parsebool(val)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   345
    abort = pycompat.iswindows or lval == b'abort'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
    warn = bval or lval == b'warn'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   347
    if bval is None and not (warn or abort or lval == b'ignore'):
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
   348
        raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
            _(b"ui.portablefilenames value is invalid ('%s')") % val
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   350
        )
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
   351
    return abort, warn
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
   352
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   353
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
   354
class casecollisionauditor:
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   355
    def __init__(self, ui: uimod.ui, abort: bool, dirstate) -> None:
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   356
        self._ui = ui
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   357
        self._abort = abort
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   358
        allfiles = b'\0'.join(dirstate)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
        self._loweredfiles = set(encoding.lower(allfiles).split(b'\0'))
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   360
        self._dirstate = dirstate
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   361
        # The purpose of _newfiles is so that we don't complain about
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   362
        # case collisions if someone were to call this object with the
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   363
        # same filename twice.
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   364
        self._newfiles = set()
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
   365
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   366
    def __call__(self, f: bytes) -> None:
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
   367
        if f in self._newfiles:
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
   368
            return
14980
28e98a8b173d i18n: use UTF-8 string to lower filename for case collision check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 14861
diff changeset
   369
        fl = encoding.lower(f)
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
   370
        if fl in self._loweredfiles and f not in self._dirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   371
            msg = _(b'possible case-folding collision for %s') % f
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
   372
            if self._abort:
48367
0b8e076e878c errors: use detailed exit code for detected case-collision
Martin von Zweigbergk <martinvonz@google.com>
parents: 48315
diff changeset
   373
                raise error.StateError(msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
            self._ui.warn(_(b"warning: %s\n") % msg)
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   375
        self._loweredfiles.add(fl)
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
   376
        self._newfiles.add(f)
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13962
diff changeset
   377
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   378
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   379
def combined_filtered_and_obsolete_hash(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   380
    repo, maxrev, needobsolete: bool = False
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   381
):
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   382
    """build hash of filtered revisions in the current repoview.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   383
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   384
    Multiple caches perform up-to-date validation by checking that the
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   385
    tiprev and tipnode stored in the cache file match the current repository.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   386
    However, this is not sufficient for validating repoviews because the set
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   387
    of revisions in the view may change without the repository tiprev and
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   388
    tipnode changing.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   389
48687
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   390
    This function hashes all the revs filtered from the view (and, optionally,
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   391
    all obsolete revs) up to maxrev and returns that SHA-1 digest.
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   392
    """
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   393
    cl = repo.changelog
48687
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   394
    if needobsolete:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   395
        obsrevs = obsolete.getrevs(repo, b'obsolete')
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   396
        if not cl.filteredrevs and not obsrevs:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   397
            return None
48724
c7e675848027 scmutil: obsrevs is already a frozenset
Anton Shestakov <av6@dwimlabs.net>
parents: 48687
diff changeset
   398
        key = (maxrev, hash(cl.filteredrevs), hash(obsrevs))
48687
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   399
    else:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   400
        if not cl.filteredrevs:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   401
            return None
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   402
        key = maxrev
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   403
        obsrevs = frozenset()
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   404
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   405
    result = cl._filteredrevs_hashcache.get(key)
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   406
    if not result:
51522
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   407
        revs, obs_revs = _filtered_and_obs_revs(repo, maxrev)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   408
        if needobsolete:
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   409
            revs = revs | obs_revs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   410
        revs = sorted(revs)
45515
89f0d9f87701 branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents: 45483
diff changeset
   411
        if revs:
51521
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   412
            result = _hash_revs(revs)
48687
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   413
            cl._filteredrevs_hashcache[key] = result
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48460
diff changeset
   414
    return result
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
   415
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   416
51526
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   417
def filtered_and_obsolete_hash(repo, maxrev):
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   418
    """build hashs of filtered and obsolete revisions in the current repoview.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   419
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   420
    Multiple caches perform up-to-date validation by checking that the
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   421
    tiprev and tipnode stored in the cache file match the current repository.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   422
    However, this is not sufficient for validating repoviews because the set
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   423
    of revisions in the view may change without the repository tiprev and
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   424
    tipnode changing.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   425
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   426
    This function hashes all the revs filtered from the view up to maxrev and
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   427
    returns that SHA-1 digest. The obsolete revisions hashed are only the
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   428
    non-filtered one.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   429
    """
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   430
    cl = repo.changelog
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   431
    obs_set = obsolete.getrevs(repo, b'obsolete')
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   432
    key = (maxrev, hash(cl.filteredrevs), hash(obs_set))
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   433
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   434
    result = cl._filteredrevs_hashcache.get(key)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   435
    if result is None:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   436
        filtered_hash = None
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   437
        obs_hash = None
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   438
        filtered_revs, obs_revs = _filtered_and_obs_revs(repo, maxrev)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   439
        if filtered_revs:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   440
            filtered_hash = _hash_revs(filtered_revs)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   441
        if obs_revs:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   442
            obs_hash = _hash_revs(obs_revs)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   443
        result = (filtered_hash, obs_hash)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   444
        cl._filteredrevs_hashcache[key] = result
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   445
    return result
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   446
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51523
diff changeset
   447
51522
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   448
def _filtered_and_obs_revs(repo, max_rev):
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   449
    """return the set of filtered and non-filtered obsolete revision"""
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   450
    cl = repo.changelog
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   451
    obs_set = obsolete.getrevs(repo, b'obsolete')
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   452
    filtered_set = cl.filteredrevs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   453
    if cl.filteredrevs:
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   454
        obs_set = obs_set - cl.filteredrevs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   455
    if max_rev < (len(cl) - 1):
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   456
        # there might be revision to filter out
52651
f066fc0bdc7a pyupgrade: use set literals where possible
Matt Harbison <matt_harbison@yahoo.com>
parents: 52645
diff changeset
   457
        filtered_set = {r for r in filtered_set if r <= max_rev}
f066fc0bdc7a pyupgrade: use set literals where possible
Matt Harbison <matt_harbison@yahoo.com>
parents: 52645
diff changeset
   458
        obs_set = {r for r in obs_set if r <= max_rev}
51522
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   459
    return (filtered_set, obs_set)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   460
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51521
diff changeset
   461
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   462
def _hash_revs(revs: Iterable[int]) -> bytes:
51521
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   463
    """return a hash from a list of revision numbers"""
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   464
    s = hashutil.sha1()
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   465
    for rev in revs:
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   466
        s.update(b'%d;' % rev)
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   467
    return s.digest()
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   468
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51280
diff changeset
   469
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   470
def walkrepos(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   471
    path,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   472
    followsym: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   473
    seen_dirs: Optional[List[bytes]] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   474
    recurse: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   475
) -> Iterable[bytes]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   476
    """yield every hg repository under path, always recursively.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   477
    The recurse flag will only control recursion into repo working dirs"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   478
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   479
    def errhandler(err):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   480
        if err.filename == path:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   481
            raise err
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   482
14961
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
   483
    samestat = getattr(os.path, 'samestat', None)
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
   484
    if followsym and samestat is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   485
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
   486
        def adddir(dirlst, dirname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   487
            dirstat = os.stat(dirname)
36338
ddd9474d2e08 walkrepos: don't reimplement any()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36313
diff changeset
   488
            match = any(samestat(dirstat, lstdirstat) for lstdirstat in dirlst)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   489
            if not match:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   490
                dirlst.append(dirstat)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   491
            return not match
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   492
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   493
    else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   494
        followsym = False
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   495
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   496
    if (seen_dirs is None) and followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   497
        seen_dirs = []
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
   498
        adddir(seen_dirs, path)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   499
    for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   500
        dirs.sort()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   501
        if b'.hg' in dirs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   502
            yield root  # found a repository
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   503
            qroot = os.path.join(root, b'.hg', b'patches')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   504
            if os.path.isdir(os.path.join(qroot, b'.hg')):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   505
                yield qroot  # we have a patch queue repo here
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   506
            if recurse:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   507
                # avoid recursing inside the .hg directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   508
                dirs.remove(b'.hg')
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   509
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   510
                dirs[:] = []  # don't descend further
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   511
        elif followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   512
            newdirs = []
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   513
            for d in dirs:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   514
                fname = os.path.join(root, d)
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
   515
                if adddir(seen_dirs, fname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   516
                    if os.path.islink(fname):
52644
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52640
diff changeset
   517
                        yield from walkrepos(fname, True, seen_dirs)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   518
                    else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   519
                        newdirs.append(d)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
   520
            dirs[:] = newdirs
13984
af60153b5e3b move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13975
diff changeset
   521
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   522
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   523
def binnode(ctx) -> bytes:
32658
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
   524
    """Return binary node id for a given basectx"""
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
   525
    node = ctx.node()
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
   526
    if node is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
   527
        return ctx.repo().nodeconstants.wdirid
32658
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
   528
    return node
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32656
diff changeset
   529
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   530
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   531
def intrev(ctx) -> int:
32656
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32270
diff changeset
   532
    """Return integer for a given basectx that can be used in comparison or
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
   533
    arithmetic operation"""
32656
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32270
diff changeset
   534
    rev = ctx.rev()
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
   535
    if rev is None:
25739
3dabc9b7494a changeset_printer: use node.wdirrev to calculate meaningful parentrevs
Yuya Nishihara <yuya@tcha.org>
parents: 25660
diff changeset
   536
        return wdirrev
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
   537
    return rev
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
   538
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   539
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   540
def formatchangeid(ctx) -> bytes:
34327
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   541
    """Format changectx as '{rev}:{node|formatnode}', which is the default
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35748
diff changeset
   542
    template provided by logcmdutil.changesettemplater"""
34327
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   543
    repo = ctx.repo()
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   544
    return formatrevnode(repo.ui, intrev(ctx), binnode(ctx))
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   545
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   546
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
   547
def formatrevnode(ui: uimod.ui, rev: int, node: bytes) -> bytes:
34327
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   548
    """Format given revision and node depending on the current verbosity"""
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   549
    if ui.debugflag:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   550
        hexfunc = hex
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   551
    else:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   552
        hexfunc = short
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   553
    return b'%d:%s' % (rev, hexfunc(node))
34327
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34146
diff changeset
   554
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   555
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   556
def resolvehexnodeidprefix(repo, prefix: bytes):
44810
62435a5b46fe revisions: parse "x123" as "nodeid starting with 123" without prefixhexnode
Martin von Zweigbergk <martinvonz@google.com>
parents: 44548
diff changeset
   557
    if prefix.startswith(b'x'):
38855
7848f284b211 revisions: allow "x123" to refer to nodeid prefix "123"
Martin von Zweigbergk <martinvonz@google.com>
parents: 38854
diff changeset
   558
        prefix = prefix[1:]
38842
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   559
    try:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   560
        # Uses unfiltered repo because it's faster when prefix is ambiguous/
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   561
        # This matches the shortesthexnodeidprefix() function below.
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   562
        node = repo.unfiltered().changelog._partialmatch(prefix)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   563
    except error.AmbiguousPrefixLookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
        revset = repo.ui.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   565
            b'experimental', b'revisions.disambiguatewithin'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   566
        )
38842
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   567
        if revset:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   568
            # Clear config to avoid infinite recursion
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   569
            configoverrides = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
                (b'experimental', b'revisions.disambiguatewithin'): None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   571
            }
38842
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   572
            with repo.ui.configoverride(configoverrides):
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   573
                revs = repo.anyrevs([revset], user=True)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   574
                matches = []
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   575
                for rev in revs:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   576
                    node = repo.changelog.node(rev)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   577
                    if hex(node).startswith(prefix):
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   578
                        matches.append(node)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   579
                if len(matches) == 1:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   580
                    return matches[0]
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
   581
        raise
37504
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
   582
    if node is None:
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
   583
        return
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
   584
    repo.changelog.rev(node)  # make sure node isn't filtered
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
   585
    return node
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
   586
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   587
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   588
def mayberevnum(repo, prefix: bytes) -> bool:
38854
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   589
    """Checks if the given prefix may be mistaken for a revision number"""
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   590
    try:
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   591
        i = int(prefix)
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   592
        # if we are a pure int, then starting with zero will not be
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   593
        # confused as a rev; or, obviously, if the int is larger
40341
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
   594
        # than the value of the tip rev. We still need to disambiguate if
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
   595
        # prefix == '0', since that *is* a valid revnum.
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
   596
        if (prefix != b'0' and prefix[0:1] == b'0') or i >= len(repo):
38854
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   597
            return False
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   598
        return True
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   599
    except ValueError:
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   600
        return False
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   601
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   602
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   603
def shortesthexnodeidprefix(repo, node: bytes, minlength: int = 1, cache=None):
38853
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   604
    """Find the shortest unambiguous prefix that matches hexnode.
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   605
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   606
    If "cache" is not None, it must be a dictionary that can be used for
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   607
    caching between calls to this method.
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   608
    """
37708
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
   609
    # _partialmatch() of filtered changelog could take O(len(repo)) time,
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
   610
    # which would be unacceptably slow. so we look for hash collision in
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
   611
    # unfiltered space, which means some hashes may be slightly longer.
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   612
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   613
    minlength = max(minlength, 1)
40403
bf249bb60087 shortest: never emit 0-length prefix even if unique
Martin von Zweigbergk <martinvonz@google.com>
parents: 40367
diff changeset
   614
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   615
    def disambiguate(prefix: bytes):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   616
        """Disambiguate against revnums."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   617
        if repo.ui.configbool(b'experimental', b'revisions.prefixhexnode'):
38856
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38855
diff changeset
   618
            if mayberevnum(repo, prefix):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   619
                return b'x' + prefix
38856
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38855
diff changeset
   620
            else:
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38855
diff changeset
   621
                return prefix
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38855
diff changeset
   622
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   623
        hexnode = hex(node)
37979
5ac72e07692a shortest: avoid magic number "41"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37971
diff changeset
   624
        for length in range(len(prefix), len(hexnode) + 1):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   625
            prefix = hexnode[:length]
38854
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   626
            if not mayberevnum(repo, prefix):
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   627
                return prefix
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   628
38854
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38853
diff changeset
   629
    cl = repo.unfiltered().changelog
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   630
    revset = repo.ui.config(b'experimental', b'revisions.disambiguatewithin')
38843
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   631
    if revset:
38853
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   632
        revs = None
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   633
        if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   634
            revs = cache.get(b'disambiguationrevset')
38853
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   635
        if revs is None:
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   636
            revs = repo.anyrevs([revset], user=True)
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38843
diff changeset
   637
            if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   638
                cache[b'disambiguationrevset'] = revs
38843
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   639
        if cl.rev(node) in revs:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   640
            hexnode = hex(node)
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   641
            nodetree = None
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   642
            if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   643
                nodetree = cache.get(b'disambiguationnodetree')
51249
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   644
            is_invalidated = getattr(nodetree, 'is_invalidated', lambda: False)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   645
            if is_invalidated():
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   646
                nodetree = None
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   647
            if not nodetree:
51249
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   648
                if hasattr(parsers, 'nodetree') and isinstance(
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   649
                    cl.index, parsers.index
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   650
                ):
44013
992f0d6e7f33 rust-index: use the new method in shortesthexnodeidprefix
Georges Racinet <georges.racinet@octobus.net>
parents: 44000
diff changeset
   651
                    index = cl.index
992f0d6e7f33 rust-index: use the new method in shortesthexnodeidprefix
Georges Racinet <georges.racinet@octobus.net>
parents: 44000
diff changeset
   652
                    nodetree = parsers.nodetree(index, len(revs))
51249
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   653
            elif getattr(cl.index, 'is_rust', False):
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   654
                nodetree = rustrevlog.NodeTree(cl.index)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   655
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   656
            if nodetree is not None:
51249
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   657
                for r in revs:
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   658
                    nodetree.insert(r)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   659
                if cache is not None:
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50926
diff changeset
   660
                    cache[b'disambiguationnodetree'] = nodetree
39226
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   661
                length = max(nodetree.shortest(node), minlength)
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   662
                prefix = hexnode[:length]
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39088
diff changeset
   663
                return disambiguate(prefix)
38843
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   664
            for length in range(minlength, len(hexnode) + 1):
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   665
                matches = []
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   666
                prefix = hexnode[:length]
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   667
                for rev in revs:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   668
                    otherhexnode = repo[rev].hex()
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   669
                    if prefix == otherhexnode[:length]:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   670
                        matches.append(otherhexnode)
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   671
                if len(matches) == 1:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   672
                    return disambiguate(prefix)
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38842
diff changeset
   673
37865
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
   674
    try:
37971
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 37960
diff changeset
   675
        return disambiguate(cl.shortest(node, minlength))
37865
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
   676
    except error.LookupError:
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
   677
        raise error.RepoLookupError()
37680
e743b8524d60 scmutil: introduce shortesthexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37679
diff changeset
   678
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   679
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   680
def isrevsymbol(repo, symbol: bytes) -> bool:
37677
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
   681
    """Checks if a symbol exists in the repo.
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
   682
38841
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38799
diff changeset
   683
    See revsymbol() for details. Raises error.AmbiguousPrefixLookupError if the
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38799
diff changeset
   684
    symbol is an ambiguous nodeid prefix.
37677
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
   685
    """
37350
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   686
    try:
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   687
        revsymbol(repo, symbol)
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   688
        return True
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   689
    except error.RepoLookupError:
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   690
        return False
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
   691
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   692
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   693
def revsymbol(repo, symbol: bytes):
37271
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   694
    """Returns a context given a single revision symbol (as string).
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   695
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   696
    This is similar to revsingle(), but accepts only a single revision symbol,
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   697
    i.e. things like ".", "tip", "1234", "deadbeef", "my-bookmark" work, but
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   698
    not "max(public())".
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   699
    """
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   700
    if not isinstance(symbol, bytes):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   701
        msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   702
            b"symbol (%s of type %s) was not a string, did you mean "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   703
            b"repo[symbol]?" % (symbol, type(symbol))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   704
        )
37271
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   705
        raise error.ProgrammingError(msg)
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   706
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   707
        if symbol in (b'.', b'tip', b'null'):
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   708
            return repo[symbol]
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   709
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   710
        try:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   711
            r = int(symbol)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   712
            if b'%d' % r != symbol:
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   713
                raise ValueError
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   714
            l = len(repo.changelog)
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   715
            if r < 0:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   716
                r += l
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   717
            if r < 0 or r >= l and r != wdirrev:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   718
                raise ValueError
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   719
            return repo[r]
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   720
        except error.FilteredIndexError:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   721
            raise
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   722
        except (ValueError, OverflowError, IndexError):
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   723
            pass
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   724
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47012
diff changeset
   725
        if len(symbol) == 2 * repo.nodeconstants.nodelen:
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   726
            try:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   727
                node = bin(symbol)
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   728
                rev = repo.changelog.rev(node)
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   729
                return repo[rev]
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   730
            except error.FilteredLookupError:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   731
                raise
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
   732
            except (binascii.Error, LookupError):
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   733
                pass
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   734
37529
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   735
        # look up bookmarks through the name interface
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   736
        try:
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   737
            node = repo.names.singlenode(repo, symbol)
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   738
            rev = repo.changelog.rev(node)
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   739
            return repo[rev]
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   740
        except KeyError:
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   741
            pass
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
   742
37679
ab828755e1ea scmutil: use resolvehexnodeidprefix() from revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37678
diff changeset
   743
        node = resolvehexnodeidprefix(repo, symbol)
37530
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
   744
        if node is not None:
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
   745
            rev = repo.changelog.rev(node)
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
   746
            return repo[rev]
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
   747
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   748
        raise error.RepoLookupError(_(b"unknown revision '%s'") % symbol)
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
   749
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   750
    except error.WdirUnsupported:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
   751
        return repo[None]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   752
    except (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   753
        error.FilteredIndexError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   754
        error.FilteredLookupError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   755
        error.FilteredRepoLookupError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   756
    ):
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   757
        raise _filterederror(repo, symbol)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   758
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   759
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   760
def _filterederror(repo, changeid: bytes) -> error.FilteredRepoLookupError:
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   761
    """build an exception to be raised about a filtered changeid
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   762
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   763
    This is extracted in a function to help extensions (eg: evolve) to
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   764
    experiment with various message variants."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   765
    if repo.filtername.startswith(b'visible'):
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   766
        # Check if the changeset is obsolete
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   767
        unfilteredrepo = repo.unfiltered()
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   768
        ctx = revsymbol(unfilteredrepo, changeid)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   769
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   770
        # If the changeset is obsolete, enrich the message with the reason
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   771
        # that made this changeset not visible
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   772
        if ctx.obsolete():
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   773
            msg = obsutil._getfilteredreason(repo, changeid, ctx)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   774
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   775
            msg = _(b"hidden revision '%s'") % changeid
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   776
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   777
        hint = _(b'use --hidden to access hidden revisions')
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   778
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   779
        return error.FilteredRepoLookupError(msg, hint=hint)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   780
    msg = _(b"filtered revision '%s' (not in '%s' subset)")
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   781
    msg %= (changeid, repo.filtername)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
   782
    return error.FilteredRepoLookupError(msg)
37271
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   783
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   784
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   785
def revsingle(repo, revspec, default=b'.', localalias=None):
19509
8963a706e075 revsingle: fix silly API issue (issue2992)
Matt Mackall <mpm@selenic.com>
parents: 19154
diff changeset
   786
    if not revspec and revspec != 0:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   787
        return repo[default]
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   788
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33798
diff changeset
   789
    l = revrange(repo, [revspec], localalias=localalias)
22814
8110405cf8ae revset-limit: use boolean testing instead of `len(revs) < 1`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21799
diff changeset
   790
    if not l:
48030
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
   791
        raise error.InputError(_(b'empty revision set'))
22815
4f81470e83bf revsingle: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22814
diff changeset
   792
    return repo[l.last()]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   794
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   795
def _pairspec(revspec) -> bool:
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30639
diff changeset
   796
    tree = revsetlang.parse(revspec)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   797
    return tree and tree[0] in (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   798
        b'range',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   799
        b'rangepre',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   800
        b'rangepost',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   801
        b'rangeall',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   802
    )
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
   803
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   804
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   805
def revpair(repo, revs):
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   806
    if not revs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   807
        return repo[b'.'], repo[None]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   808
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   809
    l = revrange(repo, revs)
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   810
41370
a728ef2f9b15 revpair: clarify check for empty revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 41369
diff changeset
   811
    if not l:
48030
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
   812
        raise error.InputError(_(b'empty revision range'))
41370
a728ef2f9b15 revpair: clarify check for empty revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 41369
diff changeset
   813
41369
5079242abef9 revpair: simplify revpair by always relying on smartset.first/last
Martin von Zweigbergk <martinvonz@google.com>
parents: 41288
diff changeset
   814
    first = l.first()
5079242abef9 revpair: simplify revpair by always relying on smartset.first/last
Martin von Zweigbergk <martinvonz@google.com>
parents: 41288
diff changeset
   815
    second = l.last()
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
   816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   817
    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   818
        first == second
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   819
        and len(revs) >= 2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   820
        and not all(revrange(repo, [r]) for r in revs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   821
    ):
48030
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
   822
        raise error.InputError(_(b'empty revision on one side of range'))
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   823
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
   824
    # if top-level is range expression, the result must always be a pair
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
   825
    if first == second and len(revs) == 1 and not _pairspec(revs[0]):
37252
e9ee540af434 scmutil: make revpair() return context objects (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37251
diff changeset
   826
        return repo[first], repo[None]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   827
37252
e9ee540af434 scmutil: make revpair() return context objects (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37251
diff changeset
   828
    return repo[first], repo[second]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
   829
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   830
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33798
diff changeset
   831
def revrange(repo, specs, localalias=None):
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   832
    """Execute 1 to many revsets and return the union.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   833
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   834
    This is the preferred mechanism for executing revsets using user-specified
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   835
    config options, such as revset aliases.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   836
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   837
    The revsets specified by ``specs`` will be executed via a chained ``OR``
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   838
    expression. If ``specs`` is empty, an empty result is returned.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   839
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   840
    ``specs`` can contain integers, in which case they are assumed to be
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   841
    revision numbers.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   842
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   843
    It is assumed the revsets are already formatted. If you have arguments
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30639
diff changeset
   844
    that need to be expanded in the revset, call ``revsetlang.formatspec()``
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   845
    and pass the result as an element of ``specs``.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   846
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   847
    Specifying a single revset is allowed.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   848
44075
2122ffa903ea doc: fix references to `revset.abstractsmartset`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44063
diff changeset
   849
    Returns a ``smartset.abstractsmartset`` which is a list-like interface over
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   850
    integer revisions.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   851
    """
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
   852
    allspecs = []
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
   853
    for spec in specs:
25904
fbaa2de13cf6 revrange: drop old-style parser in favor of revset (API)
Yuya Nishihara <yuya@tcha.org>
parents: 25772
diff changeset
   854
        if isinstance(spec, int):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   855
            spec = revsetlang.formatspec(b'%d', spec)
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
   856
        allspecs.append(spec)
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33798
diff changeset
   857
    return repo.anyrevs(allspecs, user=True, localalias=localalias)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   858
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   859
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   860
def increasingwindows(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   861
    windowsize: int = 8, sizelimit: int = 512
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   862
) -> Iterable[int]:
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   863
    while True:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   864
        yield windowsize
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   865
        if windowsize < sizelimit:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   866
            windowsize *= 2
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   867
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   868
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   869
def walkchangerevs(repo, revs, makefilematcher, prepare):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   870
    """Iterate over files and the revs in a "windowed" way.
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   871
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   872
    Callers most commonly need to iterate backwards over the history
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   873
    in which they are interested. Doing so has awful (quadratic-looking)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   874
    performance, so we use iterators in a "windowed" way.
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   875
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   876
    We walk a window of revisions in the desired order.  Within the
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   877
    window, we first walk forwards to gather data, then in the desired
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   878
    order (usually backwards) to display it.
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   879
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   880
    This function returns an iterator yielding contexts. Before
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   881
    yielding each context, the iterator will first call the prepare
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   882
    function on each context in the window in forward order."""
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   883
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   884
    if not revs:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   885
        return []
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   886
    change = repo.__getitem__
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   887
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   888
    def iterate():
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   889
        it = iter(revs)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   890
        stopiteration = False
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   891
        for windowsize in increasingwindows():
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   892
            nrevs = []
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49248
diff changeset
   893
            for i in range(windowsize):
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   894
                rev = next(it, None)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   895
                if rev is None:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   896
                    stopiteration = True
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   897
                    break
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   898
                nrevs.append(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   899
            for rev in sorted(nrevs):
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   900
                ctx = change(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   901
                prepare(ctx, makefilematcher(ctx))
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   902
            for rev in nrevs:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   903
                yield change(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   904
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   905
            if stopiteration:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   906
                break
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   907
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   908
    return iterate()
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   909
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
   910
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   911
def meaningfulparents(repo, ctx):
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   912
    """Return list of meaningful (or all if debug) parentrevs for rev.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   913
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   914
    For merges (two non-nullrev revisions) both parents are meaningful.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   915
    Otherwise the first parent revision is considered meaningful if it
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   916
    is not the preceding revision.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   917
    """
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   918
    parents = ctx.parents()
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   919
    if len(parents) > 1:
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   920
        return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   921
    if repo.ui.debugflag:
39894
d739f423bf06 repo: look up nullrev context by revnum, not symbolic name
Martin von Zweigbergk <martinvonz@google.com>
parents: 39891
diff changeset
   922
        return [parents[0], repo[nullrev]]
32656
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32270
diff changeset
   923
    if parents[0].rev() >= intrev(ctx) - 1:
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   924
        return []
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   925
    return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
   926
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   927
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   928
def getuipathfn(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   929
    repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   930
    legacyrelativevalue: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   931
    forcerelativevalue: Optional[bool] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   932
) -> typelib.UiPathFn:
41575
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   933
    """Return a function that produced paths for presenting to the user.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   934
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   935
    The returned function takes a repo-relative path and produces a path
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   936
    that can be presented in the UI.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   937
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   938
    Depending on the value of ui.relative-paths, either a repo-relative or
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   939
    cwd-relative path will be produced.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   940
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   941
    legacyrelativevalue is the value to use if ui.relative-paths=legacy
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   942
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   943
    If forcerelativevalue is not None, then that value will be used regardless
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   944
    of what ui.relative-paths is set to.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   945
    """
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   946
    if forcerelativevalue is not None:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   947
        relative = forcerelativevalue
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   948
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   949
        config = repo.ui.config(b'ui', b'relative-paths')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   950
        if config == b'legacy':
41575
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   951
            relative = legacyrelativevalue
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   952
        else:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   953
            relative = stringutil.parsebool(config)
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   954
            if relative is None:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   955
                raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   956
                    _(b"ui.relative-paths is not a boolean ('%s')") % config
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   957
                )
41575
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41492
diff changeset
   958
41491
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41421
diff changeset
   959
    if relative:
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41421
diff changeset
   960
        cwd = repo.getcwd()
44858
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44810
diff changeset
   961
        if cwd != b'':
44884
d044b66d8429 scmutil: clarify getuipathfn comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44858
diff changeset
   962
            # this branch would work even if cwd == b'' (ie cwd = repo
d044b66d8429 scmutil: clarify getuipathfn comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44858
diff changeset
   963
            # root), but its generality makes the returned function slower
44858
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44810
diff changeset
   964
            pathto = repo.pathto
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44810
diff changeset
   965
            return lambda f: pathto(f, cwd)
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44810
diff changeset
   966
    if repo.ui.configbool(b'ui', b'slash'):
41684
a8d3a4be066e windows: use util.localpath for repo-relative paths in getuipathfn()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
   967
        return lambda f: f
41491
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41421
diff changeset
   968
    else:
41684
a8d3a4be066e windows: use util.localpath for repo-relative paths in getuipathfn()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
   969
        return util.localpath
41491
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41421
diff changeset
   970
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   971
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   972
def subdiruipathfn(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   973
    subpath: bytes, uipathfn: typelib.UiPathFn
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   974
) -> typelib.UiPathFn:
41650
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41649
diff changeset
   975
    '''Create a new uipathfn that treats the file as relative to subpath.'''
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41649
diff changeset
   976
    return lambda f: uipathfn(posixpath.join(subpath, f))
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41649
diff changeset
   977
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   978
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   979
def anypats(pats, opts) -> bool:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   980
    """Checks if any patterns, including --include and --exclude were given.
41652
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
   981
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
   982
    Some commands (e.g. addremove) use this condition for deciding whether to
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
   983
    print absolute or relative paths.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   984
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   985
    return bool(pats or opts.get(b'include') or opts.get(b'exclude'))
41652
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
   986
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
   987
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
   988
def expandpats(pats: Iterable[bytes]) -> List[bytes]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   989
    """Expand bare globs when running on windows.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
   990
    On posix we assume it already has already been done by sh."""
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   991
    if not util.expandglobs:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   992
        return list(pats)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   993
    ret = []
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
   994
    for kindpat in pats:
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
   995
        kind, pat = matchmod._patsplit(kindpat, None)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   996
        if kind is None:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   997
            try:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
   998
                globbed = glob.glob(pat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
   999
            except re.error:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
  1000
                globbed = [pat]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1001
            if globbed:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1002
                ret.extend(globbed)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1003
                continue
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
  1004
        ret.append(kindpat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1005
    return ret
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1006
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1007
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1008
def matchandpats(
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1009
    ctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1010
    pats=(),
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1011
    opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1012
    globbed: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1013
    default: bytes = b'relpath',
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1014
    badfn=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1015
):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1016
    """Return a matcher and the patterns that were used.
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1017
    The matcher will warn about bad matches, unless an alternate badfn callback
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1018
    is provided."""
26326
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
  1019
    if opts is None:
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
  1020
        opts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1021
    if not globbed and default == b'relpath':
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1022
        pats = expandpats(pats or [])
14670
19197fa4c41c scmutil: match now accepts a context or a repo
Matt Mackall <mpm@selenic.com>
parents: 14669
diff changeset
  1023
41665
0ed7a8ac5711 scmutil: respect ui.relative-paths in default match.badfn
Martin von Zweigbergk <martinvonz@google.com>
parents: 41662
diff changeset
  1024
    uipathfn = getuipathfn(ctx.repo(), legacyrelativevalue=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1025
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1026
    def bad(f, msg):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1027
        ctx.repo().ui.warn(b"%s: %s\n" % (uipathfn(f), msg))
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
  1028
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1029
    if badfn is None:
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1030
        badfn = bad
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1031
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1032
    m = ctx.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1033
        pats,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1034
        opts.get(b'include'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1035
        opts.get(b'exclude'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1036
        default,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1037
        listsubrepos=opts.get(b'subrepos'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1038
        badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1039
    )
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
  1040
24447
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
  1041
    if m.always():
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
  1042
        pats = []
16171
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
  1043
    return m, pats
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
  1044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1045
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1046
def match(
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1047
    ctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1048
    pats=(),
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1049
    opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1050
    globbed: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1051
    default: bytes = b'relpath',
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1052
    badfn=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1053
):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
  1054
    '''Return a matcher that will warn about bad matches.'''
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1055
    return matchandpats(ctx, pats, opts, globbed, default, badfn=badfn)[0]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1056
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1057
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1058
def matchall(repo):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
  1059
    '''Return a matcher that will efficiently match everything.'''
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41666
diff changeset
  1060
    return matchmod.always()
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1061
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1062
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1063
def matchfiles(repo, files, badfn=None) -> matchmod.exactmatcher:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
  1064
    '''Return a matcher that will efficiently match exactly these files.'''
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41666
diff changeset
  1065
    return matchmod.exact(files, badfn=badfn)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1066
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1067
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1068
def parsefollowlinespattern(repo, rev, pat: bytes, msg: bytes) -> bytes:
34854
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1069
    """Return a file name from `pat` pattern suitable for usage in followlines
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1070
    logic.
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1071
    """
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1072
    if not matchmod.patkind(pat):
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1073
        return pathutil.canonpath(repo.root, repo.getcwd(), pat)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1074
    else:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1075
        ctx = repo[rev]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1076
        m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=ctx)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1077
        files = [f for f in ctx if m(f)]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1078
        if len(files) != 1:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1079
            raise error.ParseError(msg)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1080
        return files[0]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
  1081
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1082
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  1083
def getorigvfs(ui: uimod.ui, repo):
40752
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1084
    """return a vfs suitable to save 'orig' file
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1085
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1086
    return None if no special directory is configured"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1087
    origbackuppath = ui.config(b'ui', b'origbackuppath')
40752
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1088
    if not origbackuppath:
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1089
        return None
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1090
    return vfs.vfs(repo.wvfs.join(origbackuppath))
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40658
diff changeset
  1091
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1092
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  1093
def backuppath(ui: uimod.ui, repo, filepath: bytes) -> bytes:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1094
    """customize where working copy backup files (.orig files) are created
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1095
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1096
    Fetch user defined path from config file: [ui] origbackuppath = <path>
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1097
    Fall back to default (filepath with .orig suffix) if not specified
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1098
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1099
    filepath is repo-relative
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1100
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1101
    Returns an absolute path
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1102
    """
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1103
    origvfs = getorigvfs(ui, repo)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1104
    if origvfs is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1105
        return repo.wjoin(filepath + b".orig")
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1106
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1107
    origbackupdir = origvfs.dirname(filepath)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1108
    if not origvfs.isdir(origbackupdir) or origvfs.islink(origbackupdir):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1109
        ui.note(_(b'creating directory: %s\n') % origvfs.join(origbackupdir))
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1110
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1111
        # Remove any files that conflict with the backup file's path
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43506
diff changeset
  1112
        for f in reversed(list(pathutil.finddirs(filepath))):
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1113
            if origvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1114
                ui.note(_(b'removing conflicting file: %s\n') % origvfs.join(f))
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1115
                origvfs.unlink(f)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1116
                break
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1117
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1118
        origvfs.makedirs(origbackupdir)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1119
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1120
    if origvfs.isdir(filepath) and not origvfs.islink(filepath):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1121
        ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1122
            _(b'removing conflicting directory: %s\n') % origvfs.join(filepath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1123
        )
41595
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1124
        origvfs.rmtree(filepath, forcibly=True)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1125
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1126
    return origvfs.join(filepath)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41575
diff changeset
  1127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1128
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  1129
class _containsnode:
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1130
    """proxy __contains__(node) to container.__contains__ which accepts revs"""
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1131
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1132
    def __init__(self, repo, revcontainer):
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1133
        self._torev = repo.changelog.rev
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1134
        self._revcontains = revcontainer.__contains__
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1135
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1136
    def __contains__(self, node) -> bool:
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1137
        return self._revcontains(self._torev(node))
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1138
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1139
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1140
def cleanupnodes(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1141
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1142
    replacements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1143
    operation,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1144
    moves=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1145
    metadata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1146
    fixphase=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1147
    targetphase=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1148
    backup=True,
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1149
) -> None:
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1150
    """do common cleanups when old nodes are replaced by new nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1151
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1152
    That includes writing obsmarkers or stripping nodes, and moving bookmarks.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1153
    (we might also want to move working directory parent in the future)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1154
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1155
    By default, bookmark moves are calculated automatically from 'replacements',
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1156
    but 'moves' can be used to override that. Also, 'moves' may include
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1157
    additional bookmark moves that should not have associated obsmarkers.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1158
34353
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 34352
diff changeset
  1159
    replacements is {oldnode: [newnode]} or a iterable of nodes if they do not
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 34352
diff changeset
  1160
    have replacements. operation is a string, like "rebase".
34793
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
  1161
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
  1162
    metadata is dictionary containing metadata to be stored in obsmarker if
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
  1163
    obsolescence is enabled.
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1164
    """
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1165
    assert fixphase or targetphase is None
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1166
    if not replacements and not moves:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1167
        return
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1168
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1169
    # translate mapping's other forms
50925
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50916
diff changeset
  1170
    if not hasattr(replacements, 'items'):
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1171
        replacements = {(n,): () for n in replacements}
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1172
    else:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1173
        # upgrading non tuple "source" to tuple ones for BC
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1174
        repls = {}
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1175
        for key, value in replacements.items():
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1176
            if not isinstance(key, tuple):
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1177
                key = (key,)
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1178
            repls[key] = value
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1179
        replacements = repls
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1180
40855
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1181
    # Unfiltered repo is needed since nodes in replacements might be hidden.
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1182
    unfi = repo.unfiltered()
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1183
34352
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33649
diff changeset
  1184
    # Calculate bookmark movements
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1185
    if moves is None:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1186
        moves = {}
40855
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1187
        for oldnodes, newnodes in replacements.items():
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1188
            for oldnode in oldnodes:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1189
                if oldnode in moves:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1190
                    continue
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1191
                if len(newnodes) > 1:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1192
                    # usually a split, take the one with biggest rev number
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1193
                    newnode = next(unfi.set(b'max(%ln)', newnodes)).node()
40855
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1194
                elif len(newnodes) == 0:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1195
                    # move bookmark backwards
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1196
                    allreplaced = []
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1197
                    for rep in replacements:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1198
                        allreplaced.extend(rep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1199
                    roots = list(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1200
                        unfi.set(b'max((::%n) - %ln)', oldnode, allreplaced)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1201
                    )
40855
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1202
                    if roots:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1203
                        newnode = roots[0].node()
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1204
                    else:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
  1205
                        newnode = repo.nullid
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1206
                else:
40855
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1207
                    newnode = newnodes[0]
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40752
diff changeset
  1208
                moves[oldnode] = newnode
34352
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33649
diff changeset
  1209
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1210
    allnewnodes = [n for ns in replacements.values() for n in ns]
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1211
    toretract = {}
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1212
    toadvance = {}
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1213
    if fixphase:
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1214
        precursors = {}
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1215
        for oldnodes, newnodes in replacements.items():
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1216
            for oldnode in oldnodes:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1217
                for newnode in newnodes:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1218
                    precursors.setdefault(newnode, []).append(oldnode)
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1219
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1220
        allnewnodes.sort(key=lambda n: unfi[n].rev())
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1221
        newphases = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1222
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1223
        def phase(ctx):
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1224
            return newphases.get(ctx.node(), ctx.phase())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1225
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1226
        for newnode in allnewnodes:
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1227
            ctx = unfi[newnode]
38432
05b7dd11918e cleanupnodes: preserve phase of parents of new nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 38423
diff changeset
  1228
            parentphase = max(phase(p) for p in ctx.parents())
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1229
            if targetphase is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1230
                oldphase = max(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1231
                    unfi[oldnode].phase() for oldnode in precursors[newnode]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1232
                )
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1233
                newphase = max(oldphase, parentphase)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1234
            else:
38432
05b7dd11918e cleanupnodes: preserve phase of parents of new nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 38423
diff changeset
  1235
                newphase = max(targetphase, parentphase)
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1236
            newphases[newnode] = newphase
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1237
            if newphase > ctx.phase():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1238
                toretract.setdefault(newphase, []).append(newnode)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1239
            elif newphase < ctx.phase():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1240
                toadvance.setdefault(newphase, []).append(newnode)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1241
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1242
    with repo.transaction(b'cleanup') as tr:
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1243
        # Move bookmarks
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1244
        bmarks = repo._bookmarks
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1245
        bmarkchanges = []
34352
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33649
diff changeset
  1246
        for oldnode, newnode in moves.items():
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1247
            oldbmarks = repo.nodebookmarks(oldnode)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1248
            if not oldbmarks:
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1249
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1250
            from . import bookmarks  # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1251
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1252
            repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1253
                b'moving bookmarks %r from %s to %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1254
                % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1255
                    pycompat.rapply(pycompat.maybebytestr, oldbmarks),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1256
                    hex(oldnode),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1257
                    hex(newnode),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1258
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1259
            )
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1260
            # Delete divergent bookmarks being parents of related newnodes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1261
            deleterevs = repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1262
                b'parents(roots(%ln & (::%n))) - parents(%n)',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1263
                allnewnodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1264
                newnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1265
                oldnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1266
            )
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
  1267
            deletenodes = _containsnode(repo, deleterevs)
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1268
            for name in oldbmarks:
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1269
                bmarkchanges.append((name, newnode))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1270
                for b in bookmarks.divergent2delete(repo, deletenodes, name):
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1271
                    bmarkchanges.append((b, None))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1272
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1273
        if bmarkchanges:
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
  1274
            bmarks.applychanges(repo, tr, bmarkchanges)
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1275
38423
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1276
        for phase, nodes in toretract.items():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1277
            phases.retractboundary(repo, tr, phase, nodes)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1278
        for phase, nodes in toadvance.items():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1279
            phases.advanceboundary(repo, tr, phase, nodes)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38419
diff changeset
  1280
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1281
        mayusearchived = repo.ui.config(b'experimental', b'cleanup-as-archived')
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1282
        # Obsolete or strip nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1283
        if obsolete.isenabled(repo, obsolete.createmarkersopt):
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1284
            # If a node is already obsoleted, and we want to obsolete it
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1285
            # without a successor, skip that obssolete request since it's
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1286
            # unnecessary. That's the "if s or not isobs(n)" check below.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1287
            # Also sort the node in topology order, that might be useful for
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1288
            # some obsstore logic.
40041
ca9d0c93acea cleanupnodes: update comment to drop mention of filtering
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1289
            # NOTE: the sorting might belong to createmarkers.
33330
ba43e5ee9c6d scmutil: make cleanupnodes handle filtered node
Jun Wu <quark@fb.com>
parents: 33252
diff changeset
  1290
            torev = unfi.changelog.rev
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1291
            sortfunc = lambda ns: torev(ns[0][0])
39890
1c3f1491965f scmutil: expand long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39836
diff changeset
  1292
            rels = []
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1293
            for ns, s in sorted(replacements.items(), key=sortfunc):
39923
61f39a892168 cleanupnodes: pass multiple predecessors to `createmarkers` directly
Boris Feld <boris.feld@octobus.net>
parents: 39916
diff changeset
  1294
                rel = (tuple(unfi[n] for n in ns), tuple(unfi[m] for m in s))
61f39a892168 cleanupnodes: pass multiple predecessors to `createmarkers` directly
Boris Feld <boris.feld@octobus.net>
parents: 39916
diff changeset
  1295
                rels.append(rel)
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1296
            if rels:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1297
                obsolete.createmarkers(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1298
                    repo, rels, operation=operation, metadata=metadata
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1299
                )
49450
b57c95a0f5f9 phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49306
diff changeset
  1300
        elif phases.supportarchived(repo) and mayusearchived:
41799
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1301
            # this assume we do not have "unstable" nodes above the cleaned ones
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1302
            allreplaced = set()
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1303
            for ns in replacements.keys():
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1304
                allreplaced.update(ns)
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1305
            if backup:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1306
                from . import repair  # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1307
41799
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1308
                node = min(allreplaced, key=repo.changelog.rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1309
                repair.backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1310
                    repo, allreplaced, allreplaced, node, operation
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1311
                )
41799
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41781
diff changeset
  1312
            phases.retractboundary(repo, tr, phases.archived, allreplaced)
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1313
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1314
            from . import repair  # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1315
39891
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39890
diff changeset
  1316
            tostrip = list(n for ns in replacements for n in ns)
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 34353
diff changeset
  1317
            if tostrip:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1318
                repair.delayedstrip(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1319
                    repo.ui, repo, tostrip, operation, backup=backup
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1320
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1321
33088
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32659
diff changeset
  1322
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1323
def addremove(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1324
    repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1325
    matcher,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1326
    prefix: bytes,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1327
    uipathfn: typelib.UiPathFn,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1328
    opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1329
    open_tr=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1330
) -> int:
26329
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
  1331
    if opts is None:
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
  1332
        opts = {}
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
  1333
    m = matcher
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1334
    dry_run = opts.get(b'dry_run')
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37271
diff changeset
  1335
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1336
        similarity = float(opts.get(b'similarity') or 0)
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37271
diff changeset
  1337
    except ValueError:
48031
5b89626c11e9 errors: use InputError for bad --similarity value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48030
diff changeset
  1338
        raise error.InputError(_(b'similarity must be a number'))
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37271
diff changeset
  1339
    if similarity < 0 or similarity > 100:
48031
5b89626c11e9 errors: use InputError for bad --similarity value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48030
diff changeset
  1340
        raise error.InputError(_(b'similarity must be between 0 and 100'))
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37271
diff changeset
  1341
    similarity /= 100.0
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
  1342
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1343
    ret = 0
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1344
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1345
    wctx = repo[None]
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1346
    for subpath in sorted(wctx.substate):
29802
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29771
diff changeset
  1347
        submatch = matchmod.subdirmatcher(subpath, m)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1348
        if opts.get(b'subrepos') or m.exact(subpath) or any(submatch.files()):
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1349
            sub = wctx.sub(subpath)
41629
5ee3c49fc9cd subrepo: adjust subrepo prefix before calling subrepo.addremove() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41604
diff changeset
  1350
            subprefix = repo.wvfs.reljoin(prefix, subpath)
41652
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
  1351
            subuipathfn = subdiruipathfn(subpath, uipathfn)
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1352
            try:
41652
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41650
diff changeset
  1353
                if sub.addremove(submatch, subprefix, subuipathfn, opts):
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1354
                    ret = 1
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1355
            except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1356
                repo.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1357
                    _(b"skipping missing subrepository: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1358
                    % uipathfn(subpath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1359
                )
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1360
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1361
    rejected = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1362
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1363
    def badfn(f: bytes, msg: bytes) -> None:
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
  1364
        if f in m.files():
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
  1365
            m.bad(f, msg)
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
  1366
        rejected.append(f)
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1367
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
  1368
    badmatch = matchmod.badmatch(m, badfn)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1369
    added, unknown, deleted, removed, forgotten = _interestingfiles(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1370
        repo, badmatch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1371
    )
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1372
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1373
    unknownset = set(unknown + forgotten)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1374
    toprint = unknownset.copy()
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1375
    toprint.update(deleted)
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1376
    for abs in sorted(toprint):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1377
        if repo.ui.verbose or not m.exact(abs):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1378
            if abs in unknownset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1379
                status = _(b'adding %s\n') % uipathfn(abs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1380
                label = b'ui.addremove.added'
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1381
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1382
                status = _(b'removing %s\n') % uipathfn(abs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1383
                label = b'ui.addremove.removed'
39088
ad88726d6982 addremove: add labels for messages about added and removed files
Boris Feld <boris.feld@octobus.net>
parents: 38856
diff changeset
  1384
            repo.ui.status(status, label=label)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
  1385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1386
    renames = _findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1387
        repo, m, added + unknown, removed + deleted, similarity, uipathfn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1388
    )
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1389
50029
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49972
diff changeset
  1390
    if not dry_run and (unknown or forgotten or deleted or renames):
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49972
diff changeset
  1391
        if open_tr is not None:
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49972
diff changeset
  1392
            open_tr()
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1393
        _markchanges(repo, unknown + forgotten, deleted, renames)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1394
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1395
    for f in rejected:
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1396
        if f in m.files():
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1397
            return 1
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
  1398
    return ret
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
  1399
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1400
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1401
def marktouched(repo, files, similarity: float = 0.0) -> int:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1402
    """Assert that files have somehow been operated upon. files are relative to
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1403
    the repo root."""
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
  1404
    m = matchfiles(repo, files, badfn=lambda x, y: rejected.append(x))
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1405
    rejected = []
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1406
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1407
    added, unknown, deleted, removed, forgotten = _interestingfiles(repo, m)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1408
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1409
    if repo.ui.verbose:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1410
        unknownset = set(unknown + forgotten)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1411
        toprint = unknownset.copy()
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1412
        toprint.update(deleted)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1413
        for abs in sorted(toprint):
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1414
            if abs in unknownset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1415
                status = _(b'adding %s\n') % abs
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1416
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1417
                status = _(b'removing %s\n') % abs
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1418
            repo.ui.status(status)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1419
41662
0a5a6675c86c addremove: use uipathfn instead of m.rel() for recorded similatity message
Martin von Zweigbergk <martinvonz@google.com>
parents: 41652
diff changeset
  1420
    # TODO: We should probably have the caller pass in uipathfn and apply it to
41697
e21183db2259 scmutil: fix a comment that doesn't match the code
Martin von Zweigbergk <martinvonz@google.com>
parents: 41685
diff changeset
  1421
    # the messages above too. legacyrelativevalue=True is consistent with how
41662
0a5a6675c86c addremove: use uipathfn instead of m.rel() for recorded similatity message
Martin von Zweigbergk <martinvonz@google.com>
parents: 41652
diff changeset
  1422
    # it used to work.
41685
b81ecf3571d5 addremove: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41684
diff changeset
  1423
    uipathfn = getuipathfn(repo, legacyrelativevalue=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1424
    renames = _findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1425
        repo, m, added + unknown, removed + deleted, similarity, uipathfn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1426
    )
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1427
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1428
    _markchanges(repo, unknown + forgotten, deleted, renames)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1429
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1430
    for f in rejected:
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1431
        if f in m.files():
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1432
            return 1
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1433
    return 0
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
  1434
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1435
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1436
def _interestingfiles(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1437
    repo, matcher
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1438
) -> Tuple[List[bytes], List[bytes], List[bytes], List[bytes], List[bytes]]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1439
    """Walk dirstate with matcher, looking for files that addremove would care
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1440
    about.
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1441
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1442
    This is different from dirstate.status because it doesn't care about
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1443
    whether files are modified or clean."""
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1444
    added, unknown, deleted, removed, forgotten = [], [], [], [], []
33649
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33542
diff changeset
  1445
    audit_path = pathutil.pathauditor(repo.root, cached=True)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1446
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1447
    ctx = repo[None]
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1448
    dirstate = repo.dirstate
40087
1d09ba0d2ed3 narrow: move remaining narrow-limited dirstate walks to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 40041
diff changeset
  1449
    matcher = repo.narrowmatch(matcher, includeexact=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1450
    walkresults = dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1451
        matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1452
        subrepos=sorted(ctx.substate),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1453
        unknown=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1454
        ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1455
        full=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1456
    )
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1457
    for abs, st in walkresults.items():
48098
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1458
        entry = dirstate.get_entry(abs)
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1459
        if (not entry.any_tracked) and audit_path.check(abs):
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1460
            unknown.append(abs)
48098
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1461
        elif (not entry.removed) and not st:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1462
            deleted.append(abs)
48098
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1463
        elif entry.removed and st:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1464
            forgotten.append(abs)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1465
        # for finding renames
48098
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1466
        elif entry.removed and not st:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1467
            removed.append(abs)
48098
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48041
diff changeset
  1468
        elif entry.added:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1469
            added.append(abs)
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1470
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
  1471
    return added, unknown, deleted, removed, forgotten
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
  1472
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1473
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1474
def _findrenames(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1475
    repo, matcher, added, removed, similarity, uipathfn: typelib.UiPathFn
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1476
) -> Dict[bytes, bytes]:
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1477
    '''Find renames from removed files to added ones.'''
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1478
    renames = {}
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1479
    if similarity > 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1480
        for old, new, score in similar.findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1481
            repo, added, removed, similarity
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1482
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1483
            if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1484
                repo.ui.verbose
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1485
                or not matcher.exact(old)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1486
                or not matcher.exact(new)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1487
            ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1488
                repo.ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1489
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1490
                        b'recording removal of %s as rename to %s '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1491
                        b'(%d%% similar)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1492
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1493
                    % (uipathfn(old), uipathfn(new), score * 100)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1494
                )
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1495
            renames[new] = old
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1496
    return renames
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
  1497
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1498
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1499
def _markchanges(repo, unknown, deleted, renames) -> None:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1500
    """Marks the files in unknown as added, the files in deleted as removed,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1501
    and the files in renames as copied."""
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
  1502
    wctx = repo[None]
27851
4133a306606c with: use context manager in _markchanges
Bryan O'Sullivan <bryano@fb.com>
parents: 27706
diff changeset
  1503
    with repo.wlock():
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
  1504
        wctx.forget(deleted)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
  1505
        wctx.add(unknown)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1506
        for new, old in renames.items():
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
  1507
            wctx.copy(old, new)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
  1508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1509
41781
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1510
def getrenamedfn(repo, endrev=None):
42115
27475ae67676 copies: extract function for deciding whether to use changeset-centric algos
Martin von Zweigbergk <martinvonz@google.com>
parents: 42114
diff changeset
  1511
    if copiesmod.usechangesetcentricalgo(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1512
42114
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1513
        def getrenamed(fn, rev):
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1514
            ctx = repo[rev]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1515
            p1copies = ctx.p1copies()
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1516
            if fn in p1copies:
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1517
                return p1copies[fn]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1518
            p2copies = ctx.p2copies()
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1519
            if fn in p2copies:
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1520
                return p2copies[fn]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1521
            return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1522
42114
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1523
        return getrenamed
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41938
diff changeset
  1524
41781
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1525
    rcache = {}
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1526
    if endrev is None:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1527
        endrev = len(repo)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1528
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1529
    def getrenamed(fn, rev):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1530
        """looks up all renames for a file (up to endrev) the first
41781
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1531
        time the file is given. It indexes on the changerev and only
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1532
        parses the manifest if linkrev != changerev.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1533
        Returns rename info for fn at changerev rev."""
41781
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1534
        if fn not in rcache:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1535
            rcache[fn] = {}
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1536
            fl = repo.file(fn)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1537
            for i in fl:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1538
                lr = fl.linkrev(i)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1539
                renamed = fl.renamed(fl.node(i))
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1540
                rcache[fn][lr] = renamed and renamed[0]
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1541
                if lr >= endrev:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1542
                    break
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1543
        if rev in rcache[fn]:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1544
            return rcache[fn][rev]
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1545
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1546
        # If linkrev != rev (i.e. rev not found in rcache) fallback to
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1547
        # filectx logic.
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1548
        try:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1549
            return repo[rev][fn].copysource()
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1550
        except error.LookupError:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1551
            return None
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1552
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1553
    return getrenamed
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41697
diff changeset
  1554
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1555
42503
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1556
def getcopiesfn(repo, endrev=None):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1557
    if copiesmod.usechangesetcentricalgo(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1558
42503
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1559
        def copiesfn(ctx):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1560
            if ctx.p2copies():
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1561
                allcopies = ctx.p1copies().copy()
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1562
                # There should be no overlap
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1563
                allcopies.update(ctx.p2copies())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1564
                return sorted(allcopies.items())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1565
            else:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1566
                return sorted(ctx.p1copies().items())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1567
42503
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1568
    else:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1569
        getrenamed = getrenamedfn(repo, endrev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1570
42503
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1571
        def copiesfn(ctx):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1572
            copies = []
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1573
            for fn in ctx.files():
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1574
                rename = getrenamed(fn, ctx.rev())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1575
                if rename:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1576
                    copies.append((fn, rename))
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1577
            return copies
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1578
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1579
    return copiesfn
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
  1580
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1581
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1582
def dirstatecopy(
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  1583
    ui: uimod.ui,
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1584
    repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1585
    wctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1586
    src,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1587
    dst,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1588
    dryrun: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1589
    cwd: Optional[bytes] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1590
) -> None:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1591
    """Update the dirstate to reflect the intent of copying src to dst. For
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1592
    different reasons it might not end with dst being marked as copied from src.
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1593
    """
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1594
    origsrc = repo.dirstate.copied(src) or src
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1595
    if dst == origsrc:  # copying back a copy?
48103
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
  1596
        entry = repo.dirstate.get_entry(dst)
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
  1597
        if (entry.added or not entry.tracked) and not dryrun:
47729
b66ae4468c9a copy: use `set_tracked` instead of `normallookup` in `dirstatecopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
  1598
            repo.dirstate.set_tracked(dst)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1599
    else:
48103
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
  1600
        if repo.dirstate.get_entry(origsrc).added and origsrc == src:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1601
            if not ui.quiet:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1602
                ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1603
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1604
                        b"%s has not been committed yet, so no copy "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1605
                        b"data will be stored for %s.\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1606
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1607
                    % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1608
                )
48103
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
  1609
            if not repo.dirstate.get_entry(dst).tracked and not dryrun:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1610
                wctx.add([dst])
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1611
        elif not dryrun:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
  1612
            wctx.copy(origsrc, dst)
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
  1613
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1614
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1615
def movedirstate(repo, newctx, match=None) -> None:
41938
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1616
    """Move the dirstate to newctx and adjust it as necessary.
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1617
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1618
    A matcher can be provided as an optimization. It is probably a bug to pass
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1619
    a matcher that doesn't match all the differences between the parent of the
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1620
    working copy and newctx.
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41937
diff changeset
  1621
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1622
    oldctx = repo[b'.']
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1623
    ds = repo.dirstate
44038
0750cbffdb3b movedirstate: get copies from dirstate before setting parents
Martin von Zweigbergk <martinvonz@google.com>
parents: 44013
diff changeset
  1624
    copies = dict(ds.copies())
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
  1625
    ds.setparents(newctx.node(), repo.nullid)
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1626
    s = newctx.status(oldctx, match=match)
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47295
diff changeset
  1627
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1628
    for f in s.modified:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
  1629
        ds.update_file_p1(f, p1_tracked=True)
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1630
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1631
    for f in s.added:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
  1632
        ds.update_file_p1(f, p1_tracked=False)
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1633
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1634
    for f in s.removed:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
  1635
        ds.update_file_p1(f, p1_tracked=True)
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1636
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1637
    # Merge old parent and old working dir copies
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1638
    oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1639
    oldcopies.update(copies)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1640
    copies = {dst: oldcopies.get(src, src) for dst, src in oldcopies.items()}
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1641
    # Adjust the dirstate copies
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1642
    for dst, src in copies.items():
48105
207df24a31f6 dirstate-item: use `added` instead of `state` when moving dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48103
diff changeset
  1643
        if src not in newctx or dst in newctx or not ds.get_entry(dst).added:
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1644
            src = None
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1645
        ds.copy(src, dst)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1646
    repo._quick_access_changeid_invalidate()
41937
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41799
diff changeset
  1647
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1648
45482
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1649
def filterrequirements(requirements):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  1650
    """filters the requirements into two sets:
45482
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1651
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1652
    wcreq: requirements which should be written in .hg/requires
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1653
    storereq: which should be written in .hg/store/requires
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1654
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1655
    Returns (wcreq, storereq)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1656
    """
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45482
diff changeset
  1657
    if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
45482
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1658
        wc, store = set(), set()
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1659
        for r in requirements:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1660
            if r in requirementsmod.WORKING_DIR_REQUIREMENTS:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1661
                wc.add(r)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1662
            else:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1663
                store.add(r)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1664
        return wc, store
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1665
    return requirements, None
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1666
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1667
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1668
def istreemanifest(repo) -> bool:
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46976
diff changeset
  1669
    """returns whether the repository is using treemanifest or not"""
45552
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
  1670
    return requirementsmod.TREEMANIFEST_REQUIREMENT in repo.requirements
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
  1671
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
  1672
51802
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1673
def writereporequirements(repo, requirements=None, maywritestore=True) -> None:
46242
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1674
    """writes requirements for the repo
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1675
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1676
    Requirements are written to .hg/requires and .hg/store/requires based
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1677
    on whether share-safe mode is enabled and which requirements are wdir
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1678
    requirements and which are store requirements
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46116
diff changeset
  1679
    """
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45072
diff changeset
  1680
    if requirements:
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45072
diff changeset
  1681
        repo.requirements = requirements
45482
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1682
    wcreq, storereq = filterrequirements(repo.requirements)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1683
    if wcreq is not None:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1684
        writerequires(repo.vfs, wcreq)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
  1685
    if storereq is not None:
51802
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1686
        writerequires(repo.svfs, storereq, maywrite=maywritestore)
45919
aba4f2c97e74 scmutil: try-delete `.hg/store/requires` if store requirements are empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45915
diff changeset
  1687
    elif repo.ui.configbool(b'format', b'usestore'):
aba4f2c97e74 scmutil: try-delete `.hg/store/requires` if store requirements are empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45915
diff changeset
  1688
        # only remove store requires if we are using store
51802
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1689
        if maywritestore:
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1690
            repo.svfs.tryunlink(b'requires')
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45072
diff changeset
  1691
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45072
diff changeset
  1692
51798
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1693
def readrequires(vfs, allowmissing):
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1694
    """reads the require file present at root of this vfs
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1695
    and return a set of requirements
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1696
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1697
    If allowmissing is True, we suppress FileNotFoundError if raised"""
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1698
    # requires file contains a newline-delimited list of
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1699
    # features/capabilities the opener (us) must have in order to use
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1700
    # the repository. This file was introduced in Mercurial 0.9.2,
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1701
    # which means very old repositories may not have one. We assume
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1702
    # a missing file translates to no requirements.
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1703
    read = vfs.tryread if allowmissing else vfs.read
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1704
    return set(read(b'requires').splitlines())
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1705
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51728
diff changeset
  1706
51802
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1707
def writerequires(opener, requirements, maywrite=True) -> None:
51800
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51798
diff changeset
  1708
    on_disk = readrequires(opener, True)
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51798
diff changeset
  1709
    if not (on_disk == set(requirements)):
51802
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1710
        if not maywrite:
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51800
diff changeset
  1711
            raise error.Abort(_(b"store requirements are not as expected"))
51800
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51798
diff changeset
  1712
        with opener(b'requires', b'w', atomictemp=True) as fp:
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51798
diff changeset
  1713
            for r in sorted(requirements):
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51798
diff changeset
  1714
                fp.write(b"%s\n" % r)
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24755
diff changeset
  1715
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1716
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  1717
class filecachesubentry:
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1718
    _cacheable: Optional[bool] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1719
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1720
    def __init__(self, path, stat: bool):
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1721
        self.path = path
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1722
        self.cachestat = None
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1723
        self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1724
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1725
        if stat:
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
  1726
            self.cachestat = filecachesubentry.stat(self.path)
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1727
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1728
            if self.cachestat:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1729
                self._cacheable = self.cachestat.cacheable()
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1730
            else:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1731
                # None means we don't know yet
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
  1732
                self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1733
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1734
    def refresh(self) -> None:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1735
        if self.cacheable():
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
  1736
            self.cachestat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1737
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1738
    def cacheable(self) -> bool:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1739
        if self._cacheable is not None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1740
            return self._cacheable
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1741
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1742
        # we don't know yet, assume it is for now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1743
        return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1744
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1745
    def changed(self) -> bool:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1746
        # no point in going further if we can't cache it
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1747
        if not self.cacheable():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1748
            return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1749
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
  1750
        newstat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1751
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1752
        # we may not know if it's cacheable yet, check again now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1753
        if newstat and self._cacheable is None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1754
            self._cacheable = newstat.cacheable()
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1755
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1756
            # check again
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1757
            if not self._cacheable:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1758
                return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1759
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1760
        if self.cachestat != newstat:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1761
            self.cachestat = newstat
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1762
            return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1763
        else:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1764
            return False
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1765
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1766
    @staticmethod
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1767
    def stat(path: bytes) -> Optional[typelib.CacheStat]:
52098
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51859
diff changeset
  1768
        # TODO have a cleaner approach on httpstaticrepo side
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51859
diff changeset
  1769
        if path.startswith(b'https://') or path.startswith(b'http://'):
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51859
diff changeset
  1770
            return util.uncacheable_cachestat()
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1771
        try:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1772
            return util.cachestat(path)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
  1773
        except FileNotFoundError:
52098
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51859
diff changeset
  1774
            return None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1775
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1776
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  1777
class filecacheentry:
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1778
    def __init__(self, paths, stat: bool = True) -> None:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1779
        self._entries = []
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1780
        for path in paths:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1781
            self._entries.append(filecachesubentry(path, stat))
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1782
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1783
    def changed(self) -> bool:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1784
        '''true if any entry has changed'''
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1785
        for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1786
            if entry.changed():
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1787
                return True
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1788
        return False
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1789
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1790
    def refresh(self) -> None:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1791
        for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1792
            entry.refresh()
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
  1793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1794
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  1795
class filecache:
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1796
    """A property like decorator that tracks files under .hg/ for updates.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1797
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1798
    On first access, the files defined as arguments are stat()ed and the
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1799
    results cached. The decorated function is called. The results are stashed
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1800
    away in a ``_filecache`` dict on the object whose method is decorated.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1801
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1802
    On subsequent access, the cached result is used as it is set to the
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1803
    instance dictionary.
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1804
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1805
    On external property set/delete operations, the caller must update the
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1806
    corresponding _filecache entry appropriately. Use __class__.<attr>.set()
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1807
    instead of directly setting <attr>.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1808
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1809
    When using the property API, the cached data is always used if available.
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1810
    No stat() is performed to check if the file has changed.
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
  1811
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1812
    Others can muck about with the state of the ``_filecache`` dict. e.g. they
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1813
    can populate an entry before the property's getter is called. In this case,
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1814
    entries in ``_filecache`` will be used during property operations,
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1815
    if available. If the underlying file changes, it is up to external callers
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1816
    to reflect this by e.g. calling ``delattr(obj, attr)`` to remove the cached
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1817
    method result as well as possibly calling ``del obj._filecache[attr]`` to
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1818
    remove the ``filecacheentry``.
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1819
    """
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
  1820
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1821
    paths: Tuple[bytes, ...]
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1822
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1823
    def __init__(self, *paths: bytes) -> None:
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
  1824
        self.paths = paths
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1825
48041
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48031
diff changeset
  1826
    def tracked_paths(self, obj):
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48031
diff changeset
  1827
        return [self.join(obj, path) for path in self.paths]
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48031
diff changeset
  1828
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1829
    def join(self, obj, fname: bytes):
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
  1830
        """Used to compute the runtime path of a cached file.
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1831
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1832
        Users should subclass filecache and provide their own version of this
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1833
        function to call the appropriate join function on 'obj' (an instance
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1834
        of the class that its member function was decorated).
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
  1835
        """
31285
1937671105bc filecache: make 'join' abstract
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31217
diff changeset
  1836
        raise NotImplementedError
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1837
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1838
    def __call__(self, func):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1839
        self.func = func
37869
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37868
diff changeset
  1840
        self.sname = func.__name__
50916
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50615
diff changeset
  1841
        # XXX We should be using a unicode string instead of bytes for the main
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50615
diff changeset
  1842
        # name (and the _filecache key). The fact we use bytes is a remains
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50615
diff changeset
  1843
        # from Python2, since the name is derived from an attribute name a
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50615
diff changeset
  1844
        # `str` is a better fit now that we support Python3 only
37869
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37868
diff changeset
  1845
        self.name = pycompat.sysbytes(self.sname)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1846
        return self
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1847
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1848
    def __get__(self, obj, type=None):
29373
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
  1849
        # if accessed on the class, return the descriptor itself.
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
  1850
        if obj is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
  1851
            return self
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1852
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1853
        assert self.sname not in obj.__dict__
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
  1854
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1855
        entry = obj._filecache.get(self.name)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1856
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1857
        if entry:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1858
            if entry.changed():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1859
                entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1860
        else:
48041
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48031
diff changeset
  1861
            paths = self.tracked_paths(obj)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1862
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1863
            # We stat -before- creating the object so our cache doesn't lie if
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1864
            # a writer modified between the time we read and stat
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
  1865
            entry = filecacheentry(paths, True)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1866
            entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1867
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1868
            obj._filecache[self.name] = entry
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1869
37869
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37868
diff changeset
  1870
        obj.__dict__[self.sname] = entry.obj
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
  1871
        return entry.obj
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
  1872
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1873
    # don't implement __set__(), which would make __dict__ lookup as slow as
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1874
    # function call.
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1875
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
  1876
    def set(self, obj, value):
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1877
        if self.name not in obj._filecache:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1878
            # we add an entry for the missing value because X in __dict__
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1879
            # implies X in _filecache
48041
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48031
diff changeset
  1880
            paths = self.tracked_paths(obj)
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
  1881
            ce = filecacheentry(paths, False)
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1882
            obj._filecache[self.name] = ce
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1883
        else:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1884
            ce = obj._filecache[self.name]
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
  1885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1886
        ce.obj = value  # update cached copy
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1887
        obj.__dict__[self.sname] = value  # update copy returned by obj.x
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1888
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
  1889
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1890
def extdatasource(repo, source: bytes):
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1891
    """Gather a map of rev -> value dict from the specified source
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1892
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1893
    A source spec is treated as a URL, with a special case shell: type
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1894
    for parsing the output from a shell command.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1895
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1896
    The data is parsed as a series of newline-separated records where
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1897
    each record is a revision specifier optionally followed by a space
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1898
    and a freeform string value. If the revision is known locally, it
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1899
    is converted to a rev, otherwise the record is skipped.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1900
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1901
    Note that both key and value are treated as UTF-8 and converted to
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1902
    the local encoding. This allows uniformity between local and
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1903
    remote data sources.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1904
    """
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1905
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1906
    spec = repo.ui.config(b"extdata", source)
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1907
    if not spec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1908
        raise error.Abort(_(b"unknown extdata source '%s'") % source)
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1909
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1910
    data = {}
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1911
    src = proc = None
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1912
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1913
        if spec.startswith(b"shell:"):
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1914
            # external commands should be run relative to the repo root
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1915
            cmd = spec[6:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1916
            proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1917
                procutil.tonativestr(cmd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1918
                shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1919
                bufsize=-1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1920
                close_fds=procutil.closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1921
                stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1922
                cwd=procutil.tonativestr(repo.root),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1923
            )
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1924
            src = proc.stdout
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1925
        else:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1926
            # treat as a URL or file
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1927
            src = url.open(repo.ui, spec)
34460
910adadf08e8 extdata: just use iterator to read lines one by one
Yuya Nishihara <yuya@tcha.org>
parents: 34459
diff changeset
  1928
        for l in src:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1929
            if b" " in l:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1930
                k, v = l.strip().split(b" ", 1)
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1931
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1932
                k, v = l.strip(), b""
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1933
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1934
            k = encoding.tolocal(k)
34459
d5c5cc767b7e extdata: ignore ambiguous identifier as well
Yuya Nishihara <yuya@tcha.org>
parents: 34456
diff changeset
  1935
            try:
37360
d0d55980ffa7 extdatasource: use revsymbol() for converting to node
Martin von Zweigbergk <martinvonz@google.com>
parents: 37350
diff changeset
  1936
                data[revsingle(repo, k).rev()] = encoding.tolocal(v)
46115
be3d8178251e errors: raise InputError if an ambiguous revision id prefix is used
Martin von Zweigbergk <martinvonz@google.com>
parents: 46096
diff changeset
  1937
            except (error.LookupError, error.RepoLookupError, error.InputError):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1938
                pass  # we ignore data for nodes that don't exist locally
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1939
    finally:
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1940
        if proc:
42576
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1941
            try:
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1942
                proc.communicate()
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1943
            except ValueError:
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1944
                # This happens if we started iterating src and then
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1945
                # get a parse error on a line. It should be safe to ignore.
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42503
diff changeset
  1946
                pass
34461
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1947
        if src:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
  1948
            src.close()
35412
b1959391a088 extdata: abort if external command exits with non-zero status (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 35308
diff changeset
  1949
    if proc and proc.returncode != 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1950
        raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1951
            _(b"extdata command '%s' failed: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1952
            % (cmd, procutil.explainexit(proc.returncode))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1953
        )
34456
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1954
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1955
    return data
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34367
diff changeset
  1956
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  1957
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  1958
class progress:
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  1959
    ui: uimod.ui
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1960
    pos: Optional[int]  # None once complete
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1961
    topic: bytes
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1962
    unit: bytes
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1963
    total: Optional[int]
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1964
    debug: bool
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1965
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1966
    def __init__(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1967
        self,
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  1968
        ui: uimod.ui,
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1969
        updatebar,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1970
        topic: bytes,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1971
        unit: bytes = b"",
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1972
        total: Optional[int] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1973
    ) -> None:
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1974
        self.ui = ui
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1975
        self.pos = 0
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1976
        self.topic = topic
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1977
        self.unit = unit
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1978
        self.total = total
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1979
        self.debug = ui.configbool(b'progress', b'debug')
41145
963462786f6e progress: check what type of progress bar to use only once per topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 41144
diff changeset
  1980
        self._updatebar = updatebar
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1981
38374
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38373
diff changeset
  1982
    def __enter__(self):
38503
077301ac69dc scmutil: fix __enter__ in progress context manager
Danny Hooper <hooper@google.com>
parents: 38456
diff changeset
  1983
        return self
38374
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38373
diff changeset
  1984
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38373
diff changeset
  1985
    def __exit__(self, exc_type, exc_value, exc_tb):
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38373
diff changeset
  1986
        self.complete()
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38373
diff changeset
  1987
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1988
    def update(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1989
        self, pos: int, item: bytes = b"", total: Optional[int] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1990
    ) -> None:
38419
6dea017eb6ba progress: enforce use of complete() on the helper class
Martin von Zweigbergk <martinvonz@google.com>
parents: 38374
diff changeset
  1991
        assert pos is not None
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1992
        if total:
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1993
            self.total = total
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1994
        self.pos = pos
41209
b223fc1c6b4c progress: change _updatebar() to take parameters as arguments
Yuya Nishihara <yuya@tcha.org>
parents: 41145
diff changeset
  1995
        self._updatebar(self.topic, self.pos, item, self.unit, self.total)
41144
3025fd3c2e71 progress: split up _print() method in bar-updating and debug-printing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41143
diff changeset
  1996
        if self.debug:
3025fd3c2e71 progress: split up _print() method in bar-updating and debug-printing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41143
diff changeset
  1997
            self._printdebug(item)
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  1998
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  1999
    def increment(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2000
        self, step: int = 1, item: bytes = b"", total: Optional[int] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2001
    ) -> None:
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  2002
        self.update(self.pos + step, item, total)
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  2003
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2004
    def complete(self) -> None:
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2005
        self.pos = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2006
        self.unit = b""
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2007
        self.total = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2008
        self._updatebar(self.topic, self.pos, b"", self.unit, self.total)
38373
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38345
diff changeset
  2009
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2010
    def _printdebug(self, item: bytes) -> None:
44063
089255b1341e scmutil: fix an unbound variable with progressbar debug enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 44060
diff changeset
  2011
        unit = b''
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2012
        if self.unit:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2013
            unit = b' ' + self.unit
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2014
        if item:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2015
            item = b' ' + item
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2016
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2017
        if self.total:
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2018
            pct = 100.0 * self.pos / self.total
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2019
            self.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2020
                b'%s:%s %d/%d%s (%4.2f%%)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2021
                % (self.topic, item, self.pos, self.total, unit, pct)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2022
            )
41142
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40884
diff changeset
  2023
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2024
            self.ui.debug(b'%s:%s %d%s\n' % (self.topic, item, self.pos, unit))
38345
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38331
diff changeset
  2025
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2026
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  2027
def gdinitconfig(ui: uimod.ui):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45919
diff changeset
  2028
    """helper function to know if a repo should be created as general delta"""
26907
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
  2029
    # experimental config: format.generaldelta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2030
    return ui.configbool(b'format', b'generaldelta') or ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2031
        b'format', b'usegeneraldelta'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2032
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2033
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
  2034
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  2035
def gddeltaconfig(ui: uimod.ui):
49666
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2036
    """helper function to know if incoming deltas should be optimized
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2037
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2038
    The `format.generaldelta` config is an old form of the config that also
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2039
    implies that incoming delta-bases should be never be trusted. This function
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2040
    exists for this purpose.
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49450
diff changeset
  2041
    """
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
  2042
    # experimental config: format.generaldelta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2043
    return ui.configbool(b'format', b'generaldelta')
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2045
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
  2046
class simplekeyvaluefile:
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2047
    """A simple file with key=value lines
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2048
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2049
    Keys must be alphanumerics and start with a letter, values must not
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2050
    contain '\n' characters"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2051
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2052
    firstlinekey = b'__firstline'
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2053
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2054
    def __init__(self, vfs, path: bytes, keys=None) -> None:
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2055
        self.vfs = vfs
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2056
        self.path = path
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2057
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2058
    def read(self, firstlinenonkeyval: bool = False):
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2059
        """Read the contents of a simple key-value file
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2060
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2061
        'firstlinenonkeyval' indicates whether the first line of file should
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2062
        be treated as a key-value pair or reuturned fully under the
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2063
        __firstline key."""
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2064
        lines = self.vfs.readlines(self.path)
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2065
        d = {}
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2066
        if firstlinenonkeyval:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2067
            if not lines:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2068
                e = _(b"empty simplekeyvalue file")
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2069
                raise error.CorruptedState(e)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2070
            # we don't want to include '\n' in the __firstline
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2071
            d[self.firstlinekey] = lines[0][:-1]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2072
            del lines[0]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2073
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2074
        try:
32269
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32172
diff changeset
  2075
            # the 'if line.strip()' part prevents us from failing on empty
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32172
diff changeset
  2076
            # lines which only contain '\n' therefore are not skipped
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32172
diff changeset
  2077
            # by 'if line'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2078
            updatedict = dict(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2079
                line[:-1].split(b'=', 1) for line in lines if line.strip()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2080
            )
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2081
            if self.firstlinekey in updatedict:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2082
                e = _(b"%r can't be used as a key")
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2083
                raise error.CorruptedState(e % self.firstlinekey)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2084
            d.update(updatedict)
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2085
        except ValueError as e:
43365
899e55e2d375 py3: fix exception message encoding in scmutil.py's simplekeyvaluefile.read
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43147
diff changeset
  2086
            raise error.CorruptedState(stringutil.forcebytestr(e))
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2087
        return d
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2088
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2089
    def write(self, data, firstline: Optional[bytes] = None) -> None:
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2090
        """Write key=>value mapping to a file
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2091
        data is a dict. Keys must be alphanumerical and start with a letter.
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2092
        Values must not contain newline characters.
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2093
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2094
        If 'firstline' is not None, it is written to file before
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2095
        everything else, as it is, not in a key=value form"""
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2096
        lines = []
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2097
        if firstline is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2098
            lines.append(b'%s\n' % firstline)
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2099
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2100
        for k, v in data.items():
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2101
            if k == self.firstlinekey:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2102
                e = b"key name '%s' is reserved" % self.firstlinekey
32270
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32269
diff changeset
  2103
                raise error.ProgrammingError(e)
35913
558e01a23f40 py3: slice on bytes to prevent getting the ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35888
diff changeset
  2104
            if not k[0:1].isalpha():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2105
                e = b"keys must start with a letter in a key-value file"
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2106
                raise error.ProgrammingError(e)
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2107
            if not k.isalnum():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2108
                e = b"invalid key name in a simple key-value file"
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2109
                raise error.ProgrammingError(e)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2110
            if b'\n' in v:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2111
                e = b"invalid value in a simple key-value file"
31553
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31419
diff changeset
  2112
                raise error.ProgrammingError(e)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2113
            lines.append(b"%s=%s\n" % (k, v))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2114
        with self.vfs(self.path, mode=b'wb', atomictemp=True) as fp:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2115
            fp.write(b''.join(lines))
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
  2116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2117
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2118
_reportobsoletedsource: List[bytes] = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2119
    b'debugobsolete',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2120
    b'pull',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2121
    b'push',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2122
    b'serve',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2123
    b'unbundle',
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
  2124
]
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
  2125
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2126
_reportnewcssource: List[bytes] = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2127
    b'pull',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2128
    b'unbundle',
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2129
]
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2131
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2132
def prefetchfiles(repo, revmatches) -> None:
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
  2133
    """Invokes the registered file prefetch functions, allowing extensions to
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
  2134
    ensure the corresponding files are available locally, before the command
45072
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2135
    uses them.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2136
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2137
    Args:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2138
      revmatches: a list of (revision, match) tuples to indicate the files to
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2139
      fetch at each revision. If any of the match elements is None, it matches
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2140
      all files.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2141
    """
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
  2142
45072
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2143
    def _matcher(m):
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2144
        if m:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2145
            assert isinstance(m, matchmod.basematcher)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2146
            # The command itself will complain about files that don't exist, so
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2147
            # don't duplicate the message.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2148
            return matchmod.badmatch(m, lambda fn, msg: None)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2149
        else:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2150
            return matchall(repo)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2151
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2152
    revbadmatches = [(rev, _matcher(match)) for (rev, match) in revmatches]
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2153
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44884
diff changeset
  2154
    fileprefetchhooks(repo, revbadmatches)
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
  2155
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2156
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
  2157
# a list of (repo, revs, match) prefetch functions
36137
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35913
diff changeset
  2158
fileprefetchhooks = util.hooks()
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35913
diff changeset
  2159
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2160
# A marker that tells the evolve extension to suppress its own reporting
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2161
_reportstroubledchangesets: bool = True
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2162
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2163
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2164
def registersummarycallback(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2165
    repo, otr, txnname: bytes = b'', as_validator: bool = False
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2166
) -> None:
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
  2167
    """register a callback to issue a summary after the transaction is closed
44544
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2168
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2169
    If as_validator is true, then the callbacks are registered as transaction
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2170
    validators instead
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
  2171
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2172
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2173
    def txmatch(sources):
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2174
        return any(txnname.startswith(source) for source in sources)
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2175
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2176
    categories = []
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2177
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2178
    def reportsummary(func):
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2179
        """decorator for report callbacks."""
35035
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2180
        # The repoview life cycle is shorter than the one of the actual
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2181
        # underlying repository. So the filtered object can die before the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2182
        # weakref is used leading to troubles. We keep a reference to the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2183
        # unfiltered object and restore the filtering when retrieving the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2184
        # repository through the weakref.
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2185
        filtername = repo.filtername
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2186
        reporef = weakref.ref(repo.unfiltered())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2187
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2188
        def wrapped(tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2189
            repo = reporef()
35035
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2190
            if filtername:
43727
5b90a050082b scmutil: add assertions to help pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 43654
diff changeset
  2191
                assert repo is not None  # help pytype
35035
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 35009
diff changeset
  2192
                repo = repo.filtered(filtername)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2193
            func(repo, tr)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2194
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2195
        newcat = b'%02i-txnreport' % len(categories)
44544
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2196
        if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2197
            otr.addvalidator(newcat, wrapped)
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2198
        else:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2199
            otr.addpostclose(newcat, wrapped)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2200
        categories.append(newcat)
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2201
        return wrapped
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2202
42897
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2203
    @reportsummary
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2204
    def reportchangegroup(repo, tr):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2205
        cgchangesets = tr.changes.get(b'changegroup-count-changesets', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2206
        cgrevisions = tr.changes.get(b'changegroup-count-revisions', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2207
        cgfiles = tr.changes.get(b'changegroup-count-files', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2208
        cgheads = tr.changes.get(b'changegroup-count-heads', 0)
42897
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2209
        if cgchangesets or cgrevisions or cgfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2210
            htext = b""
42897
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2211
            if cgheads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2212
                htext = _(b" (%+d heads)") % cgheads
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2213
            msg = _(b"added %d changesets with %d changes to %d files%s\n")
44544
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2214
            if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2215
                msg = _(b"adding %d changesets with %d changes to %d files%s\n")
43727
5b90a050082b scmutil: add assertions to help pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 43654
diff changeset
  2216
            assert repo is not None  # help pytype
42897
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2217
            repo.ui.status(msg % (cgchangesets, cgrevisions, cgfiles, htext))
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42894
diff changeset
  2218
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2219
    if txmatch(_reportobsoletedsource):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2220
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2221
        @reportsummary
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
  2222
        def reportobsoleted(repo, tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2223
            obsoleted = obsutil.getobsoleted(repo, tr)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2224
            newmarkers = len(tr.changes.get(b'obsmarkers', ()))
42894
38392d5bde8e transaction: issue "new obsmarkers" message at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42711
diff changeset
  2225
            if newmarkers:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2226
                repo.ui.status(_(b'%i new obsolescence markers\n') % newmarkers)
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
  2227
            if obsoleted:
44544
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2228
                msg = _(b'obsoleted %i changesets\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2229
                if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2230
                    msg = _(b'obsoleting %i changesets\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2231
                repo.ui.status(msg % len(obsoleted))
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2232
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2233
    if obsolete.isenabled(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2234
        repo, obsolete.createmarkersopt
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2235
    ) and repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2236
        b'experimental', b'evolution.report-instabilities'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2237
    ):
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2238
        instabilitytypes = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2239
            (b'orphan', b'orphan'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2240
            (b'phase-divergent', b'phasedivergent'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2241
            (b'content-divergent', b'contentdivergent'),
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2242
        ]
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2243
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2244
        def getinstabilitycounts(repo):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2245
            filtered = repo.changelog.filteredrevs
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2246
            counts = {}
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2247
            for instability, revset in instabilitytypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2248
                counts[instability] = len(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2249
                    set(obsolete.getrevs(repo, revset)) - filtered
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2250
                )
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2251
            return counts
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2252
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2253
        oldinstabilitycounts = getinstabilitycounts(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2254
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2255
        @reportsummary
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2256
        def reportnewinstabilities(repo, tr):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2257
            newinstabilitycounts = getinstabilitycounts(repo)
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2258
            for instability, revset in instabilitytypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2259
                delta = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2260
                    newinstabilitycounts[instability]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2261
                    - oldinstabilitycounts[instability]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2262
                )
38456
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2263
                msg = getinstabilitymessage(delta, instability)
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2264
                if msg:
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2265
                    repo.ui.warn(msg)
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35499
diff changeset
  2266
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2267
    if txmatch(_reportnewcssource):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2268
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2269
        @reportsummary
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2270
        def reportnewcs(repo, tr):
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2271
            """Report the range of new revisions pulled/unbundled."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2272
            origrepolen = tr.changes.get(b'origrepolen', len(repo))
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2273
            unfi = repo.unfiltered()
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2274
            if origrepolen >= len(unfi):
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2275
                return
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2276
39897
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39894
diff changeset
  2277
            # Compute the bounds of new visible revisions' range.
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39894
diff changeset
  2278
            revs = smartset.spanset(repo, start=origrepolen)
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2279
            if revs:
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2280
                minrev, maxrev = repo[revs.min()], repo[revs.max()]
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
  2281
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2282
                if minrev == maxrev:
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2283
                    revrange = minrev
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2284
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2285
                    revrange = b'%s:%s' % (minrev, maxrev)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2286
                draft = len(repo.revs(b'%ld and draft()', revs))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2287
                secret = len(repo.revs(b'%ld and secret()', revs))
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2288
                if not (draft or secret):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2289
                    msg = _(b'new changesets %s\n') % revrange
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2290
                elif draft and secret:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2291
                    msg = _(b'new changesets %s (%d drafts, %d secrets)\n')
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2292
                    msg %= (revrange, draft, secret)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2293
                elif draft:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2294
                    msg = _(b'new changesets %s (%d drafts)\n')
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2295
                    msg %= (revrange, draft)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2296
                elif secret:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2297
                    msg = _(b'new changesets %s (%d secrets)\n')
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2298
                    msg %= (revrange, secret)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2299
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2300
                    errormsg = b'entered unreachable condition'
39898
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2301
                    raise error.ProgrammingError(errormsg)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39897
diff changeset
  2302
                repo.ui.status(msg)
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2303
39899
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2304
            # search new changesets directly pulled as obsolete
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2305
            duplicates = tr.changes.get(b'revduplicates', ())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2306
            obsadded = unfi.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2307
                b'(%d: + %ld) and obsolete()', origrepolen, duplicates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2308
            )
39899
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2309
            cl = repo.changelog
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2310
            extinctadded = [r for r in obsadded if r not in cl]
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2311
            if extinctadded:
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2312
                # They are not just obsolete, but obsolete and invisible
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2313
                # we call them "extinct" internally but the terms have not been
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2314
                # exposed to users.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2315
                msg = b'(%d other changesets obsolete on arrival)\n'
39899
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2316
                repo.ui.status(msg % len(extinctadded))
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39898
diff changeset
  2317
38171
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2318
        @reportsummary
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2319
        def reportphasechanges(repo, tr):
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2320
            """Report statistics of phase changes for changesets pre-existing
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2321
            pull/unbundle.
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2322
            """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2323
            origrepolen = tr.changes.get(b'origrepolen', len(repo))
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44544
diff changeset
  2324
            published = []
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44544
diff changeset
  2325
            for revs, (old, new) in tr.changes.get(b'phases', []):
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44544
diff changeset
  2326
                if new != phases.public:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44544
diff changeset
  2327
                    continue
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44544
diff changeset
  2328
                published.extend(rev for rev in revs if rev < origrepolen)
38171
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2329
            if not published:
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2330
                return
44544
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2331
            msg = _(b'%d local changesets published\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2332
            if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2333
                msg = _(b'%d local changesets will be published\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
  2334
            repo.ui.status(msg % len(published))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2335
38171
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38131
diff changeset
  2336
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2337
def getinstabilitymessage(delta: int, instability: bytes) -> Optional[bytes]:
38456
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2338
    """function to return the message to show warning about new instabilities
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2339
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2340
    exists as a separate function so that extension can wrap to show more
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2341
    information like how to fix instabilities"""
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2342
    if delta > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2343
        return _(b'%i new %s changesets\n') % (delta, instability)
38456
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38432
diff changeset
  2344
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2345
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2346
def nodesummaries(repo, nodes, maxnumnodes: int = 4) -> bytes:
35184
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35177
diff changeset
  2347
    if len(nodes) <= maxnumnodes or repo.ui.verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2348
        return b' '.join(short(h) for h in nodes)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2349
    first = b' '.join(short(h) for h in nodes[:maxnumnodes])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2350
    return _(b"%s and %d others") % (first, len(nodes) - maxnumnodes)
35184
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35177
diff changeset
  2351
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2352
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2353
def enforcesinglehead(repo, tr, desc: bytes, accountclosed, filtername) -> None:
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2354
    """check that no named branch has multiple heads"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2355
    if desc in (b'strip', b'repair'):
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2356
        # skip the logic during strip
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2357
        return
46096
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46042
diff changeset
  2358
    visible = repo.filtered(filtername)
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2359
    # possible improvement: we could restrict the check to affected branch
42969
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42926
diff changeset
  2360
    bm = visible.branchmap()
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42926
diff changeset
  2361
    for name in bm:
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42926
diff changeset
  2362
        heads = bm.branchheads(name, closed=accountclosed)
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2363
        if len(heads) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2364
            msg = _(b'rejecting multiple heads on branch "%s"')
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2365
            msg %= name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2366
            hint = _(b'%d heads: %s')
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2367
            hint %= (len(heads), nodesummaries(repo, heads))
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2368
            raise error.Abort(msg, hint=hint)
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  2369
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2370
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2371
def wrapconvertsink(sink):
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2372
    """Allow extensions to wrap the sink returned by convcmd.convertsink()
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2373
    before it is used, whether or not the convert extension was formally loaded.
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2374
    """
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35035
diff changeset
  2375
    return sink
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2376
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2377
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2378
def unhidehashlikerevs(repo, specs, hiddentype: bytes):
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2379
    """parse the user specs and unhide changesets whose hash or revision number
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2380
    is passed.
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2381
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2382
    hiddentype can be: 1) 'warn': warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2383
                       2) 'nowarn': don't warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2384
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2385
    returns a repo object with the required changesets unhidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2386
    """
48460
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48368
diff changeset
  2387
    if not specs:
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48368
diff changeset
  2388
        return repo
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48368
diff changeset
  2389
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2390
    if not repo.filtername or not repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2391
        b'experimental', b'directaccess'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2392
    ):
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2393
        return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2394
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2395
    if repo.filtername not in (b'visible', b'visible-hidden'):
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2396
        return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2397
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2398
    symbols = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2399
    for spec in specs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2400
        try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2401
            tree = revsetlang.parse(spec)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2402
        except error.ParseError:  # will be reported by scmutil.revrange()
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2403
            continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2404
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2405
        symbols.update(revsetlang.gethashlikesymbols(tree))
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2406
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2407
    if not symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2408
        return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2409
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2410
    revs = _getrevsfromsymbols(repo, symbols)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2411
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2412
    if not revs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2413
        return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2414
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2415
    if hiddentype == b'warn':
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2416
        unfi = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2417
        revstr = b", ".join([pycompat.bytestr(unfi[l]) for l in revs])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2418
        repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2419
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2420
                b"warning: accessing hidden changesets for write "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2421
                b"operation: %s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2422
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2423
            % revstr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2424
        )
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2425
35499
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
  2426
    # we have to use new filtername to separate branch/tags cache until we can
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
  2427
    # disbale these cache when revisions are dynamically pinned.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2428
    return repo.filtered(b'visible-hidden', revs)
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2429
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2430
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2431
def _getrevsfromsymbols(repo, symbols) -> Set[int]:
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2432
    """parse the list of symbols and returns a set of revision numbers of hidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2433
    changesets present in symbols"""
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2434
    revs = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2435
    unfi = repo.unfiltered()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2436
    unficl = unfi.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2437
    cl = repo.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2438
    tiprev = len(unficl)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2439
    allowrevnums = repo.ui.configbool(b'experimental', b'directaccess.revnums')
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2440
    for s in symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2441
        try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2442
            n = int(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2443
            if n <= tiprev:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2444
                if not allowrevnums:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2445
                    continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2446
                else:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2447
                    if n not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2448
                        revs.add(n)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2449
                    continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2450
        except ValueError:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2451
            pass
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2452
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2453
        try:
37868
69de3c3de036 directaccess: use resolvehexnodeidprefix() instead of _partialmatch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37865
diff changeset
  2454
            s = resolvehexnodeidprefix(unfi, s)
37094
7f025c9b7865 directaccess: do not abort by 'ff...' hash
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  2455
        except (error.LookupError, error.WdirUnsupported):
35496
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2456
            s = None
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2457
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2458
        if s is not None:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2459
            rev = unficl.rev(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2460
            if rev not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2461
                revs.add(rev)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2462
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35412
diff changeset
  2463
    return revs
38131
46c2b19a1263 scmutil: move repair.stripbmrevset as scmutil.bookmarkrevs (API)
David Demelier <markand@malikania.fr>
parents: 37979
diff changeset
  2464
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2465
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2466
def bookmarkrevs(repo, mark: bytes):
46039
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  2467
    """Select revisions reachable by a given bookmark
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  2468
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  2469
    If the bookmarked revision isn't a head, an empty set will be returned.
38131
46c2b19a1263 scmutil: move repair.stripbmrevset as scmutil.bookmarkrevs (API)
David Demelier <markand@malikania.fr>
parents: 37979
diff changeset
  2470
    """
46040
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2471
    return repo.revs(format_bookmark_revspec(mark))
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2472
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2473
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2474
def format_bookmark_revspec(mark: bytes) -> bytes:
46040
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2475
    """Build a revset expression to select revisions reachable by a given
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2476
    bookmark"""
46042
1bf2b44c4007 log: do not accept string-matcher pattern as -u/-b/-B parameter
Yuya Nishihara <yuya@tcha.org>
parents: 46040
diff changeset
  2477
    mark = b'literal:' + mark
46040
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46039
diff changeset
  2478
    return revsetlang.formatspec(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2479
        b"ancestors(bookmark(%s)) - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2480
        b"ancestors(head() and not bookmark(%s)) - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2481
        b"ancestors(bookmark() and not bookmark(%s))",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2482
        mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2483
        mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2484
        mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42969
diff changeset
  2485
    )
50442
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2486
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2487
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  2488
def ismember(ui: uimod.ui, username: bytes, userlist: List[bytes]) -> bool:
50442
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2489
    """Check if username is a member of userlist.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2490
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2491
    If userlist has a single '*' member, all users are considered members.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2492
    Can be overridden by extensions to provide more complex authorization
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2493
    schemes.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2494
    """
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50029
diff changeset
  2495
    return userlist == [b'*'] or username in userlist
51280
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2496
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2497
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2498
RESOURCE_HIGH: int = 3
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2499
RESOURCE_MEDIUM: int = 2
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2500
RESOURCE_LOW: int = 1
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2501
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2502
RESOURCE_MAPPING: Dict[bytes, int] = {
51280
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2503
    b'low': RESOURCE_LOW,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2504
    b'medium': RESOURCE_MEDIUM,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2505
    b'high': RESOURCE_HIGH,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2506
}
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2507
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2508
DEFAULT_RESOURCE: int = RESOURCE_MEDIUM
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2509
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2510
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2511
def get_resource_profile(
52645
4cb75772818d pyupgrade: drop the quoting around type annotations
Matt Harbison <matt_harbison@yahoo.com>
parents: 52644
diff changeset
  2512
    ui: uimod.ui, dimension: Optional[bytes] = None
51728
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51725
diff changeset
  2513
) -> int:
51280
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2514
    """return the resource profile for a dimension
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2515
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2516
    If no dimension is specified, the generic value is returned"""
52668
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2517
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2518
    def config(section, name):
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2519
        value_name = ui.config(section, name, default=b'default')
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2520
        return RESOURCE_MAPPING.get(value_name)
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2521
51280
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51249
diff changeset
  2522
    if dimension is not None:
52668
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2523
        value = config(b'usage', b'resources.%s' % dimension)
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2524
        if value is not None:
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2525
            return value
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2526
    value = config(b'usage', b'resources')
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2527
    if value is not None:
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2528
        return value
1fef0d25dcde usage: refactor usage.resources config parsing
Mitchell Kember <mkember@janestreet.com>
parents: 52098
diff changeset
  2529
    return DEFAULT_RESOURCE