To understand the "versioning" and conflict mechanism of Jake, we first have to explain some key concepts.
First, there is the log as the fundamental data structure. This is basically a table of:
|timestamp ...||userid ...||file ...||85j42h5f378 ...|
There are two main mechanisms: "LogSync" and "Pull".
A user can announce (or commit) a file to state that this is a new version. This adds a new entry to the log. Announce is a local operation.
First, whenever possible, a logsync is initialized, where clients send each other their log and complete what the other doesn't have.
When a client realizes that a newer version is available, it might do a pull. It can request from the user that issued the log entry, or from someone else.
The user may do a announce.
The user may do a pull.
The user should update with a pull, or resolve the conflict if local changes were made.
Summary: A conflict is a differences between a locally modified file and a newer version available that is newer than what my version is based upon. The user decides what the "new" version is.
Obviously, two clients could create new file versions, and then there has to be some method of resolving this conflict.
One of the two users will have a earlier time stamp and one a later time stamp. If not, the user id is used as a symmetry breaker.
First, both users may do a logsync and get each others log entries.
The user that created the later version does not have a conflict.
The user that created the earlier version is presented with a conflict dialog.
Here, the user can
To assist this choice, he/she may pull the later version and compare the two files, then either th
A conflict is simply the fact that the locally modified and present file is a early version than an incomming log entry.
This simple concept is powerful and covers all aspects of distributed versioning.