| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <style type="text/css"> /* <![CDATA[ */ |
| @import "branding/css/tigris.css"; |
| @import "branding/css/inst.css"; |
| /* ]]> */</style> |
| <link rel="stylesheet" type="text/css" media="print" |
| href="branding/css/print.css"/> |
| <script type="text/javascript" src="branding/scripts/tigris.js"></script> |
| <title>Subversion 1.5 Release Notes</title> |
| </head> |
| |
| <body> |
| <div class="app"> |
| |
| <h1 style="text-align: center">Subversion 1.5 Release Notes</h1> |
| |
| <div class="h2" id="news" title="news"> |
| <h2>What's New in Subversion 1.5</h2> |
| |
| <ul> |
| <li><a href="#merge-tracking" |
| >Merge tracking (foundational)</a></li> |
| <li><a href="#sparse-checkouts" |
| >Sparse checkouts (via new <tt>--depth</tt> option)</a></li> |
| <li><a href="#interactive-conflict-resolution" |
| >Interactive conflict resolution</a></li> |
| <li><a href="#changelists" |
| >Changelist support</a></li> |
| <li><a href="#externals" |
| >Relative URLs, peg revisions in <tt>svn:externals</tt></a></li> |
| <li><a href="#cyrus-sasl" |
| >Cyrus SASL support for ra_svn and <tt>svnserve</tt></a></li> |
| <li><a href="#fsfs-sharding" |
| >Improved support for large deployments on FSFS, via sharding</a></li> |
| <li><a href="#fsfs-isolate-immutable" |
| >Improved FSFS optimizability, via immutable file isolation</a></li> |
| <li><a href="#webdav-proxy" |
| >WebDAV transparent write-through proxy</a></li> |
| <li><a href="#copy-move-improvements" |
| >Improvements to <tt>copy</tt> and <tt>move</tt></a></li> |
| <li><a href="#cancellation-improvements" |
| >Speed improvements, cancellation response improvements</a></li> |
| <li><a href="#dav-modules" |
| >Easier to try experimental <tt>ra_serf</tt> DAV access module</a></li> |
| <li><a href="#apis" |
| >API changes, improvements, and much language bindings work</a></li> |
| <li><a href="#bug-fixes" |
| >More than 150 new bug fixes, enhancements</a></li> |
| </ul> |
| |
| <p>Subversion 1.5 is a superset of all previous Subversion releases, |
| and is considered the current "best" release. Any feature or bugfix |
| in 1.0.x through 1.4.x is also in 1.5, but 1.5 contains features and |
| bugfixes not present in any earlier release. The new features will |
| eventually be documented in a 1.5 version of the free Subversion book, |
| see <a href="http://svnbook.red-bean.com" >svnbook.red-bean.com</a>.</p> |
| |
| </div> <!-- news --> |
| |
| <div class="h2" id="compatibility" title="compatibility"> |
| <h2>Compatibility Concerns</h2> |
| |
| <p>Older clients and servers interoperate transparently with 1.5 |
| servers and clients. However, some of the new 1.5 features (e.g., <a |
| href="#merge-tracking" >merge tracking</a>) may not be available |
| unless both client and server are the latest version . There are also |
| cases (e.g., <a href="#sparse-checkouts">sparse checkouts</a>) where a |
| new feature will work but will run less efficiently if the client is |
| new and the server old.</p> |
| |
| <p>There is <strong>no need</strong> to dump and reload your |
| repositories. Subversion 1.5 can read repositories created by earlier |
| versions. To upgrade an existing installation, just install the |
| newest libraries and binaries on top of the older ones.</p> |
| |
| <p>Subversion 1.5 maintains API/ABI compatibility with earlier |
| releases, by only adding new functions, never removing old ones. A |
| program written to the 1.0, 1.1, 1.2, 1.3, or 1.4 API can both compile |
| and run using 1.5 libraries. However, a program written for 1.5 |
| cannot necessarily compile or run against older libraries.</p> |
| |
| <div class="h3" id="new-feature-compatibility-table" |
| title="new-feature-compatibility-table"> |
| <h3>New Feature Compatibility Table</h3> |
| <table border="1"> |
| <tr> |
| <th>New Feature</th> |
| <th>Minimum Client</th> |
| <th>Minimum Server</th> |
| <th>Minimum Repository</th> |
| <th>Notes</th></tr> |
| <tr> |
| <td><a href="#merge-tracking">Merge tracking</a></td> |
| <td>1.5</td> |
| <td>1.5</td> |
| <td>1.5</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#sparse-checkouts">Sparse checkouts</a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#interactive-conflict-resolution">Interactive conflict resolution</a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#changelists">Changelist support</a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#externals">Relative URLs, peg revisions in <tt>svn:externals</tt></a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#cyrus-sasl"> Cyrus SASL support for ra_svn and <tt>svnserve</tt></a></td> |
| <td>any<sup>*</sup>, 1.5</td> |
| <td>any<sup>*</sup>, 1.5</td> |
| <td>any</td> |
| <td><sup>*</sup>Limited, see <a href="#sasl-compatibility">SASL and <code>svn://</code> compatibility</a></td></tr> |
| <tr> |
| <td><a href="#fsfs-sharding"> Improved support for large deployments on FSFS, via sharding</a></td> |
| <td>any<sup>*</sup>, 1.5</td> |
| <td>1.5</td> |
| <td>1.5</td> |
| <td><sup>*</sup>1.5 required for <code>file://</code> compatibility</td></tr> |
| <tr> |
| <td><a href="#fsfs-isolate-immutable">Improved FSFS optimizability, via immutable file isolation</a></td> |
| <td>any<sup>*</sup>, 1.5</td> |
| <td>1.5</td> |
| <td>1.5</td> |
| <td><sup>*</sup>1.5 required for <code>file://</code> compatibility</td></tr> |
| <tr> |
| <td><a href="#webdav-proxy">WebDAV transparent write-through proxy</a></td> |
| <td>any</td> |
| <td>1.5<sup>*</sup></td> |
| <td>any</td> |
| <td><sup>*</sup>Apache 2.2 server also required</td></tr> |
| <tr> |
| <td><a href="#copy-move-improvements">Improvements to <tt>copy</tt> and <tt>move</tt></a></td> |
| <td>1.5</td> |
| <td>any<sup>*</sup>, 1.5</td> |
| <td>any</td> |
| <td><sup>*</sup>Limited, see <a href="#copy-move-improvements">Copy/move<tt>-</tt>related improvements</a></td></tr> |
| <tr> |
| <td><a href="#cancellation-improvements">Speed improvements, cancellation response improvements</a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| <tr> |
| <td><a href="#dav-modules">Easier to try experimental <tt>ra_serf</tt> DAV access module</a></td> |
| <td>1.5</td> |
| <td>any</td> |
| <td>any</td> |
| <td></td></tr> |
| </table> |
| |
| </div> <!-- new-feature-compatibility-table --> |
| |
| <div class="h3" id="wc-and-repos-format-change" |
| title="wc-and-repos-format-change"> |
| <h3>Working Copy and Repository Format Changes</h3> |
| |
| <p>The working copy format has been upgraded. This means that 1.4 and |
| older Subversion clients will <em>not</em> be able to work with |
| working copies produced by Subversion 1.5. Working copies are <a |
| href="#wc-upgrades" >upgraded automatically</a>.</p> |
| |
| <p>Similarly, the repository format has changed, meaning that 1.4 and |
| older versions of Subversion tools that normally access a repository |
| directly (e.g. <tt>svnserve</tt>, <tt>mod_dav_svn</tt>, |
| <tt>svnadmin</tt>) won't be able to read a repository created by |
| Subversion 1.5. But, repositories are <a href="#repos-upgrades" |
| ><strong>not</strong> upgraded automatically</a>.</p> |
| |
| <div class="h4" id="wc-upgrades" title="wc-upgrades"> |
| <h4>Working Copy Upgrades</h4> |
| |
| <p><strong>WARNING:</strong> if a Subversion 1.5 client encounters a |
| pre-1.5 working copy, it will <em>automatically</em> upgrade the |
| working copy format as soon as it touches it, making it unreadable by |
| older Subversion clients. If you are using several versions of |
| Subversion on your machine, be careful about which version you use in |
| which working copy, to avoid accidentally upgrading a working copy. |
| (But note that this "auto upgrade" behavior does <em>not</em> occur |
| with the <a href="#repos-upgrades" >repositories</a>, only working |
| copies.)</p> |
| |
| <p>If you accidentally upgrade a 1.4 working copy to 1.5, and wish to |
| downgrade back to 1.4, use the <a |
| href="http://svn.collab.net/repos/svn/trunk/tools/client-side/change-svn-wc-format.py" |
| ><tt>change-svn-wc-format.py</tt></a> script. See <a |
| href="http://subversion.tigris.org/faq.html#working-copy-format-change" |
| >this FAQ entry</a> for details, and run the script with the |
| <code>--help</code> option for usage instructions.</p> |
| |
| </div> <!-- wc-upgrades --> |
| |
| <div class="h4" id="repos-upgrades" title="repos-upgrades"> |
| <h4>Repository Upgrades</h4> |
| |
| <p>The Subversion 1.5 server works with 1.4 and older repositories, |
| and it will <em>not</em> upgrade such repositories to 1.5 unless |
| specifically requested to via the |
| <strong><code>svnadmin upgrade</code></strong> command. This means |
| that some of the new 1.5 features will not become available simply by |
| upgrading your server: you will also have to upgrade your |
| repositories. (We decided not to auto-upgrade repositories because we |
| didn't want 1.5 to silently make repositories unusable by |
| 1.4 — that step should be a conscious decision on the |
| part of the repository admin.)</p> |
| |
| <p>After running <strong><code>svnadmin upgrade</code></strong>, |
| you may wish to also run the <a |
| href="http://svn.collab.net/repos/svn/trunk/tools/server-side/svn-populate-node-origins-index.c" |
| >svn-populate-node-origins-index</a> program on the repository. |
| Subversion 1.5 maintains a node-origins index for each repository, and |
| builds the index lazily as the information is needed. But for old |
| repositories with lots of revisions, it's better to create the index |
| in one step, using the aforementioned tool, than to have live queries |
| be slower until the index has built itself. See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=3024" >issue |
| #3024</a> for details.</p> |
| |
| </div> <!-- repos-upgrades --> |
| |
| </div> <!-- wc-and-repos-format-change --> |
| |
| <div class="h3" id="output-changes" title="output-changes"> |
| <h3>Command Line Output Changes</h3> |
| |
| <p>Although we try hard to keep output from the command line programs |
| compatible between releases, new information sometimes has to be |
| added. This can break scripts that rely on the exact format of the |
| output. Unfortunately, we are not able to enumerate all of the output |
| changes in 1.5, but one of them is that conflict markers in files now |
| match the file's defined eol-style.</p> |
| |
| </div> <!-- output-changes --> |
| |
| <div class="h3" id="sasl-compatibility" title="sasl-compatibility"> |
| <h3>SASL and <code>svn://</code> compatibility</h3> |
| |
| <p>All 1.x clients, with or without Cyrus SASL support, will be able to |
| authenticate against all 1.x servers that do not have Cyrus SASL enabled. |
| Note that the <tt>CRAM-MD5</tt> and <tt>ANONYMOUS</tt> mechanisms are |
| built into Subversion, so you'll be able to use them even if the |
| corresponding Cyrus SASL plugins are missing.</p> |
| |
| <p>1.x clients without Cyrus SASL support will be able to authenticate |
| against 1.5+ servers with SASL enabled, provided the server allows the |
| <tt>CRAM-MD5</tt> and/or <tt>ANONYMOUS</tt> mechanisms.</p> |
| |
| <p>1.5+ clients with Cyrus SASL support will be able to authenticate against |
| 1.5+ servers with SASL enabled, provided at least one of the mechanisms |
| supported by the server is also supported by the client.</p> |
| |
| <p>See <a href="#cyrus-sasl" >this section</a> for more information on |
| using Cyrus SASL with Subversion.</p> |
| |
| </div> <!-- sasl-compatibility --> |
| |
| <div class="h3" id="revprops-compatibility" title="revprops-compatibility"> |
| <h3>Custom revprops may now need to be examined by <tt>pre-commit</tt> |
| hooks</h3> |
| |
| <p>Each revision in Subversion has a set of <q>revision properties</q> |
| associated with it; in addition to the standard log message, author, |
| and date, arbitrary user-defined properties can be set. These |
| properties are not themselves versioned, so there is no way to revert |
| changes to them. Because of this, you cannot modify revprops on a |
| committed revision without setting up a <tt>pre-revprop-change</tt> |
| hook on the server. Before Subversion 1.5, only the three standard |
| revprops could be set at commit time; administrators using hooks to |
| control the contents of the three standard revprops needed to check |
| during <tt>pre-commit</tt> and <tt>pre-revprop-change</tt>, but for |
| custom revprops, only <tt>pre-revprop-change</tt> appeared |
| relevant.</p> |
| |
| <p>Subversion 1.5 adds |
| a <a href="#commit-revprops"><tt>--with-revprop</tt> option to <tt>svn |
| commit</tt></a> which allows users to specify revprops for revisions |
| as they commit them. Thus, in Subversion 1.5, it is possible for |
| revproperties to be set on revisions without |
| any <tt>pre-revprop-change</tt>. The <tt>pre-commit</tt> hook can |
| examine the transaction's revision properties before it is committed |
| (just like many servers already use <tt>pre-commit</tt> to check for |
| properly formatted log messages, e.g.).</p> |
| |
| <p>This means that if you previously relied |
| on <tt>pre-revprop-change</tt> to control the ability to write to |
| revprops (as opposed to just keeping track of their history), you may |
| want to add similar controls to <tt>pre-commit</tt>.</p> |
| |
| </div> <!-- revprops-compatibility --> |
| |
| |
| </div> <!-- compatibility --> |
| |
| <div class="h2" id="new-features" title="new-features"> |
| <h2>New Features</h2> |
| |
| <div class="h3" id="merge-tracking" title="merge-tracking"> |
| <h3>Merge tracking (foundational) (<em>client and server</em>)</h3> |
| |
| <p><em>Merge tracking</em> means Subversion keeps track of what |
| changes have been merged where. This reduces the overhead involved in |
| maintaining branches, and gives users a way to inquire what changes |
| are merged — or are available to be |
| merged — on different lines of development.</p> |
| |
| <p>The merge tracking support in Subversion 1.5 is "foundational": its |
| basic functionality is implemented, but there are still parts of our |
| <a href="http://subversion.tigris.org/merge-tracking/" >original |
| spec</a> that remain to be done, and merging is sometimes too slow. |
| There will be merge tracking improvements in Subversion 1.5.1 and |
| afterwards. In the meantime:</p> |
| |
| <ul> |
| <li><p>Take a look at <a href="#mt-known-issues" |
| >the list of known issues</a></p></li> |
| <li><p>Read <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword" |
| >"The Final Word on Merge Tracking"</a> in the Subversion Book</p></li> |
| <li><p>Read <a |
| href="http://www.collab.net/community/subversion/articles/merge-info.html" |
| >"Understanding the internals of Subversion's merge tracking feature"</a> |
| by Paul Burba</p></li> |
| </ul> |
| |
| <div class="h4" id="mt-overview" title="mt-overview"> |
| <h4>Overview</h4> |
| |
| <p>Subversion's merge tracking is designed to:</p> |
| |
| <ul> |
| <li>Reduce the bookkeeping overhead for branch maintenance</li> |
| <li>Avoid common cases of the "repeated merge" problem</li> |
| <li>Allow for cherry-picking of changes</li> |
| </ul> |
| |
| <p>Each changeset is identified by its revision number, and merged |
| changesets are recorded in the new |
| <strong><code>svn:mergeinfo</code></strong> property (known colloquially |
| as "mergeinfo") set on the destination of the merge. Subversion keeps |
| mergeinfo up-to-date automatically, but there is also a way to <a |
| href="#mt-record-only" >record/unrecord merges manually</a>, since |
| there will always be cases where a human knows something that |
| Subversion doesn't.</p> |
| |
| </div> <!-- mt-overview --> |
| |
| <div class="h4" id="mt-ui" title="mt-ui"> |
| <h4>User interface</h4> |
| |
| <p>Merging changes from (say) trunk to a branch no longer requires |
| that you specify the revision range. Instead, each time you want to |
| sync up with trunk, you can just do:</p> |
| |
| <pre> $ cd BRANCH_WORKING_COPY |
| $ svn merge URL_TO_TRUNK</pre> |
| |
| <p>Subversion will figure out what changes from URL_TO_TRUNK have not |
| yet been merged and pull in just those changes. When it's time to |
| merge the branch back to trunk, do this:</p> |
| |
| <pre> $ cd TRUNK_WORKING_COPY |
| $ svn merge --reintegrate URL_TO_BRANCH</pre> |
| |
| <p>Below is a more formal description of all the |
| merge-tracking-related interface changes.</p> |
| |
| <p>The <strong><code>svn merge</code></strong> command takes two new |
| options: <strong><code>--record-only</code></strong> and |
| <strong><code>--reintegrate</code></strong>.</p> |
| |
| <div id="mt-record-only" title="mt-record-only"> |
| <p>The --record-only option works with -r and does exactly what you |
| think it does: it marks a revision as merged (or unmerged, if using |
| the "-" revision number negation syntax), without actually changing |
| anything besides the mergeinfo. For example, this would be useful |
| when someone has hand-edited a file in such a way as to effectively |
| incorporate a change that was already made somewhere else. Rather |
| than have the original change be ported over in the next |
| synchronization merge, thus risking textual conflicts wherever the two |
| versions trivially differ, you can just record the change as already |
| merged. (See <a |
| href="http://subversion.tigris.org/merge-tracking/requirements.html#manual-merge" |
| >the merge-tracking requirements</a>, and <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.blockchanges" |
| >Blocking Changes</a> in the Subversion book, for more details.)</p> |
| </div> <!-- mt-record-only --> |
| |
| <div id="mt-reintegrate" title="mt-reintegrate"> |
| <p>The --reintegrate option is used when merging a branch back to |
| trunk; it checks for some common safeguard conditions and then does |
| the merge in a fast and efficient way. See <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.stayinsync" |
| >Keeping a branch in sync</a> in the Subversion book for more.</p> |
| </div> <!-- mt-reintegrate --> |
| |
| <p>The new <strong><code>svn mergeinfo</code></strong> command can |
| show which changesets a directory has absorbed and which changesets |
| it's still eligible to receive. See <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchmerge.basicmerging.mergeinfo" |
| >Mergeinfo and Previews</a> in the Subversion book for more information.</p> |
| |
| <p>The <strong><code>svn log</code></strong> and |
| <strong><code>svn blame</code></strong> commands take a new |
| <strong><code>-g</code></strong> |
| (<strong><code>--use-merge-history</code></strong>) option, which tells |
| them to take mergeinfo into account. Without this option, they won't.</p> |
| |
| <p>The reason for the -g option is that it is sometimes useful to |
| ignore merge history. In blame output you sometimes want to see the |
| person B who merged a change, though other times you want to see the |
| person A who originally wrote the change that B later merged; use -g |
| to get the latter information. In log output, you sometimes want to |
| see exactly the revisions that were committed on a given line of |
| development, though other times you want to see, as part of the same |
| output, the original changes that were later ported as merge |
| revisions; again, -g includes the latter information (tagged with |
| lines that say "<tt>Merged via: </tt>" followed by the revision number |
| in which the merge took place). See <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.logblame" |
| >Merge-Sensitive Logs and Annotations</a> in the Subversion book for |
| more details.</p> |
| |
| </div> <!-- mt-ui --> |
| |
| <div class="h4" id="mt-compatibility" title="mt-compatibility"> |
| <h4>Merge tracking and compatibility</h4> |
| |
| <p>As described earlier, merge-tracking is not supported unless you <a |
| href="#repos-upgrades" >upgrade the repository</a> as well as the |
| server.</p> |
| |
| <p>If you were using the <a |
| href="http://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge/" |
| >svnmerge</a> wrapper program to do merging, and now want to switch to |
| using Subversion 1.5's native merge-tracking, then you should use the |
| <a |
| href="http://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge/svnmerge-migrate-history.py" |
| >svnmerge-migrate-history.py</a> script to convert svnmerge's custom |
| properties to the <tt>svn:mergeinfo</tt> properties that Subversion |
| itself now uses.</p> |
| |
| </div> <!-- mt-compatibility --> |
| |
| <div class="h4" id="mt-known-issues" title="mt-known-issues"> |
| <h4>Known Issues</h4> |
| |
| <p>There are still known issues with merge tracking in 1.5.0. We're |
| working on the most important ones first, which are:</p> |
| |
| <ul> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3128" |
| >issue #3128</a>: <code>merge --reintegrate</code> should handle |
| renames better</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2897" |
| >issue #2897</a>: proper support for reflective merges</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3126" |
| >issue #3126</a>: better change-availability reporting |
| (<code>svn mergeinfo</code> shows too few or too many eligible |
| revisions)</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2837" |
| >issue #2837</a>: allow merge tracking to be useful when performing |
| cyclic merging</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3056" |
| >issue #3056</a>: avoid repeat merge in an intelligent way</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2898" |
| >issue #2898</a>: handle mergeinfo when deleting/adding children |
| you don't have access to</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3067" |
| >issue #3067</a>: subtrees that don't exist at the start or end of |
| a merge range shouldn't break the merge</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3157" |
| >issue #3157</a>: merging a change from a path's natural history |
| creates self-referential mergeinfo</li> |
| <li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3174" |
| >issue #3174</a>: merge algorithm chokes on subtrees needing |
| special attention that have been renamed</li> |
| </ul> |
| |
| <p>(See also the <a |
| href="http://subversion.tigris.org/issues/buglist.cgi?issue_status=UNCONFIRMED&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&keywords=merge-tracking&keywords_type=anytokens" |
| >list of merge-tracking-related open issues</a> and the <a |
| href="http://subversion.tigris.org/issues/buglist.cgi?issue_status=UNCONFIRMED&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&short_desc=merg&short_desc_type=substring" |
| >list of all merge-related open issues</a>, though note that not all |
| of merge-related issues are about merge-tracking and many predate it.)</p> |
| |
| <p><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3157" |
| >Issue #3157</a> is particularly easy to run into, so here's a more |
| detailed explanation of what the issue is and how to work around |
| it:</p> |
| |
| <p>Merge tracking information currently can include the "natural |
| history" of a path. One situation where this happens is when creating |
| a <tt>branch</tt> from <tt>trunk</tt> at a certain revision <tt>X</tt> |
| and later merging all changes from <tt>branch</tt> back to |
| <tt>trunk</tt>, without explicitly limiting the merge range and |
| without using the <a href="#mt-reintegrate" |
| ><code>--reintegrate</code> option</a>. Afterwards, the merge |
| tracking information on <tt>trunk</tt> will list revisions before |
| <tt>X</tt>. This does no harm to future merge operations, but |
| thereafter <code>svn log -g</code> on <tt>trunk</tt> will report these |
| revisions from the "natural history", which is typically not expected. |
| This is because <code>svn log -g</code> uses the merge tracking |
| information from previous revisions (not only from HEAD).</p> |
| |
| <p>Note that this should not be a problem with release branches (also |
| called "maintenance branches"), because one typically does not merge |
| them back to trunk. Instead, recommended practice is for new changes |
| to enter on trunk and be ported outward to the branches that need the |
| changes. However, you could run into this problem with a feature |
| branch, which would be merged back to trunk once, at the end of the |
| branch's lifetime.</p> |
| |
| <p>One workaround is to correct the merge tracking information before |
| committing the merged revision, by reverse merging the "natural |
| history" information: <code>svn merge --record-only -rX:1</code>. |
| Another solution is to avoid this situation entirely, by explicitly |
| specifying merge ranges in the first place, e.g.: <tt>-rX:HEAD</tt>. |
| See <a |
| href="http://subversion.tigris.org/servlets/ReadMsg?listName=dev&msgNo=139379" |
| >this mail</a> for more information.</p> |
| |
| <p>When merging a feature branch, the best solution is to <a |
| href="#mt-reintegrate" >use the <code>--reintegrate</code> option</a>; |
| then this problem won't happen in the first place.</p> |
| |
| </div> <!-- mt-known-issues --> |
| |
| <div class="h4" id="mt-further-reading" title="mt-further-reading"> |
| <h4>Further reading</h4> |
| |
| <p>For more on merge-tracking in Subversion 1.5, see:</p> |
| |
| <ul> |
| <li><a href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.html" |
| >Chapter 4: Branching and Merging</a> in the Subversion book |
| </li> |
| <li><a href="http://blog.red-bean.com/sussman/?p=92" >Subversion 1.5 |
| merge-tracking in a nutshell</a> (blog post by Ben Collins-Sussman) |
| </li> |
| <li><a href="http://subversion.tigris.org/merge-tracking/" >The merge |
| tracking design documents</a> |
| (requirements, use cases, functional spec, design) |
| </li> |
| </ul> |
| |
| </div> <!-- mt-further-reading --> |
| |
| </div> <!-- merge-tracking --> |
| |
| <div class="h3" id="sparse-checkouts" title="sparse-checkouts"> |
| <h3>Sparse checkouts (<em>client and server</em>)</h3> |
| |
| <p>Many users have very large trees of which they only want to |
| checkout certain parts. In previous versions of Subversion, |
| <code>checkout -N</code> was not really up to this task. Subversion |
| 1.5 introduces the <strong><code>--depth</code></strong> option to the |
| <strong><code>checkout</code></strong>, |
| <strong><code>switch</code></strong>, and |
| <strong><code>update</code></strong> subcommands. This option |
| replaces <code>-N</code>, and allows users to construct working |
| copies containing just what's needed, leaving out everything else.</p> |
| |
| <div class="h4" id="sc-depth" title="sc-depth"> |
| <h4>Depth overview</h4> |
| <p>Each directory now understands the notion of <em>depth</em>, which has |
| four possible values: <tt>empty</tt>, <tt>files</tt>, <tt>immediates</tt>, |
| <tt>infinity</tt>. The values are defined as follows:</p> |
| |
| <table border="1"> |
| <tr> |
| <td><tt>empty</tt></td> |
| <td>Updates will not pull in any files or subdirectories not already |
| present.</td> |
| </tr> |
| <tr> |
| <td><tt>files</tt></td> |
| <td>Updates will pull in any files not already present, but not |
| subdirectories.</td> |
| </tr> |
| <tr> |
| <td><tt>immediates</tt></td> |
| <td>Updates will pull in any files or subdirectories not already present; |
| the new subdirectories will have depth-empty.</td> |
| </tr> |
| <tr> |
| <td><tt>infinity</tt></td> |
| <td>Updates will pull in any files or subdirectories not already present; |
| the new subdirectories will have depth-infinity. Equivalent to today's |
| default update behavior.</td> |
| </tr> |
| </table> |
| |
| <p>The <code>--depth</code> option sets depth values as it updates the working |
| copy, tweaking new subdirectories' depth values as described above.</p> |
| |
| </div> <!-- sc-depth --> |
| |
| <div class="h4" id="sc-ui" title="sc-ui"> |
| <h4>User Interface</h4> |
| <p>Affected commands:</p> |
| <ul> |
| <li><code>checkout</code></li> |
| <li><code>switch</code></li> |
| <li><code>update</code></li> |
| <li><code>status</code></li> |
| <li><code>info</code></li> |
| </ul> |
| |
| <p>The <code>-N</code> option becomes a synonym for <code>--depth=files</code> |
| for these commands. This changes the existing <code>-N</code> behavior for |
| these commands, but in a trivial way (see below).</p> |
| |
| <p><code>checkout</code> without <code>--depth</code> or |
| <code>-N</code> behaves the same as it does today. |
| <code>switch</code> and <code>update</code> without |
| <code>--depth</code> or <code>-N</code> behave the same way as today |
| if and only if the working copy is fully depth-infinity. |
| <code>switch</code> and <code>update</code> without |
| <code>--depth</code> or <code>-N</code> will <em>not</em> change depth |
| values (exception: a missing directory specified on the command line |
| will be pulled in).</p> |
| |
| <p>Thus, <code>checkout</code> is identical to <code>checkout |
| --depth=infinity</code>, but <code>switch</code> and <code>update</code> are |
| not the same as <code>switch --depth=infinity</code> and <code>update |
| --depth=infinity</code>. The former update entries according to existing depth |
| values, while the latter pull in everything.</p> |
| |
| <p>To get started, run <code>checkout</code> with |
| <code>--depth=empty</code> or <code>--depth=files</code>. If |
| additional files or directories are desired, pull them in with |
| <code>update</code> commands using appropriate <code>--depth</code> |
| options. The <code>svn status</code> command should list the ambient |
| depths of directories, in addition to whatever other statuses are |
| listed. The <code>svn info</code> command also lists ambient depth, |
| when invoked on a directory whose depth is not the default |
| (depth-infinity)</p> |
| |
| <p><strong>Note:</strong> There is currently no <em>deselection</em> |
| interface for sparse checkouts — that is, there is no |
| command to unselect or "fold up" a subdirectory after you've brought |
| it into a sparse working copy (although there are some fairly easy |
| workarounds to achieve the same effect). See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=2843" >issue |
| #2843</a> for details.</p> |
| |
| </div> <!-- sc-ui --> |
| |
| <div class="h4" id="sc-compat" title="sc-compat"> |
| <h4>Compatibility with older servers</h4> |
| |
| <p>The new <tt>--depth</tt> feature naturally requires the client to |
| be 1.5+, and will work most efficiently if the server is also 1.5+. |
| However, the client will still behave correctly if the server is 1.4.x |
| or lower; things will just be less efficient.</p> |
| |
| <p>This is because older servers do not |
| understand — and therefore |
| ignore — what the client tells them about "depth". So |
| when a client requests a depth shallower than depth-infinity, older |
| servers will send back more data than the client wants. However, a |
| 1.5+ client will know it's talking to an older server and filter out |
| this extra data. Thus, operations may take a while, because the |
| server sends a lot of data over the network that the client then |
| ignores, but the final result on the client side will be the same. |
| (Note that older servers understand a <tt>recurse</tt> flag in the |
| network protocols, and 1.5+ clients send that flag based on the depth; |
| this alleviates some of the extra network traffic penalty.)</p> |
| |
| </div> <!-- sc-compat --> |
| |
| <div class="h4" id="sc-further-reading" title="sc-further-reading"> |
| <h4>Further reading</h4> |
| |
| <ul> |
| <li>The <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.advanced.sparsedirs.html" |
| >Sparse Directories</a> section in the Subversion book. |
| </li> |
| <li>The <a |
| href="http://svn.collab.net/repos/svn/trunk/notes/sparse-directories.txt" |
| >design/implementation document</a> in the repository.</li> |
| </ul> |
| |
| </div> <!-- sc-further-reading --> |
| |
| </div> <!-- sparse-checkouts --> |
| |
| <div class="h3" id="interactive-conflict-resolution" |
| title="interactive-conflict-resolution"> |
| <h3>Interactive Conflict Resolution (<em>client</em>)</h3> |
| |
| <p>Conflict resolution is now done interactively by the command-line |
| client for the |
| <code>update</code>/<code>switch</code>/<code>merge</code> |
| subcommands, and the client library offers a callback function so |
| other clients can do similarly.</p> |
| |
| <p>Here's an example using the command-line client:</p> |
| |
| <pre> |
| $ svn up |
| U contrib/client-side/svnmerge/svnmerge_test.py |
| Conflict discovered in 'contrib/client-side/svnmerge/svnmerge.py'. |
| Select: (p) postpone, (df) diff-full, (e) edit, |
| (s) show all options: s |
| (p) postpone - mark the conflict to be resolved later |
| (df) diff-full - show all changes made to merged file |
| (e) edit - change merged file in an editor |
| (r) resolved - accept merged version of file |
| (mf) mine-full - accept my version of entire file (ignore their changes) |
| (tf) theirs-full - accept their version of entire file (lose my changes) |
| (l) launch - launch external tool to resolve conflict |
| (s) show all - show this list |
| |
| Select: (p) postpone, (df) diff-full, (e) edit, |
| (s) show all options: tf |
| G contrib/client-side/svnmerge/svnmerge.py |
| Updated to revision 25685. |
| $ |
| </pre> |
| |
| <p>This feature can be selectively disabled by using the --non-interactive |
| option, or disabled permanently by setting '[miscellany] interactive-conflicts |
| = no' in your run-time config file.</p> |
| |
| <p>The API for interactive conflict resolution is exposed via a |
| callback function and the following new data types:</p> |
| |
| <ul> |
| <li><code>svn_wc_conflict_resolver_func_t</code>, the callback API |
| itself</li> |
| <li><code>svn_wc_conflict_description_t</code>, a description of the |
| conflict passed to the callback</li> |
| <li><code>svn_wc_conflict_action_t</code>, the part of the conflict |
| description indicating what the merge was trying to do</li> |
| <li><code>svn_wc_conflict_reason_t</code>, the part of the conflict |
| description indicating the type of conflict</li> |
| <li><code>svn_wc_conflict_result_t</code>, returned by the callback |
| as the result of any conflict resolution attempt</li> |
| <li><code>svn_wc_conflict_choice_t</code>, an enum indicating what |
| course of action the user chose</li> |
| </ul> |
| |
| <p>Clients provide their callback function to Subversion's libraries |
| by setting it on the (new) <code>conflict_func</code> field of their |
| <code>svn_client_ctx_t</code>, and may provide additional state to the |
| callback via the corresponding <code>conflict_baton</code> field.</p> |
| |
| </div> <!-- interactive-conflict-resolution --> |
| |
| <div class="h3" id="changelists" title="changelists"> <h3>Changelist |
| support (<em>client</em>)</h3> <p>The Subversion client now contains |
| the notion of a <em>changelist</em>: a group of files which are |
| associated with a chosen name. This becomes especially useful when |
| working on several different set of files within the same working |
| copy. Instead of having to remember each file in each set, Subversion |
| 1.5 will allow you to associate a changelist with each set of files. |
| Most commands which take a set of files as targets will now also |
| accept the <strong><code>--changelist</code></strong> option, which |
| filters those targets based upon the members of the changelist. |
| Changelist membership can be edited using the new |
| <strong><code>changelist</code></strong> subcommand.</p> |
| |
| <p>Changelists are handled entirely by the client. They are never sent |
| to the server, and aren't visible to other users of the same repository. |
| Also, the <code>--changelist</code> option is never additive; if a file |
| wouldn't have been included in the list of targets without |
| <code>--changelist</code>, it will not be added to it, regardless of membership |
| in the changelist. Currently, a file may only be in one changelist at a |
| time, and directories can not be members of a changelist.</p> |
| |
| <p>The <code>--changelist</code> option is supported by the following |
| subcommands:</p> |
| <ul> |
| <li><code>changelist</code></li> |
| <li><code>commit</code></li> |
| <li><code>diff</code> (only wc-wc and wc-repos cases)</li> |
| <li><code>info</code></li> |
| <li><code>propget</code></li> |
| <li><code>proplist</code></li> |
| <li><code>propset</code></li> |
| <li><code>propdel</code></li> |
| <li><code>revert</code></li> |
| <li><code>status</code></li> |
| <li><code>update</code></li> |
| </ul> |
| |
| <div class="h4" id="cl-further-reading" title="cl-further-reading"> |
| <h4>Further reading</h4> |
| |
| <ul> |
| <li>The <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.advanced.changelists.html" |
| >Changelists</a> section in the Subversion book. |
| </li> |
| <li>The <a |
| href="http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt" |
| >design/implementation document</a> in the repository.</li> |
| </ul> |
| |
| </div> <!-- cl-further-reading --> |
| |
| </div> <!-- changelists --> |
| |
| <div class="h3" id="externals" title="externals"> |
| <h3>Relative URLs, peg revisions in <tt>svn:externals</tt> |
| (<em>client</em>)</h3> |
| |
| <p>Two additions to the <tt>svn:externals</tt> feature</p> |
| |
| <div class="h4" id="externals-peg-revs" title="externals-peg-revs"> |
| <h4>Peg revision syntax for URLs</h4> |
| |
| <p><em>Compatibility and the new syntax:</em> For compatibility |
| reasons, the pre-1.5 svn:externals syntax continues to not understand |
| peg revisions. A new format has been introduced to allow peg |
| revisions in URLs.</p> |
| |
| <p>The old format of</p> |
| <pre> |
| foo http://example.com/repos/zig |
| foo/bar -r 1234 http://example.com/repos/zag |
| </pre> |
| |
| <p>does not support peg revisions, and the following externals will |
| not work (unless there are directories named <tt>zig@HEAD</tt> and |
| <tt>zag@HEAD</tt>):</p> |
| |
| <pre> |
| foo http://example.com/repos/zig@HEAD |
| foo/bar -r 1234 http://example.com/repos/zag@HEAD |
| </pre> |
| |
| <p>The new format moves the URL first followed by the directory the |
| external is checked out or exported into; if there is an operative |
| (-r) revision, it precedes the URL. Here are four externals lines:</p> |
| |
| <pre> |
| http://example.com/repos/zig foo1 |
| -r 1234 http://example.com/repos/zag foo/bar1 |
| http://example.com/repos/zig@HEAD foo2 |
| -r 1234 http://example.com/repos/zag@HEAD foo/bar2 |
| </pre> |
| |
| <p>In other words, both operative ("-r") and peg ("@") revisions are |
| allowed, but neither is required.</p> |
| |
| </div> <!-- externals-peg-revisions --> |
| |
| <div class="h4" id="externals-relative-urls" title="externals-relative-urls"> |
| <h4>Support for relative URLs</h4> |
| |
| <p>Prior to Subversion 1.5, the URLs in an <tt>svn:externals</tt> |
| specification must be absolute. Now they can be relative. Four |
| different relative externals specifications are supported. (In the |
| following examples, assume we have two repositories: one at |
| <tt>http://example.com/svn/repos-1</tt> and another at |
| <tt>http://example.com/svn/repos-2</tt>. We have a checkout of |
| <tt>http://example.com/svn/repos-1/project1/trunk</tt> and the |
| <tt>svn:externals</tt> property is set on <tt>trunk</tt>.)</p> |
| |
| <dl><dt><strong>../</strong></dt> |
| <dd><p>Relative to the directory with the <tt>svn:externals</tt> |
| property. These URLs always begin with the string <tt>../</tt>, for |
| example:</p> |
| <pre> |
| ../../project2/trunk common/project2/trunk |
| </pre> |
| |
| <p>This will extract |
| <tt>http://example.com/svn/repos-1/project2/trunk</tt> into |
| <tt>common/project2/trunk</tt>. The external's URL is relative to the |
| URL of the directory with the <tt>svn:externals</tt> property, not the |
| directory where the external is written to disk.</p></dd> |
| |
| <dt><strong>^/</strong></dt> |
| |
| <dd><p>Relative to the repository root.</p> |
| |
| <pre> |
| ^/project2/trunk common/project2/trunk |
| </pre> |
| |
| <p>This will extract |
| <tt>http://example.com/svn/repos-1/project2/trunk</tt> into |
| <tt>common/project2/trunk</tt>.</p> |
| |
| <p>You can also refer to other repositories easily using repository |
| root relative URLs:</p> |
| |
| <pre> |
| ^/../repos-2/foo/trunk common/foo/trunk |
| </pre> |
| |
| <p>This will extract <tt>http://example.com/svn/repos-2/foo/trunk</tt> |
| into <tt>common/foo/trunk</tt>.</p> |
| </dd> |
| |
| <dt><strong>//</strong></dt> |
| |
| <dd><p>Relative to the scheme. This copies the scheme of the checkout |
| or export URL into the URL in <tt>svn:externals</tt>. It is useful |
| when the same hostname must the accessed with different schemes |
| depending upon network location; i.e. clients in the intranet use |
| <tt>http://</tt> while external clients use <tt>svn+ssh://</tt>.</p> |
| |
| <pre> |
| //example.com/svn/repos-1/project2/trunk common/project2/trunk |
| </pre> |
| |
| <p>This will extract |
| <tt>http://example.com/svn/repos-1/project2/trunk</tt> into |
| <tt>common/project2/trunk</tt>. If the working copy was checked out |
| from <tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt> then |
| this URL would be |
| <tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt>.</p> |
| </dd> |
| |
| <dt><strong>/</strong></dt> |
| |
| <dd><p>Server root relative URLs. This copies the scheme and hostname |
| from the checkout or export URL into the <tt>svn:externals</tt> |
| URL.</p> |
| |
| <pre> |
| /svn/repos-1/project2/trunk common/project2/trunk |
| </pre> |
| |
| <p>This will extract |
| <tt>http://example.com/svn/repos-1/project2/trunk</tt> into |
| <tt>common/project2/trunk</tt>. If the working copy was checked out |
| from <tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt> then |
| this URL would be |
| <tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt>.</p> |
| </dd> |
| |
| </dl> |
| |
| <p>Relative URLs are still supported in the old <tt>svn:externals</tt> |
| format (that does not support peg revisions).</p> |
| |
| <p>When Subversion sees an <tt>svn:externals</tt> without an absolute |
| URL, it takes the first argument as a relative URL and the second as |
| the target directory.</p> |
| |
| </div> <!-- externals-relative-urls --> |
| |
| <div class="h4" id="externals-further-reading" |
| title="externals-further-reading"> |
| <h4>Further reading</h4> |
| |
| <p>See The <a |
| href="http://svnbook.red-bean.com/nightly/en/svn.advanced.externals.html" |
| >svn:externals</a> section of the Subversion Book.</p> |
| |
| </div> <!-- externals-further-reading --> |
| |
| </div> <!-- externals --> |
| |
| <div class="h3" id="cyrus-sasl" title="cyrus-sasl"> |
| <h3>Cyrus SASL support for ra_svn and <tt>svnserve</tt> (<em>client |
| and server</em>)</h3> |
| |
| <p>From <a |
| href="http://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer"> |
| Wikipedia</a>: "SASL is a framework for authentication and data security in |
| Internet protocols. It decouples authentication mechanisms from application |
| protocols, in theory allowing any authentication mechanism supported by SASL to |
| be used in any application protocol that uses SASL."</p> |
| |
| <p>In practice, the server sends a list of authentication mechanisms that it |
| supports. The client then selects one of these mechanisms based on what the |
| client supports, and informs the server of its decision. After that, a |
| number of messages are exchanged until either authentication succeeds or an |
| error occurs. In the latter case, the client is allowed to restart |
| authentication.</p> |
| |
| <p>The <tt>svn://</tt> protocol has always supported this type of negotiation. |
| However, only the <tt>CRAM-MD5</tt> and <tt>ANONYMOUS</tt> mechanisms were |
| implemented. <a href="http://asg.web.cmu.edu/sasl/">Cyrus SASL</a> supports |
| all these, and, in addition, provides a host of other mechanisms such as |
| <tt>DIGEST-MD5</tt>, OTP (One-Time Passwords), GSSAPI (used for Kerberos |
| authentication), NTLM (NT LAN Manager), SRP (Secure Remote Password), and |
| others. The exact list of available mechanisms depends on how SASL was |
| compiled, as many of them either have external dependencies, or are not |
| built by default. Also, because each mechanism is actually a shared library |
| that is dynamically loaded at runtime, many distributions package these |
| mechanisms separately from the core library.</p> |
| |
| <p>Please see the <a href="#sasl-compatibility">compatibility |
| section</a> for information regarding using a 1.5 SASL-enabled server |
| with pre-1.5 clients. More information about Subversion's SASL |
| support can be found in <a |
| href="http://svn.collab.net/repos/svn/trunk/notes/sasl.txt" |
| >sasl.txt</a>.</p> |
| |
| </div> <!-- cyrus-sasl --> |
| |
| <div class="h3" id="fsfs-sharding" title="fsfs-sharding"> |
| <h3>Improved support for large deployments on FSFS, via sharding |
| (<em>server</em>)</h3> |
| |
| <p>The FSFS filesystem backend stores each revision in its own file, and prior |
| to Subversion 1.5, all of these files were stored in a common directory in |
| the repository. Now, <em>newly created</em> FSFS repositories will use a |
| two-level directory tree with up to (by default) 1000 files per directory. |
| These repositories will only be compatible with other Subversion 1.5 clients, |
| but of course, Subversion 1.5 will be able to continue using repositories |
| employing the older scheme without any problem.</p> |
| |
| <p>The primary reason for the change is to allow the revision count to |
| grow beyond the filesystem's (efficient) directory entry limit. While |
| modern filesystems can support millions of entries per directory, they |
| become slower and common administrative tools (e.g. directory |
| listings, backups) become unwieldy or fail completely.</p> |
| |
| <p>For more information about the technical underpinnings of FSFS sharding, |
| see this <a href="http://www.farside.org.uk/200704/tree_structured_fsfs">blog |
| entry</a>. |
| <!-- ### Reshard script is not quite finished and currently |
| ### aborts if you try to run it. |
| <a |
| href="http://svn.collab.net/repos/svn/trunk/tools/server-side/fsfs-reshard.py" |
| >Migration script</a> provided. |
| --> |
| </p> |
| |
| <p>The shard size can by adjusted by editing the |
| "<code>layout sharded</code>" line in "db/format" after |
| <code>svnadmin create</code> but before populating the |
| repository.</p> |
| |
| </div> <!-- fsfs-sharding --> |
| |
| <div class="h3" id="fsfs-isolate-immutable" title="fsfs-isolate-immutable"> |
| <h3>Improved FSFS optimizability, via immutable file isolation |
| (<em>server</em>)</h3> |
| |
| <p>The FSFS repositories never change a revision after it is written |
| to the disk. Although this should allow the operating system to cache |
| these files forever, certain filesystems (e.g. NFS) prohibit such |
| caching by default. Now the FSFS repository layout has been changed |
| such that the immutable files are confined to the subdirectories |
| "db/revs" and "db/txn-protorevs". This allows these directories to be |
| on a mount point where caching is enabled (on Linux look at the |
| "nocto" option to nfs(5)).</p> |
| |
| <p>Since commit transactions are now built up in "db/txn-protorevs" |
| instead of "db/transactions", the latter directory no longer needs to |
| be on the same mount point. If the repository is stored on a slower |
| filesystem (e.g. NFS), then commit performance can be improved by |
| moving the transactions directory to local disk (using a symbolic |
| link). If you are using multiple svn servers behind a network load |
| scaler, you must configure the load scaler to direct to the same |
| server for the duration of the transaction. This is typically called |
| "client affinity".</p> |
| |
| </div> <!-- fsfs-isolate-immutable --> |
| |
| <div class="h3" id="webdav-proxy" title="webdav-proxy"> |
| <h3>WebDAV transparent write-through proxy (<em>server</em>)</h3> |
| |
| <p>Subversion 1.4 <a |
| href="http://subversion.tigris.org/svn_1.4_releasenotes.html#svnsync"> |
| introduced <tt>svnsync</tt></a> — a tool which |
| provided the ability to replicate repository history from one |
| repository to another. Though useful, <tt>svnsync</tt> could only |
| pull revision history from a repository, not push additional commits |
| back to the master. Subversion 1.5 adds WebDAV proxy support to |
| <tt>mod_dav_svn</tt>, effectively allowing bidirectional revision |
| history replication between master servers and slave servers using |
| <tt>mod_dav_svn</tt>.</p> |
| |
| <p>All clients interact with a slave server, but the slave transparently |
| passes all of the write-oriented activites to the master (rewriting the |
| content as necessary). The slaves are essentially read-only, but they |
| do have a complete copy of the repository locally. This serves to |
| alleviate read traffic from the master server which may be desirable |
| in certain circumstances.</p> |
| |
| <p>This model has several advantages to using a straight HTTP DAV-aware |
| caching proxy, in that each slave can respond to all read-only requests |
| without ever having to relay them to the master backend.</p> |
| |
| <div class="h4" id="webdav-proxy-requirements" |
| title="webdav-proxy-requirements"> |
| <h4>Requirements</h4> |
| <ul> |
| <li>Subversion 1.5 or newer.</li> |
| <li>Apache HTTP Server 2.2.0 or higher with mod_proxy enabled. |
| (Several fixes to mod_proxy were committed for this patch that were not |
| backported to the 2.0 branch of httpd.)</li> |
| </ul> |
| |
| </div> <!-- webdav-proxy-requirements --> |
| |
| <div class="h4" id="webdav-proxy-example" title="webdav-proxy-example"> |
| <h4>Example configuration</h4> |
| |
| <p>Participants:</p> |
| <ul> |
| <li>Slave → <tt>slave.example.com</tt> (there can be many!)</li> |
| <li>Master → <tt>master.example.com</tt> (there can only be one!)</li> |
| <li>A WebDAV client (<tt>ra_neon</tt>, <tt>ra_serf</tt>, other WebDAV |
| clients)</li> |
| </ul> |
| |
| <p>Each client does:</p> |
| <pre><code> |
| % svn co http://slave.example.com/repos/slave/ |
| ... |
| % svn ci |
| % ...etc... |
| </code></pre> |
| <p>(The client can perform all operations as normal.)</p> |
| |
| <p>Each slave has:</p> |
| <pre><code> |
| <Location /repos/slave> |
| DAV svn |
| SVNPath /my/local/copy/of/repos |
| SVNMasterURI http://master.example.com/repos/master/ |
| </Location> |
| </code></pre> |
| |
| <p>The master MUST have a post-commit hook that updates all of the slaves. An |
| example that does this using <code>svnadmin dump</code>/<code>svnadmin |
| load</code> and ssh is provided below. <tt>svnsync</tt> can probably do the |
| same thing.</p> |
| |
| <p>Additionally, if locks are permitted on the master repository, lock |
| databases need to kept in sync via post-lock and post-unlock hooks on |
| the master pushing the lock state to the slaves. (Username |
| preservation is left as an exercise to the reader. Translation: <a |
| href="hacking.html#patches">patches to these notes are most |
| welcome</a>.) If the lock database is not propagated, users will not |
| be able to accurately determine whether a lock is |
| held — but locking will still work.</p> |
| |
| <p>A sample synchronization script may look like this:</p> |
| <pre><code> |
| #!/bin/sh |
| REPOS="$1" |
| REV="$2" |
| SLAVE_HOST=slave.example.com |
| SLAVE_PATH=/my/local/copy/of/repos |
| |
| # Ensure svnadmin is in $PATH on both this machine and the remote server! |
| svnadmin dump --incremental -r$2 $1 > /tmp/$2.dump |
| scp /tmp/$2.dump $SLAVE_HOST:$SLAVE_PATH |
| ssh $SLAVE_HOST "svnadmin load $SLAVE_PATH < $SLAVE_PATH/$2.dump" |
| ssh $SLAVE_HOST "rm $SLAVE_PATH/$2.dump" |
| rm /tmp/$2.dump |
| </code></pre> |
| |
| </div> <!-- webdav-proxy-example --> |
| |
| <div class="h4" id="webdav-proxy-further-reading" |
| title="webdav-proxy-further-reading"> |
| <h4>Further reading</h4> |
| |
| <p>Additional information about WebDAV proxy support is available <a |
| href="http://svn.collab.net/repos/svn/trunk/notes/webdav-proxy">in the |
| repository</a>.</p> |
| |
| </div> <!-- webdav-proxy-further-reading --> |
| |
| </div> <!-- webdav-proxy --> |
| |
| </div> <!-- new-features --> |
| |
| |
| <div class="h2" id="enhancements" title="enhancements"> |
| <h2>Enhancements and Bugfixes</h2> |
| |
| <div class="h3" id="copy-move-improvements" title="copy-move-improvements"> |
| <h3>Copy/move-related improvements (<em>client and server</em>)</h3> |
| |
| <p>The abilities and behavior of <code>copy</code> and |
| <code>move</code> operations are significantly improved in 1.5+.</p> |
| |
| <div class="h4" id="leverage-copyfrom" title="leverage-copyfrom"> |
| <h4>Improved copy-handling during updates (<em>client and server</em>)</h4> |
| |
| <p>A common problem in older versions of Subversion was the way in |
| which <code>svn update</code> handled incoming copies and moves.</p> |
| |
| <p>Consider this scenario: Harry runs <code>svn move foo bar; svn |
| commit</code>, and meanwhile Sally makes local changes to 'foo', and |
| then runs <code>svn update</code>. In earlier versions of Subversion, |
| the server would send down a completely new file 'bar', and unversion |
| the file 'foo' (if it had no uncommitted changes, Subversion would |
| remove it entirely.) From Sally's point of view, her changes seem to |
| be lost; the newly added 'bar' file has the older content, and the |
| file 'foo' has been taken out of version control.</p> |
| |
| <p>In Subversion 1.5, the client and server both attempt to be smarter |
| about this. The server doesn't send a whole new file during the |
| update, but rather instructions to copy something that likely already |
| exists in the working copy. So Sally's 'foo' file is copied to 'bar' |
| (with local edits intact!).</p> |
| |
| <p>In theory, this is the best-case scenario. There are a few |
| caveats: this "proper copying" of existing working-copy resources only |
| works on files, not (yet) on directories. Also, if an incoming |
| move-operation deletes 'foo' before it attempts to copy it to 'bar', |
| then the copy will fail, and the client reverts to the old behavior of |
| fetching a pristine copy of the file from the repository. We hope to |
| address this in svn 1.6.</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=503" >issue |
| #503</a> for more.</p> |
| |
| </div> <!-- leverage-copyfrom --> |
| |
| <div class="h4" id="copy-peg-revs" title="copy-peg-revs"> |
| <h4>Peg revisions (<em>client</em>)</h4> |
| |
| <p>Copy and move operations now accept sources with peg ("@") |
| revisions.</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=2546" >issue |
| #2546</a> for more.</p> |
| |
| </div> <!-- copy-peg-revs --> |
| |
| <div class="h4" id="multi-op-copy-move" title="multi-op-copy-move"> |
| <h4>Multiple working copy copy/move operations (<em>client</em>)</h4> |
| |
| <p>Clients may now perform chained copy/move operations locally on a |
| single object in a working copy:</p> |
| |
| <pre> |
| svn mv path1 path2 |
| svn mv path2 path3 |
| </pre> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=756" >issue |
| #756</a> for more.</p> |
| |
| </div> <!-- multi-op-copy-move --> |
| |
| <div class="h4" id="multi-src-copy" title="multi-src-copy"> |
| <h4>Improved handling multiple copy/move sources (<em>client</em>)</h4> |
| |
| <p>Clients now accept multiple sources for copy and move operations, with |
| the ability to copy/move each of the sources to the specified directory. |
| This mirrors the behavior of standard command-line copy and move tools, |
| such as <code>cp</code> and <code>mv</code>. For example:</p> |
| |
| <pre> |
| svn mkdir new_subdir |
| svn mv foo.txt bar.txt baz.txt new_subdir |
| </pre> |
| |
| <p>In practice, this means users can take advantage of shell globbing |
| when doing a local copy or move:</p> |
| |
| <pre> |
| svn cp *.c dir |
| </pre> |
| |
| <p>Multiple source copy/move also works for all previously defined |
| copy/move working copy and repository combinations.</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=747" >issue |
| #747</a> for more.</p> |
| |
| </div> <!-- multi-src-copy --> |
| |
| <div class="h4" id="cp-takes-base" title="cp-takes-base"> |
| <h4>Copy takes -rBASE (<em>client</em>)</h4> |
| |
| <p>Copy now understands the special revision "BASE" in a working copy |
| (as in: "<tt>-rBASE</tt>").</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=1643" >issue |
| #1643</a> for more.</p> |
| |
| </div> <!-- cp-takes-base --> |
| |
| <div class="h4" id="cp-mv-intermediate-dirs" title="cp-mv-intermediate-dirs"> |
| <h4>Creation of intermediate directories with copy/move |
| (<em>client and server</em>)</h4> |
| |
| <p>See the section on the new <a href="#intermediate-directories" |
| >--parents option</a> for more about this.</p> |
| |
| </div> <!-- cp-mv-intermediate-dirs --> |
| |
| </div> <!-- copy-move-improvements --> |
| |
| <div class="h3" id="cancellation-improvements" |
| title="cancellation-improvements"> |
| <h3>Cancellation improvements (<em>client</em>)</h3> |
| |
| <p>Clients operations are now significantly more responsive to |
| cancellation (e.g. via <tt>control-c</tt>). In pre-1.5 releases, |
| after directing an operation to stop, one sometimes had to wait for |
| some time (e.g. while I/O occurred) before the operation would |
| actually stop.</p> |
| |
| </div> <!-- cancellation-improvements --> |
| |
| <div class="h3" id="cmdline" title="cmdline"> |
| <h3>Command-line client improvements (<em>client</em>)</h3> |
| |
| <p>There are far too many enhancements and new options to the |
| command-line client to list them all here. Aside from all the ones |
| mentioned already in these release notes, below are a few more that we |
| consider important, but please see the 1.5.0 section in the <a |
| href="http://svn.collab.net/repos/svn/trunk/CHANGES">CHANGES</a> file |
| for a complete list.</p> |
| |
| <div class="h4" id="resolve" title="resolve"> |
| <h4>New "resolve" subcommand replaces "resolved"</h4> |
| |
| <p>A new <strong><tt>resolve</tt></strong> subcommand replaces the |
| "<tt>resolved</tt>" subcommand (the latter is deprecated, but still |
| present for compatibility). The new subcommand takes a |
| <strong><tt>--accept=orig|mine|repo</tt></strong> option to select |
| which version of a file to retain (which means Subversion now supports |
| batch-style conflict resolution).</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=2784" >issue |
| #2784</a> for more.</p> |
| |
| </div> <!-- resolve --> |
| |
| <div class="h4" id="intermediate-directories" |
| title="intermediate-directories"> |
| <h4>Create intermediate directories if asked</h4> |
| |
| <p>Add, mkdir, copy, and move take a new |
| <strong><tt>--parents</tt></strong> option, which makes intermediate |
| directories as necessary to create the destination path.</p> |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=1776" >issue |
| #1776</a> for more</p> |
| |
| </div> <!-- intermediate-directories --> |
| |
| <div class="h4" id="keep-local" title="keep-local"> |
| <h4>New --keep-local option retains path after delete.</h4> |
| |
| <p>Delete (remove) now takes a |
| <strong><code>--keep-local</code></strong> option to retain its |
| targets locally, so paths will not be removed even if unmodified.</p> |
| |
| </div> <!-- keep-local --> |
| |
| <div class="h4" id="commit-revprops" title="commit-revprops"> |
| <h4>Commit now takes a --with-revprop option.</h4> |
| |
| Commit now takes a <strong><tt>--with-revprop</tt></strong> option |
| allowing one to set revision properties |
| |
| <p>See <a |
| href="http://subversion.tigris.org/issues/show_bug.cgi?id=1976" >issue |
| #1976</a> for more.</p> |
| |
| </div> <!-- commit-revprops --> |
| |
| </div> <!-- cmdline --> |
| |
| <div class="h3" id="dav-modules" title="dav-modules"> |
| <h3>Easier to try out experimental <tt>ra_serf</tt> DAV access module |
| (<em>client</em>)</h3> |
| |
| <p>Subversion 1.4 introduced the experimental <tt>ra_serf</tt> |
| repository access module for accessing HTTP[S] DAV Subversion servers. |
| This uses the <a href="http://code.google.com/p/serf/">serf</a> |
| library instead of the Neon library which the original DAV support |
| uses. serf supports pipelined requests which may lead to better |
| performance. However, Subversion 1.4 required you to choose which |
| module to use for accessing DAV servers at build time, which made it |
| difficult to find out which module performs better for your usage |
| patterns.</p> |
| |
| <p>Subversion 1.5 allows you to build both modules at the same time; |
| you can choose which library to use on a global or host-by-host basis |
| by setting the <tt>http-library</tt> variable in your run-time server |
| configuration file (<tt>~/.subversion/servers</tt>). In recognition |
| of the fact that both libraries are DAV clients, we have |
| renamed <tt>ra_dav</tt> to <tt>ra_neon</tt>.</p> |
| |
| </div> <!-- dav-modules --> |
| |
| <div class="h3" id="apis" title="apis"> |
| <h3>API changes, improvements and language bindings |
| (<em>client and server</em>)</h3> |
| |
| <p>There are too many new and revised APIs in Subversion 1.5.0 to even |
| begin to list them all here. See the <a |
| href="http://svn.collab.net/svn-doxygen/" >Subversion API |
| Documentation</a> page for general API information. If you develop a |
| 3rd-party client application that uses Subversion APIs, you should |
| probably look at the header files for the interfaces you use and see |
| what's changed.</p> |
| |
| <p>One general change is that most APIs that formerly took a |
| <tt>recurse</tt> parameter have been upgraded to accept a |
| <tt>depth</tt> parameter instead, to enable the new <a |
| href="#sparse-checkouts">sparse checkouts</a> feature.</p> |
| |
| <p>Language bindings have mostly been updated for the new APIs, though |
| some may lag more than others.</p> |
| |
| </div> <!-- apis --> |
| |
| <div class="h3" id="bug-fixes" title="bug-fixes"> |
| <h3>Bug fixes (<em>client and server</em>)</h3> |
| |
| <p>A great many bugs have been fixed. See the 1.5.0 section in the <a |
| href="http://svn.collab.net/repos/svn/trunk/CHANGES">CHANGES</a> file |
| for details.</p> |
| |
| </div> <!-- bug-fixes --> |
| |
| </div> <!-- enhancements --> |
| |
| <div class="h2" id="svn-1.3-deprecation" title="svn-1.3-deprecation"> |
| <h2>Subversion 1.3.x series no longer supported</h2> |
| |
| <p>The Subversion 1.3.x line is no longer supported. This doesn't |
| mean that your 1.3 installation is doomed; if it works well and is all |
| you need, that's fine. "No longer supported" just means we've stopped |
| accepting bug reports against 1.3.x versions, and will not make any |
| more 1.3.x bugfix releases, except perhaps for absolutely critical |
| security or data-loss bugs.</p> |
| |
| </div> <!-- svn-1.3-deprecation --> |
| |
| <div class="h2" id="deps" title="deps"> |
| <h2>Subversion Dependencies Distribution: Binary Compatibility Issues</h2> |
| |
| <div class="h3" id="deps-background" title="deps-background"> |
| <h3>Background</h3> |
| |
| <p>APR 0.9.x and 1.x are binary-incompatible. This means if you are |
| already using Subversion with APR 0.9.x, and then upgrade your libapr |
| to 1.X <em>without rebuilding Subversion</em>, things will break. |
| Things will also break if your Subversion server libraries are linked |
| to one version of APR but your Apache HTTPD server is linked to a |
| different version.</p> |
| |
| <p>For a long time, Subversion's main source distribution included APR |
| 0.9.x, which was the latest available at the time, along with a few |
| other things (e.g., Neon, zlib) that weren't yet widespread on |
| installation systems.</p> |
| |
| </div> <!-- deps-background --> |
| |
| <div class="h3" id="deps-now" title="deps-now"> |
| <h3>Subversion 1.5.0 Dependencies Distribution</h3> |
| |
| <p>Today, these dependencies are no longer exotic, so our source |
| distribution contains just Subversion itself. Those building |
| Subversion are expected to have the necessary libraries already |
| installed, or to be able to fetch them easily. But for convenience, |
| we still offer a "deps" distribution: it doesn't contain Subversion, |
| it just has source code for those third-party libraries.</p> |
| |
| <p>Until Subversion 1.5.0, the deps distribution contained APR 0.9.x, |
| but as of 1.5.0, we're finally upgrading it to APR 1.x. This is |
| because by now there are very few systems that will have binary |
| compatibility issues, and of those, few are likely to build using the |
| "deps" dist.</p> |
| |
| <p>If you already have a Subversion installation using APR 0.9.x, it's |
| still possible to move to APR 1.x safely (although you are not |
| required to, unless you use the deps dist). Just be sure to recompile |
| Subversion, and Apache httpd if necessary, after upgrading APR.</p> |
| |
| <p>Note that it's perfectly safe to use APR 1.x from the beginning. |
| In fact, we recommend it. If you're building Subversion for the first |
| time, there's no compatibility issue to worry about, so just grab the |
| latest version of APR (or use our deps dist).</p> |
| |
| </div> <!-- deps-now --> |
| |
| </div> <!-- deps --> |
| |
| </div> <!-- app --> |
| </body> |
| </html> |