<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>commit-internals</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>/ </span> <span class="title"> commit-internals </span> </span> </div> </div> <div id="pagebody"> <div id="content" role="main"> <p>Saving this irc transcript here, since it's a fairly in-depth discussion of how ikiwiki handles commits, locking, etc, and avoids some races while doing so.</p> <pre><code><tschwinge> What happens if I edit a page and in the underground a new version is installed into the svn repository? <tschwinge> The revision when I started editing was saved, right? <joeyh> what happens, exactly is: <joeyh> 1. the new version that was committed first get into svn, and ikiwiki updates its WC to have the new version <joeyh> 2. When you save your edit, ikiwiki detects a conflict. <joeyh> 3. It uses svn merge to try to resolve it; if it's resolved it adds your changes transparently <joeyh> 4. If the conflict needs manual resolution, it displays the page with conflict markers in the editor for you to resolve <tschwinge> Ok. <joeyh> Note that in step 2, it detects the conflict by using svn info to get the current Revision of the page in the WC, and compares that to a revision that is stored when you start to edit the page <joeyh> that's why rcs_prepedit exists, to get that revision info <tschwinge> But isn't there a race condition? <joeyh> well, there is locking going on too <joeyh> ikiwiki won't update the WC in step 1. if another instance of itself is getting the Revision info <tschwinge> Is that lockwiki()? <joeyh> yeah <joeyh> note that when it gets the current Revision info of a page during its conflict detection, svn could have changed the page in the repo, and the WC not been updated yet due to the lock, but this isn't a race since the commit will then fail due to a regular svn conflict and the conflict detction will still work. </code></pre> </div> </div> <div id="footer" class="pagefooter" role="contentinfo"> <div id="pageinfo"> <div id="backlinks"> Links: <a href="./rcs/details.html">rcs/details</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>