3.7 KiB
Sync Algorithm V3
Drafted on 20240117.
An absolutely better sync algorithm. Better for tracking deletions and better for subbranching.
Huge Thanks
Basically a combination of algorithm v2 + synclone + rsinc + (some of rclone bisync). All of the later three are released under MIT License so no worries about the licenses.
Features
Must have
- true deletion detection
- deletion protection (blocking) with a setting
- transaction from the old algorithm
- user warning show up, new algorithm needs all clients to be updated! (deliberately corrput the metadata file??)
- filters
- conflict warning
- partial sync
Nice to have
- true time and hash
- conflict rename
Description
We have five input sources:
- local all files
- remote all files
- local previous succeeded sync history
- local deletions
- remote deletions.
Init run, consuming remote deletions :
Change history data into local previous succeeded sync history.
Later runs, use the first, second, third sources only.
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:
local\remote | remote unchanged | remote modified | remote deleted | remote created |
---|---|---|---|---|
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 |