summaryrefslogtreecommitdiff
path: root/Readme.md
blob: ef81afdb1b2fa001df2b39767573dfd80d1beb6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# sv

sv is a source versioning tool.

## Why sv ?

Well git exists for almost 20 years now, and is now the de-facto
standard. Its design is sound, it works pretty well and is definitely
better than the previous generation of tools (cvs, subversion,
clearcase, etc.).

But to me, git is too large and complex in its format, usage, and
overall code. According to a [security audit on git], git has a
quarter of millions lines of code, C, Bash and Perl. This is not a
complaint.  Git is extremely useful, and covers succesfully an
incredibly large scope of uses.  But for my own simple usage, I
feel it is too large and complex, still too opaque.

I would prefer the storage of versions to be transparent: previous
versions stored directly as trees, not opaque archives. I would
prefer to see real version names instead of cryptographic sums,
which are useful but not in the face of users.

Patches are already in the right format: unified diff.

Storing the full history in place (under .git) is also very nice.

I think that it should be possible to create a small and minimalist
tool in a shell layer just on top of existing standard (POSIX) unix
commands to manipulate text files to implement all basic requirements
for a versioning system.

## Wanted features and constraints

- transactional: changes should be atomic, replayable, reversible,
  work correctly in distributed mode (client-server architecture).

- centralized: having one source of truth. Do not forbid replicas.

- transparent: every thing stored as pure text files, no tools
  needed to extract, browse, understand files. Use the file system
  as database.  This is the condition to remain usable over decades
  and decades, even after long unused periods.

- simple and minimal, thus secure. Unix philosophy: compose simple
  tools which are fast and proven, glued by shell script. Ideally,
  only one shell script necessary, no other dependencies than core
  system such as busybox+ssh or openBSD.

- fully self contained: each repo or clone contains the whole
  history, but also the minimal tooling to operate (at least the
  sv script itself).

- robust in presence of incomplete or degraded tooling: for example,
  still operate if no checksuming available (give up warranty on
  integrity).

- robust in presence of missing versions or patches.

- comply to standards whenever applicable: dates, mbox format, posix
  tools (sh, diff, patch).

## Low priority features and constraints

- performance: if you think it should be faster or more efficient,
  use git instead.

- support of binary or large files. Outside scope. Small binary
  files can be uuencoded.

- support of symbolic links.

- support of file modes and permissions.

## Todo

- branch command: create a named branch from a version
- checkout command


[security audit on git]: https://www.x41-dsec.de/static/reports/X41-OSTIF-Gitlab-Git-Security-Audit-20230117-public.pdf