2024-01-16 17:24:39 +00:00
# Sync Algorithm V3
Drafted on 20240117.
An absolutely better sync algorithm. Better for tracking deletions and better for subbranching.
## Huge Thanks
2024-02-24 00:21:05 +00:00
Basically a combination of algorithm v2 + [synclone ](https://github.com/Jwink3101/syncrclone/blob/master/docs/algorithm.md ) + [rsinc ](https://github.com/ConorWilliams/rsinc ) + (some of rclone [bisync ](https://rclone.org/bisync/ )). All of the later three are released under MIT License so no worries about the licenses.
2024-01-16 17:24:39 +00:00
## Features
Must have
1. true deletion detection
2. deletion protection (blocking) with a setting
3. transaction from the old algorithm
4. user warning show up, **new algorithm needs all clients to be updated!** (deliberately corrput the metadata file??)
5. filters
6. conflict warning
7. partial sync
Nice to have
1. true time and hash
2. conflict rename
## Description
2024-02-24 00:21:05 +00:00
We have _five_ input sources:
2024-01-16 17:24:39 +00:00
2024-02-24 00:21:05 +00:00
1. local all files
2. remote all files
3. _local previous succeeded sync history_
4. local deletions
5. remote deletions.
Init run, consuming remote deletions :
2024-01-16 17:24:39 +00:00
2024-03-17 15:58:54 +00:00
Change history data into _local previous succeeded sync history_ .
2024-01-16 17:24:39 +00:00
Later runs, use the first, second, third sources **only** .
2024-03-17 15:58:54 +00:00
Bidirectional table is modified based on synclone and rsinc. Incremental push / pull only tables is further modified based on the bidirectional table. The number inside the table cell is the decision branch in the code.
Bidirectional:
2024-02-24 00:21:05 +00:00
2024-02-24 15:25:15 +00:00
| local\remote | remote unchanged | remote modified | remote deleted | remote created |
| --------------- | ------------------ | ------------------------- | ------------------ | ------------------------- |
2024-03-17 15:58:54 +00:00
| local unchanged | (02/21) do nothing | (09) pull | (07) delete local | (??) conflict |
| local modified | (10) push | (16/17/18/19/20) conflict | (08) push | (??) conflict |
| local deleted | (04) delete remote | (05) pull | (01) clean history | (03) pull |
| local created | (??) conflict | (??) conflict | (06) push | (11/12/13/14/15) conflict |
Incremental push only:
| local\remote | remote unchanged | remote modified | remote deleted | remote created |
| --------------- | ---------------------------- | ---------------------------- | ---------------------- | ---------------------------- |
| local unchanged | (02/21) do nothing | ** (26) conflict push** | ** (32) conflict push** | (??) conflict |
| local modified | (10) push | ** (25) conflict push** | (08) push | (??) conflict |
| local deleted | ** (29) conflict do nothing** | ** (30) conflict do nothing** | (01) clean history | ** (28) conflict do nothing** |
| local created | (??) conflict | (??) conflict | (06) push | ** (23) conflict push** |
Incremental pull only:
| local\remote | remote unchanged | remote modified | remote deleted | remote created |
| --------------- | ---------------------- | ---------------------- | ---------------------------- | ---------------------- |
| local unchanged | (02/21) do nothing | (09) pull | ** (33) conflict do nothing** | (??) conflict |
| local modified | ** (27) conflict pull** | ** (24) conflict pull** | ** (34) conflict do nothing** | (??) conflict |
| local deleted | ** (35) conflict pull** | (05) pull | (01) clean history | (03) pull |
| local created | (??) conflict | (??) conflict | ** (31) conflict do nothing** | ** (22) conflict pull** |