Julio Biason
2 years ago
4 changed files with 420 additions and 0 deletions
@ -0,0 +1,27 @@
|
||||
# Sparse-Checkout |
||||
|
||||
This code tries to simulate the way `sparse-checkout` works in recent Git |
||||
versions. |
||||
|
||||
## The Problem |
||||
|
||||
The problem is that the behaviour of `sparse-checkout` changed somewhere in the |
||||
line. In most recent versions, `sparse-checkout init`, on a clone, will hide |
||||
every single file; older versions, though, will refuse to init the |
||||
`sparse-checkout` if that would leave the current directory empty. |
||||
|
||||
## Solution |
||||
|
||||
The idea is to push `update-index --skip-worktree` to tag a file as "being |
||||
ignored" (Git will always assume the file checksum is still the same as in the |
||||
index, no matter what you do with the file). Then, when a user wants to |
||||
re-enable the directory/file, use `update-index --no-skip-worktree`. |
||||
|
||||
Although that sounds simple, there an issue that Git deals only with files and |
||||
not directories, and trying to disable/enable the file in the index requires to |
||||
pass the files; for example, on the re-enable, how to find the names of the |
||||
files we just deleted? |
||||
|
||||
That requires a combination of use with `ls-files --cached [pattern]`. This way |
||||
we can get all the files that need to be pushed back/ignored, reading directly |
||||
from the Git information. |
@ -0,0 +1,238 @@
|
||||
[[package]] |
||||
name = "black" |
||||
version = "22.12.0" |
||||
description = "The uncompromising code formatter." |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.dependencies] |
||||
click = ">=8.0.0" |
||||
mypy-extensions = ">=0.4.3" |
||||
pathspec = ">=0.9.0" |
||||
platformdirs = ">=2" |
||||
tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} |
||||
typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} |
||||
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} |
||||
|
||||
[package.extras] |
||||
colorama = ["colorama (>=0.4.3)"] |
||||
d = ["aiohttp (>=3.7.4)"] |
||||
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] |
||||
uvloop = ["uvloop (>=0.15.2)"] |
||||
|
||||
[[package]] |
||||
name = "click" |
||||
version = "8.1.3" |
||||
description = "Composable command line interface toolkit" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.dependencies] |
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""} |
||||
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} |
||||
|
||||
[[package]] |
||||
name = "colorama" |
||||
version = "0.4.6" |
||||
description = "Cross-platform colored terminal text." |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" |
||||
|
||||
[[package]] |
||||
name = "importlib-metadata" |
||||
version = "5.1.0" |
||||
description = "Read metadata from Python packages" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.dependencies] |
||||
typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} |
||||
zipp = ">=0.5" |
||||
|
||||
[package.extras] |
||||
docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] |
||||
perf = ["ipython"] |
||||
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] |
||||
|
||||
[[package]] |
||||
name = "mypy-extensions" |
||||
version = "0.4.3" |
||||
description = "Experimental type system extensions for programs checked with the mypy typechecker." |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = "*" |
||||
|
||||
[[package]] |
||||
name = "nodeenv" |
||||
version = "1.7.0" |
||||
description = "Node.js virtual environment builder" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" |
||||
|
||||
[[package]] |
||||
name = "pathspec" |
||||
version = "0.10.2" |
||||
description = "Utility library for gitignore style pattern matching of file paths." |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[[package]] |
||||
name = "platformdirs" |
||||
version = "2.6.0" |
||||
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.extras] |
||||
docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.19.4)", "sphinx (>=5.3)"] |
||||
test = ["appdirs (==1.4.4)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2)"] |
||||
|
||||
[[package]] |
||||
name = "pyright" |
||||
version = "1.1.283" |
||||
description = "Command line wrapper for pyright" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.dependencies] |
||||
nodeenv = ">=1.6.0" |
||||
typing-extensions = {version = ">=3.7", markers = "python_version < \"3.8\""} |
||||
|
||||
[package.extras] |
||||
all = ["twine (>=3.4.1)"] |
||||
dev = ["twine (>=3.4.1)"] |
||||
|
||||
[[package]] |
||||
name = "tomli" |
||||
version = "2.0.1" |
||||
description = "A lil' TOML parser" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[[package]] |
||||
name = "typed-ast" |
||||
version = "1.5.4" |
||||
description = "a fork of Python 2 and 3 ast modules with type comment support" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.6" |
||||
|
||||
[[package]] |
||||
name = "typing-extensions" |
||||
version = "4.4.0" |
||||
description = "Backported and Experimental Type Hints for Python 3.7+" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[[package]] |
||||
name = "zipp" |
||||
version = "3.11.0" |
||||
description = "Backport of pathlib-compatible object wrapper for zip files" |
||||
category = "dev" |
||||
optional = false |
||||
python-versions = ">=3.7" |
||||
|
||||
[package.extras] |
||||
docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] |
||||
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] |
||||
|
||||
[metadata] |
||||
lock-version = "1.1" |
||||
python-versions = ">=3.7" |
||||
content-hash = "206760241f84f05f6c0bc34758945781724000f713a2f1fac41326cb79678618" |
||||
|
||||
[metadata.files] |
||||
black = [ |
||||
{file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, |
||||
{file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, |
||||
{file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, |
||||
{file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, |
||||
{file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, |
||||
{file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, |
||||
{file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, |
||||
{file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, |
||||
{file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, |
||||
{file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, |
||||
{file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, |
||||
{file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, |
||||
] |
||||
click = [ |
||||
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, |
||||
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, |
||||
] |
||||
colorama = [ |
||||
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, |
||||
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, |
||||
] |
||||
importlib-metadata = [ |
||||
{file = "importlib_metadata-5.1.0-py3-none-any.whl", hash = "sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313"}, |
||||
{file = "importlib_metadata-5.1.0.tar.gz", hash = "sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b"}, |
||||
] |
||||
mypy-extensions = [ |
||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, |
||||
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, |
||||
] |
||||
nodeenv = [ |
||||
{file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, |
||||
{file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, |
||||
] |
||||
pathspec = [ |
||||
{file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, |
||||
{file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, |
||||
] |
||||
platformdirs = [ |
||||
{file = "platformdirs-2.6.0-py3-none-any.whl", hash = "sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca"}, |
||||
{file = "platformdirs-2.6.0.tar.gz", hash = "sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e"}, |
||||
] |
||||
pyright = [ |
||||
{file = "pyright-1.1.283-py3-none-any.whl", hash = "sha256:d5b14bb50ccbfb7769e09a611960665021816ea1b0543e0ffb8c341388c73710"}, |
||||
{file = "pyright-1.1.283.tar.gz", hash = "sha256:57dcc7abf0b764d5f587a80faf20186f5666adffe5f34afa10d471e96bbd9509"}, |
||||
] |
||||
tomli = [ |
||||
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, |
||||
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, |
||||
] |
||||
typed-ast = [ |
||||
{file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, |
||||
{file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, |
||||
{file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, |
||||
{file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, |
||||
{file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, |
||||
{file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, |
||||
{file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, |
||||
{file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, |
||||
{file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, |
||||
{file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, |
||||
{file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, |
||||
{file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, |
||||
{file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, |
||||
{file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, |
||||
{file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, |
||||
{file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, |
||||
{file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, |
||||
{file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, |
||||
{file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, |
||||
{file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, |
||||
{file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, |
||||
{file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, |
||||
{file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, |
||||
{file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, |
||||
] |
||||
typing-extensions = [ |
||||
{file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, |
||||
{file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, |
||||
] |
||||
zipp = [ |
||||
{file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, |
||||
{file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, |
||||
] |
@ -0,0 +1,16 @@
|
||||
[tool.poetry] |
||||
name = "sparse-checkout" |
||||
version = "0.1.0" |
||||
description = "" |
||||
authors = ["Julio Biason <julio.biason@pm.me>"] |
||||
|
||||
[tool.poetry.dependencies] |
||||
python = ">=3.7" |
||||
|
||||
[tool.poetry.dev-dependencies] |
||||
pyright = "^1.1.283" |
||||
black = "^22.12.0" |
||||
|
||||
[build-system] |
||||
requires = ["poetry-core>=1.0.0"] |
||||
build-backend = "poetry.core.masonry.api" |
@ -0,0 +1,139 @@
|
||||
#!/bin/env python |
||||
|
||||
import shutil |
||||
import subprocess |
||||
import os |
||||
|
||||
from argparse import ArgumentParser |
||||
from pathlib import Path |
||||
from typing import List |
||||
from typing import Optional |
||||
from typing import Generator |
||||
|
||||
|
||||
GIT_EXE = shutil.which("git", mode=os.X_OK) |
||||
WORKING_DIRECTORY = Path.cwd() / "test" |
||||
|
||||
|
||||
def run(command: str, args: List[str]): |
||||
"""Run Git with the specified arguments.""" |
||||
full_command = [str(GIT_EXE)] |
||||
full_command.extend(command.split()) |
||||
full_command.extend(args) |
||||
|
||||
result = None |
||||
print(f"Git: {full_command}") |
||||
proc = subprocess.Popen( |
||||
full_command, |
||||
stdout=subprocess.PIPE, |
||||
stderr=subprocess.PIPE, |
||||
cwd=WORKING_DIRECTORY, |
||||
) |
||||
result = proc.communicate() |
||||
(out, err) = result |
||||
print(f"Out:\n{out}") |
||||
print(f"Err:\n{err}") |
||||
return result |
||||
|
||||
|
||||
def files(base: Optional[str] = None) -> List[str]: |
||||
"""Return the list of files for the base directory or all the files in the |
||||
repo in case there is no base. |
||||
""" |
||||
params = ["--cached"] |
||||
if base: |
||||
params.append(base) |
||||
result = run("ls-files", params) |
||||
return result[0].decode("utf-8").strip().split("\n") |
||||
|
||||
|
||||
def hide(files: List[str]): |
||||
"""Hide a list of files by tagging them to skip the worktree.""" |
||||
params = ["--skip-worktree", "--force-remove"] |
||||
params.extend(files) |
||||
run("update-index", params) |
||||
|
||||
|
||||
def show(files: List[str]): |
||||
"""Display files by removing the tagging to skip the worktree.""" |
||||
params = ["--no-skip-worktree"] |
||||
params.extend(files) |
||||
run("update-index", params) |
||||
run("checkout", files) |
||||
|
||||
|
||||
def bases(files: List[str]) -> Generator[str, None, None]: |
||||
"""Produces only the bases for the list of files.""" |
||||
last_seen = None |
||||
for filename in files: |
||||
as_path = Path(filename) |
||||
base = as_path.parts[0] |
||||
if base != last_seen: |
||||
yield base |
||||
last_seen = base |
||||
|
||||
|
||||
def clone(args): |
||||
print(f"Clonining {args.url} on {args.branch}") |
||||
shutil.rmtree(WORKING_DIRECTORY, ignore_errors=True) |
||||
WORKING_DIRECTORY.mkdir() |
||||
run( |
||||
"clone", |
||||
["--no-checkout", args.url, "--branch", args.branch, str(WORKING_DIRECTORY)], |
||||
) |
||||
run("reset", []) |
||||
hide(files()) |
||||
|
||||
|
||||
def enable(args): |
||||
"""Make the files under a directory available again.""" |
||||
print(f"Enabling {args.path}") |
||||
to_enable = [] |
||||
for base in args.path: |
||||
to_enable.extend(files(base)) |
||||
show(to_enable) |
||||
|
||||
|
||||
def disable(args): |
||||
"""Make the files under a directory unavailable.""" |
||||
print(f"Disabling {args.path}") |
||||
to_enable = [] |
||||
for base in args.path: |
||||
to_enable.extend(files(base)) |
||||
hide(to_enable) |
||||
for base in args.path: |
||||
shutil.rmtree(WORKING_DIRECTORY / base, ignore_errors=True) |
||||
|
||||
|
||||
def list(_args): |
||||
"""List all the bases available.""" |
||||
for filename in bases(files()): |
||||
print(f"{filename}") |
||||
|
||||
|
||||
def main(): |
||||
parser = ArgumentParser() |
||||
subparsers = parser.add_subparsers() |
||||
|
||||
clone_cmd = subparsers.add_parser("clone") |
||||
clone_cmd.add_argument("url") |
||||
clone_cmd.add_argument("branch") |
||||
clone_cmd.set_defaults(func=clone) |
||||
|
||||
enable_cmd = subparsers.add_parser("enable") |
||||
enable_cmd.add_argument("path", nargs="+") |
||||
enable_cmd.set_defaults(func=enable) |
||||
|
||||
disable_cmd = subparsers.add_parser("disable") |
||||
disable_cmd.add_argument("path", nargs="+") |
||||
disable_cmd.set_defaults(func=disable) |
||||
|
||||
list_cmd = subparsers.add_parser("list") |
||||
list_cmd.set_defaults(func=list) |
||||
|
||||
args = parser.parse_args() |
||||
args.func(args) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
main() |
Loading…
Reference in new issue