git-nested 1.0.5__tar.gz → 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/build-binary.yml +19 -3
  2. {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/release-binary.yml +21 -12
  3. {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/test-binary.yml +5 -2
  4. {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/test.yml +10 -0
  5. {git_nested-1.0.5 → git_nested-1.1.0}/.gitignore +1 -0
  6. git_nested-1.1.0/.pre-commit-config.yaml +62 -0
  7. {git_nested-1.0.5 → git_nested-1.1.0}/.rc +0 -0
  8. {git_nested-1.0.5 → git_nested-1.1.0}/CONTRIBUTING.md +21 -4
  9. {git_nested-1.0.5 → git_nested-1.1.0}/PKG-INFO +12 -5
  10. {git_nested-1.0.5 → git_nested-1.1.0}/README.md +11 -4
  11. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/PKG-INFO +12 -5
  12. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/SOURCES.txt +8 -1
  13. git_nested-1.1.0/lib/git_nested.py +2690 -0
  14. {git_nested-1.0.5 → git_nested-1.1.0}/pyproject.toml +57 -1
  15. {git_nested-1.0.5 → git_nested-1.1.0}/scripts/create-python-exe.sh +25 -12
  16. git_nested-1.1.0/sonar-project.properties +9 -0
  17. {git_nested-1.0.5 → git_nested-1.1.0}/test/conftest.py +141 -133
  18. {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_filemode.py +6 -7
  19. {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_filter.py +0 -1
  20. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_branch.py +11 -2
  21. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_clone.py +2 -1
  22. git_nested-1.1.0/test/test_commit.py +50 -0
  23. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_completion.py +1 -0
  24. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_gitignore.py +1 -1
  25. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_init.py +30 -2
  26. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_nested_in_nested.py +1 -2
  27. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_pull.py +21 -12
  28. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_push.py +61 -6
  29. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_reclone.py +3 -3
  30. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_status.py +3 -3
  31. git_nested-1.1.0/test/unittest/conftest.py +62 -0
  32. git_nested-1.1.0/test/unittest/test_command.py +112 -0
  33. git_nested-1.1.0/test/unittest/test_helpers.py +174 -0
  34. {git_nested-1.0.5 → git_nested-1.1.0}/test/unittest/test_logging.py +9 -12
  35. git_nested-1.1.0/test/unittest/test_repo_business.py +492 -0
  36. git_nested-1.1.0/uv.lock +2237 -0
  37. git_nested-1.0.5/lib/git_nested.py +0 -2108
  38. git_nested-1.0.5/uv.lock +0 -689
  39. {git_nested-1.0.5 → git_nested-1.1.0}/.codecov.yml +0 -0
  40. {git_nested-1.0.5 → git_nested-1.1.0}/.fish.rc +0 -0
  41. {git_nested-1.0.5 → git_nested-1.1.0}/.gitattributes +0 -0
  42. {git_nested-1.0.5 → git_nested-1.1.0}/.github/CODEOWNERS +0 -0
  43. {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/publish.yml +0 -0
  44. {git_nested-1.0.5 → git_nested-1.1.0}/LICENSE +0 -0
  45. {git_nested-1.0.5 → git_nested-1.1.0}/docs/diagrams.md +0 -0
  46. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git-nested +0 -0
  47. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/dependency_links.txt +0 -0
  48. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/entry_points.txt +0 -0
  49. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/requires.txt +0 -0
  50. {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/top_level.txt +0 -0
  51. {git_nested-1.0.5 → git_nested-1.1.0}/setup.cfg +0 -0
  52. {git_nested-1.0.5 → git_nested-1.1.0}/share/completion.bash +0 -0
  53. {git_nested-1.0.5 → git_nested-1.1.0}/share/enable-completion.sh +0 -0
  54. {git_nested-1.0.5 → git_nested-1.1.0}/share/git-nested.fish +0 -0
  55. {git_nested-1.0.5 → git_nested-1.1.0}/share/zsh-completion/_git-nested +0 -0
  56. {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_extraction.py +1 -1
  57. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_clean.py +0 -0
  58. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_diff.py +0 -0
  59. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_encode.py +0 -0
  60. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_error.py +0 -0
  61. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_fetch.py +0 -0
  62. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_rebase.py +2 -2
  63. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_submodule.py +0 -0
  64. {git_nested-1.0.5 → git_nested-1.1.0}/test/test_version.py +0 -0
@@ -18,6 +18,10 @@ on:
18
18
  type: string
19
19
  required: false
20
20
  default: git-nested-binary
21
+ outputs:
22
+ version:
23
+ description: 'Version of the built git-nested, e.g. 1.2.3 -- for composing the exact git-nested-<version>-x64-linux.tar.xz filename in a caller'
24
+ value: ${{ jobs.build.outputs.version }}
21
25
 
22
26
  jobs:
23
27
  build:
@@ -30,6 +34,8 @@ jobs:
30
34
  # Fedora 29 / RHEL 8 onwards. glibc-based distros only -- musl ones
31
35
  # (Alpine) can never run this binary.
32
36
  container: almalinux:8
37
+ outputs:
38
+ version: ${{ steps.build.outputs.version }}
33
39
  steps:
34
40
  # Before the checkout -- without git, actions/checkout silently falls
35
41
  # back to downloading a tarball, and a checkout with no .git has no
@@ -50,13 +56,23 @@ jobs:
50
56
  run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
51
57
 
52
58
  - name: Build the executable
53
- run: scripts/create-python-exe.sh --output dist --python python3.12
59
+ id: build
60
+ run: |
61
+ scripts/create-python-exe.sh --output dist --python python3.12
62
+ # 'git-nested Version: X.Y.Z' -> X.Y.Z. Exposed as a job output so a
63
+ # caller can compose the exact git-nested-<version>-x64-linux.tar.xz
64
+ # filename itself (e.g. release-binary.yml's 'gh release upload')
65
+ # instead of globbing for it.
66
+ echo "version=$(dist/git-nested --version | head -1 | cut -d' ' -f3)" >> "$GITHUB_OUTPUT"
54
67
 
55
68
  # the .tar.xz rather than the bare executable. It is what a release
56
69
  # actually ships, and unlike a zipped artifact it keeps the exec bit,
57
- # so consumers just untar and run it.
70
+ # so consumers just untar and run it. Named git-nested-<version>-x64-linux
71
+ # by create-python-exe.sh, so the version can't be spelled out here --
72
+ # matched by glob instead (see steps.build.outputs.version for callers
73
+ # that need the exact name).
58
74
  - uses: actions/upload-artifact@v4
59
75
  with:
60
76
  name: ${{ inputs.artifact }}
61
- path: dist/git-nested_x64_Linux.tar.xz
77
+ path: dist/git-nested-*-x64-linux.tar.xz
62
78
  if-no-files-found: error
@@ -1,9 +1,9 @@
1
1
  name: Release binary
2
2
 
3
3
  # Builds the single-file 'git-nested' executable (see
4
- # scripts/create-python-exe.sh) and attaches git-nested_x64_Linux.tar.xz to the
5
- # release, so git-nested can be used on a machine that has no python -- and no
6
- # pip, no uv -- at all.
4
+ # scripts/create-python-exe.sh) and attaches
5
+ # git-nested-<version>-x64-linux.tar.xz to the release, so git-nested can be
6
+ # used on a machine that has no python -- and no pip, no uv -- at all.
7
7
  #
8
8
  # Separate from publish.yml on purpose. That one is triggered by the tag push
9
9
  # and uploads to PyPI, while attaching an asset needs the GitHub *release* to
@@ -34,7 +34,6 @@ env:
34
34
  # produce an executable that misreports itself. Empty on a plain
35
35
  # workflow_dispatch -- then the triggering ref is built as-is.
36
36
  REF: ${{ github.event.release.tag_name || inputs.tag || github.ref }}
37
- ARCHIVE: git-nested_x64_Linux.tar.xz
38
37
 
39
38
  jobs:
40
39
  # the glibc floor and every other build decision live there, shared with
@@ -86,8 +85,10 @@ jobs:
86
85
  with:
87
86
  name: git-nested-binary
88
87
 
88
+ # Named git-nested-<version>-x64-linux.tar.xz -- resolved by glob since
89
+ # the version isn't known here.
89
90
  - name: Unpack
90
- run: tar -xf "$ARCHIVE"
91
+ run: tar -xf git-nested-*-x64-linux.tar.xz
91
92
 
92
93
  # git is the one thing that does have to be installed -- git-nested
93
94
  # drives it and refuses to start without it. Python deliberately is not:
@@ -127,17 +128,22 @@ jobs:
127
128
 
128
129
  # The binary and the script are mounted in, so the distro images need
129
130
  # neither tar/xz nor anything else to take part beyond git -- the point
130
- # is that nothing else is required.
131
+ # is that nothing else is required. 'git-nested' is now a symlink to the
132
+ # versioned binary, so both have to be mounted together (into PATH)
133
+ # rather than just the single file -- a lone symlink mount would
134
+ # dangle, pointing at a sibling that was never brought along.
131
135
  - name: Run on ${{ matrix.image }}
132
136
  run: |
133
137
  docker run --rm \
134
- -v "$PWD/git-nested:/usr/local/bin/git-nested:ro" \
135
- -v "$PWD/verify.sh:/verify.sh:ro" \
138
+ -v "$PWD:/work" -w /work \
136
139
  ${{ matrix.image }} \
137
- sh -c '${{ matrix.install }} >/dev/null && sh /verify.sh'
140
+ sh -c '${{ matrix.install }} >/dev/null && export PATH="/work:$PATH" && sh verify.sh'
138
141
 
139
142
  upload:
140
- needs: [test, verify]
143
+ # 'build' listed directly (not just transitively via 'test'/'verify')
144
+ # because a job's outputs are only visible to jobs that name it in
145
+ # 'needs'.
146
+ needs: [build, test, verify]
141
147
  # nothing to attach when workflow_dispatch ran without a tag
142
148
  if: github.event_name == 'release' || inputs.tag != ''
143
149
  runs-on: ubuntu-latest
@@ -149,9 +155,12 @@ jobs:
149
155
  name: git-nested-binary
150
156
 
151
157
  # --clobber so re-running against an already-attached release replaces
152
- # the asset instead of failing halfway.
153
- - name: Attach ${{ env.ARCHIVE }} to ${{ env.REF }}
158
+ # the asset instead of failing halfway. The filename is composed from
159
+ # 'build's version output -- this is the point that actually names the
160
+ # release asset, so it uses the real version rather than a glob.
161
+ - name: Attach git-nested-${{ needs.build.outputs.version }}-x64-linux.tar.xz to ${{ env.REF }}
154
162
  env:
155
163
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
156
164
  GH_REPO: ${{ github.repository }}
165
+ ARCHIVE: git-nested-${{ needs.build.outputs.version }}-x64-linux.tar.xz
157
166
  run: gh release upload "$REF" "$ARCHIVE" --clobber
@@ -61,11 +61,14 @@ jobs:
61
61
  name: ${{ inputs.artifact }}
62
62
 
63
63
  # into its own directory: the env fixture puts the binary's directory on
64
- # PATH, and the repo root is not a good thing to put there.
64
+ # PATH, and the repo root is not a good thing to put there. Named
65
+ # git-nested-<version>-x64-linux.tar.xz, so matched by glob. 'git-nested'
66
+ # inside is a symlink to the versioned binary, so both land in bin/
67
+ # together.
65
68
  - name: Unpack the binary
66
69
  run: |
67
70
  mkdir -p bin
68
- tar -C bin -xf git-nested_x64_Linux.tar.xz
71
+ tar -C bin -xf git-nested-*-x64-linux.tar.xz
69
72
  bin/git-nested --version
70
73
 
71
74
  # no coverage flags: the code being executed lives in another process
@@ -35,6 +35,11 @@ jobs:
35
35
  steps:
36
36
  - name: Checkout code
37
37
  uses: actions/checkout@v4
38
+ with:
39
+ # SonarCloud's blame-based analysis (new-code detection, issue
40
+ # authorship) needs real history, not the default shallow, tagless
41
+ # checkout.
42
+ fetch-depth: 0
38
43
  - name: Install uv
39
44
  uses: astral-sh/setup-uv@v7
40
45
  with:
@@ -61,3 +66,8 @@ jobs:
61
66
  uses: codecov/test-results-action@v1
62
67
  with:
63
68
  token: ${{ secrets.CODECOV_TOKEN }}
69
+ - name: SonarCloud Scan
70
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.14'
71
+ uses: SonarSource/sonarqube-scan-action@v4
72
+ env:
73
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -10,6 +10,7 @@ build/
10
10
  .coverage
11
11
  htmlcov/
12
12
  coverage.xml
13
+ .coverage*
13
14
  junit.xml
14
15
  *.whl
15
16
  *.tar.gz
@@ -0,0 +1,62 @@
1
+ # Repo-wide hygiene gate. Run over the whole tree by `uv run poe pre-commit`,
2
+ # the first step of `uv run poe all`. Nothing installs an actual git hook --
3
+ # that stays a per-developer `pre-commit install` if you want it.
4
+ #
5
+ # Everything language-specific already has its own poe task backed by a version
6
+ # pinned in pyproject.toml's `lint` dependency group -- ruff, mypy, pyright,
7
+ # bandit, pip-audit, complexipy. Duplicating any of them here would mean a
8
+ # second, independently-pinned copy drifting from the one CI runs, so this file
9
+ # deliberately stays limited to the checks nothing else covers.
10
+ repos:
11
+ # General pre-commit hooks
12
+ - repo: https://github.com/pre-commit/pre-commit-hooks
13
+ rev: v6.0.0
14
+ hooks:
15
+ # --- whitespace -----------------------------------------------------
16
+ # .patch/.diff are excluded throughout: trailing whitespace inside a
17
+ # hunk is content, and git's "-- \n" signature separator is load-bearing.
18
+ # Rewriting either corrupts the patch.
19
+ - id: trailing-whitespace
20
+ exclude: ^.*\.(patch|diff)$
21
+ - id: end-of-file-fixer
22
+ exclude: ^.*\.(patch|diff)$
23
+ - id: mixed-line-ending
24
+ args: ['--fix=lf']
25
+ exclude: ^.*\.(patch|diff)$
26
+
27
+ # --- parseability of the files that configure everything else -------
28
+ - id: check-yaml
29
+ - id: check-toml
30
+ - id: check-json
31
+
32
+ # --- python ---------------------------------------------------------
33
+ - id: debug-statements
34
+ - id: name-tests-test
35
+ args: ['--pytest-test-first']
36
+
37
+ # --- scripts --------------------------------------------------------
38
+ - id: check-executables-have-shebangs
39
+ - id: check-shebang-scripts-are-executable
40
+ # share/*.bash and share/*.sh are meant to be *sourced* into a user's
41
+ # shell (see share/enable-completion.sh), never executed directly --
42
+ # their shebang is there only so editors pick the right syntax mode.
43
+ exclude: ^share/
44
+
45
+ # --- repo integrity -------------------------------------------------
46
+ - id: detect-private-key
47
+ - id: check-added-large-files
48
+ args: ['--maxkb=500', '--enforce-all']
49
+ - id: check-case-conflict
50
+ - id: check-merge-conflict
51
+ - id: check-symlinks
52
+ - id: destroyed-symlinks
53
+ - id: forbid-submodules
54
+
55
+
56
+ # Configuration
57
+ default_language_version:
58
+ python: python3.12
59
+
60
+ # Minimum pre-commit version -- matches the floor pyproject.toml's `lint`
61
+ # dependency group pins.
62
+ minimum_pre_commit_version: '4.0.0'
File without changes
@@ -92,14 +92,31 @@ a release.
92
92
 
93
93
  ### Code Quality
94
94
 
95
- We use [Ruff](https://github.com/astral-sh/ruff) for both linting and formatting:
95
+ `uv run poe all` runs the full gate CI enforces: repo hygiene, linting,
96
+ formatting, static typing, security, dependency, and complexity checks, then
97
+ the test suite. Each has its own `poe` task if you want to run just one:
96
98
 
97
99
  ```bash
98
- # Check code quality
99
- uv run poe lint
100
+ # Repo-wide hygiene (whitespace, YAML/TOML/JSON parseability, shebangs, ...)
101
+ uv run poe pre-commit
100
102
 
101
- # Auto-format code
103
+ # Lint and auto-format with Ruff (https://github.com/astral-sh/ruff)
104
+ uv run poe lint
102
105
  uv run poe format
106
+
107
+ # Static typing -- mypy and pyright are both run since they catch
108
+ # different things; passing both is required
109
+ uv run poe mypy
110
+ uv run poe pyright
111
+
112
+ # Security linting (bandit) and dependency vulnerability scanning (pip-audit)
113
+ uv run poe bandit
114
+ uv run poe pip-audit
115
+
116
+ # Cognitive complexity (complexipy); threshold is set in pyproject.toml's
117
+ # [tool.complexipy] to catch complexity creep in new code, not to demand
118
+ # every existing function be simple
119
+ uv run poe complexity
103
120
  ```
104
121
 
105
122
  Make sure all checks pass before submitting your PR.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-nested
3
- Version: 1.0.5
3
+ Version: 1.1.0
4
4
  Summary: Git Submodule Alternative
5
5
  Author-email: Thorsten Klein <thorsten.klein.git@gmail.com>
6
6
  License: MIT
@@ -83,16 +83,23 @@ pip install git+https://github.com/thorsten-klein/git-nested
83
83
  #### Method 2: Standalone Executable (no Python needed)
84
84
 
85
85
  Every [release](https://github.com/thorsten-klein/git-nested/releases) ships
86
- `git-nested_x64_Linux.tar.xz`: a single file with git-nested, its dependencies
87
- and a Python interpreter inside. Only git itself has to be installed.
86
+ `git-nested-<version>-x64-linux.tar.xz`: a single file with git-nested, its
87
+ dependencies and a Python interpreter inside. Only git itself has to be
88
+ installed.
88
89
 
89
90
  ```bash
90
- curl -L https://github.com/thorsten-klein/git-nested/releases/latest/download/git-nested_x64_Linux.tar.xz | tar -xJ
91
+ # Find the asset from the latest release
92
+ ASSET=$(curl -sSL https://api.github.com/repos/thorsten-klein/git-nested/releases/latest | grep -o 'https://[^"]*\.tar\.xz')
93
+
94
+ # Download the asset and unpack it
95
+ curl -sSL "$ASSET" | tar -xJ
91
96
  sudo install git-nested /usr/local/bin/ # any directory on PATH works
92
97
  ```
93
98
 
94
99
  The file has to keep the name `git-nested` — that is how `git nested ...`
95
- finds it. The archive also contains the completion scripts from `share/`.
100
+ finds it. The archive also contains a versioned copy of the binary (e.g.
101
+ `git-nested-1.2.3`) that `git-nested` symlinks to, and the completion scripts
102
+ from `share/`.
96
103
 
97
104
  Built on x86_64 with glibc 2.28, so it runs on any x86_64 Linux from that
98
105
  version onwards (Ubuntu 20.04, Debian 10, RHEL/AlmaLinux 8 and newer). Not on
@@ -57,16 +57,23 @@ pip install git+https://github.com/thorsten-klein/git-nested
57
57
  #### Method 2: Standalone Executable (no Python needed)
58
58
 
59
59
  Every [release](https://github.com/thorsten-klein/git-nested/releases) ships
60
- `git-nested_x64_Linux.tar.xz`: a single file with git-nested, its dependencies
61
- and a Python interpreter inside. Only git itself has to be installed.
60
+ `git-nested-<version>-x64-linux.tar.xz`: a single file with git-nested, its
61
+ dependencies and a Python interpreter inside. Only git itself has to be
62
+ installed.
62
63
 
63
64
  ```bash
64
- curl -L https://github.com/thorsten-klein/git-nested/releases/latest/download/git-nested_x64_Linux.tar.xz | tar -xJ
65
+ # Find the asset from the latest release
66
+ ASSET=$(curl -sSL https://api.github.com/repos/thorsten-klein/git-nested/releases/latest | grep -o 'https://[^"]*\.tar\.xz')
67
+
68
+ # Download the asset and unpack it
69
+ curl -sSL "$ASSET" | tar -xJ
65
70
  sudo install git-nested /usr/local/bin/ # any directory on PATH works
66
71
  ```
67
72
 
68
73
  The file has to keep the name `git-nested` — that is how `git nested ...`
69
- finds it. The archive also contains the completion scripts from `share/`.
74
+ finds it. The archive also contains a versioned copy of the binary (e.g.
75
+ `git-nested-1.2.3`) that `git-nested` symlinks to, and the completion scripts
76
+ from `share/`.
70
77
 
71
78
  Built on x86_64 with glibc 2.28, so it runs on any x86_64 Linux from that
72
79
  version onwards (Ubuntu 20.04, Debian 10, RHEL/AlmaLinux 8 and newer). Not on
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-nested
3
- Version: 1.0.5
3
+ Version: 1.1.0
4
4
  Summary: Git Submodule Alternative
5
5
  Author-email: Thorsten Klein <thorsten.klein.git@gmail.com>
6
6
  License: MIT
@@ -83,16 +83,23 @@ pip install git+https://github.com/thorsten-klein/git-nested
83
83
  #### Method 2: Standalone Executable (no Python needed)
84
84
 
85
85
  Every [release](https://github.com/thorsten-klein/git-nested/releases) ships
86
- `git-nested_x64_Linux.tar.xz`: a single file with git-nested, its dependencies
87
- and a Python interpreter inside. Only git itself has to be installed.
86
+ `git-nested-<version>-x64-linux.tar.xz`: a single file with git-nested, its
87
+ dependencies and a Python interpreter inside. Only git itself has to be
88
+ installed.
88
89
 
89
90
  ```bash
90
- curl -L https://github.com/thorsten-klein/git-nested/releases/latest/download/git-nested_x64_Linux.tar.xz | tar -xJ
91
+ # Find the asset from the latest release
92
+ ASSET=$(curl -sSL https://api.github.com/repos/thorsten-klein/git-nested/releases/latest | grep -o 'https://[^"]*\.tar\.xz')
93
+
94
+ # Download the asset and unpack it
95
+ curl -sSL "$ASSET" | tar -xJ
91
96
  sudo install git-nested /usr/local/bin/ # any directory on PATH works
92
97
  ```
93
98
 
94
99
  The file has to keep the name `git-nested` — that is how `git nested ...`
95
- finds it. The archive also contains the completion scripts from `share/`.
100
+ finds it. The archive also contains a versioned copy of the binary (e.g.
101
+ `git-nested-1.2.3`) that `git-nested` symlinks to, and the completion scripts
102
+ from `share/`.
96
103
 
97
104
  Built on x86_64 with glibc 2.28, so it runs on any x86_64 Linux from that
98
105
  version onwards (Ubuntu 20.04, Debian 10, RHEL/AlmaLinux 8 and newer). Not on
@@ -2,11 +2,13 @@
2
2
  .fish.rc
3
3
  .gitattributes
4
4
  .gitignore
5
+ .pre-commit-config.yaml
5
6
  .rc
6
7
  CONTRIBUTING.md
7
8
  LICENSE
8
9
  README.md
9
10
  pyproject.toml
11
+ sonar-project.properties
10
12
  uv.lock
11
13
  .github/CODEOWNERS
12
14
  .github/workflows/build-binary.yml
@@ -32,6 +34,7 @@ test/conftest.py
32
34
  test/test_branch.py
33
35
  test/test_clean.py
34
36
  test/test_clone.py
37
+ test/test_commit.py
35
38
  test/test_completion.py
36
39
  test/test_diff.py
37
40
  test/test_encode.py
@@ -50,4 +53,8 @@ test/test_version.py
50
53
  test/scenarios/test_extraction.py
51
54
  test/scenarios/test_filemode.py
52
55
  test/scenarios/test_filter.py
53
- test/unittest/test_logging.py
56
+ test/unittest/conftest.py
57
+ test/unittest/test_command.py
58
+ test/unittest/test_helpers.py
59
+ test/unittest/test_logging.py
60
+ test/unittest/test_repo_business.py