git-nested 1.1.1__tar.gz → 1.2.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 (212) hide show
  1. {git_nested-1.1.1 → git_nested-1.2.0}/.github/workflows/build-binary.yml +5 -3
  2. git_nested-1.2.0/.github/workflows/docs.yml +64 -0
  3. git_nested-1.2.0/.github/workflows/prune-artifacts.yml +57 -0
  4. {git_nested-1.1.1 → git_nested-1.2.0}/.github/workflows/publish.yml +3 -3
  5. {git_nested-1.1.1 → git_nested-1.2.0}/.github/workflows/release-binary.yml +3 -3
  6. {git_nested-1.1.1 → git_nested-1.2.0}/.github/workflows/test-binary.yml +2 -2
  7. {git_nested-1.1.1 → git_nested-1.2.0}/.github/workflows/test.yml +22 -11
  8. {git_nested-1.1.1 → git_nested-1.2.0}/.gitignore +1 -0
  9. {git_nested-1.1.1 → git_nested-1.2.0}/.pre-commit-config.yaml +0 -3
  10. git_nested-1.2.0/CONTRIBUTING.md +19 -0
  11. git_nested-1.2.0/PKG-INFO +131 -0
  12. git_nested-1.2.0/README.md +105 -0
  13. git_nested-1.2.0/doc/README.md +60 -0
  14. git_nested-1.2.0/doc/_static/custom.css +102 -0
  15. git_nested-1.2.0/doc/_static/custom.js +40 -0
  16. git_nested-1.2.0/doc/_templates/layout.html +19 -0
  17. git_nested-1.2.0/doc/architecture/diagrams.md +860 -0
  18. git_nested-1.2.0/doc/architecture/index.md +127 -0
  19. git_nested-1.2.0/doc/cli/branch.md +94 -0
  20. git_nested-1.2.0/doc/cli/clean.md +53 -0
  21. git_nested-1.2.0/doc/cli/clone.md +121 -0
  22. git_nested-1.2.0/doc/cli/commit.md +53 -0
  23. git_nested-1.2.0/doc/cli/completion.md +47 -0
  24. git_nested-1.2.0/doc/cli/config.md +69 -0
  25. git_nested-1.2.0/doc/cli/diff.md +54 -0
  26. git_nested-1.2.0/doc/cli/environment-variables.md +19 -0
  27. git_nested-1.2.0/doc/cli/fetch.md +59 -0
  28. git_nested-1.2.0/doc/cli/index.md +139 -0
  29. git_nested-1.2.0/doc/cli/init.md +103 -0
  30. git_nested-1.2.0/doc/cli/pull.md +130 -0
  31. git_nested-1.2.0/doc/cli/push.md +141 -0
  32. git_nested-1.2.0/doc/cli/repair.md +54 -0
  33. git_nested-1.2.0/doc/cli/run.md +42 -0
  34. git_nested-1.2.0/doc/cli/status.md +87 -0
  35. git_nested-1.2.0/doc/cli/version.md +29 -0
  36. git_nested-1.2.0/doc/concepts/comparison.md +63 -0
  37. git_nested-1.2.0/doc/concepts/glossary.md +81 -0
  38. git_nested-1.2.0/doc/concepts/how-it-works.md +163 -0
  39. git_nested-1.2.0/doc/conf.py +119 -0
  40. git_nested-1.2.0/doc/configuration/git-config.md +43 -0
  41. git_nested-1.2.0/doc/configuration/gitnested-file.md +137 -0
  42. git_nested-1.2.0/doc/contributing/development.md +116 -0
  43. git_nested-1.2.0/doc/contributing/documentation.md +81 -0
  44. git_nested-1.2.0/doc/guides/adopt.md +45 -0
  45. git_nested-1.2.0/doc/guides/conflicts.md +83 -0
  46. git_nested-1.2.0/doc/guides/hooks-and-signing.md +47 -0
  47. git_nested-1.2.0/doc/guides/many.md +79 -0
  48. git_nested-1.2.0/doc/guides/nested-in-nested.md +55 -0
  49. git_nested-1.2.0/doc/guides/partial.md +66 -0
  50. git_nested-1.2.0/doc/guides/pin.md +53 -0
  51. git_nested-1.2.0/doc/guides/squash-merges.md +54 -0
  52. git_nested-1.2.0/doc/guides/submodules.md +49 -0
  53. git_nested-1.2.0/doc/index.md +185 -0
  54. git_nested-1.2.0/doc/introduction/index.md +69 -0
  55. git_nested-1.2.0/doc/introduction/install.md +158 -0
  56. git_nested-1.2.0/doc/quickstart/05-minutes.md +222 -0
  57. git_nested-1.2.0/doc/quickstart/everyday.md +105 -0
  58. {git_nested-1.1.1 → git_nested-1.2.0}/man/man1/git-nested.1 +62 -1
  59. {git_nested-1.1.1 → git_nested-1.2.0}/pyproject.toml +26 -4
  60. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/__init__.py +0 -6
  61. git_nested-1.2.0/src/git_nested/_compat.py +49 -0
  62. git_nested-1.2.0/src/git_nested/checks.py +95 -0
  63. git_nested-1.2.0/src/git_nested/cli/app.py +80 -0
  64. git_nested-1.2.0/src/git_nested/cli/location.py +108 -0
  65. git_nested-1.2.0/src/git_nested/cli/parser.py +154 -0
  66. git_nested-1.2.0/src/git_nested/cli/setup.py +77 -0
  67. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/cli/spec.py +201 -14
  68. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/commands/__init__.py +4 -0
  69. git_nested-1.2.0/src/git_nested/commands/branch.py +133 -0
  70. git_nested-1.2.0/src/git_nested/commands/clean.py +81 -0
  71. git_nested-1.2.0/src/git_nested/commands/clone.py +231 -0
  72. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/commands/commit.py +10 -19
  73. git_nested-1.2.0/src/git_nested/commands/config.py +68 -0
  74. git_nested-1.2.0/src/git_nested/commands/diff.py +33 -0
  75. git_nested-1.2.0/src/git_nested/commands/fetch.py +78 -0
  76. git_nested-1.2.0/src/git_nested/commands/init.py +104 -0
  77. git_nested-1.2.0/src/git_nested/commands/pull.py +247 -0
  78. git_nested-1.2.0/src/git_nested/commands/push.py +282 -0
  79. git_nested-1.2.0/src/git_nested/commands/repair.py +53 -0
  80. git_nested-1.2.0/src/git_nested/commands/run.py +36 -0
  81. git_nested-1.2.0/src/git_nested/commands/status.py +145 -0
  82. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/completion/__init__.py +20 -52
  83. git_nested-1.2.0/src/git_nested/content.py +162 -0
  84. git_nested-1.2.0/src/git_nested/discovery.py +102 -0
  85. git_nested-1.2.0/src/git_nested/filters.py +117 -0
  86. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/git.py +29 -30
  87. git_nested-1.2.0/src/git_nested/gitfile.py +147 -0
  88. git_nested-1.2.0/src/git_nested/history.py +353 -0
  89. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/messages.py +36 -20
  90. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/models.py +48 -24
  91. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/output.py +47 -8
  92. git_nested-1.2.0/src/git_nested/refs.py +111 -0
  93. git_nested-1.2.0/src/git_nested/submodules.py +58 -0
  94. git_nested-1.2.0/src/git_nested/worktree.py +74 -0
  95. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/yamlio.py +6 -3
  96. git_nested-1.2.0/src/git_nested.egg-info/PKG-INFO +131 -0
  97. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/SOURCES.txt +62 -3
  98. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/scm_file_list.json +62 -3
  99. git_nested-1.2.0/src/git_nested.egg-info/scm_version.json +8 -0
  100. {git_nested-1.1.1 → git_nested-1.2.0}/tests/conftest.py +59 -8
  101. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/scenarios/test_extraction.py +4 -4
  102. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/scenarios/test_filemode.py +24 -7
  103. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/scenarios/test_filter.py +69 -15
  104. git_nested-1.2.0/tests/e2e/test_branch.py +577 -0
  105. git_nested-1.2.0/tests/e2e/test_clean.py +94 -0
  106. git_nested-1.2.0/tests/e2e/test_clone.py +261 -0
  107. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_commit.py +25 -4
  108. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_completion.py +39 -16
  109. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_config.py +23 -3
  110. git_nested-1.2.0/tests/e2e/test_detached.py +21 -0
  111. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_diff.py +27 -15
  112. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_encode.py +16 -9
  113. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_error.py +31 -27
  114. git_nested-1.2.0/tests/e2e/test_exclude.py +75 -0
  115. git_nested-1.2.0/tests/e2e/test_fetch.py +60 -0
  116. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_gitignore.py +2 -2
  117. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_init.py +52 -3
  118. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_nested_in_nested.py +73 -20
  119. git_nested-1.2.0/tests/e2e/test_non_ascii.py +24 -0
  120. git_nested-1.2.0/tests/e2e/test_pin.py +51 -0
  121. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_pull.py +214 -30
  122. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_push.py +353 -20
  123. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_rebase.py +7 -14
  124. git_nested-1.2.0/tests/e2e/test_reclone.py +141 -0
  125. git_nested-1.2.0/tests/e2e/test_repair.py +196 -0
  126. git_nested-1.2.0/tests/e2e/test_run.py +73 -0
  127. git_nested-1.2.0/tests/e2e/test_signing.py +42 -0
  128. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_status.py +53 -16
  129. git_nested-1.2.0/tests/e2e/test_subdirectory.py +160 -0
  130. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_submodule.py +4 -1
  131. git_nested-1.2.0/tests/e2e/test_submodules.py +123 -0
  132. git_nested-1.2.0/tests/e2e/test_upstream_path.py +64 -0
  133. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/fakes.py +0 -4
  134. git_nested-1.2.0/tests/unit/test_adopt.py +145 -0
  135. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/test_command.py +62 -24
  136. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/test_completion_engine.py +24 -13
  137. git_nested-1.2.0/tests/unit/test_docs.py +98 -0
  138. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/test_helpers.py +95 -54
  139. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/test_logging.py +56 -18
  140. git_nested-1.2.0/tests/unit/test_repo_business.py +568 -0
  141. git_nested-1.2.0/uv.lock +2020 -0
  142. git_nested-1.1.1/CONTRIBUTING.md +0 -95
  143. git_nested-1.1.1/PKG-INFO +0 -506
  144. git_nested-1.1.1/README.md +0 -480
  145. git_nested-1.1.1/docs/diagrams.md +0 -578
  146. git_nested-1.1.1/src/git_nested/_compat.py +0 -32
  147. git_nested-1.1.1/src/git_nested/checks.py +0 -104
  148. git_nested-1.1.1/src/git_nested/cli/app.py +0 -109
  149. git_nested-1.1.1/src/git_nested/cli/parser.py +0 -170
  150. git_nested-1.1.1/src/git_nested/cli/setup.py +0 -103
  151. git_nested-1.1.1/src/git_nested/commands/branch.py +0 -37
  152. git_nested-1.1.1/src/git_nested/commands/clean.py +0 -55
  153. git_nested-1.1.1/src/git_nested/commands/clone.py +0 -160
  154. git_nested-1.1.1/src/git_nested/commands/config.py +0 -104
  155. git_nested-1.1.1/src/git_nested/commands/diff.py +0 -53
  156. git_nested-1.1.1/src/git_nested/commands/fetch.py +0 -49
  157. git_nested-1.1.1/src/git_nested/commands/init.py +0 -81
  158. git_nested-1.1.1/src/git_nested/commands/pull.py +0 -234
  159. git_nested-1.1.1/src/git_nested/commands/push.py +0 -329
  160. git_nested-1.1.1/src/git_nested/commands/status.py +0 -184
  161. git_nested-1.1.1/src/git_nested/content.py +0 -199
  162. git_nested-1.1.1/src/git_nested/discovery.py +0 -76
  163. git_nested-1.1.1/src/git_nested/filters.py +0 -164
  164. git_nested-1.1.1/src/git_nested/gitfile.py +0 -194
  165. git_nested-1.1.1/src/git_nested/history.py +0 -224
  166. git_nested-1.1.1/src/git_nested/refs.py +0 -58
  167. git_nested-1.1.1/src/git_nested/repo.py +0 -56
  168. git_nested-1.1.1/src/git_nested/worktree.py +0 -40
  169. git_nested-1.1.1/src/git_nested.egg-info/PKG-INFO +0 -506
  170. git_nested-1.1.1/src/git_nested.egg-info/scm_version.json +0 -8
  171. git_nested-1.1.1/tests/e2e/test_branch.py +0 -300
  172. git_nested-1.1.1/tests/e2e/test_clean.py +0 -32
  173. git_nested-1.1.1/tests/e2e/test_clone.py +0 -114
  174. git_nested-1.1.1/tests/e2e/test_fetch.py +0 -33
  175. git_nested-1.1.1/tests/e2e/test_reclone.py +0 -36
  176. git_nested-1.1.1/tests/unit/test_docs.py +0 -39
  177. git_nested-1.1.1/tests/unit/test_facade.py +0 -97
  178. git_nested-1.1.1/tests/unit/test_repo_business.py +0 -469
  179. git_nested-1.1.1/uv.lock +0 -1491
  180. {git_nested-1.1.1 → git_nested-1.2.0}/.codecov.yml +0 -0
  181. {git_nested-1.1.1 → git_nested-1.2.0}/.fish.rc +0 -0
  182. {git_nested-1.1.1 → git_nested-1.2.0}/.gitattributes +0 -0
  183. {git_nested-1.1.1 → git_nested-1.2.0}/.github/CODEOWNERS +0 -0
  184. {git_nested-1.1.1 → git_nested-1.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  185. {git_nested-1.1.1 → git_nested-1.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  186. {git_nested-1.1.1 → git_nested-1.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  187. {git_nested-1.1.1 → git_nested-1.2.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  188. {git_nested-1.1.1 → git_nested-1.2.0}/.github/dependabot.yml +0 -0
  189. {git_nested-1.1.1 → git_nested-1.2.0}/.github/release.yml +0 -0
  190. {git_nested-1.1.1 → git_nested-1.2.0}/.rc +0 -0
  191. {git_nested-1.1.1 → git_nested-1.2.0}/LICENSE +0 -0
  192. {git_nested-1.1.1 → git_nested-1.2.0}/SECURITY.md +0 -0
  193. {git_nested-1.1.1 → git_nested-1.2.0}/bin/git-nested +0 -0
  194. {git_nested-1.1.1 → git_nested-1.2.0}/scripts/create-python-exe.sh +0 -0
  195. {git_nested-1.1.1 → git_nested-1.2.0}/setup.cfg +0 -0
  196. {git_nested-1.1.1 → git_nested-1.2.0}/sonar-project.properties +0 -0
  197. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/__main__.py +0 -0
  198. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/_version.py +0 -0
  199. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/cli/__init__.py +0 -0
  200. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/cli/main.py +0 -0
  201. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/commands/completion.py +0 -0
  202. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/commands/version.py +0 -0
  203. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/completion/scripts.py +0 -0
  204. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/constants.py +0 -0
  205. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/errors.py +0 -0
  206. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested/py.typed +0 -0
  207. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/dependency_links.txt +0 -0
  208. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/entry_points.txt +0 -0
  209. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/requires.txt +0 -0
  210. {git_nested-1.1.1 → git_nested-1.2.0}/src/git_nested.egg-info/top_level.txt +0 -0
  211. {git_nested-1.1.1 → git_nested-1.2.0}/tests/e2e/test_version.py +0 -0
  212. {git_nested-1.1.1 → git_nested-1.2.0}/tests/unit/conftest.py +0 -0
@@ -23,10 +23,10 @@ on:
23
23
  required: false
24
24
  default: git-nested-binary
25
25
  runs-on:
26
- description: 'Runner to build on -- ubuntu-latest, macos-latest, windows-latest'
26
+ description: 'Runner to build on -- ubuntu-26.04, macos-latest, windows-latest'
27
27
  type: string
28
28
  required: false
29
- default: ubuntu-latest
29
+ default: ubuntu-26.04
30
30
  container:
31
31
  description: 'Container to build inside (Linux only). Empty: build on the runner itself.'
32
32
  type: string
@@ -54,7 +54,7 @@ jobs:
54
54
  # For Linux the default is almalinux:8, and that is a portability
55
55
  # decision, not a convenience one: a PyInstaller binary links the glibc of
56
56
  # the machine that built it, and glibc is only backward compatible, so
57
- # built on ubuntu-latest it would refuse to start on anything older than
57
+ # built on ubuntu-26.04 it would refuse to start on anything older than
58
58
  # that runner. AlmaLinux 8 has glibc 2.28, the oldest that still runs the
59
59
  # node20 the actions below need, which covers every distro from Ubuntu
60
60
  # 20.04 / Debian 10 / Fedora 29 / RHEL 8 onwards. glibc-based distros only
@@ -135,3 +135,5 @@ jobs:
135
135
  dist/*.tar.xz
136
136
  dist/*.zip
137
137
  if-no-files-found: error
138
+ # main keeps its builds for a month, branch and PR builds only for two days.
139
+ retention-days: ${{ github.ref == 'refs/heads/main' && 30 || 2 }}
@@ -0,0 +1,64 @@
1
+ name: Docs
2
+
3
+ # Builds doc/ (see doc/conf.py) with Sphinx. On pull requests it only
4
+ # builds, so a broken page fails the check. On main it also publishes the
5
+ # site to the gh_pages branch, which GitHub Pages serves.
6
+ on:
7
+ push:
8
+ branches: [main]
9
+ pull_request:
10
+ branches: ['**']
11
+ # by hand: 'Run workflow' in the Actions tab, or `gh workflow run docs.yml`
12
+ workflow_dispatch:
13
+
14
+ concurrency:
15
+ group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
16
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
17
+
18
+ jobs:
19
+ build:
20
+ runs-on: ubuntu-26.04
21
+ steps:
22
+ - name: Checkout code
23
+ uses: actions/checkout@v7
24
+ with:
25
+ # doc/conf.py shows the version from `git describe`, which needs the tags.
26
+ fetch-depth: 0
27
+ - name: Install uv
28
+ uses: astral-sh/setup-uv@v10.3.0
29
+ with:
30
+ python-version: '3.14'
31
+ enable-cache: true
32
+ - name: Setup project
33
+ run: uv sync --frozen
34
+ - name: Build docs
35
+ run: uv run poe docs
36
+ - name: Upload docs
37
+ if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
38
+ uses: actions/upload-artifact@v7
39
+ with:
40
+ name: docs-html
41
+ path: doc/_build/html
42
+ include-hidden-files: true
43
+
44
+ # A job of its own, so only this one can write to the repository.
45
+ # Only main is published, also when the workflow is started by hand.
46
+ publish:
47
+ if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
48
+ needs: build
49
+ runs-on: ubuntu-26.04
50
+ permissions:
51
+ contents: write
52
+ steps:
53
+ - name: Download docs
54
+ uses: actions/download-artifact@v8
55
+ with:
56
+ name: docs-html
57
+ path: site
58
+ - name: Publish docs
59
+ uses: peaceiris/actions-gh-pages@v4
60
+ with:
61
+ github_token: ${{ secrets.GITHUB_TOKEN }}
62
+ publish_branch: gh_pages
63
+ publish_dir: site
64
+ force_orphan: true
@@ -0,0 +1,57 @@
1
+ name: Prune artifacts
2
+
3
+ # Caps how many binary artifacts pile up against the repository's Actions
4
+ # storage quota, per artifact name and branch: main keeps its newest 3 builds,
5
+ # every other branch (PR branches included) only its newest 1. The upload
6
+ # step's retention-days (30 days main, 2 days elsewhere) is only an upper
7
+ # bound; this caps the count as well.
8
+ #
9
+ # Runs once the workflows that build the artifacts have finished, so the
10
+ # artifact of the run that triggered it already exists and the caps hold
11
+ # exactly. workflow_run only fires for workflow files on the default branch,
12
+ # so changes to this file take effect once merged.
13
+ on:
14
+ workflow_run:
15
+ workflows:
16
+ - Run Tests
17
+ - Release binary
18
+ types:
19
+ - completed
20
+ # on-demand -- 'Run workflow' in the Actions tab, or `gh workflow run prune-artifacts.yml`
21
+ workflow_dispatch:
22
+ inputs:
23
+ keep:
24
+ description: 'How many of the newest main artifacts to keep per artifact name (other branches keep 1)'
25
+ type: number
26
+ default: 3
27
+
28
+ permissions:
29
+ actions: write
30
+
31
+ # two prunes at once would only race each other deleting the same artifacts.
32
+ concurrency:
33
+ group: ${{ github.workflow }}
34
+ cancel-in-progress: false
35
+
36
+ jobs:
37
+ prune:
38
+ runs-on: ubuntu-26.04
39
+ steps:
40
+ - name: Delete all but the newest builds
41
+ env:
42
+ GH_TOKEN: ${{ github.token }}
43
+ REPO: ${{ github.repository }}
44
+ KEEP: ${{ inputs.keep || 3 }}
45
+ run: |
46
+ # Per artifact name and branch ("git-nested-binary-ci-linux" on
47
+ # "main", ...), newest first; everything after the first $KEEP on
48
+ # main, or after the first 1 on any other branch, is deleted. Other
49
+ # artifacts (dist) are not touched.
50
+ gh api --paginate "repos/$REPO/actions/artifacts?per_page=100" \
51
+ --jq '.artifacts[] | select(.expired == false) | select(.name | startswith("git-nested-binary-")) | [.name + " " + .workflow_run.head_branch, .created_at, .id, .workflow_run.head_branch] | @tsv' \
52
+ | sort -t $'\t' -k1,1 -k2,2r \
53
+ | awk -F'\t' -v keep="$KEEP" '{ if (++n[$1] > ($4 == "main" ? keep : 1)) print $3, $1 }' \
54
+ | while read -r id name; do
55
+ echo "delete $name (artifact $id)"
56
+ gh api -X DELETE "repos/$REPO/actions/artifacts/$id"
57
+ done
@@ -6,14 +6,14 @@ on:
6
6
 
7
7
  jobs:
8
8
  build:
9
- runs-on: ubuntu-latest
9
+ runs-on: ubuntu-26.04
10
10
  steps:
11
11
  - name: Checkout code
12
12
  uses: actions/checkout@v7
13
13
  with:
14
14
  fetch-depth: 0
15
15
  - name: Install uv
16
- uses: astral-sh/setup-uv@v7
16
+ uses: astral-sh/setup-uv@v10.3.0
17
17
  with:
18
18
  python-version: '3.13'
19
19
  enable-cache: true
@@ -29,7 +29,7 @@ jobs:
29
29
 
30
30
  publish:
31
31
  needs: build
32
- runs-on: ubuntu-latest
32
+ runs-on: ubuntu-26.04
33
33
  environment:
34
34
  name: pypi
35
35
  url: https://pypi.org/project/git-nested/
@@ -47,7 +47,7 @@ jobs:
47
47
  # Intel macOS is deliberately absent: those runners are gone, and
48
48
  # the arm64 binary is what a current Mac needs.
49
49
  - target: linux
50
- runs-on: ubuntu-latest
50
+ runs-on: ubuntu-26.04
51
51
  container: almalinux:8
52
52
  - target: macos
53
53
  runs-on: macos-latest
@@ -76,7 +76,7 @@ jobs:
76
76
  # and has to drive a real nested repo end to end there.
77
77
  verify:
78
78
  needs: build
79
- runs-on: ubuntu-latest
79
+ runs-on: ubuntu-26.04
80
80
  strategy:
81
81
  fail-fast: false
82
82
  matrix:
@@ -163,7 +163,7 @@ jobs:
163
163
  needs: [build, test, verify]
164
164
  # nothing to attach when workflow_dispatch ran without a tag
165
165
  if: github.event_name == 'release' || inputs.tag != ''
166
- runs-on: ubuntu-latest
166
+ runs-on: ubuntu-26.04
167
167
  permissions:
168
168
  contents: write
169
169
  steps:
@@ -28,7 +28,7 @@ on:
28
28
 
29
29
  jobs:
30
30
  test:
31
- runs-on: ubuntu-latest
31
+ runs-on: ubuntu-26.04
32
32
  steps:
33
33
  - uses: actions/checkout@v7
34
34
  with:
@@ -38,7 +38,7 @@ jobs:
38
38
  # tags of this checkout.
39
39
 
40
40
  - name: Install uv
41
- uses: astral-sh/setup-uv@v7
41
+ uses: astral-sh/setup-uv@v10.3.0
42
42
  with:
43
43
  python-version: '3.13'
44
44
  enable-cache: true
@@ -6,13 +6,14 @@ on:
6
6
  pull_request:
7
7
  branches: ['**']
8
8
 
9
- # One run per branch/PR at a time -- a new commit cancels whatever this
10
- # workflow is still running for the same ref. Not on main: every push there
11
- # is a merge, and each one should run to completion rather than being
12
- # canceled by the next.
9
+ # One run per branch/PR at a time. On a PR a newer push cancels the run in
10
+ # progress: only the newest commit's results matter there, and waiting for a
11
+ # superseded run would hold its checks back by the length of a whole run. On
12
+ # main every run finishes, so each merged commit keeps its full results (a
13
+ # newer push waits; only the newest waiting run is kept).
13
14
  concurrency:
14
15
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
15
- cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
16
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
16
17
 
17
18
  jobs:
18
19
  # Builds the standalone executable with the very script the release uses
@@ -29,7 +30,7 @@ jobs:
29
30
  # Intel macOS is deliberately absent: those runners are gone, and
30
31
  # the arm64 binary is what a current Mac needs.
31
32
  - target: linux
32
- runs-on: ubuntu-latest
33
+ runs-on: ubuntu-26.04
33
34
  container: almalinux:8
34
35
  - target: macos
35
36
  runs-on: macos-latest
@@ -56,9 +57,17 @@ jobs:
56
57
 
57
58
  test:
58
59
  runs-on: ${{ matrix.os }}
60
+ # The steps are written for bash; on windows-latest the default would be
61
+ # PowerShell. Git for Windows ships bash on every runner.
62
+ defaults:
63
+ run:
64
+ shell: bash
59
65
  strategy:
66
+ # One OS failing must not cancel the others: a Windows-only break should
67
+ # still show whether Linux and macOS pass.
68
+ fail-fast: false
60
69
  matrix:
61
- os: [ubuntu-latest, macos-latest]
70
+ os: [ubuntu-26.04, macos-latest, windows-latest]
62
71
  python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
63
72
 
64
73
  steps:
@@ -70,7 +79,7 @@ jobs:
70
79
  # checkout.
71
80
  fetch-depth: 0
72
81
  - name: Install uv
73
- uses: astral-sh/setup-uv@v7
82
+ uses: astral-sh/setup-uv@v10.3.0
74
83
  with:
75
84
  python-version: ${{ matrix.python-version }}
76
85
  enable-cache: true
@@ -86,17 +95,19 @@ jobs:
86
95
  - name: Run poe all
87
96
  run: uv run poe all
88
97
  - name: Upload coverage reports to Codecov
89
- if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.14'
98
+ if: matrix.os == 'ubuntu-26.04' && matrix.python-version == '3.14'
90
99
  uses: codecov/codecov-action@v7
91
100
  with:
92
101
  token: ${{ secrets.CODECOV_TOKEN }}
93
102
  - name: Upload test results to Codecov
94
103
  if: ${{ !cancelled() }}
95
- uses: codecov/test-results-action@v1
104
+ uses: codecov/codecov-action@v7
96
105
  with:
97
106
  token: ${{ secrets.CODECOV_TOKEN }}
107
+ report_type: test_results
108
+ files: junit.xml
98
109
  - name: SonarCloud Scan
99
- if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.14'
110
+ if: matrix.os == 'ubuntu-26.04' && matrix.python-version == '3.14'
100
111
  uses: SonarSource/sonarqube-scan-action@v8
101
112
  env:
102
113
  SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -6,6 +6,7 @@ __pycache__
6
6
  *.egg-info/
7
7
  dist/
8
8
  build/
9
+ doc/_build/
9
10
  .pytest_cache/
10
11
  .coverage
11
12
  htmlcov/
@@ -55,9 +55,6 @@ repos:
55
55
 
56
56
 
57
57
  # Configuration
58
- default_language_version:
59
- python: python3.12
60
-
61
58
  # Minimum pre-commit version -- matches the floor pyproject.toml's `lint`
62
59
  # dependency group pins.
63
60
  minimum_pre_commit_version: '4.0.0'
@@ -0,0 +1,19 @@
1
+ # Contributing to git-nested
2
+
3
+ Thank you for helping!
4
+
5
+ - [Development](doc/contributing/development.md): setup, tests, checks and
6
+ commit messages.
7
+ - [Documentation](doc/contributing/documentation.md): how to write and build
8
+ the docs.
9
+ - [Architecture](doc/architecture/index.md): how the code is built.
10
+
11
+ The short version:
12
+
13
+ ```bash
14
+ uv sync # install everything
15
+ uv run poe all # every check CI runs
16
+ ```
17
+
18
+ For security problems, see [SECURITY.md](SECURITY.md). Do not open a public
19
+ issue.
@@ -0,0 +1,131 @@
1
+ Metadata-Version: 2.4
2
+ Name: git-nested
3
+ Version: 1.2.0
4
+ Summary: Git Submodule Alternative
5
+ Author-email: Thorsten Klein <thorsten.klein.git@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/thorsten-klein/git-nested
8
+ Project-URL: Documentation, https://thorsten-klein.github.io/git-nested/
9
+ Project-URL: Repository, https://github.com/thorsten-klein/git-nested
10
+ Project-URL: Issues, https://github.com/thorsten-klein/git-nested/issues
11
+ Keywords: git,nested,submodule,nested
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Topic :: Software Development :: Version Control :: Git
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: PyYAML<7,>=6.0
25
+ Dynamic: license-file
26
+
27
+ # git-nested
28
+
29
+ > An alternative to git-submodule and git-subtree for managing nested repositories.
30
+
31
+ [![Test](https://github.com/thorsten-klein/git-nested/actions/workflows/test.yml/badge.svg)](https://github.com/thorsten-klein/git-nested/actions/workflows/test.yml)
32
+ [![Docs](https://github.com/thorsten-klein/git-nested/actions/workflows/docs.yml/badge.svg)](https://thorsten-klein.github.io/git-nested/)
33
+ [![codecov](https://codecov.io/gh/thorsten-klein/git-nested/branch/main/graph/badge.svg)](https://codecov.io/gh/thorsten-klein/git-nested)
34
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=thorsten-klein_git-nested&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=thorsten-klein_git-nested)
35
+ [![PyPI](https://img.shields.io/pypi/v/git-nested.svg)](https://pypi.org/project/git-nested/)
36
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
37
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
38
+
39
+ **📖 Documentation: <https://thorsten-klein.github.io/git-nested/>**
40
+
41
+ ## What is git-nested?
42
+
43
+ git-nested puts another git repository into a folder of your repository.
44
+ The files are ordinary files in ordinary commits. You can still pull new
45
+ changes from the other repository, and push your changes back to it.
46
+
47
+ ```bash
48
+ git nested clone https://github.com/user/lib ext/lib # copy it in
49
+ git nested pull ext/lib # get new upstream changes
50
+ git nested push ext/lib # send your changes back
51
+ git nested status # see where everything stands
52
+ ```
53
+
54
+ A small `.gitnested` file in the folder remembers the URL, the branch and
55
+ the upstream commit. So the commands stay short.
56
+
57
+ ## Why git-nested?
58
+
59
+ - **Self-contained.** Your repository has all files. A plain `git clone`
60
+ gets everything. No access to the other repositories is needed.
61
+ - **Simple.** The commands feel like git.
62
+ - **Clean history.** By default one pull is one commit.
63
+ - **Flexible.** Each branch can have its nested repositories in another
64
+ state.
65
+ - **Safe to try.** Everything is a normal commit. `git reset` undoes it.
66
+
67
+ Only people who pull or push nested repositories need git-nested. See
68
+ [Compared to submodule and subtree](https://github.com/thorsten-klein/git-nested/blob/main/doc/concepts/comparison.md).
69
+
70
+ ## Install
71
+
72
+ ```bash
73
+ pip install git-nested
74
+ ```
75
+
76
+ git 2.23 and Python 3.10 or newer are needed. There is also a
77
+ [standalone executable](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/install.md#standalone-executable)
78
+ that needs no Python. See [Install git-nested](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/install.md)
79
+ for all ways, shell completion and the manual page.
80
+
81
+ ## Documentation
82
+
83
+ The full documentation is in [`doc/`](https://github.com/thorsten-klein/git-nested/blob/main/doc/README.md), and online at
84
+ <https://thorsten-klein.github.io/git-nested/>.
85
+
86
+ - [About git-nested](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/index.md)
87
+ - [git-nested in 5 minutes](https://github.com/thorsten-klein/git-nested/blob/main/doc/quickstart/05-minutes.md)
88
+ - [Everyday tasks](https://github.com/thorsten-klein/git-nested/blob/main/doc/quickstart/everyday.md)
89
+ - [How it works](https://github.com/thorsten-klein/git-nested/blob/main/doc/concepts/how-it-works.md)
90
+ - [Command reference](https://github.com/thorsten-klein/git-nested/blob/main/doc/cli/index.md)
91
+ - [The `.gitnested` file](https://github.com/thorsten-klein/git-nested/blob/main/doc/configuration/gitnested-file.md)
92
+ - [Guides](https://github.com/thorsten-klein/git-nested/blob/main/doc/README.md#guides): conflicts, partial upstreams, pins,
93
+ submodules and more
94
+
95
+ Help on the command line:
96
+
97
+ ```bash
98
+ git nested --help # the manual page
99
+ git nested pull --help # one command: what it does, its options, examples
100
+ ```
101
+
102
+ ## Contributing
103
+
104
+ Pull requests are welcome. See [Development](https://github.com/thorsten-klein/git-nested/blob/main/doc/contributing/development.md)
105
+ for the setup and the checks. The short version:
106
+
107
+ ```bash
108
+ uv sync # install everything
109
+ uv run poe all # every check CI runs
110
+ ```
111
+
112
+ Report security problems as described in [SECURITY.md](https://github.com/thorsten-klein/git-nested/blob/main/SECURITY.md).
113
+
114
+ ## Authors
115
+
116
+ **git-nested:**
117
+ - **Thorsten Klein** - Python rewrite and enhancements
118
+
119
+ **Original [git-subrepo](https://github.com/ingydotnet/git-subrepo) authors:**
120
+ - **Ingy döt Net** - Original concept and implementation
121
+ - **Magnus Carlsson** - Contributor
122
+ - **Austin Morgan** - Contributor
123
+
124
+ ## License
125
+
126
+ MIT. See [LICENSE](https://github.com/thorsten-klein/git-nested/blob/main/LICENSE).
127
+
128
+ ## Acknowledgments
129
+
130
+ This project is based on [git-subrepo](https://github.com/ingydotnet/git-subrepo) by Ingy döt Net.
131
+ git-nested is a Python rewrite with some modified features and improvements.
@@ -0,0 +1,105 @@
1
+ # git-nested
2
+
3
+ > An alternative to git-submodule and git-subtree for managing nested repositories.
4
+
5
+ [![Test](https://github.com/thorsten-klein/git-nested/actions/workflows/test.yml/badge.svg)](https://github.com/thorsten-klein/git-nested/actions/workflows/test.yml)
6
+ [![Docs](https://github.com/thorsten-klein/git-nested/actions/workflows/docs.yml/badge.svg)](https://thorsten-klein.github.io/git-nested/)
7
+ [![codecov](https://codecov.io/gh/thorsten-klein/git-nested/branch/main/graph/badge.svg)](https://codecov.io/gh/thorsten-klein/git-nested)
8
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=thorsten-klein_git-nested&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=thorsten-klein_git-nested)
9
+ [![PyPI](https://img.shields.io/pypi/v/git-nested.svg)](https://pypi.org/project/git-nested/)
10
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
11
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
12
+
13
+ **📖 Documentation: <https://thorsten-klein.github.io/git-nested/>**
14
+
15
+ ## What is git-nested?
16
+
17
+ git-nested puts another git repository into a folder of your repository.
18
+ The files are ordinary files in ordinary commits. You can still pull new
19
+ changes from the other repository, and push your changes back to it.
20
+
21
+ ```bash
22
+ git nested clone https://github.com/user/lib ext/lib # copy it in
23
+ git nested pull ext/lib # get new upstream changes
24
+ git nested push ext/lib # send your changes back
25
+ git nested status # see where everything stands
26
+ ```
27
+
28
+ A small `.gitnested` file in the folder remembers the URL, the branch and
29
+ the upstream commit. So the commands stay short.
30
+
31
+ ## Why git-nested?
32
+
33
+ - **Self-contained.** Your repository has all files. A plain `git clone`
34
+ gets everything. No access to the other repositories is needed.
35
+ - **Simple.** The commands feel like git.
36
+ - **Clean history.** By default one pull is one commit.
37
+ - **Flexible.** Each branch can have its nested repositories in another
38
+ state.
39
+ - **Safe to try.** Everything is a normal commit. `git reset` undoes it.
40
+
41
+ Only people who pull or push nested repositories need git-nested. See
42
+ [Compared to submodule and subtree](https://github.com/thorsten-klein/git-nested/blob/main/doc/concepts/comparison.md).
43
+
44
+ ## Install
45
+
46
+ ```bash
47
+ pip install git-nested
48
+ ```
49
+
50
+ git 2.23 and Python 3.10 or newer are needed. There is also a
51
+ [standalone executable](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/install.md#standalone-executable)
52
+ that needs no Python. See [Install git-nested](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/install.md)
53
+ for all ways, shell completion and the manual page.
54
+
55
+ ## Documentation
56
+
57
+ The full documentation is in [`doc/`](https://github.com/thorsten-klein/git-nested/blob/main/doc/README.md), and online at
58
+ <https://thorsten-klein.github.io/git-nested/>.
59
+
60
+ - [About git-nested](https://github.com/thorsten-klein/git-nested/blob/main/doc/introduction/index.md)
61
+ - [git-nested in 5 minutes](https://github.com/thorsten-klein/git-nested/blob/main/doc/quickstart/05-minutes.md)
62
+ - [Everyday tasks](https://github.com/thorsten-klein/git-nested/blob/main/doc/quickstart/everyday.md)
63
+ - [How it works](https://github.com/thorsten-klein/git-nested/blob/main/doc/concepts/how-it-works.md)
64
+ - [Command reference](https://github.com/thorsten-klein/git-nested/blob/main/doc/cli/index.md)
65
+ - [The `.gitnested` file](https://github.com/thorsten-klein/git-nested/blob/main/doc/configuration/gitnested-file.md)
66
+ - [Guides](https://github.com/thorsten-klein/git-nested/blob/main/doc/README.md#guides): conflicts, partial upstreams, pins,
67
+ submodules and more
68
+
69
+ Help on the command line:
70
+
71
+ ```bash
72
+ git nested --help # the manual page
73
+ git nested pull --help # one command: what it does, its options, examples
74
+ ```
75
+
76
+ ## Contributing
77
+
78
+ Pull requests are welcome. See [Development](https://github.com/thorsten-klein/git-nested/blob/main/doc/contributing/development.md)
79
+ for the setup and the checks. The short version:
80
+
81
+ ```bash
82
+ uv sync # install everything
83
+ uv run poe all # every check CI runs
84
+ ```
85
+
86
+ Report security problems as described in [SECURITY.md](https://github.com/thorsten-klein/git-nested/blob/main/SECURITY.md).
87
+
88
+ ## Authors
89
+
90
+ **git-nested:**
91
+ - **Thorsten Klein** - Python rewrite and enhancements
92
+
93
+ **Original [git-subrepo](https://github.com/ingydotnet/git-subrepo) authors:**
94
+ - **Ingy döt Net** - Original concept and implementation
95
+ - **Magnus Carlsson** - Contributor
96
+ - **Austin Morgan** - Contributor
97
+
98
+ ## License
99
+
100
+ MIT. See [LICENSE](https://github.com/thorsten-klein/git-nested/blob/main/LICENSE).
101
+
102
+ ## Acknowledgments
103
+
104
+ This project is based on [git-subrepo](https://github.com/ingydotnet/git-subrepo) by Ingy döt Net.
105
+ git-nested is a Python rewrite with some modified features and improvements.
@@ -0,0 +1,60 @@
1
+ # git-nested documentation
2
+
3
+ This folder is the full documentation of git-nested. You can read it here
4
+ on GitHub, or as a website at <https://thorsten-klein.github.io/git-nested/>.
5
+
6
+ ## Introduction
7
+
8
+ - **[`introduction/index.md`](introduction/index.md)**: what git-nested is
9
+ and which problem it solves.
10
+ - **[`introduction/install.md`](introduction/install.md)**: all ways to
11
+ install it.
12
+
13
+ ## Quickstart
14
+
15
+ - **[`quickstart/05-minutes.md`](quickstart/05-minutes.md)**: a hands-on
16
+ walk through with two local repositories.
17
+ - **[`quickstart/everyday.md`](quickstart/everyday.md)**: the commands you
18
+ need most days.
19
+
20
+ ## Concepts
21
+
22
+ - **[`concepts/glossary.md`](concepts/glossary.md)**: every word git-nested
23
+ uses, in short.
24
+ - **[`concepts/how-it-works.md`](concepts/how-it-works.md)**: what happens
25
+ inside a clone, a pull and a push.
26
+ - **[`concepts/comparison.md`](concepts/comparison.md)**: git-nested next to
27
+ git submodule and git subtree.
28
+
29
+ ## `git nested` command
30
+
31
+ - **[`cli/index.md`](cli/index.md)**: the options all commands share, and a
32
+ list of all commands. Each command has its own page in [`cli/`](cli/).
33
+ - **[`cli/environment-variables.md`](cli/environment-variables.md)**: the
34
+ environment variables git-nested reads.
35
+
36
+ ## Configuration
37
+
38
+ - **[`configuration/gitnested-file.md`](configuration/gitnested-file.md)**:
39
+ every field of the `.gitnested` file.
40
+ - **[`configuration/git-config.md`](configuration/git-config.md)**: the
41
+ `git config` settings git-nested reads and writes.
42
+
43
+ ## Guides
44
+
45
+ - **[`guides/`](guides/)**: one page per task, such as resolving conflicts,
46
+ nesting a part of upstream or pinning a release.
47
+
48
+ ## Architecture
49
+
50
+ - **[`architecture/index.md`](architecture/index.md)**: how the code is
51
+ built.
52
+ - **[`architecture/diagrams.md`](architecture/diagrams.md)**: the git
53
+ commands each command runs.
54
+
55
+ ## Contributing
56
+
57
+ - **[`contributing/development.md`](contributing/development.md)**: how to
58
+ work on git-nested.
59
+ - **[`contributing/documentation.md`](contributing/documentation.md)**: how
60
+ to write and build these docs.