gitrupt 0.1.0__py3-none-any.whl

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 (48) hide show
  1. gitrupt/__init__.py +13 -0
  2. gitrupt/cli.py +546 -0
  3. gitrupt/config.py +269 -0
  4. gitrupt/git.py +590 -0
  5. gitrupt/hooks/__init__.py +7 -0
  6. gitrupt/hooks/install.py +255 -0
  7. gitrupt/hooks/pre_commit.py +103 -0
  8. gitrupt/hooks/pre_push.py +178 -0
  9. gitrupt/models.py +190 -0
  10. gitrupt/policy.py +36 -0
  11. gitrupt/reporting.py +316 -0
  12. gitrupt/risk.py +197 -0
  13. gitrupt/scanner.py +117 -0
  14. gitrupt/scanners/__init__.py +17 -0
  15. gitrupt/scanners/adapters.py +166 -0
  16. gitrupt/scanners/base.py +113 -0
  17. gitrupt/scanners/binaries.py +185 -0
  18. gitrupt/scanners/code_rules/__init__.py +36 -0
  19. gitrupt/scanners/code_rules/base.py +27 -0
  20. gitrupt/scanners/code_rules/go.py +65 -0
  21. gitrupt/scanners/code_rules/javascript.py +106 -0
  22. gitrupt/scanners/code_rules/php.py +71 -0
  23. gitrupt/scanners/code_rules/powershell.py +85 -0
  24. gitrupt/scanners/code_rules/python.py +153 -0
  25. gitrupt/scanners/code_rules/ruby.py +76 -0
  26. gitrupt/scanners/code_rules/rust.py +41 -0
  27. gitrupt/scanners/code_rules/shell.py +112 -0
  28. gitrupt/scanners/dependencies.py +244 -0
  29. gitrupt/scanners/ecosystems/__init__.py +30 -0
  30. gitrupt/scanners/ecosystems/base.py +60 -0
  31. gitrupt/scanners/ecosystems/node.py +128 -0
  32. gitrupt/scanners/ecosystems/python.py +157 -0
  33. gitrupt/scanners/entropy.py +123 -0
  34. gitrupt/scanners/forbidden_files.py +201 -0
  35. gitrupt/scanners/malware.py +219 -0
  36. gitrupt/scanners/osv_client.py +221 -0
  37. gitrupt/scanners/registry.py +66 -0
  38. gitrupt/scanners/secret_rules.py +368 -0
  39. gitrupt/scanners/secrets.py +558 -0
  40. gitrupt/scanners/suspicious_code.py +208 -0
  41. gitrupt/scanners/yara_loader.py +65 -0
  42. gitrupt/scanners/yara_rules_builtin.py +141 -0
  43. gitrupt-0.1.0.dist-info/METADATA +342 -0
  44. gitrupt-0.1.0.dist-info/RECORD +48 -0
  45. gitrupt-0.1.0.dist-info/WHEEL +5 -0
  46. gitrupt-0.1.0.dist-info/entry_points.txt +2 -0
  47. gitrupt-0.1.0.dist-info/licenses/LICENSE +23 -0
  48. gitrupt-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,342 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitrupt
3
+ Version: 0.1.0
4
+ Summary: A local Git security firewall for secrets, suspicious code, malware heuristics, and dependency vulnerability checks
5
+ License: MIT License
6
+
7
+ Gitrupt is released under the MIT License.
8
+
9
+ Copyright (c) 2026 Gitrupt Contributors
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+ Project-URL: Homepage, https://github.com/gitrupt/gitrupt
30
+ Project-URL: Repository, https://github.com/gitrupt/gitrupt
31
+ Project-URL: Issues, https://github.com/gitrupt/gitrupt/issues
32
+ Project-URL: Documentation, https://github.com/gitrupt/gitrupt/blob/main/docs/architecture.md
33
+ Keywords: git,security,secrets,pre-commit,pre-push,malware,suspicious-code,dependency-scanning,firewall
34
+ Classifier: Development Status :: 3 - Alpha
35
+ Classifier: Environment :: Console
36
+ Classifier: Intended Audience :: Developers
37
+ Classifier: License :: OSI Approved :: MIT License
38
+ Classifier: Operating System :: OS Independent
39
+ Classifier: Programming Language :: Python :: 3
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Topic :: Security
43
+ Classifier: Topic :: Software Development :: Version Control :: Git
44
+ Requires-Python: >=3.11
45
+ Description-Content-Type: text/markdown
46
+ License-File: LICENSE
47
+ Requires-Dist: typer>=0.12.0
48
+ Requires-Dist: pydantic>=2.0.0
49
+ Requires-Dist: pyyaml>=6.0
50
+ Requires-Dist: rich>=13.0.0
51
+ Provides-Extra: malware
52
+ Requires-Dist: yara-python>=4.3.0; extra == "malware"
53
+ Provides-Extra: all
54
+ Requires-Dist: yara-python>=4.3.0; extra == "all"
55
+ Provides-Extra: dev
56
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
57
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
58
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
59
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
60
+ Requires-Dist: types-PyYAML>=6.0; extra == "dev"
61
+ Requires-Dist: yara-python>=4.3.0; extra == "dev"
62
+ Dynamic: license-file
63
+
64
+ # Gitrupt 🛡️
65
+
66
+ Gitrupt is a local Git security firewall that protects repositories from secrets, suspicious code, malware-style binaries, and vulnerable dependencies before they reach a commit or push.
67
+
68
+ It runs at the Git hook boundary and evaluates staged or outgoing content against a policy you control in a repository-level `.gitrupt.yml` file.
69
+
70
+ ---
71
+
72
+ ## Features
73
+
74
+ - 🔒 **Forbidden file blocking** — `.env`, `.env.*`, `*.pem`, `*.key`, `credentials.json`, and more
75
+ - 🔑 **Secret detection** — AWS keys, GitHub tokens, private keys, API keys, database URLs, JWTs, and more
76
+ - 📊 **Entropy-based detection** — calibrated Shannon entropy checks for likely secret material
77
+ - 🧠 **Suspicious code heuristics** — flags dangerous patterns in added lines across common languages
78
+ - 🦠 **Native malware checks** — EICAR signatures, binary heuristics, packer markers, and optional YARA matching
79
+ - 📦 **Dependency scanning** — OSV-backed vulnerability checks for Python and Node manifests when enabled
80
+ - 🪝 **Hook coverage** — pre-commit is installed by default; pre-push is available as an optional extra layer
81
+ - 🔐 **Local-first privacy** — default execution stays on the machine; networked checks are opt-in
82
+
83
+ ---
84
+
85
+ ## Quick Start
86
+
87
+ ```bash
88
+ pip install gitrupt
89
+
90
+ cd your-repository
91
+ gitrupt init
92
+
93
+ # Protect staged commits
94
+ git commit -m "feat: my change"
95
+ ```
96
+
97
+ Optional push-time protection:
98
+
99
+ ```bash
100
+ gitrupt init --with-push
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Installation
106
+
107
+ Requires Python 3.11+ and Git.
108
+
109
+ ```bash
110
+ pip install gitrupt
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Usage
116
+
117
+ ### Initialize protection
118
+
119
+ ```bash
120
+ gitrupt init
121
+ ```
122
+
123
+ Installs the Gitrupt pre-commit hook in the current Git repository.
124
+
125
+ ### Install push firewall
126
+
127
+ ```bash
128
+ gitrupt init --with-push
129
+ ```
130
+
131
+ Adds a pre-push hook that scans outgoing commits before they leave the machine.
132
+
133
+ ### Check status
134
+
135
+ ```bash
136
+ gitrupt status
137
+ ```
138
+
139
+ Shows whether Gitrupt is installed and active.
140
+
141
+ ### Manual scan
142
+
143
+ ```bash
144
+ gitrupt scan --staged # scan staged changes (pre-commit behavior)
145
+ gitrupt scan --push # scan outgoing commits (pre-push behavior)
146
+ gitrupt scan # scan the working tree
147
+ ```
148
+
149
+ ### Show configuration
150
+
151
+ ```bash
152
+ gitrupt config
153
+ ```
154
+
155
+ ### Remove protection
156
+
157
+ ```bash
158
+ gitrupt uninstall
159
+ ```
160
+
161
+ ---
162
+
163
+ ## Configuration
164
+
165
+ Gitrupt reads a repository-level `.gitrupt.yml` file. The current schema supports the scanner toggles, denial rules, allowlists, entropy tuning, suspicious-code tuning, malware settings, dependency settings, and policy overrides.
166
+
167
+ ```yaml
168
+ version: 1
169
+ mode: strict
170
+
171
+ scan:
172
+ secrets: true
173
+ threats: true
174
+ suspicious_code: false
175
+ dependencies: false
176
+
177
+ rules:
178
+ forbidden_paths:
179
+ - ".env"
180
+ - ".env.*"
181
+ - "*.pem"
182
+ - "*.key"
183
+ - "*.p12"
184
+ - "*.pfx"
185
+ - "credentials.json"
186
+ - "service-account.json"
187
+ - "*.secret"
188
+ forbidden_extensions:
189
+ - ".scr"
190
+ - ".exe"
191
+ max_file_size_mb: 50.0
192
+
193
+ allow:
194
+ paths:
195
+ - ".env.example"
196
+ - "tests/fixtures/**"
197
+ - "docs/**"
198
+
199
+ suppressions:
200
+ rules: []
201
+ files: []
202
+ paths: []
203
+
204
+ entropy:
205
+ enabled: true
206
+ threshold: 4.5
207
+ min_length: 20
208
+
209
+ suspicious_code:
210
+ min_confidence: 0.6
211
+ languages:
212
+ - python
213
+ - javascript
214
+ - shell
215
+ - powershell
216
+ - php
217
+ - ruby
218
+ - go
219
+
220
+ malware:
221
+ use_yara: true
222
+ max_file_size_mb: 50.0
223
+ custom_yara_dirs: []
224
+
225
+ dependencies:
226
+ ecosystems:
227
+ - python
228
+ - node
229
+ offline: false
230
+ timeout_seconds: 10.0
231
+ cache_ttl_hours: 24
232
+
233
+ policy:
234
+ low: allow
235
+ medium: warn
236
+ high: block
237
+ critical: block
238
+ ```
239
+
240
+ Valid modes are `strict`, `permissive`, and `warn-only`.
241
+
242
+ ---
243
+
244
+ ## How It Works
245
+
246
+ ```text
247
+ Developer
248
+ ↓
249
+ Git commit / git push
250
+ ↓
251
+ Git hook (pre-commit and optional pre-push)
252
+ ↓
253
+ Gitrupt scanner pipeline
254
+ ↓
255
+ Forbidden file checks + secret scans + entropy checks
256
+ ↓
257
+ Suspicious code checks + malware heuristics + dependency OSV scans
258
+ ↓
259
+ Risk engine + policy decision
260
+ ↓
261
+ ALLOW / WARN / BLOCK
262
+ ```
263
+
264
+ ---
265
+
266
+ ## Security Report Example
267
+
268
+ When a commit is blocked, Gitrupt reports the file, severity, detector, and guidance:
269
+
270
+ ```text
271
+ 🛡️ Gitrupt
272
+
273
+ COMMIT BLOCKED
274
+
275
+ CRITICAL .env
276
+ Environment file is prohibited.
277
+ Remove this file from staging: git restore --staged .env
278
+
279
+ HIGH backend/config.py:18
280
+ Possible AWS credential detected.
281
+ Move credentials to environment variables.
282
+
283
+ Fix the findings above and try again.
284
+ To override (not recommended): git commit --no-verify
285
+ ```
286
+
287
+ ---
288
+
289
+ ## Hook Safety
290
+
291
+ Gitrupt never silently destroys existing Git hooks.
292
+
293
+ If a hook already exists, Gitrupt preserves it and wraps it so your original behavior still runs after Gitrupt completes.
294
+
295
+ ---
296
+
297
+ ## Privacy
298
+
299
+ By default, Gitrupt runs locally. Repository content stays on the machine unless you explicitly enable networked checks.
300
+
301
+ - Native scanning runs locally
302
+ - Dependency OSV queries are only used when the dependency scanner is enabled and `offline` is `false`
303
+ - Third-party adapters remain optional and are only used when configured
304
+ - Secret findings are redacted before reporting
305
+
306
+ ---
307
+
308
+ ## Limitations
309
+
310
+ Git allows bypassing client-side hooks:
311
+
312
+ ```bash
313
+ git commit --no-verify
314
+ ```
315
+
316
+ Gitrupt logs this but cannot prevent it at the client level alone. For organizational enforcement, use CI/CD controls and repository-level policy enforcement.
317
+
318
+ ---
319
+
320
+ ## Roadmap
321
+
322
+ Gitrupt continues to expand beyond the initial MVP scope with optional integrations and workflow hardening.
323
+
324
+ - Native suspicious-code detection
325
+ - Malware heuristics and YARA support
326
+ - Dependency vulnerability scanning with OSV
327
+ - Optional pre-push firewall protection
328
+ - Additional external adapters and reporting formats
329
+
330
+ ---
331
+
332
+ ## Contributing
333
+
334
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
335
+
336
+ ## Security
337
+
338
+ See [SECURITY.md](SECURITY.md) for vulnerability reporting.
339
+
340
+ ## License
341
+
342
+ MIT License — see [LICENSE](LICENSE).
@@ -0,0 +1,48 @@
1
+ gitrupt/__init__.py,sha256=0x6czyiVEOntoLs5EqO4b8F1d2NDPOt6RAgtkyRy0ao,362
2
+ gitrupt/cli.py,sha256=AnmdLBadewBOp-Qh9KkfyeDDSGuT74yi1HFMmbtZR6E,18703
3
+ gitrupt/config.py,sha256=IE3I0FtoqqxIT0u3JH-juUDho7AWJNSCRlDmb9J4yk0,7403
4
+ gitrupt/git.py,sha256=3hIeU4IrChADl0IDtdDTfhoBh2RntWx8YJKPshmOSGk,18651
5
+ gitrupt/models.py,sha256=6gkkRraCSbviWNH_nBHFsXCSLeKpTTDbtjkYdk7bzv4,5230
6
+ gitrupt/policy.py,sha256=dab45sjYDnC2A0Fr4vUWaRiX4UUS4nnyoFxOC2zwmrQ,1152
7
+ gitrupt/reporting.py,sha256=KUKHoudsQZ22b_AtBbmVu8OzupeG3qRLiGp5kQFreiw,9904
8
+ gitrupt/risk.py,sha256=4CTc5A_NL3X9rpCuDUVXHKy3Ru6j1ymx0ravFk0wQdU,6409
9
+ gitrupt/scanner.py,sha256=uEdpmRcbIg83CivIiMiLTDNNSKRR6cikqGNsFXJGmMI,3725
10
+ gitrupt/hooks/__init__.py,sha256=xhpnRhd9Su2EugqDGVaqe_NpBQJveQKqfgu4l10xky8,113
11
+ gitrupt/hooks/install.py,sha256=jX4x9_uMc_NioOAqU5larpuOrDSIF_VmcYfX7-ieVE8,8232
12
+ gitrupt/hooks/pre_commit.py,sha256=9cSRbh9lNl_hwaTpEK9YZ4LJYn9-bL-scbczLMlqG4A,2645
13
+ gitrupt/hooks/pre_push.py,sha256=kMOCoqZ7CusVpB8GZzLRTYOoY4RJME7ZW8oskP81PAo,4855
14
+ gitrupt/scanners/__init__.py,sha256=JDvyu64vSYdXb1ocq505WnegodFfQ6zK_OcitOe2FtA,428
15
+ gitrupt/scanners/adapters.py,sha256=ND56dA-noX72HnFGM28OY3iaHkycxOUbTJOr5ivFmWo,6454
16
+ gitrupt/scanners/base.py,sha256=KQrZd1nfuOiDWLeGN3SvwjKpNJD0BzJnaoxTSorecks,2869
17
+ gitrupt/scanners/binaries.py,sha256=ml0appYly1VCot0_YbMKJ0XlNch5jdgjVCZZMcXZvVw,6557
18
+ gitrupt/scanners/dependencies.py,sha256=hAFKdXfp_irDBf__eJNR9tdVvtHP97pjbg3HQ8O76EE,8509
19
+ gitrupt/scanners/entropy.py,sha256=BRhutv3lnpzxmpvwz5ZzKk0ZYhYGllPTPUkolfUQKd8,3759
20
+ gitrupt/scanners/forbidden_files.py,sha256=KWej6HBbPeBf3H5qCtYfeQVIStX0LaXcc-kXq_1MZdI,7284
21
+ gitrupt/scanners/malware.py,sha256=EKAdB1nbY5L4QRtBHYxSNR0SwXWchJnoSrmrl9pcLF4,7918
22
+ gitrupt/scanners/osv_client.py,sha256=w24c5zOr4N9RIRLYOBk2UPME7sa9vo5LwjkC7cgpfrg,7476
23
+ gitrupt/scanners/registry.py,sha256=lzb4XsgReShfvnxs2kNqHs6913v5mtnK2jrCw9ioST4,2601
24
+ gitrupt/scanners/secret_rules.py,sha256=9ycwEmicStsfAjlruV4Q642IEBlC98ccEfDqn_mPjWc,15441
25
+ gitrupt/scanners/secrets.py,sha256=cqIxciBfuQB2g2BQ7U3I6XJU3liOv7LPTcojwpV_tSA,22140
26
+ gitrupt/scanners/suspicious_code.py,sha256=m2zLYVU_T4etbyICbQjF6GWH11w-EGUWo9_IatX7904,6369
27
+ gitrupt/scanners/yara_loader.py,sha256=FeaYNkDtxf8a7wbcSC19rQGirt6cZcQSOXTBnRCKghw,2018
28
+ gitrupt/scanners/yara_rules_builtin.py,sha256=3cfuDm2lcPvo4h_2qM2PizFS-7WQ_y5Y3uV03Tsac9A,4026
29
+ gitrupt/scanners/code_rules/__init__.py,sha256=3d1EzYPPQ5tGlBq1TMrtTukQDhNhbYg1xJduaZ_u6x4,1205
30
+ gitrupt/scanners/code_rules/base.py,sha256=iCsfOPgXWNOTWFhIAPvy3900wIQRBdhld4yVgK8c4tE,764
31
+ gitrupt/scanners/code_rules/go.py,sha256=T7ZUrGL9_mqUoXRfR1KQaGgxnwWtJTEj24qQ-Ks4O4Y,2181
32
+ gitrupt/scanners/code_rules/javascript.py,sha256=aXEvLRXAzleaNrrNlm72s7l8_7KwKQvMzQ-jWhPG5Bo,3708
33
+ gitrupt/scanners/code_rules/php.py,sha256=4WmGmxfRZSWK7g21lW5CO_4Lo0JBcfv6cFZlhhqrcLI,2138
34
+ gitrupt/scanners/code_rules/powershell.py,sha256=E1NodB--N7ZTBzuNcJ_ouSHeHs2snmOLEC6jWva7lCE,2768
35
+ gitrupt/scanners/code_rules/python.py,sha256=angf7a5Yz-VGEmWZJ7mAkGbYCjoDcdQNxXMmZk21LkE,5447
36
+ gitrupt/scanners/code_rules/ruby.py,sha256=zhYsT-fnGVaCRQkpIQPMbVz1o01q2-kbLiZDVwqE3ig,2371
37
+ gitrupt/scanners/code_rules/rust.py,sha256=pCI8EgN-td2H9Kuwlr_1oVHZromzGb_hT97No3OOZPE,1338
38
+ gitrupt/scanners/code_rules/shell.py,sha256=G1Y9rHiYKTQ2KNZ23XuPNfC8RI-_UvzuRFMbQa7oWG4,3679
39
+ gitrupt/scanners/ecosystems/__init__.py,sha256=NhsVkiE78Ay6UeKDpKqivPR4NVHjYN4bp0pOWqsNT84,833
40
+ gitrupt/scanners/ecosystems/base.py,sha256=IkZyC4S490qm7sdI9WSswGuJw-B2_p8NV6rJQwxoQEU,1926
41
+ gitrupt/scanners/ecosystems/node.py,sha256=f7nycMhMErIJTsv3pV3nkRPCzzZaYPPZYSiqKnhj-ms,4717
42
+ gitrupt/scanners/ecosystems/python.py,sha256=s-jlTrhIK7gSHKrilEfJ3Ly2tGXw-MBQxa-X-amDmC0,5743
43
+ gitrupt-0.1.0.dist-info/licenses/LICENSE,sha256=c8BbamcuUdinBGzwrPzUde4RiD0QggyPYmGDZEOqG4Y,1121
44
+ gitrupt-0.1.0.dist-info/METADATA,sha256=KlcEywaCD7frUOpSOCvC7g_B0qhUBtY79JuGZcIVgxA,8774
45
+ gitrupt-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
46
+ gitrupt-0.1.0.dist-info/entry_points.txt,sha256=M_4RZPlOyF5SYwLl-CvdpTywp9YDzMrXcxpTVmerviU,44
47
+ gitrupt-0.1.0.dist-info/top_level.txt,sha256=rK-b2Uh1SvA9vQ9oO3K1T3Kiwfq7-j5fU3d2f14Fbjs,8
48
+ gitrupt-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ gitrupt = gitrupt.cli:app
@@ -0,0 +1,23 @@
1
+ MIT License
2
+
3
+ Gitrupt is released under the MIT License.
4
+
5
+ Copyright (c) 2026 Gitrupt Contributors
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ gitrupt