Fossil says the artifact list is supposed to be append-only, but it also has 
clusters as artifacts that are discardable. This is conceptually suboptimal.

Fossil tries to keep the storage of content a separate matter from the content 
itself, but doesn't fully succeed. The manifest is an essential part of the 
content, since it contains filenames, which are themselves content. However, 
some manifests also contain a B-card for delta compression, which is a storage 
matter.

The R-card looks redundant. What's it for? Whatever would use it for 
verification could just use a hash of the manifest itself instead (and verify 
the individual F-card hashes in addition to the hash of the manifest). Or if 
the goal is to have an identifier «I» that's a function just of the files (and 
their names) that doesn't depend on any of the other data in the manifest, then 
what's the point in putting the F-cards directly in the manifest, rather than 
putting them in a separate artifact and putting the hash (i.e. «I») of that 
artifact in the manifest, like Git does?

The Z-card looks redundant. The name of an artifact is a hash of it and stored 
with it as uuid in the blob table, so you already have a way to verify it.

Do R- and Z-cards need to be cryptographically secure? If so, why not use 
something better than md5? If not, then why not use something much faster than 
md5?

Fossil records renames, on the theory that file identity matters, unlike Git 
does. If I rename two files to each other, then swap their contents, then 
commit, then Fossil records exactly what happened, whereas Git thinks nothing 
happened. Also if I delete a file, commit, then create a new file with the same 
name, and commit, Fossil (and Git) records this. However, it appears that if I 
delete a file, then create a new file with the same name, _without_ an 
intervening commit, then Fossil would be as oblivious as Git is; the manifest 
has no way to record what happened (it would record it just as a change of 
content for the file). This is a defect, if file identity matters.

Tags for artifacts should be properties with value «true», not with value 
«nil». If the value is «nil», that should mean the artifact _doesn't_ have the 
specified property, which is how Emacs does it. I.e. ⌜(put 'some-artifact 
'some-property nil)⌝ really doesn't look like it means ‟put a property on the 
artifact”; it looks like it means ‟remove (nullify) the property from the 
artifact”. Instead, ⌜(put 'some-artifact 'some-property t)⌝ puts a property on.

Consider the following sequence of events:
A drive-by reader submits a bug report. ‟Hi, I just looked at your code. Maybe 
there's an overflow on line #xx?”
Developers #1 and #2 synchronize to the server, and get the new report.
#1 changes the bug status to security-critical, and he's right.
#1 immediately re-synchronizes so the other developers will know.
#1 then dies.
#2 changes the bug status to not-a-bug, saying ‟Line #yy obviously prevents 
overflow”, but he's mistaken.
#2 re-synchronizes so the other developers won't be bothered by yet another 
bogus bug report.
Everybody else synchronizes later. Nobody, not even #2, ever notices #1's 
update (even though everybody receives it), because #2's silently overrides it.

Does Fossil give any warning if you receive a new ticket update with a 
timestamp preceding an update that you yourself created and with a conflicting 
J-card? Then #2 would notice #1's update, even though nobody else would. This 
won't help if #2 dies too, but it's better than nothing.
_______________________________________________
fossil-users mailing list
[email protected]
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to