shiggles 0.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.
- shiggles-0.2.0/LICENSE +34 -0
- shiggles-0.2.0/PKG-INFO +240 -0
- shiggles-0.2.0/README.md +211 -0
- shiggles-0.2.0/pyproject.toml +41 -0
- shiggles-0.2.0/setup.cfg +4 -0
- shiggles-0.2.0/shiggles/__init__.py +3 -0
- shiggles-0.2.0/shiggles/__main__.py +4 -0
- shiggles-0.2.0/shiggles/cli.py +67 -0
- shiggles-0.2.0/shiggles/commands.py +414 -0
- shiggles-0.2.0/shiggles/conflicts.py +98 -0
- shiggles-0.2.0/shiggles/ignore.py +52 -0
- shiggles-0.2.0/shiggles/paths.py +31 -0
- shiggles-0.2.0/shiggles/remote.py +460 -0
- shiggles-0.2.0/shiggles/repo.py +140 -0
- shiggles-0.2.0/shiggles/store.py +86 -0
- shiggles-0.2.0/shiggles/sync.py +33 -0
- shiggles-0.2.0/shiggles/trees.py +166 -0
- shiggles-0.2.0/shiggles/util.py +40 -0
- shiggles-0.2.0/shiggles.egg-info/PKG-INFO +240 -0
- shiggles-0.2.0/shiggles.egg-info/SOURCES.txt +23 -0
- shiggles-0.2.0/shiggles.egg-info/dependency_links.txt +1 -0
- shiggles-0.2.0/shiggles.egg-info/entry_points.txt +2 -0
- shiggles-0.2.0/shiggles.egg-info/requires.txt +4 -0
- shiggles-0.2.0/shiggles.egg-info/top_level.txt +1 -0
- shiggles-0.2.0/tests/test_scenarios.py +561 -0
shiggles-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
NUCLEAR WASTE SOFTWARE LICENSE V1.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 drLemis
|
|
4
|
+
|
|
5
|
+
This software license is a message... and part of a system of messages...
|
|
6
|
+
pay attention to it! Writing this software and associated documentation
|
|
7
|
+
files (the "Software") was important to us. We considered ourselves to be a
|
|
8
|
+
powerful culture. This Software is not a place of honor... no highly
|
|
9
|
+
esteemed deed is commemorated here... nothing valued is here. What is here was
|
|
10
|
+
dangerous and repulsive to us. This message is a warning about danger. The
|
|
11
|
+
danger is in a particular location... it increases towards a center... the
|
|
12
|
+
center of danger is here... of a particular size and syntax. The danger is
|
|
13
|
+
still present, in your time, as it was in ours. The danger is to the mind, and
|
|
14
|
+
it can kill. The form of the danger is an emanation of incoherence. The danger
|
|
15
|
+
is unleashed only if you substantially disturb this software digitally or
|
|
16
|
+
intellectually.
|
|
17
|
+
|
|
18
|
+
This software is best shunned and left unexecuted... however, permission is
|
|
19
|
+
hereby granted... free of charge... to any person obtaining a copy of this
|
|
20
|
+
Software... to deal in the Software without restriction, including without
|
|
21
|
+
limitation the rights to use, copy, modify, merge, publish, distribute,
|
|
22
|
+
sublicense, and/or sell copies of the Software, and to permit persons to whom
|
|
23
|
+
the Software is furnished to do so... subject to the following conditions:
|
|
24
|
+
|
|
25
|
+
The above copyright notice, warning message, and this permission notice shall
|
|
26
|
+
be included in all copies or substantial portions of the Software.
|
|
27
|
+
|
|
28
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
29
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
30
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
31
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, DEATH OR OTHER
|
|
32
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
33
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
34
|
+
SOFTWARE.
|
shiggles-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: shiggles
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: For git and shiggles. A simple content-addressed VCS.
|
|
5
|
+
Author: drLemis
|
|
6
|
+
License-Expression: LicenseRef-NWSL-1.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/drLemis/shiggles
|
|
8
|
+
Project-URL: Repository, https://github.com/drLemis/shiggles
|
|
9
|
+
Project-URL: Issues, https://github.com/drLemis/shiggles/issues
|
|
10
|
+
Keywords: vcs,version-control,backup,sync
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
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
|
+
Classifier: Topic :: System :: Archiving :: Backup
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build; extra == "dev"
|
|
27
|
+
Requires-Dist: twine; extra == "dev"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# Shiggles
|
|
31
|
+
|
|
32
|
+
Shiggles is a small command-line version control tool for people who want named saves, a simple history, and team sync without learning git.
|
|
33
|
+
|
|
34
|
+
It is designed for artists, designers, and small teams working on a shared project folder. You snapshot work with plain messages, switch context with tabs, and push or pull from a shared folder or HTTP URL.
|
|
35
|
+
|
|
36
|
+
[](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)
|
|
37
|
+
|
|
38
|
+
Repository: [github.com/drLemis/shiggles](https://github.com/drLemis/shiggles)
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
- Watches a project folder and stores content-addressed snapshots on save.
|
|
43
|
+
- Named saves with author and time on each tab.
|
|
44
|
+
- Tabs for parallel work (`main` plus side piles like `hotfix`).
|
|
45
|
+
- `bring` lands your current tab into another tab (usually `main`).
|
|
46
|
+
- `upload` and `download` sync the current tab via shared folder or HTTP URL.
|
|
47
|
+
- Hard-stop collisions: conflicting files are parked in `.shig/collisions/` with next-step help.
|
|
48
|
+
- `load` restores an older save and makes it current.
|
|
49
|
+
- `undo` discards unsaved edits and reloads the last save.
|
|
50
|
+
- `timeline` append-only log of operations (including remote history after sync).
|
|
51
|
+
- Stdlib only. No git dependency.
|
|
52
|
+
|
|
53
|
+
## How It Works
|
|
54
|
+
|
|
55
|
+
When you run `shig start`, Shiggles creates a `.shig/` folder next to your project files. Each `shig save "message"` stores a snapshot of tracked files on the **current tab**.
|
|
56
|
+
|
|
57
|
+
Tabs keep separate histories. `main` is the default shared line. `shig tab foobar` forks from your current tab and switches you to a side pile.
|
|
58
|
+
|
|
59
|
+
Team sync copies commit objects, tab refs, tab metadata, and `timeline.log` to a remote. After `download`, files and history match what was uploaded from the other machine.
|
|
60
|
+
|
|
61
|
+
## Requirements
|
|
62
|
+
|
|
63
|
+
- Python 3.9 or newer
|
|
64
|
+
- Windows, macOS, or Linux
|
|
65
|
+
|
|
66
|
+
Optional for HTTP remotes: any host that can serve PUT/GET (or `scripts/shig-server.py` for local testing).
|
|
67
|
+
|
|
68
|
+
## Installation
|
|
69
|
+
|
|
70
|
+
**Windows (recommended):**
|
|
71
|
+
|
|
72
|
+
```powershell
|
|
73
|
+
.\install.ps1
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Restart your terminal, then `shig help`.
|
|
77
|
+
|
|
78
|
+
**From PyPI** (after publish):
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install shiggles
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Developers:**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install -e ".[dev]"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Usage
|
|
91
|
+
|
|
92
|
+
1. Open a terminal in your project folder.
|
|
93
|
+
2. Run `shig start`.
|
|
94
|
+
3. Run `shig save "first version"`.
|
|
95
|
+
4. Use `shig changes` and `shig history` to see what changed.
|
|
96
|
+
5. Use `shig upload <path-or-url>` when you want to share with the team.
|
|
97
|
+
|
|
98
|
+
Basic solo workflow:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
shig start
|
|
102
|
+
shig save "first version"
|
|
103
|
+
shig changes
|
|
104
|
+
shig history
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Tabs
|
|
108
|
+
|
|
109
|
+
- `main` - default tab, the shared project line
|
|
110
|
+
- `foobar` - your side pile for interrupted work
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
shig tab foobar # create and switch
|
|
114
|
+
shig save "WIP window fix"
|
|
115
|
+
shig tab main # switch back
|
|
116
|
+
shig tab foobar # resume; files as you left them
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Team sync
|
|
120
|
+
|
|
121
|
+
**Shared folder** (NAS, network path, USB):
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
shig download \\NAS\projects\my-game
|
|
125
|
+
shig save "updated level"
|
|
126
|
+
shig upload
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**HTTP URL** (optional token in `.shig/config.json`):
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
shig upload http://backup.example.com/shiggles/my-project
|
|
133
|
+
shig download
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The remote is remembered in `.shig/config.json` after the first use.
|
|
137
|
+
|
|
138
|
+
If someone else saved while you were working, `shig save` nudges you to `download` first. Skip with `shig save --yes "message"`.
|
|
139
|
+
|
|
140
|
+
### Bring (landing your tab on main)
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
shig tab foobar
|
|
144
|
+
shig save "fixed shoot.cs"
|
|
145
|
+
shig bring main
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
If someone else changed the same file on `main`, Shiggles stops and prints next steps. Fix on **main**, not another `bring`.
|
|
149
|
+
|
|
150
|
+
### Restoring older work
|
|
151
|
+
|
|
152
|
+
- `shig load "message"` - put files back to a matching save (becomes current)
|
|
153
|
+
- `shig undo` - discard unsaved changes and reload the last save on this tab
|
|
154
|
+
|
|
155
|
+
## Commands
|
|
156
|
+
|
|
157
|
+
| Command | What it does |
|
|
158
|
+
|---------|--------------|
|
|
159
|
+
| `shig start` | Set up this folder |
|
|
160
|
+
| `shig save "..."` | Snapshot current tab |
|
|
161
|
+
| `shig save --yes "..."` | Save even if remote is ahead |
|
|
162
|
+
| `shig load "..."` | Put files back to a save (becomes current) |
|
|
163
|
+
| `shig changes` | What is different since last save |
|
|
164
|
+
| `shig history` | Saves on current tab |
|
|
165
|
+
| `shig tab [name]` | List, switch, or create tabs |
|
|
166
|
+
| `shig untab <name>` | Remove a tab (history kept) |
|
|
167
|
+
| `shig bring <tab>` | Land current tab into another |
|
|
168
|
+
| `shig download [path\|url]` | Pull current tab from remote |
|
|
169
|
+
| `shig upload [path\|url]` | Push current tab to remote |
|
|
170
|
+
| `shig undo` | Discard unsaved changes; back to last save |
|
|
171
|
+
| `shig timeline` | Operation log |
|
|
172
|
+
|
|
173
|
+
## Ignore files
|
|
174
|
+
|
|
175
|
+
Edit `.shignore` (created on `shig start`). Same idea as `.gitignore`. Build output, `.shig/`, and junk stay out of snapshots.
|
|
176
|
+
|
|
177
|
+
## Project structure
|
|
178
|
+
|
|
179
|
+
```text
|
|
180
|
+
shiggles/
|
|
181
|
+
shiggles/ Python package (commands, store, remote sync)
|
|
182
|
+
scripts/
|
|
183
|
+
shig-server.py Minimal HTTP remote for local testing
|
|
184
|
+
tests/
|
|
185
|
+
test_scenarios.py Scenario walkthrough and unit tests
|
|
186
|
+
install.ps1 Windows installer
|
|
187
|
+
LICENSE NWSL-1.0
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
On-disk repo layout:
|
|
191
|
+
|
|
192
|
+
```text
|
|
193
|
+
.shignore
|
|
194
|
+
.shig/
|
|
195
|
+
objects/
|
|
196
|
+
refs/tabs/
|
|
197
|
+
tabs/
|
|
198
|
+
collisions/
|
|
199
|
+
HEAD
|
|
200
|
+
config.json
|
|
201
|
+
timeline.log
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## HTTP dev server
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
python scripts/shig-server.py ./remote-store -p 8765
|
|
208
|
+
shig upload http://127.0.0.1:8765
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Use the full URL including `http://`. A bare `127.0.0.1:8765` is not recognized as HTTP.
|
|
212
|
+
|
|
213
|
+
## Tests
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
python tests/test_scenarios.py # narrated walkthrough
|
|
217
|
+
python tests/test_scenarios.py --keep # keep files in tests/_sandbox/
|
|
218
|
+
python tests/test_scenarios.py --clean # wipe sandbox
|
|
219
|
+
python -m unittest discover -s tests -v # unit tests
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Publish to PyPI
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
pip install build twine
|
|
226
|
+
python -m build
|
|
227
|
+
twine upload dist/*
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Notes
|
|
231
|
+
|
|
232
|
+
- Shiggles is a simple VCS helper, not a replacement for full backups, cloud sync, or git power workflows.
|
|
233
|
+
- Collisions never overwrite your working files; compare copies under `.shig/collisions/`.
|
|
234
|
+
- See [ROADMAP.md](ROADMAP.md) for philosophy, collision policy, and deferred features.
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
This software is licensed under the **[NWSL](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)**.
|
|
239
|
+
|
|
240
|
+
Copyright (c) 2026 drLemis.
|
shiggles-0.2.0/README.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Shiggles
|
|
2
|
+
|
|
3
|
+
Shiggles is a small command-line version control tool for people who want named saves, a simple history, and team sync without learning git.
|
|
4
|
+
|
|
5
|
+
It is designed for artists, designers, and small teams working on a shared project folder. You snapshot work with plain messages, switch context with tabs, and push or pull from a shared folder or HTTP URL.
|
|
6
|
+
|
|
7
|
+
[](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)
|
|
8
|
+
|
|
9
|
+
Repository: [github.com/drLemis/shiggles](https://github.com/drLemis/shiggles)
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- Watches a project folder and stores content-addressed snapshots on save.
|
|
14
|
+
- Named saves with author and time on each tab.
|
|
15
|
+
- Tabs for parallel work (`main` plus side piles like `hotfix`).
|
|
16
|
+
- `bring` lands your current tab into another tab (usually `main`).
|
|
17
|
+
- `upload` and `download` sync the current tab via shared folder or HTTP URL.
|
|
18
|
+
- Hard-stop collisions: conflicting files are parked in `.shig/collisions/` with next-step help.
|
|
19
|
+
- `load` restores an older save and makes it current.
|
|
20
|
+
- `undo` discards unsaved edits and reloads the last save.
|
|
21
|
+
- `timeline` append-only log of operations (including remote history after sync).
|
|
22
|
+
- Stdlib only. No git dependency.
|
|
23
|
+
|
|
24
|
+
## How It Works
|
|
25
|
+
|
|
26
|
+
When you run `shig start`, Shiggles creates a `.shig/` folder next to your project files. Each `shig save "message"` stores a snapshot of tracked files on the **current tab**.
|
|
27
|
+
|
|
28
|
+
Tabs keep separate histories. `main` is the default shared line. `shig tab foobar` forks from your current tab and switches you to a side pile.
|
|
29
|
+
|
|
30
|
+
Team sync copies commit objects, tab refs, tab metadata, and `timeline.log` to a remote. After `download`, files and history match what was uploaded from the other machine.
|
|
31
|
+
|
|
32
|
+
## Requirements
|
|
33
|
+
|
|
34
|
+
- Python 3.9 or newer
|
|
35
|
+
- Windows, macOS, or Linux
|
|
36
|
+
|
|
37
|
+
Optional for HTTP remotes: any host that can serve PUT/GET (or `scripts/shig-server.py` for local testing).
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
**Windows (recommended):**
|
|
42
|
+
|
|
43
|
+
```powershell
|
|
44
|
+
.\install.ps1
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Restart your terminal, then `shig help`.
|
|
48
|
+
|
|
49
|
+
**From PyPI** (after publish):
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pip install shiggles
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Developers:**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install -e ".[dev]"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Usage
|
|
62
|
+
|
|
63
|
+
1. Open a terminal in your project folder.
|
|
64
|
+
2. Run `shig start`.
|
|
65
|
+
3. Run `shig save "first version"`.
|
|
66
|
+
4. Use `shig changes` and `shig history` to see what changed.
|
|
67
|
+
5. Use `shig upload <path-or-url>` when you want to share with the team.
|
|
68
|
+
|
|
69
|
+
Basic solo workflow:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
shig start
|
|
73
|
+
shig save "first version"
|
|
74
|
+
shig changes
|
|
75
|
+
shig history
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Tabs
|
|
79
|
+
|
|
80
|
+
- `main` - default tab, the shared project line
|
|
81
|
+
- `foobar` - your side pile for interrupted work
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
shig tab foobar # create and switch
|
|
85
|
+
shig save "WIP window fix"
|
|
86
|
+
shig tab main # switch back
|
|
87
|
+
shig tab foobar # resume; files as you left them
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Team sync
|
|
91
|
+
|
|
92
|
+
**Shared folder** (NAS, network path, USB):
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
shig download \\NAS\projects\my-game
|
|
96
|
+
shig save "updated level"
|
|
97
|
+
shig upload
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**HTTP URL** (optional token in `.shig/config.json`):
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
shig upload http://backup.example.com/shiggles/my-project
|
|
104
|
+
shig download
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The remote is remembered in `.shig/config.json` after the first use.
|
|
108
|
+
|
|
109
|
+
If someone else saved while you were working, `shig save` nudges you to `download` first. Skip with `shig save --yes "message"`.
|
|
110
|
+
|
|
111
|
+
### Bring (landing your tab on main)
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
shig tab foobar
|
|
115
|
+
shig save "fixed shoot.cs"
|
|
116
|
+
shig bring main
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If someone else changed the same file on `main`, Shiggles stops and prints next steps. Fix on **main**, not another `bring`.
|
|
120
|
+
|
|
121
|
+
### Restoring older work
|
|
122
|
+
|
|
123
|
+
- `shig load "message"` - put files back to a matching save (becomes current)
|
|
124
|
+
- `shig undo` - discard unsaved changes and reload the last save on this tab
|
|
125
|
+
|
|
126
|
+
## Commands
|
|
127
|
+
|
|
128
|
+
| Command | What it does |
|
|
129
|
+
|---------|--------------|
|
|
130
|
+
| `shig start` | Set up this folder |
|
|
131
|
+
| `shig save "..."` | Snapshot current tab |
|
|
132
|
+
| `shig save --yes "..."` | Save even if remote is ahead |
|
|
133
|
+
| `shig load "..."` | Put files back to a save (becomes current) |
|
|
134
|
+
| `shig changes` | What is different since last save |
|
|
135
|
+
| `shig history` | Saves on current tab |
|
|
136
|
+
| `shig tab [name]` | List, switch, or create tabs |
|
|
137
|
+
| `shig untab <name>` | Remove a tab (history kept) |
|
|
138
|
+
| `shig bring <tab>` | Land current tab into another |
|
|
139
|
+
| `shig download [path\|url]` | Pull current tab from remote |
|
|
140
|
+
| `shig upload [path\|url]` | Push current tab to remote |
|
|
141
|
+
| `shig undo` | Discard unsaved changes; back to last save |
|
|
142
|
+
| `shig timeline` | Operation log |
|
|
143
|
+
|
|
144
|
+
## Ignore files
|
|
145
|
+
|
|
146
|
+
Edit `.shignore` (created on `shig start`). Same idea as `.gitignore`. Build output, `.shig/`, and junk stay out of snapshots.
|
|
147
|
+
|
|
148
|
+
## Project structure
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
shiggles/
|
|
152
|
+
shiggles/ Python package (commands, store, remote sync)
|
|
153
|
+
scripts/
|
|
154
|
+
shig-server.py Minimal HTTP remote for local testing
|
|
155
|
+
tests/
|
|
156
|
+
test_scenarios.py Scenario walkthrough and unit tests
|
|
157
|
+
install.ps1 Windows installer
|
|
158
|
+
LICENSE NWSL-1.0
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
On-disk repo layout:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
.shignore
|
|
165
|
+
.shig/
|
|
166
|
+
objects/
|
|
167
|
+
refs/tabs/
|
|
168
|
+
tabs/
|
|
169
|
+
collisions/
|
|
170
|
+
HEAD
|
|
171
|
+
config.json
|
|
172
|
+
timeline.log
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## HTTP dev server
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python scripts/shig-server.py ./remote-store -p 8765
|
|
179
|
+
shig upload http://127.0.0.1:8765
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Use the full URL including `http://`. A bare `127.0.0.1:8765` is not recognized as HTTP.
|
|
183
|
+
|
|
184
|
+
## Tests
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
python tests/test_scenarios.py # narrated walkthrough
|
|
188
|
+
python tests/test_scenarios.py --keep # keep files in tests/_sandbox/
|
|
189
|
+
python tests/test_scenarios.py --clean # wipe sandbox
|
|
190
|
+
python -m unittest discover -s tests -v # unit tests
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Publish to PyPI
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
pip install build twine
|
|
197
|
+
python -m build
|
|
198
|
+
twine upload dist/*
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Notes
|
|
202
|
+
|
|
203
|
+
- Shiggles is a simple VCS helper, not a replacement for full backups, cloud sync, or git power workflows.
|
|
204
|
+
- Collisions never overwrite your working files; compare copies under `.shig/collisions/`.
|
|
205
|
+
- See [ROADMAP.md](ROADMAP.md) for philosophy, collision policy, and deferred features.
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
This software is licensed under the **[NWSL](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)**.
|
|
210
|
+
|
|
211
|
+
Copyright (c) 2026 drLemis.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "shiggles"
|
|
7
|
+
version = "0.2.0"
|
|
8
|
+
description = "For git and shiggles. A simple content-addressed VCS."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
license = "LicenseRef-NWSL-1.0"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [{ name = "drLemis" }]
|
|
14
|
+
keywords = ["vcs", "version-control", "backup", "sync"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 4 - Beta",
|
|
17
|
+
"Environment :: Console",
|
|
18
|
+
"Intended Audience :: End Users/Desktop",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.9",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Programming Language :: Python :: 3.14",
|
|
26
|
+
"Topic :: System :: Archiving :: Backup",
|
|
27
|
+
]
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/drLemis/shiggles"
|
|
30
|
+
Repository = "https://github.com/drLemis/shiggles"
|
|
31
|
+
Issues = "https://github.com/drLemis/shiggles/issues"
|
|
32
|
+
|
|
33
|
+
[project.scripts]
|
|
34
|
+
shig = "shiggles.cli:main"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.packages.find]
|
|
37
|
+
where = ["."]
|
|
38
|
+
include = ["shiggles*"]
|
|
39
|
+
|
|
40
|
+
[project.optional-dependencies]
|
|
41
|
+
dev = ["build", "twine"]
|
shiggles-0.2.0/setup.cfg
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""CLI entry point for shig."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from shiggles import __version__
|
|
6
|
+
from shiggles.commands import (
|
|
7
|
+
cmd_bring,
|
|
8
|
+
cmd_changes,
|
|
9
|
+
cmd_download,
|
|
10
|
+
cmd_history,
|
|
11
|
+
cmd_load,
|
|
12
|
+
cmd_save,
|
|
13
|
+
cmd_start,
|
|
14
|
+
cmd_tab,
|
|
15
|
+
cmd_timeline,
|
|
16
|
+
cmd_undo,
|
|
17
|
+
cmd_untab,
|
|
18
|
+
cmd_upload,
|
|
19
|
+
)
|
|
20
|
+
from shiggles.util import die
|
|
21
|
+
|
|
22
|
+
COMMANDS = {
|
|
23
|
+
"start": cmd_start,
|
|
24
|
+
"save": cmd_save,
|
|
25
|
+
"load": cmd_load,
|
|
26
|
+
"changes": cmd_changes,
|
|
27
|
+
"history": cmd_history,
|
|
28
|
+
"undo": cmd_undo,
|
|
29
|
+
"tab": cmd_tab,
|
|
30
|
+
"untab": cmd_untab,
|
|
31
|
+
"bring": cmd_bring,
|
|
32
|
+
"download": cmd_download,
|
|
33
|
+
"upload": cmd_upload,
|
|
34
|
+
"timeline": cmd_timeline,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
HELP = f"""Shiggles v{__version__} - for git and shiggles.
|
|
38
|
+
|
|
39
|
+
Commands:
|
|
40
|
+
shig start set up this folder
|
|
41
|
+
shig save "message" snapshot current tab
|
|
42
|
+
shig save --yes "message" save even if remote is ahead (skip nudge)
|
|
43
|
+
shig load ["message"] put files back to a save (becomes current)
|
|
44
|
+
shig changes what's different since last save
|
|
45
|
+
shig history saves on current tab
|
|
46
|
+
shig tab [name] list tabs, or switch / create
|
|
47
|
+
shig untab <name> remove a tab (history kept)
|
|
48
|
+
shig bring <tab> land current tab into another (usually main)
|
|
49
|
+
shig download [path] get latest current tab (folder or URL)
|
|
50
|
+
shig upload [path] send current tab (folder or URL)
|
|
51
|
+
shig undo discard unsaved changes, restore last save
|
|
52
|
+
shig timeline operation log
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def main():
|
|
57
|
+
if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help", "help"):
|
|
58
|
+
print(HELP)
|
|
59
|
+
return
|
|
60
|
+
cmd = sys.argv[1]
|
|
61
|
+
if cmd not in COMMANDS:
|
|
62
|
+
die(f"Unknown command: {cmd}\n -> shig help")
|
|
63
|
+
COMMANDS[cmd](sys.argv[2:])
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == "__main__":
|
|
67
|
+
main()
|