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.
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/build-binary.yml +19 -3
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/release-binary.yml +21 -12
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/test-binary.yml +5 -2
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/test.yml +10 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.gitignore +1 -0
- git_nested-1.1.0/.pre-commit-config.yaml +62 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.rc +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/CONTRIBUTING.md +21 -4
- {git_nested-1.0.5 → git_nested-1.1.0}/PKG-INFO +12 -5
- {git_nested-1.0.5 → git_nested-1.1.0}/README.md +11 -4
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/PKG-INFO +12 -5
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/SOURCES.txt +8 -1
- git_nested-1.1.0/lib/git_nested.py +2690 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/pyproject.toml +57 -1
- {git_nested-1.0.5 → git_nested-1.1.0}/scripts/create-python-exe.sh +25 -12
- git_nested-1.1.0/sonar-project.properties +9 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/conftest.py +141 -133
- {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_filemode.py +6 -7
- {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_filter.py +0 -1
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_branch.py +11 -2
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_clone.py +2 -1
- git_nested-1.1.0/test/test_commit.py +50 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_completion.py +1 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_gitignore.py +1 -1
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_init.py +30 -2
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_nested_in_nested.py +1 -2
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_pull.py +21 -12
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_push.py +61 -6
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_reclone.py +3 -3
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_status.py +3 -3
- git_nested-1.1.0/test/unittest/conftest.py +62 -0
- git_nested-1.1.0/test/unittest/test_command.py +112 -0
- git_nested-1.1.0/test/unittest/test_helpers.py +174 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/unittest/test_logging.py +9 -12
- git_nested-1.1.0/test/unittest/test_repo_business.py +492 -0
- git_nested-1.1.0/uv.lock +2237 -0
- git_nested-1.0.5/lib/git_nested.py +0 -2108
- git_nested-1.0.5/uv.lock +0 -689
- {git_nested-1.0.5 → git_nested-1.1.0}/.codecov.yml +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.fish.rc +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.gitattributes +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/CODEOWNERS +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/.github/workflows/publish.yml +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/LICENSE +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/docs/diagrams.md +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git-nested +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/dependency_links.txt +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/entry_points.txt +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/requires.txt +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/lib/git_nested.egg-info/top_level.txt +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/setup.cfg +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/share/completion.bash +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/share/enable-completion.sh +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/share/git-nested.fish +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/share/zsh-completion/_git-nested +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/scenarios/test_extraction.py +1 -1
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_clean.py +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_diff.py +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_encode.py +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_error.py +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_fetch.py +0 -0
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_rebase.py +2 -2
- {git_nested-1.0.5 → git_nested-1.1.0}/test/test_submodule.py +0 -0
- {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
|
-
|
|
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-
|
|
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
|
|
5
|
-
# release, so git-nested can be
|
|
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
|
|
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
|
|
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
|
|
140
|
+
sh -c '${{ matrix.install }} >/dev/null && export PATH="/work:$PATH" && sh verify.sh'
|
|
138
141
|
|
|
139
142
|
upload:
|
|
140
|
-
|
|
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
|
-
|
|
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-
|
|
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 }}
|
|
@@ -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
|
-
|
|
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
|
-
#
|
|
99
|
-
uv run poe
|
|
100
|
+
# Repo-wide hygiene (whitespace, YAML/TOML/JSON parseability, shebangs, ...)
|
|
101
|
+
uv run poe pre-commit
|
|
100
102
|
|
|
101
|
-
#
|
|
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
|
|
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-
|
|
87
|
-
and a Python interpreter inside. Only git itself has to be
|
|
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
|
-
|
|
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
|
|
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-
|
|
61
|
-
and a Python interpreter inside. Only git itself has to be
|
|
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
|
-
|
|
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
|
|
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
|
|
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-
|
|
87
|
-
and a Python interpreter inside. Only git itself has to be
|
|
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
|
-
|
|
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
|
|
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/
|
|
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
|