commitrocket 0.1.1__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 (63) hide show
  1. commitrocket-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
  2. commitrocket-0.1.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. commitrocket-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
  4. commitrocket-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +17 -0
  5. commitrocket-0.1.1/.github/dependabot.yml +33 -0
  6. commitrocket-0.1.1/.github/workflows/lint.yml +27 -0
  7. commitrocket-0.1.1/.github/workflows/release.yml +69 -0
  8. commitrocket-0.1.1/.github/workflows/tests.yml +45 -0
  9. commitrocket-0.1.1/.gitignore +223 -0
  10. commitrocket-0.1.1/.pre-commit-config.yaml +17 -0
  11. commitrocket-0.1.1/.python-version +1 -0
  12. commitrocket-0.1.1/CHANGELOG.md +48 -0
  13. commitrocket-0.1.1/CODE_OF_CONDUCT.md +131 -0
  14. commitrocket-0.1.1/CONTRIBUTING.md +62 -0
  15. commitrocket-0.1.1/LICENSE +21 -0
  16. commitrocket-0.1.1/PKG-INFO +520 -0
  17. commitrocket-0.1.1/README.md +489 -0
  18. commitrocket-0.1.1/SECURITY.md +43 -0
  19. commitrocket-0.1.1/docs/architecture.md +192 -0
  20. commitrocket-0.1.1/docs/development.md +66 -0
  21. commitrocket-0.1.1/pyproject.toml +40 -0
  22. commitrocket-0.1.1/src/commitrocket/__init__.py +3 -0
  23. commitrocket-0.1.1/src/commitrocket/__main__.py +3 -0
  24. commitrocket-0.1.1/src/commitrocket/batching.py +184 -0
  25. commitrocket-0.1.1/src/commitrocket/cli.py +431 -0
  26. commitrocket-0.1.1/src/commitrocket/config.py +125 -0
  27. commitrocket-0.1.1/src/commitrocket/doctor.py +202 -0
  28. commitrocket-0.1.1/src/commitrocket/errors.py +14 -0
  29. commitrocket-0.1.1/src/commitrocket/eta.py +40 -0
  30. commitrocket-0.1.1/src/commitrocket/filters.py +72 -0
  31. commitrocket-0.1.1/src/commitrocket/git.py +228 -0
  32. commitrocket-0.1.1/src/commitrocket/journal.py +31 -0
  33. commitrocket-0.1.1/src/commitrocket/lfs.py +212 -0
  34. commitrocket-0.1.1/src/commitrocket/logs.py +67 -0
  35. commitrocket-0.1.1/src/commitrocket/notify.py +162 -0
  36. commitrocket-0.1.1/src/commitrocket/options.py +38 -0
  37. commitrocket-0.1.1/src/commitrocket/push.py +246 -0
  38. commitrocket-0.1.1/src/commitrocket/report.py +130 -0
  39. commitrocket-0.1.1/src/commitrocket/runner.py +680 -0
  40. commitrocket-0.1.1/src/commitrocket/security.py +50 -0
  41. commitrocket-0.1.1/src/commitrocket/template.py +37 -0
  42. commitrocket-0.1.1/src/commitrocket/ui.py +216 -0
  43. commitrocket-0.1.1/src/commitrocket/verify.py +129 -0
  44. commitrocket-0.1.1/tests/conftest.py +22 -0
  45. commitrocket-0.1.1/tests/integration/test_e2e.py +166 -0
  46. commitrocket-0.1.1/tests/test_batching.py +112 -0
  47. commitrocket-0.1.1/tests/test_cli.py +39 -0
  48. commitrocket-0.1.1/tests/test_config.py +126 -0
  49. commitrocket-0.1.1/tests/test_doctor.py +34 -0
  50. commitrocket-0.1.1/tests/test_eta.py +44 -0
  51. commitrocket-0.1.1/tests/test_filters.py +51 -0
  52. commitrocket-0.1.1/tests/test_git.py +112 -0
  53. commitrocket-0.1.1/tests/test_journal.py +17 -0
  54. commitrocket-0.1.1/tests/test_lfs.py +86 -0
  55. commitrocket-0.1.1/tests/test_logs.py +44 -0
  56. commitrocket-0.1.1/tests/test_notify.py +118 -0
  57. commitrocket-0.1.1/tests/test_push_parsing.py +31 -0
  58. commitrocket-0.1.1/tests/test_report.py +58 -0
  59. commitrocket-0.1.1/tests/test_retries.py +70 -0
  60. commitrocket-0.1.1/tests/test_security.py +197 -0
  61. commitrocket-0.1.1/tests/test_template.py +39 -0
  62. commitrocket-0.1.1/tests/test_verify.py +84 -0
  63. commitrocket-0.1.1/uv.lock +338 -0
@@ -0,0 +1,65 @@
1
+ name: Bug report
2
+ description: Something did not work as expected
3
+ title: "[Bug]: "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for reporting a bug. Please check the [README](https://github.com/coldsofttech/CommitRocket#readme)
10
+ and existing issues first. Do not include secrets, tokens or private file names.
11
+ - type: textarea
12
+ id: what-happened
13
+ attributes:
14
+ label: What happened?
15
+ description: What did you expect, and what happened instead?
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: command
20
+ attributes:
21
+ label: Command you ran
22
+ description: The full `commitrocket` command, including options.
23
+ render: shell
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: output
28
+ attributes:
29
+ label: Output or error
30
+ description: Paste the terminal output. The log file path is printed at the end of every run.
31
+ render: text
32
+ - type: textarea
33
+ id: log
34
+ attributes:
35
+ label: Relevant log lines
36
+ description: Re-run with `--level DEBUG` and paste the relevant part of the log file, with any private paths removed.
37
+ render: text
38
+ - type: input
39
+ id: version
40
+ attributes:
41
+ label: CommitRocket version
42
+ description: Output of `commitrocket --version`
43
+ validations:
44
+ required: true
45
+ - type: dropdown
46
+ id: os
47
+ attributes:
48
+ label: Operating system
49
+ options:
50
+ - Windows
51
+ - macOS
52
+ - Linux
53
+ - Other
54
+ validations:
55
+ required: true
56
+ - type: input
57
+ id: tooling
58
+ attributes:
59
+ label: Python, Git and git-lfs versions
60
+ description: For example `Python 3.12, git 2.47, git-lfs 3.6`. `commitrocket doctor` shows these.
61
+ - type: input
62
+ id: host
63
+ attributes:
64
+ label: Git host
65
+ description: For example GitHub, GitLab, Bitbucket, self-hosted.
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/coldsofttech/CommitRocket/security/advisories/new
5
+ about: Please report security problems privately, not in a public issue.
6
+ - name: Questions and ideas
7
+ url: https://github.com/coldsofttech/CommitRocket/discussions
8
+ about: Ask a question or float an idea before opening an issue.
@@ -0,0 +1,30 @@
1
+ name: Feature request
2
+ description: Suggest an improvement or a new option
3
+ title: "[Feature]: "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: What problem are you trying to solve?
10
+ description: Describe the situation, not only the solution.
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: What would you like to happen?
17
+ description: For example a new option, a change in behavior, or a new output.
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: alternatives
22
+ attributes:
23
+ label: Alternatives you considered
24
+ description: Workarounds you use today, or other designs.
25
+ - type: checkboxes
26
+ id: contribute
27
+ attributes:
28
+ label: Contributing
29
+ options:
30
+ - label: I would be willing to open a pull request for this.
@@ -0,0 +1,17 @@
1
+ ## What does this change?
2
+
3
+ <!-- A short summary, and why it is needed. Link the issue it closes, e.g. "Closes #123". -->
4
+
5
+ ## How was it tested?
6
+
7
+ <!-- Commands you ran and anything you checked by hand. -->
8
+
9
+ ## Checklist
10
+
11
+ - [ ] `uv run ruff check .` passes
12
+ - [ ] `uv run pytest -m "not integration"` passes
13
+ - [ ] `uv run pytest -m integration` passes (if the change touches the run flow, Git handling or LFS)
14
+ - [ ] Tests added or updated for the change
15
+ - [ ] `CHANGELOG.md` has a short entry under `[Unreleased]` (what changed for the reader, in one or two lines)
16
+ - [ ] `README.md` updated if user-facing behavior or options changed; technical details go in `docs/`
17
+ - [ ] No secrets, tokens or private paths in the code, tests or logs
@@ -0,0 +1,33 @@
1
+ version: 2
2
+
3
+ updates:
4
+ # Python dependencies and the uv.lock file
5
+ - package-ecosystem: "uv"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ commit-message:
10
+ prefix: "chore(deps)"
11
+ groups:
12
+ python-dependencies:
13
+ patterns: ["*"]
14
+ update-types: ["minor", "patch"]
15
+
16
+ # Actions used in .github/workflows
17
+ - package-ecosystem: "github-actions"
18
+ directory: "/"
19
+ schedule:
20
+ interval: "weekly"
21
+ commit-message:
22
+ prefix: "chore(ci)"
23
+ groups:
24
+ github-actions:
25
+ patterns: ["*"]
26
+
27
+ # Hook versions in .pre-commit-config.yaml
28
+ - package-ecosystem: "pre-commit"
29
+ directory: "/"
30
+ schedule:
31
+ interval: "weekly"
32
+ commit-message:
33
+ prefix: "chore(deps)"
@@ -0,0 +1,27 @@
1
+ name: Lint
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: lint-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ ruff:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v7
20
+
21
+ - uses: astral-sh/setup-uv@v7
22
+
23
+ - name: Install
24
+ run: uv sync --python 3.11
25
+
26
+ - name: Ruff
27
+ run: uv run ruff check .
@@ -0,0 +1,69 @@
1
+ name: Release
2
+
3
+ # Publishes to PyPI when a version tag such as v0.2.0 is pushed.
4
+ # Needs a PYPI_API_TOKEN secret (Settings > Secrets and variables > Actions).
5
+ on:
6
+ push:
7
+ tags: ["v*.*.*"]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ check:
14
+ name: Check version and tests
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+
19
+ - uses: astral-sh/setup-uv@v7
20
+
21
+ - name: Tag must match the package version
22
+ shell: bash
23
+ run: |
24
+ tag="${GITHUB_REF_NAME#v}"
25
+ project=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
26
+ module=$(python3 -c "import re; print(re.search(r'__version__ = \"(.+?)\"', open('src/commitrocket/__init__.py').read()).group(1))")
27
+ echo "tag=$tag pyproject=$project __init__=$module"
28
+ if [ "$tag" != "$project" ] || [ "$tag" != "$module" ]; then
29
+ echo "::error::Tag v$tag must match the version in pyproject.toml ($project) and src/commitrocket/__init__.py ($module)."
30
+ exit 1
31
+ fi
32
+
33
+ - name: Install
34
+ run: uv sync --python 3.11
35
+
36
+ - name: Lint
37
+ run: uv run ruff check .
38
+
39
+ - name: Unit tests
40
+ run: uv run pytest -m "not integration"
41
+
42
+ - name: Integration tests
43
+ run: uv run pytest -m integration
44
+
45
+ publish:
46
+ name: Build and publish
47
+ needs: check
48
+ runs-on: ubuntu-latest
49
+ environment: pypi
50
+ permissions:
51
+ contents: write
52
+ steps:
53
+ - uses: actions/checkout@v7
54
+
55
+ - uses: astral-sh/setup-uv@v7
56
+
57
+ - name: Build
58
+ run: uv build
59
+
60
+ - name: Publish to PyPI
61
+ env:
62
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
63
+ run: uv publish
64
+
65
+ - name: GitHub release
66
+ uses: softprops/action-gh-release@v3
67
+ with:
68
+ generate_release_notes: true
69
+ files: dist/*
@@ -0,0 +1,45 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: tests-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ test:
17
+ name: ${{ matrix.os }} / Python ${{ matrix.python }}
18
+ runs-on: ${{ matrix.os }}
19
+ # Python 3.15 may still be a pre-release; don't let it block the build.
20
+ continue-on-error: ${{ matrix.python == '3.15' }}
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ include:
25
+ - { os: ubuntu-latest, python: "3.11" }
26
+ - { os: ubuntu-latest, python: "3.12" }
27
+ - { os: ubuntu-latest, python: "3.13" }
28
+ - { os: ubuntu-latest, python: "3.14" }
29
+ - { os: ubuntu-latest, python: "3.15" }
30
+ - { os: windows-latest, python: "3.11" }
31
+ - { os: macos-latest, python: "3.11" }
32
+
33
+ steps:
34
+ - uses: actions/checkout@v7
35
+
36
+ - uses: astral-sh/setup-uv@v7
37
+
38
+ - name: Install
39
+ run: uv sync --python ${{ matrix.python }}
40
+
41
+ - name: Unit tests
42
+ run: uv run pytest -m "not integration" -n auto
43
+
44
+ - name: Integration tests
45
+ run: uv run pytest -m integration -n auto
@@ -0,0 +1,223 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ *.lcov
51
+ .hypothesis/
52
+ .pytest_cache/
53
+ cover/
54
+
55
+ # Translations
56
+ *.mo
57
+ *.pot
58
+
59
+ # Django stuff:
60
+ *.log
61
+ local_settings.py
62
+ db.sqlite3
63
+ db.sqlite3-journal
64
+
65
+ # Flask stuff:
66
+ instance/
67
+ .webassets-cache
68
+
69
+ # Scrapy stuff:
70
+ .scrapy
71
+
72
+ # Sphinx documentation
73
+ docs/_build/
74
+
75
+ # PyBuilder
76
+ .pybuilder/
77
+ target/
78
+
79
+ # Jupyter Notebook
80
+ .ipynb_checkpoints
81
+
82
+ # IPython
83
+ profile_default/
84
+ ipython_config.py
85
+
86
+ # pyenv
87
+ # For a library or package, you might want to ignore these files since the code is
88
+ # intended to run in multiple environments; otherwise, check them in:
89
+ # .python-version
90
+
91
+ # pipenv
92
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
93
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
94
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
95
+ # install all needed dependencies.
96
+ # Pipfile.lock
97
+
98
+ # uv
99
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
100
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
101
+ # commonly ignored for libraries.
102
+ # uv.lock
103
+
104
+ # poetry
105
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
106
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
107
+ # commonly ignored for libraries.
108
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
109
+ # poetry.lock
110
+ # poetry.toml
111
+
112
+ # pdm
113
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
115
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
116
+ # pdm.lock
117
+ # pdm.toml
118
+ .pdm-python
119
+ .pdm-build/
120
+
121
+ # pixi
122
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
123
+ # pixi.lock
124
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
125
+ # in the .venv directory. It is recommended not to include this directory in version control.
126
+ .pixi/*
127
+ !.pixi/config.toml
128
+
129
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
130
+ __pypackages__/
131
+
132
+ # Celery stuff
133
+ celerybeat-schedule*
134
+ celerybeat.pid
135
+
136
+ # Redis
137
+ *.rdb
138
+ *.aof
139
+ *.pid
140
+
141
+ # RabbitMQ
142
+ mnesia/
143
+ rabbitmq/
144
+ rabbitmq-data/
145
+
146
+ # ActiveMQ
147
+ activemq-data/
148
+
149
+ # SageMath parsed files
150
+ *.sage.py
151
+
152
+ # Environments
153
+ .env
154
+ .envrc
155
+ .venv
156
+ env/
157
+ venv/
158
+ ENV/
159
+ env.bak/
160
+ venv.bak/
161
+
162
+ # Spyder project settings
163
+ .spyderproject
164
+ .spyproject
165
+
166
+ # Rope project settings
167
+ .ropeproject
168
+
169
+ # mkdocs/Zensical documentation
170
+ /site
171
+
172
+ # mypy
173
+ .mypy_cache/
174
+ .dmypy.json
175
+ dmypy.json
176
+
177
+ # Pyre type checker
178
+ .pyre/
179
+
180
+ # pytype static type analyzer
181
+ .pytype/
182
+
183
+ # Cython debug symbols
184
+ cython_debug/
185
+
186
+ # PyCharm
187
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
188
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
189
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
190
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
191
+ # .idea/
192
+
193
+ # Abstra
194
+ # Abstra is an AI-powered process automation framework.
195
+ # Ignore directories containing user credentials, local state, and settings.
196
+ # Learn more at https://abstra.io/docs
197
+ .abstra/
198
+
199
+ # Visual Studio Code
200
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
201
+ # can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
202
+ # and can be added to the global gitignore or merged into this file. However, if you prefer, you
203
+ # could uncomment the following to ignore the entire vscode folder
204
+ # .vscode/
205
+ # Temporary file for partial code execution
206
+ tempCodeRunnerFile.py
207
+
208
+ # Ruff stuff:
209
+ .ruff_cache/
210
+
211
+ # PyPI configuration file
212
+ .pypirc
213
+
214
+ # Marimo
215
+ marimo/_static/
216
+ marimo/_lsp/
217
+ __marimo__/
218
+
219
+ # Streamlit
220
+ .streamlit/secrets.toml
221
+
222
+ CLAUDE.md
223
+ .temp/
@@ -0,0 +1,17 @@
1
+ # Install once with: uv run pre-commit install
2
+ # Integration tests (marker "integration") are slower and run only in CI.
3
+ repos:
4
+ - repo: https://github.com/astral-sh/ruff-pre-commit
5
+ rev: v0.17.2
6
+ hooks:
7
+ - id: ruff
8
+ args: [--fix, --exit-non-zero-on-fix]
9
+
10
+ - repo: local
11
+ hooks:
12
+ - id: pytest
13
+ name: pytest (unit tests)
14
+ entry: uv run pytest -m "not integration" -n auto -q
15
+ language: system
16
+ types: [python]
17
+ pass_filenames: false
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ ## [0.1.1] - 2026-10-24
6
+
7
+ ### Added
8
+ - Issue and pull request templates, a security policy, a code of conduct and contributing guidelines.
9
+ - Dependabot keeps dependencies, GitHub Actions and pre-commit hooks up to date.
10
+
11
+ ### Fixed
12
+ - Batches with thousands of files no longer fail on Windows with "The filename or extension is too long".
13
+
14
+ ### Security
15
+ - A config file found inside a repository can no longer turn on `force`, set the remote or branch, write reports or logs, or read pattern files; use `--config` for those.
16
+ - File names with characters like `[` or `*` are treated literally, so they no longer pull other files into a batch.
17
+ - `--remote` and `--branch` values that look like Git options are rejected.
18
+ - Credentials inside remote URLs are hidden in logs, errors and reports, and log and report files are readable only by you.
19
+ - File names with line breaks are refused when creating LFS rules.
20
+ - Square brackets in file names and Git messages no longer break or hide output.
21
+
22
+ ## [0.1.0] - 2026-10-24
23
+
24
+ ### Added
25
+ - CommitRocket is now an installable package with a `commitrocket` command.
26
+ - Files over 100 MiB are detected up front, and the run stops with a hint to use `--use-lfs` instead of failing at push time.
27
+ - The overall progress bar shows an ETA based on the average speed of the whole run so far, updating live during each upload.
28
+ - `--use-lfs` stores files over 100 MiB with Git LFS during the run, without committing any LFS config, and removes the local setup afterwards.
29
+ - `--report FILE` writes a machine-readable JSON summary of every run.
30
+ - `--notify` and `--notify-webhook` tell you when a run ends, via a desktop notification or a web hook.
31
+ - `commitrocket doctor` checks Git, git-lfs, your settings, the remote and the repository before a run.
32
+ - Settings can be saved in `commitrocket.toml` or `[tool.commitrocket]` in `pyproject.toml`.
33
+ - `--include`, `--exclude`, `--include-from`, `--exclude-from` and `.commitrocketignore` choose which files are handled, using `.gitignore`-style patterns.
34
+ - `--remote` and `--branch` choose where to push, `--no-push` only commits, and `--message-template` customises commit messages.
35
+ - `--lfs-commit-rules` commits LFS rules per file type so clones get the real files.
36
+ - A failed `--use-lfs` run now keeps the LFS hooks until its commits are pushed, so LFS files are never published as bare pointers.
37
+ - `--repo` now defaults to the current folder.
38
+ - A `--log-file` or `--report` inside the repository is no longer committed, which previously made a run commit its own log forever.
39
+ - `--dry-run` shows the planned batches and commit messages without changing anything.
40
+ - Failed pushes are retried with growing waits (`--retries`, default 3); rejections are not retried.
41
+ - Interrupted or failed runs can be resumed by running the same command again.
42
+ - `--post-buffer-mib` raises Git's HTTP buffer for large pushes over HTTPS.
43
+ - Each push is checked against the remote, and LFS files are confirmed as pointers before upload.
44
+ - `--lfs-threshold-mib` sets the size above which `--use-lfs` applies (default 100); `0` sends every file through LFS.
45
+ - Each run writes a log file to the system's standard log folder; `--level` sets the detail and `--log-file` overrides the location.
46
+ - `--batch-type` chooses how files are grouped: `deterministic` (default, unchanged), `sequential` or `soft`.
47
+ - `--compression-threads`, `--lfs-threads` and `--lfs-batch-mib` speed up pushes; the thread settings apply to the repository only and are restored afterwards.
48
+ - Leftover local commits containing files over 100 MiB are detected at startup, with the command to clean them up.