Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > d8544620e4ac7bee48ddb48c85d55709 > files > 455

ikiwiki-3.20190228-1.mga7.noarch.rpm

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>details</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />

<link rel="stylesheet" href="../style.css" type="text/css" />

<link rel="stylesheet" href="../local.css" type="text/css" />










</head>
<body>

<div class="page">

<div class="pageheader">
<div class="header">
<span>
<span class="parentlinks">

<a href="../index.html">ikiwiki</a>/ 

<a href="../rcs.html">rcs</a>/ 

</span>
<span class="title">
details

</span>
</span>



</div>









</div>





<div id="pagebody">

<div id="content" role="main">
<p>A few bits about the RCS backends</p>

<div class="toc">
	<ol>
		<li class="L2"><a href="#index1h2">Terminology</a>
		</li>
		<li class="L2"><a href="#index2h2">svn</a>
		</li>
		<li class="L2"><a href="#index3h2">darcs</a>
		</li>
		<li class="L2"><a href="#index4h2">Git</a>
		</li>
		<li class="L2"><a href="#index5h2">Mercurial</a>
		</li>
		<li class="L2"><a href="#index6h2">tla</a>
		</li>
		<li class="L2"><a href="#index7h2">rcs</a>
		</li>
		<li class="L2"><a href="#index8h2">Monotone</a>
		</li>
		<li class="L2"><a href="#index9h2">bzr</a>
		</li>
		<li class="L2"><a href="#index10h2">cvs</a>
		</li>
	</ol>
</div>

<h2><a name="index1h2"></a>Terminology</h2>

<p>``web-edit'' means that a page is edited by using the web (CGI) interface
as opposed to using a editor and the RCS interface.</p>

<h2><a name="index2h2"></a><a href="./svn.html">svn</a></h2>

<p>Subversion was the first RCS to be supported by ikiwiki.</p>

<h3><a name="index1h3"></a>How does it work internally?</h3>

<p>Master repository M.</p>

<p>RCS commits from the outside are installed into M.</p>

<p>There is a working copy of M (a checkout of M): W.</p>

<p>HTML is generated from W.  rcs_update() will update from M to W.</p>

<p>CGI operates on W.  rcs_commit() will commit from W to M.</p>

<p>For all the gory details of how ikiwiki handles this behind the scenes,
see <a href="../commit-internals.html">commit-internals</a>.</p>

<p>You browse and web-edit the wiki on W.</p>

<p>W "belongs" to ikiwiki and should not be edited directly.</p>

<h2><a name="index3h2"></a><a href="./darcs.html">darcs</a></h2>

<p>Regarding the repository layout: There are two darcs repositories. One is the <code>srcdir</code>, the other we'll call <code>master</code>.</p>

<ul>
<li>HTML is generated from <code>srcdir</code>.</li>
<li>CGI edits happen in <code>srcdir</code>.</li>
<li>The backend pulls updates from <code>master</code> into <code>srcdir</code>, i.e. darcs commits should happen to <code>master</code>.</li>
<li><p><code>master</code> calls ikiwiki (through a wrapper) in its apply posthook, i.e. <code>master/_darcs/prefs/defaults</code> should look like this:</p>

<p>apply posthook ikiwrap
apply run-posthook</p></li>
<li><p>The backend pushes CGI edits from <code>srcdir</code> back into <code>master</code> (triggering the apply hook).</p></li>
<li>The working copies in <code>srcdir</code> and <code>master</code> should <em>not</em> be touched by the user, only by the CGI or darcs, respectively.</li>
</ul>

<h2><a name="index4h2"></a><a href="./git.html">Git</a></h2>

<p>Regarding the Git support, Recai says:</p>

<p>I have been testing it for the past few days and it seems satisfactory.  I
haven't observed any race condition regarding the concurrent blog commits
and it handles merge conflicts gracefully as far as I can see.</p>

<p>(After about a year, git support is nearly as solid as subversion support --<span class="createlink">Joey</span>)</p>

<p>As you may notice from the patch size, GIT support is not so trivial to
implement (for me, at least). It has some drawbacks (especially wrt merge
which was the hard part).  GIT doesn't have a similar functionality like
'svn merge -rOLD:NEW FILE' (please see the relevant comment in <code>_merge_past</code>
for more details), so I had to invent an ugly hack just for the purpose.</p>

<blockquote>
  <p>I was looking at this, and WRT the problem of uncommitted local changes,
  it seems to me you could just git-stash them now that git-stash exists.
  I think it didn't when you first added the git support.. --<span class="createlink">Joey</span></p>
  
  <blockquote>
    <p>Yes,  git-stash had not existed before.  What about sth like below?  It
    seems to work (I haven't given much thought on the specific implementation
    details).  --<span class="createlink">roktas</span></p>

<pre><code> # create test files
 cd /tmp
 seq 6 &gt;page
 cat page
 1
 2
 3
 4
 5
 6
 sed -e 's/2/2ME/' page &gt;page.me # my changes
 cat page
 1
 2ME
 3
 4
 5
 6
 sed -e 's/5/5SOMEONE/' page &gt;page.someone # someone's changes
 cat page
 1
 2
 3
 4
 5SOMEONE
 6

 # create a test repository
 mkdir t
 cd t
 cp ../page .
 git init
 git add .
 git commit -m init

 # save the current HEAD
 ME=&#036;(git rev-list HEAD -- page)
 &#036;EDITOR page # assume that I'm starting to edit page via web

 # simulates someone's concurrent commit
 cp ../page.someone page
 git commit -m someone -- page

 # My editing session ended, the resulting content is in page.me
 cp ../page.me page
 cat page
 1
 2ME
 3
 4
 5
 6

 # let's start to save my uncommitted changes
 git stash clear
 git stash save "changes by me"
 # we've reached a clean state
 cat page
 1
 2
 3
 4
 5SOMEONE
 6

 # roll-back to the &#036;ME state
 git reset --soft &#036;ME
 # now, the file is marked as modified
 git stash save "changes by someone"

 # now, we're at the &#036;ME state
 cat page
 1
 2
 3
 4
 5
 6
 git stash list
 stash@{0}: On master: changes by someone
 stash@{1}: On master: changes by me

 # first apply my changes
 git stash apply stash@{1}
 cat page
 1
 2ME
 3
 4
 5
 6
 # ... and commit
 git commit -m me -- page

 # apply someone's changes
 git stash apply stash@{0}
 cat page
 1
 2ME
 3
 4
 5SOMEONE
 6
 # ... and commit
 git commit -m me+someone -- page
</code></pre>
  </blockquote>
</blockquote>

<p>By design, Git backend uses a "master-clone" repository pair approach in contrast
to the single repository approach (here, <em>clone</em> may be considered as the working
copy of a fictious web user).  Even though a single repository implementation is
possible, it somewhat increases the code complexity of backend (I couldn't figure
out a uniform method which doesn't depend on the prefered repository model, yet).
By exploiting the fact that the master repo and <em>web user</em>'s repo (<code>srcdir</code>) are all
on the same local machine, I suggest to create the latter with the "<code>git clone -l -s</code>"
command to save disk space.</p>

<p>Note that, as a rule of thumb, you should always put the rcs wrapper (<code>post-update</code>)
into the master repository (<code>.git/hooks/</code>).</p>

<p>Here is how a web edit works with ikiwiki and git:</p>

<ul>
<li>ikiwiki cgi modifies the page source in the clone</li>
<li>git-commit in the clone</li>
<li>git push origin master, pushes the commit from the clone to the master repo</li>
<li>the master repo's post-update hook notices this update, and runs ikiwiki</li>
<li>ikiwiki notices the modifies page source, and compiles it</li>
</ul>

<p>Here is a how a commit from a remote repository works:</p>

<ul>
<li>git-commit in the remote repository</li>
<li>git-push, pushes the commit to the master repo on the server</li>
<li>(Optionally, the master repo's pre-receive hook runs, and checks that the
update only modifies files that the pushing user is allowed to update. 
If not, it aborts the receive.)</li>
<li>the master repo's post-update hook notices this update, and runs ikiwiki</li>
<li>ikiwiki notices the modifies page source, and compiles it</li>
</ul>

<h2><a name="index5h2"></a><a href="./mercurial.html">Mercurial</a></h2>

<p>The Mercurial backend is still in a early phase, so it may not be mature 
enough, but it should be simple to understand and use.</p>

<p>As Mercurial is a distributed RCS, it lacks the distinction between 
repository and working copy (every wc is a repo).</p>

<p>This means that the Mercurial backend uses directly the repository as 
working copy (the master M and the working copy W described in the svn 
example are the same thing).</p>

<p>You only need to specify 'srcdir' (the repository M) and 'destdir' (where
the HTML will be generated).</p>

<p>Master repository M.</p>

<p>RCS commit from the outside are installed into M.</p>

<p>M is directly used as working copy (M is also W).</p>

<p>HTML is generated from the working copy in M. rcs_update() will update 
to the last committed revision in M (the same as 'hg update').
If you use an 'update' hook you can generate automatically the HTML
in the destination directory each time 'hg update' is called.</p>

<p>CGI operates on M. rcs_commit() will commit directly in M.</p>

<p>If you have any question or suggestion about the Mercurial backend 
please refer to <a href="http://nerd.ocracy.org/em/">Emanuele</a></p>

<h2><a name="index6h2"></a><a href="./tla.html">tla</a></h2>

<p>Nobody really understands how tla works. <img src="../smileys/smile4.png" alt=";-)" /></p>

<h2><a name="index7h2"></a>rcs</h2>

<p>There is a patch that needs a bit of work linked to from <span class="createlink">rcs</span>.</p>

<h2><a name="index8h2"></a><a href="./monotone.html">Monotone</a></h2>

<p>In normal use, monotone has a local database as well as a workspace/working copy.
In ikiwiki terms, the local database takes the role of the master repository, and
the srcdir is the workspace.  As all monotone workspaces point to a default
database, there is no need to tell ikiwiki explicitly about the "master" database.  It
will know.</p>

<p>The backend currently supports normal committing and getting the history of the page.
To understand the parallel commit approach, you need to understand monotone's
approach to conflicts:</p>

<p>Monotone allows multiple micro-branches in the database.  There is a command,
<code>mtn merge</code>, that takes the heads of all these branches and merges them back together
(turning the tree of branches into a dag).  Conflicts in monotone (at time of writing)
need to be resolved interactively during this merge process.
It is important to note that having multiple heads is not an error condition in a
monotone database.  This condition will occur in normal use.  In this case
'update' will choose a head if it can, or complain and tell the user to merge.</p>

<p>For the ikiwiki plugin, the monotone ikiwiki plugin borrows some ideas from the svn ikiwiki plugin.
On prepedit() we record the revision that this change is based on (I'll refer to this as the prepedit revision).  When the web user
saves the page, we check if that is still the current revision.  If it is, then we commit.
If it isn't then we check to see if there were any changes by anyone else to the file
we're editing while we've been editing (a diff bewteen the prepedit revision and the current rev).
If there were no changes to the file we're editing then we commit as normal.</p>

<p>It is only if there have been parallel changes to the file we're trying to commit that
things get hairy.  In this case the current approach is to
commit the web changes as a branch from the prepedit revision.  This
will leave the repository with multiple heads.  At this point, all data is saved.
The system then tries to merge the heads with a merger that will fail if it cannot
resolve the conflict.  If the merge succeeds then everything is ok.</p>

<p>If that merge failed then there are conflicts.  In this case, the current code calls
merge again with a merger that inserts conflict markers.  It commits this new
revision with conflict markers to the repository.  It then returns the text to the
user for cleanup.  This is less neat than it could be, in that a conflict marked
revision gets committed to the repository.</p>

<h2><a name="index9h2"></a><a href="./bzr.html">bzr</a></h2>

<h2><a name="index10h2"></a><a href="./cvs.html">cvs</a></h2>

</div>







</div>

<div id="footer" class="pagefooter" role="contentinfo">

<div id="pageinfo">






<div id="backlinks">
Links:

<a href="./cvs.html">cvs</a>

<a href="../plugins/write.html">plugins/write</a>

<a href="../post-commit.html">post-commit</a>

<a href="../rcs.html">rcs</a>


</div>






<div class="pagedate">
Last edited <span class="date">Tue Feb 26 23:01:54 2019</span>
<!-- Created <span class="date">Tue Feb 26 23:01:54 2019</span> -->
</div>

</div>


<!-- from ikiwiki -->
</div>

</div>

</body>
</html>