On Mar 19, 2015, at 5:52 PM, Abilio Marques <abili...@gmail.com> wrote:
> 
> I've toyed with the idea of writing a "shim" so fossil can be used in place 
> of git or subversion.

I speak only pidgin Git, so I wouldn’t like to speculate about how difficult 
such a shim would be to write.

I can, however, speak to the svn case.  I have used Subversion heavily for 
about a dozen years now, so I can pretty confidently predict that you’re going 
to run into a bunch of areas where the semantics of Fossil and Subversion 
differ enough to make building such a shim tricky, and in places actually 
difficult.

Here are the differences that immediately occur to me:

1. svn uses a monotonically-increasing revision number for the whole repository 
as the unique identifier for each checkin.  Fossil uses cryptographic hashes 
instead.  This affects every command in both systems that take an -r flag, and 
more.

(“More” because Fossil doesn’t always use -r to specify a checkin.  Fossil is 
somewhat of a bicameral mind on this point: sometimes you use -r, and other 
times you just give it as a bare parameter.)

For the same reason, I don’t know how you’d implement an svnversion wrapper in 
terms of Fossil.


2. Fossil branching and tagging are baked into the database schema; there’s 
only one way to do it.

In Subversion, branching and tagging are a mere *convention* built on top of 
the svn copy command, and there is no requirement that your copy target be 
somewhere under the repo’s branches or tags directories; that too is just a 
convention.

I don’t think you can actually emulate the full scope of the svn copy command 
in terms of Fossil.  There are things you can do with that command that do not 
map neatly to fossil tag and branch commands.


3. fossil timeline is not quite the same thing as svn log.

First you have to decide if you want to translate the output formats so that 
it’s parseable by tools that know how to read svn log output.

Then you have a deeper problem, which is that the two commands simply don’t 
entirely overlap in their capability.

Some svn log commands will be straightforward to translate into fossil timeline 
commands:

    svn log -r{2014-12-25}:HEAD

is the same as:

   fossil timeline after 2014-12-25 -n 0

But, svn also lets me give an arbitrary log endpoint, which fossil timeline 
doesn’t:

    svn log -r{2014-12-25}:r1234

How will your shim cope?


4. svn does one-step mv and rm operations.  Fossil currently requires a 
separate OS-level mv or rm to accompany the Fossil command in order to make the 
file tree consistent with the repo.

I’ve advocated for this to change, though it’s looking like if something along 
this line does happen, it won’t be to make Fossil behave exactly like svn, but 
perhaps more like Monotone instead.


5. svn ci is not quite the same thing as fossil ci.  Perhaps “fossil ci .” is 
close enough for your purposes.  (i.e. Subversion checks in only files in the 
current directory and its children, by default.)


6. svn allows sub-repo checkouts.  Fossil doesn’t.  (Yet.)


7. There is no equivalent to svn [un]lock in Fossil.  (Praise Ritchie!)


8. Emulating svn merge in terms of fossil merge amounts to taking a simple and 
straightforward interface and complexifying it.


9. svn doesn’t even blink if you try to check in a binary file.  Fossil copes 
just fine with binary files, too, but by default it second-guesses you whenever 
you do it with a file that isn’t on its glob whilelist.


10. svn info more or less combines what Fossil implements separately via info 
and finfo.  I think it might be tricky to work out which Fossil command to call 
for a given set of args to your svn wrapper.


11. svn stat and fossil stat are conceptually the same thing, but their output 
formats are quite different.


12. fossil open kind of overlaps the effects of svn co and svn switch, but not 
entirely.


13. Most of the svn prop{get,set,edit,del} properties do not exist in Fossil:

svn:ignore: Fossil has the ignore-glob setting, but it’s very much not the same 
thing.  Fossil and svn are almost inverses in the way they handle file 
ignorance.  (Ignoration?  Ignorification?)

svn:keywords: Fossil doesn’t do RCS/CVS-like keyword substitution at all, on 
purpose.

svn:executable: A similar per-file property exists in Fossil, but it’s more of 
an implicit property.  To make the shim behave *exactly* like svn, you’re going 
to have to defeat Fossil’s implicit use of the file’s modes to implement this 
property.

svn:eol-style: Fossil doesn’t do CRLF translation, ever.  I think those 
interested in using such a shim will be a self-selected set of people who have 
a greater-than-average interest in having such a feature than those willing to 
just switch to Fossil.  You may be asked to emulate this behavior on top of 
Fossil.

svn:mime-type: The “doc” URL handler in Fossil has a hard-coded implementation 
of this, which probably obviates the need to emulate this property, but perhaps 
someone needs the flexibility of per-file MIME types.

svn:externals: No equivalent in Fossil, as far as I can tell.

svn:needs-lock: No equivalent in Fossil, since there is no locking.


14. fossil ls and svn ls aren’t quite the same thing.  The semantic differences 
are mostly covered above in terms of other commands, so just take it as a fact 
already in evidence.


I’m sure I’ve missed a whole bunch of other differences.  Subversion and Fossil 
really are quite different.  Your shim will have to be quite thick in places in 
order to provide a convincing illusion.
_______________________________________________
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to