You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by gb...@apache.org on 2013/12/08 18:56:53 UTC

svn commit: r1549081 [4/18] - in /subversion/branches/invoke-diff-cmd-feature: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ contrib/server-side/ contrib/server-side/svncutter/ subversion/bindings/javahl/native/ subversion/bind...

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java Sun Dec  8 17:56:46 2013
@@ -219,6 +219,33 @@ public class BasicTests extends SVNTests
     }
 
     /**
+     * Test RuntimeVersion
+     */
+    public void testRuntimeVersion() throws Throwable
+    {
+        try
+        {
+            RuntimeVersion runtimeVersion = client.getRuntimeVersion();
+            String versionString = runtimeVersion.toString();
+            if (versionString == null || versionString.trim().length() == 0)
+            {
+                throw new Exception("Version string empty");
+            }
+        }
+        catch (Exception e)
+        {
+            fail("RuntimeVersion should always be available unless the " +
+                 "native libraries failed to initialize: " + e);
+        }
+
+        RuntimeVersion runtimeVersion = client.getRuntimeVersion();
+        Version version = client.getVersion();
+        assertTrue(runtimeVersion.getMajor() > version.getMajor()
+                   || (runtimeVersion.getMajor() == version.getMajor()
+                       && runtimeVersion.getMinor() >= version.getMinor()));
+    }
+
+    /**
      * Test the JNIError class functionality
      * @throws Throwable
      */
@@ -2350,7 +2377,7 @@ public class BasicTests extends SVNTests
         List<RevisionRange> ranges = mergeInfo.getRevisions(mergeSrc);
         assertTrue("Missing merge info for source '" + mergeSrc + "' on '" +
                    targetPath + '\'', ranges != null && !ranges.isEmpty());
-        RevisionRange range = (RevisionRange) ranges.get(0);
+        RevisionRange range = ranges.get(0);
         String expectedMergedRevs = expectedMergeStart + "-" + expectedMergeEnd;
         assertEquals("Unexpected first merged revision range for '" +
                      mergeSrc + "' on '" + targetPath + '\'',
@@ -2613,6 +2640,7 @@ public class BasicTests extends SVNTests
      * @throws Throwable
      * @since 1.5
      */
+    @SuppressWarnings("deprecation")
     public void testMergeReintegrate() throws Throwable
     {
         OneTest thisTest = setupAndPerformMerge();
@@ -3269,7 +3297,7 @@ public class BasicTests extends SVNTests
 
         // Rigorously inspect one of our DiffSummary notifications.
         final String BETA_PATH = "A/B/E/beta";
-        DiffSummary betaDiff = (DiffSummary) summaries.get(BETA_PATH);
+        DiffSummary betaDiff = summaries.get(BETA_PATH);
         assertNotNull("No diff summary for " + BETA_PATH, betaDiff);
         assertEquals("Incorrect path for " + BETA_PATH, BETA_PATH,
                      betaDiff.getPath());
@@ -3963,6 +3991,8 @@ public class BasicTests extends SVNTests
         extends HashMap<String, Collection<String>>
         implements ChangelistCallback
     {
+        private static final long serialVersionUID = 1L;
+
         public void doChangelist(String path, String changelist)
         {
             path = fileToSVNPath(new File(path), true);

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java Sun Dec  8 17:56:46 2013
@@ -38,6 +38,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.security.MessageDigest;
@@ -162,9 +163,13 @@ public class SVNRemoteTests extends SVNT
         }
         catch (ClientException ex)
         {
-            svnErrorCode = ex.getAllMessages().get(0).getCode();
+            List<ClientException.ErrorMessage> msgs = ex.getAllMessages();
+            svnErrorCode = msgs.get(msgs.size() - 1).getCode();
         }
-        assertEquals(180001, svnErrorCode);
+
+        assertTrue(svnErrorCode == 180001    // file:
+                   || svnErrorCode == 210005 // svn:
+                   || svnErrorCode == 2);    // http:
     }
 
     public void testDatedRev() throws Exception
@@ -447,10 +452,13 @@ public class SVNRemoteTests extends SVNT
         }
     }
 
-    private final class CommitContext implements CommitCallback
+    private static final class CommitContext implements CommitCallback
     {
         public final ISVNEditor editor;
-        public CommitContext(ISVNRemote session, String logstr)
+        public CommitContext(ISVNRemote session, String logstr,
+                             ISVNEditor.ProvideBaseCallback getBase,
+                             ISVNEditor.ProvidePropsCallback getProps,
+                             ISVNEditor.GetNodeKindCallback getKind)
             throws ClientException
         {
             Charset UTF8 = Charset.forName("UTF-8");
@@ -459,7 +467,19 @@ public class SVNRemoteTests extends SVNT
                           : logstr.getBytes(UTF8));
             HashMap<String, byte[]> revprops = new HashMap<String, byte[]>();
             revprops.put("svn:log", log);
-            editor = session.getCommitEditor(revprops, this, null, false);
+
+            // Run the getCommitEditor overloads through their paces, too.
+            if (getBase == null && getProps == null && getKind == null)
+                editor = session.getCommitEditor(revprops, this, null, false);
+            else
+                editor = session.getCommitEditor(revprops, this, null, false,
+                                                 getBase, getProps, getKind);
+        }
+
+        public CommitContext(ISVNRemote session, String logstr)
+            throws ClientException
+        {
+            this(session, logstr, null, null, null);
         }
 
         public void commitInfo(CommitInfo info) { this.info = info; }
@@ -468,11 +488,67 @@ public class SVNRemoteTests extends SVNT
         private CommitInfo info;
     }
 
-    public void testEditorCopy() throws Exception
+    private static final class EditorCallbacks
+    {
+        private final String wcpath;
+        private final long revision;
+        private final Map<String, byte[]> props;
+        private final NodeKind kind;
+
+        public EditorCallbacks(String wcpath, long revision,
+                               Map<String, byte[]> props,
+                               NodeKind kind)
+        {
+            this.wcpath = wcpath;
+            this.revision = revision;
+            this.props = props;
+            this.kind = kind;
+        }
+
+        public final ISVNEditor.ProvideBaseCallback getBase =
+            new ISVNEditor.ProvideBaseCallback()
+            {
+                public ISVNEditor.ProvideBaseCallback.ReturnValue
+                getContents(String relpath)
+                {
+                    try {
+                        return new ISVNEditor.ProvideBaseCallback.ReturnValue(
+                            new FileInputStream(wcpath + relpath), revision);
+                    } catch (java.io.FileNotFoundException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            };
+
+        public final ISVNEditor.ProvidePropsCallback getProps =
+            new ISVNEditor.ProvidePropsCallback()
+            {
+                public ISVNEditor.ProvidePropsCallback.ReturnValue
+                getProperties(String relpath)
+                {
+                    return new ISVNEditor.ProvidePropsCallback.ReturnValue(
+                        props, revision);
+                }
+            };
+
+        public final ISVNEditor.GetNodeKindCallback getKind =
+            new ISVNEditor.GetNodeKindCallback()
+            {
+                public NodeKind getKind(String relpath, long revision)
+                {
+                    return kind;
+                }
+            };
+    };
+
+    private void testEditorCopy(EditorCallbacks cb) throws Exception
     {
         ISVNRemote session = getSession();
         CommitContext cc =
-            new CommitContext(session, "Copy A/B/lambda -> A/B/omega");
+            (cb != null
+             ? new CommitContext(session, "Copy A/B/lambda -> A/B/omega",
+                                 cb.getBase, cb.getProps, cb.getKind)
+             : new CommitContext(session, "Copy A/B/lambda -> A/B/omega"));
 
         try {
             // FIXME: alter dir A/B first
@@ -493,6 +569,18 @@ public class SVNRemoteTests extends SVNT
                                        Revision.SVN_INVALID_REVNUM));
     }
 
+    public void testEditorCopy() throws Exception
+    {
+        testEditorCopy(null);
+    }
+
+    public void testEditorCopy_WithCallbacks() throws Exception
+    {
+        testEditorCopy(new EditorCallbacks(thisTest.getWCPath(), 1L,
+                                           new HashMap<String, byte[]>(),
+                                           NodeKind.file));
+    }
+
     public void testEditorMove() throws Exception
     {
         ISVNRemote session = getSession();
@@ -576,16 +664,23 @@ public class SVNRemoteTests extends SVNT
                                        Revision.SVN_INVALID_REVNUM));
     }
 
-    public void testEditorSetDirProps() throws Exception
+    private void testEditorSetDirProps(EditorCallbacks cb) throws Exception
     {
         Charset UTF8 = Charset.forName("UTF-8");
         ISVNRemote session = getSession();
 
         byte[] ignoreval = "*.pyc\n.gitignore\n".getBytes(UTF8);
+        byte[] binaryval = new byte[]{(byte)0, (byte)13, (byte)255, (byte)8,
+                                      (byte)127, (byte)128, (byte)129};
         HashMap<String, byte[]> props = new HashMap<String, byte[]>();
         props.put("svn:ignore", ignoreval);
+        props.put("binaryprop", binaryval);
 
-        CommitContext cc = new CommitContext(session, "Add svn:ignore");
+        CommitContext cc =
+            (cb != null
+             ? new CommitContext(session, "Add svn:ignore and binaryprop",
+                                 cb.getBase, cb.getProps, cb.getKind)
+             : new CommitContext(session, "Add svn:ignore and binaryprop"));
         try {
             cc.editor.alterDirectory("", 1, null, props);
             cc.editor.complete();
@@ -600,6 +695,23 @@ public class SVNRemoteTests extends SVNT
                                                     "svn:ignore",
                                                     Revision.HEAD,
                                                     Revision.HEAD)));
+        assertTrue(Arrays.equals(binaryval,
+                                 client.propertyGet(session.getSessionUrl(),
+                                                    "binaryprop",
+                                                    Revision.HEAD,
+                                                    Revision.HEAD)));
+    }
+
+    public void testEditorSetDirProps() throws Exception
+    {
+        testEditorSetDirProps(null);
+    }
+
+    public void testEditorSetDirProps_WithCallbacks() throws Exception
+    {
+        testEditorSetDirProps(new EditorCallbacks(thisTest.getWCPath(), 1L,
+                                                  new HashMap<String, byte[]>(),
+                                                  NodeKind.dir));
     }
 
     private static byte[] SHA1(byte[] text) throws NoSuchAlgorithmException
@@ -691,7 +803,7 @@ public class SVNRemoteTests extends SVNT
         assertEquals(0, propcount);
     }
 
-    public void testEditorSetFileContents() throws Exception
+    private void testEditorSetFileContents(EditorCallbacks cb) throws Exception
     {
         Charset UTF8 = Charset.forName("UTF-8");
         ISVNRemote session = getSession();
@@ -701,7 +813,10 @@ public class SVNRemoteTests extends SVNT
         ByteArrayInputStream stream = new ByteArrayInputStream(contents);
 
         CommitContext cc =
-            new CommitContext(session, "Change contents of A/B/E/alpha");
+            (cb != null
+             ? new CommitContext(session, "Change contents of A/B/E/alpha",
+                                 cb.getBase, cb.getProps, cb.getKind)
+             : new CommitContext(session, "Change contents of A/B/E/alpha"));
         try {
             cc.editor.alterFile("A/B/E/alpha", 1, hash, stream, null);
             cc.editor.complete();
@@ -717,6 +832,18 @@ public class SVNRemoteTests extends SVNT
         assertTrue(Arrays.equals(contents, checkcontents.toByteArray()));
     }
 
+    public void testEditorSetFileContents() throws Exception
+    {
+        testEditorSetFileContents(null);
+    }
+
+    public void testEditorSetFileContents_WithCallbacks() throws Exception
+    {
+        testEditorSetFileContents(new EditorCallbacks(thisTest.getWCPath(), 1L,
+                                                      new HashMap<String, byte[]>(),
+                                                      NodeKind.file));
+    }
+
     // Sanity check so that we don't forget about unimplemented methods.
     public void testEditorNotImplemented() throws Exception
     {

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java Sun Dec  8 17:56:46 2013
@@ -927,7 +927,7 @@ class SVNTests extends TestCase
 
         public Status[] getStatusArray()
         {
-            return (Status[]) statuses.toArray(new Status[statuses.size()]);
+            return statuses.toArray(new Status[statuses.size()]);
         }
     }
 }

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java Sun Dec  8 17:56:46 2013
@@ -30,12 +30,16 @@ import org.apache.subversion.javahl.type
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
 
 /**
  * Tests the JavaHL SVNUtil APIs.
@@ -396,17 +400,191 @@ public class UtilTests extends SVNTests
 
     public void testBuildKeywords() throws Throwable
     {
-        final byte[] kwval = "TEST=%H%_%b%_%u".getBytes();
+        final byte[] kwval = "Id TEST=%H%_%b%_%u".getBytes();
 
         Map<String, byte[]> result;
 
         result = SVNUtil.buildKeywords(kwval, Revision.SVN_INVALID_REVNUM,
                                        null, null, null, null);
+        assertEquals("   ", new String(result.get("Id")));
         assertEquals("     ", new String(result.get("TEST")));
 
-        result = SVNUtil.buildKeywords(kwval, 48, "http://a/b/c",
+        result = SVNUtil.buildKeywords(kwval, 42, "http://a/b/c",
                                        "http://a", new Date(1), "X");
-        assertEquals("b/c 48 1970-01-01 00:00:00Z X c http://a/b/c",
+        assertEquals("c 42 1970-01-01 00:00:00Z X",
+                     new String(result.get("Id")));
+        assertEquals("b/c 42 1970-01-01 00:00:00Z X c http://a/b/c",
                      new String(result.get("TEST")));
     }
+
+    public void testTranslateStream() throws Throwable
+    {
+        final byte[] keywordsValue = "Id TEST=%H%_%b%_%u".getBytes();
+        final byte[] contentsContracted = "$Id$\n$TEST$\n".getBytes();
+        final byte[] contentsExpanded =
+            ("$Id: c 42 1970-01-01 00:00:00Z X $\r" +
+             "$TEST: b/c 42 1970-01-01 00:00:00Z X c http://a/b/c $\r"
+             ) .getBytes();
+        final Map<String, byte[]> keywords =
+            SVNUtil.buildKeywords(keywordsValue, 42, "http://a/b/c",
+                                  "http://a", new Date(1), "X");
+        final Map<String, byte[]> null_keywords = new HashMap<String, byte[]>();
+        byte[] buffer = new byte[1024];
+
+        for (Map.Entry<String, byte[]> e : keywords.entrySet())
+            null_keywords.put(e.getKey(), null);
+
+        // InputStream; expand
+        InputStream testin = null;
+        try {
+            testin = SVNUtil.translateStream(
+                         new ByteArrayInputStream(contentsContracted),
+                         SVNUtil.EOL_CR, true, keywords, true);
+            final int size = testin.read(buffer);
+            testin.close();
+            testin = null;
+
+            assertEquals("expand InputStream with concrete keywords",
+                         new String(contentsExpanded),
+                         new String(buffer, 0, size));
+        } finally {
+            if (testin != null) {
+                testin.close();
+                testin = null;
+            }
+        }
+
+        try {
+            testin = SVNUtil.translateStream(
+                         new ByteArrayInputStream(contentsContracted),
+                         SVNUtil.EOL_CR, true, true,
+                         keywordsValue, 42, "http://a/b/c",
+                         "http://a", new Date(1), "X");
+            final int size = testin.read(buffer);
+            testin.close();
+            testin = null;
+
+            assertEquals("expand InputStream with implied keywords",
+                         new String(contentsExpanded),
+                         new String(buffer, 0, size));
+        } finally {
+            if (testin != null) {
+                testin.close();
+                testin = null;
+            }
+        }
+
+        // InputStream; contract
+        try {
+            testin = SVNUtil.translateStream(
+                         new ByteArrayInputStream(contentsExpanded),
+                         SVNUtil.EOL_LF, true, null_keywords, false);
+            final int size = testin.read(buffer);
+            testin.close();
+            testin = null;
+
+            assertEquals("contract InputStream with concrete keywords",
+                         new String(contentsContracted),
+                         new String(buffer, 0, size));
+        } finally {
+            if (testin != null) {
+                testin.close();
+                testin = null;
+            }
+        }
+
+        try {
+            testin = SVNUtil.translateStream(
+                         new ByteArrayInputStream(contentsExpanded),
+                         SVNUtil.EOL_LF, true, false,
+                         keywordsValue, 0, "", "", new Date(1), "");
+            final int size = testin.read(buffer);
+            testin.close();
+            testin = null;
+
+            assertEquals("contract InputStream with implied keywords",
+                         new String(contentsContracted),
+                         new String(buffer, 0, size));
+        } finally {
+            if (testin != null) {
+                testin.close();
+                testin = null;
+            }
+        }
+
+
+        // OutputStream; expand
+        OutputStream testout = null;
+        try {
+            ByteArrayOutputStream result = new ByteArrayOutputStream();
+            testout = SVNUtil.translateStream(
+                         result, SVNUtil.EOL_CR, true, keywords, true);
+            testout.write(contentsContracted);
+            testout.close();
+            testout = null;
+
+            assertEquals("expand OutputStream with concrete keywords",
+                         new String(contentsExpanded), result.toString());
+        } finally {
+            if (testout != null) {
+                testout.close();
+                testout = null;
+            }
+        }
+
+        try {
+            ByteArrayOutputStream result = new ByteArrayOutputStream();
+            testout = SVNUtil.translateStream(
+                         result, SVNUtil.EOL_CR, true, true,
+                         keywordsValue, 42, "http://a/b/c",
+                         "http://a", new Date(1), "X");
+            testout.write(contentsContracted);
+            testout.close();
+            testout = null;
+
+            assertEquals("expand OutputStream with implied keywords",
+                         new String(contentsExpanded), result.toString());
+        } finally {
+            if (testout != null) {
+                testout.close();
+                testout = null;
+            }
+        }
+
+        // OutputStream; contract
+        try {
+            ByteArrayOutputStream result = new ByteArrayOutputStream();
+            testout = SVNUtil.translateStream(
+                         result, SVNUtil.EOL_LF, true, null_keywords, false);
+            testout.write(contentsExpanded);
+            testout.close();
+            testout = null;
+
+            assertEquals("contract OutputStream with concrete keywords",
+                         new String(contentsContracted), result.toString());
+        } finally {
+            if (testout != null) {
+                testout.close();
+                testout = null;
+            }
+        }
+
+        try {
+            ByteArrayOutputStream result = new ByteArrayOutputStream();
+            testout = SVNUtil.translateStream(
+                         result, SVNUtil.EOL_LF, true, false,
+                         keywordsValue, 0, "", "", new Date(1), "");
+            testout.write(contentsExpanded);
+            testout.close();
+            testout = null;
+
+            assertEquals("contract OutputStream with implied keywords",
+                         new String(contentsContracted), result.toString());
+        } finally {
+            if (testout != null) {
+                testout.close();
+                testout = null;
+            }
+        }
+    }
 }

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java Sun Dec  8 17:56:46 2013
@@ -34,11 +34,12 @@ import java.util.Date;
 
 import org.apache.subversion.javahl.types.*;
 
-import junit.framework.Assert;
+import junit.framework.TestCase;
+
 /**
  * This class describe the expected state of the working copy
  */
-public class WC
+public class WC extends TestCase
 {
     /**
      * the map of the items of the working copy. The relative path is the key
@@ -169,9 +170,9 @@ public class WC
         // since having no content signals a directory, changes of removing the
         // content or setting a former not set content is not allowed. That
         // would change the type of the item.
-        Assert.assertNotNull("cannot unset content", content);
+        assertNotNull("cannot unset content", content);
         Item i = items.get(path);
-        Assert.assertNotNull("cannot set content on directory", i.myContent);
+        assertNotNull("cannot set content on directory", i.myContent);
         i.myContent = content;
     }
 
@@ -304,13 +305,13 @@ public class WC
      */
     void check(DirEntry[] tested, String singleFilePath)
     {
-        Assert.assertEquals("not a single dir entry", 1, tested.length);
+        assertEquals("not a single dir entry", 1, tested.length);
         Item item = items.get(singleFilePath);
-        Assert.assertNotNull("not found in working copy", item);
-        Assert.assertNotNull("not a file", item.myContent);
-        Assert.assertEquals("state says file, working copy not",
-                tested[0].getNodeKind(),
-                item.nodeKind == null ? NodeKind.file : item.nodeKind);
+        assertNotNull("not found in working copy", item);
+        assertNotNull("not a file", item.myContent);
+        assertEquals("state says file, working copy not",
+                     tested[0].getNodeKind(),
+                     item.nodeKind == null ? NodeKind.file : item.nodeKind);
     }
 
     /**
@@ -342,19 +343,18 @@ public class WC
         {
             String name = basePath + entry.getPath();
             Item item = items.get(name);
-            Assert.assertNotNull("null paths won't be found in working copy",
-                                 item);
+            assertNotNull("null paths won't be found in working copy", item);
             if (item.myContent != null)
             {
-                Assert.assertEquals("Expected '" + entry + "' to be file",
-                        entry.getNodeKind(),
-                        item.nodeKind == null ? NodeKind.file : item.nodeKind);
+                assertEquals("Expected '" + entry + "' to be file",
+                             entry.getNodeKind(),
+                             item.nodeKind == null ? NodeKind.file : item.nodeKind);
             }
             else
             {
-                Assert.assertEquals("Expected '" + entry + "' to be dir",
-                        entry.getNodeKind(),
-                        item.nodeKind == null ? NodeKind.dir : item.nodeKind);
+                assertEquals("Expected '" + entry + "' to be dir",
+                             entry.getNodeKind(),
+                             item.nodeKind == null ? NodeKind.dir : item.nodeKind);
             }
             item.touched = true;
         }
@@ -369,9 +369,9 @@ public class WC
                         !item.myPath.equals(basePath))
                 {
                     // Non-recursive checks will fail here.
-                    Assert.assertFalse("Expected path '" + item.myPath +
-                                       "' not found in dir entries",
-                                       recursive);
+                    assertFalse("Expected path '" + item.myPath +
+                                "' not found in dir entries",
+                                recursive);
 
                     // Look deeper under the tree.
                     boolean found = false;
@@ -387,8 +387,8 @@ public class WC
                             }
                         }
                     }
-                    Assert.assertTrue("Expected path '" + item.myPath +
-                                       "' not found in dir entries", found);
+                    assertTrue("Expected path '" + item.myPath +
+                               "' not found in dir entries", found);
                 }
             }
         }
@@ -436,14 +436,14 @@ public class WC
         for (Status status : tested)
         {
             String path = status.getPath();
-            Assert.assertTrue("status path starts not with working copy path",
-                    path.startsWith(normalizeWCPath));
+            assertTrue("status path starts not with working copy path",
+                       path.startsWith(normalizeWCPath));
 
             // we calculate the relative path to the working copy root
             if (path.length() > workingCopyPath.length() + 1)
             {
-                Assert.assertEquals("missing '/' in status path",
-                        path.charAt(workingCopyPath.length()), '/');
+                assertEquals("missing '/' in status path",
+                             path.charAt(workingCopyPath.length()), '/');
                 path = path.substring(workingCopyPath.length() + 1);
             }
             else
@@ -451,25 +451,23 @@ public class WC
                 path = "";
 
             Item item = items.get(path);
-            Assert.assertNotNull("status not found in working copy: " + path,
-                    item);
-            Assert.assertEquals("wrong text status in working copy: " + path,
-                    item.textStatus, status.getTextStatus());
+            assertNotNull("status not found in working copy: " + path, item);
+            assertEquals("wrong text status in working copy: " + path,
+                         item.textStatus, status.getTextStatus());
             if (item.workingCopyRev != -1)
-                Assert.assertEquals("wrong revision number in working copy: "
-                            + path,
-                        item.workingCopyRev, status.getRevisionNumber());
-            Assert.assertEquals("lock status wrong: " + path,
-                    item.isLocked, status.isLocked());
-            Assert.assertEquals("switch status wrong: " + path,
-                    item.isSwitched, status.isSwitched());
-            Assert.assertEquals("wrong prop status in working copy: " + path,
-                    item.propStatus, status.getPropStatus());
+                assertEquals("wrong revision number in working copy: " + path,
+                             item.workingCopyRev, status.getRevisionNumber());
+            assertEquals("lock status wrong: " + path,
+                         item.isLocked, status.isLocked());
+            assertEquals("switch status wrong: " + path,
+                         item.isSwitched, status.isSwitched());
+            assertEquals("wrong prop status in working copy: " + path,
+                         item.propStatus, status.getPropStatus());
             if (item.myContent != null)
             {
-                Assert.assertEquals("state says file, working copy not: " + path,
-                        status.getNodeKind(),
-                        item.nodeKind == null ? NodeKind.file : item.nodeKind);
+                assertEquals("state says file, working copy not: " + path,
+                             status.getNodeKind(),
+                             item.nodeKind == null ? NodeKind.file : item.nodeKind);
                 if (status.getTextStatus() == Status.Kind.normal ||
                         item.checkContent)
                 {
@@ -483,26 +481,26 @@ public class WC
                         buffer.append((char) ch);
                     }
                     rd.close();
-                    Assert.assertEquals("content mismatch: " + path,
-                            buffer.toString(), item.myContent);
+                    assertEquals("content mismatch: " + path,
+                                 buffer.toString(), item.myContent);
                 }
             }
             else
             {
-                Assert.assertEquals("state says dir, working copy not: " + path,
-                        status.getNodeKind(),
-                        item.nodeKind == null ? NodeKind.dir : item.nodeKind);
+                assertEquals("state says dir, working copy not: " + path,
+                             status.getNodeKind(),
+                             item.nodeKind == null ? NodeKind.dir : item.nodeKind);
             }
 
             if (checkRepos)
             {
-                Assert.assertEquals("Last commit revisions for OOD path '"
-                                    + item.myPath + "' don't match:",
-                                    item.reposLastCmtRevision,
-                                    status.getReposLastCmtRevisionNumber());
-                Assert.assertEquals("Last commit kinds for OOD path '"
-                                    + item.myPath + "' don't match:",
-                                    item.reposKind, status.getReposKind());
+                assertEquals("Last commit revisions for OOD path '"
+                             + item.myPath + "' don't match:",
+                             item.reposLastCmtRevision,
+                             status.getReposLastCmtRevisionNumber());
+                assertEquals("Last commit kinds for OOD path '"
+                             + item.myPath + "' don't match:",
+                             item.reposKind, status.getReposKind());
 
                 // Only the last committed rev and kind is available for
                 // paths deleted in the repos.
@@ -511,17 +509,17 @@ public class WC
                     long lastCmtTime =
                         (status.getReposLastCmtDate() == null ?
                          0 : status.getReposLastCmtDate().getTime());
-                    Assert.assertEquals("Last commit dates for OOD path '" +
-                                        item.myPath + "' don't match:",
-                                        new Date(item.reposLastCmtDate),
-                                        new Date(lastCmtTime));
-                    Assert.assertEquals("Last commit authors for OOD path '"
-                                        + item.myPath + "' don't match:",
-                                        item.reposLastCmtAuthor,
-                                        status.getReposLastCmtAuthor());
-                    Assert.assertNotNull("URL for path " + item.myPath
-                                         + " should not be null",
-                                         status.getUrl());
+                    assertEquals("Last commit dates for OOD path '" +
+                                 item.myPath + "' don't match:",
+                                 new Date(item.reposLastCmtDate),
+                                 new Date(lastCmtTime));
+                    assertEquals("Last commit authors for OOD path '"
+                                 + item.myPath + "' don't match:",
+                                 item.reposLastCmtAuthor,
+                                 status.getReposLastCmtAuthor());
+                    assertNotNull("URL for path " + item.myPath
+                                  + " should not be null",
+                                  status.getUrl());
                 }
             }
             item.touched = true;
@@ -531,9 +529,9 @@ public class WC
         // result array
         for (Item item : items.values())
         {
-            Assert.assertTrue("item '" + item.myPath +
-                              "' in working copy not found in status",
-                    item.touched);
+            assertTrue("item '" + item.myPath +
+                       "' in working copy not found in status",
+                       item.touched);
         }
     }
 

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java Sun Dec  8 17:56:46 2013
@@ -3360,9 +3360,12 @@ public class BasicTests extends SVNTests
     private class MyChangelistCallback extends HashMap
         implements ChangelistCallback
     {
+        private static final long serialVersionUID = 1L;
+
         @SuppressWarnings("unchecked")
         public void doChangelist(String path, String changelist)
         {
+            path = fileToSVNPath(new File(path), true);
             if (super.containsKey(path))
             {
                 // Append the changelist to the existing list

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/core.i
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/core.i?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/core.i (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/core.i Sun Dec  8 17:56:46 2013
@@ -820,7 +820,6 @@ core_set_current_pool (apr_pool_t *pool)
 
 
 
-#ifdef SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC
 %inline %{
 /* Helper function to set the gnome-keyring unlock prompt function. This
  * C function accepts an auth baton, a function and a prompt baton, but
@@ -844,7 +843,6 @@ static void svn_auth_set_gnome_keyring_u
                            prompt_baton);
 }
 %}
-#endif
 
 #if defined(SWIGPERL) || defined(SWIGRUBY)
 %include svn_md5_h.swg

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/include/svn_containers.swg
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/include/svn_containers.swg?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/include/svn_containers.swg (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/include/svn_containers.swg Sun Dec  8 17:56:46 2013
@@ -954,3 +954,16 @@
   %append_output(svn_swig_rb_apr_array_to_array_auth_provider_object(*$1));
 }
 #endif
+
+/* -----------------------------------------------------------------------
+   Output of apr_array_header_t * <svn_diff_hunk_t *>
+*/
+#ifdef SWIGPYTHON
+%typemap(out) apr_array_header_t *hunks {
+  %append_output(svn_swig_py_pointerlist_to_list($1, $descriptor(svn_diff_hunk_t *),
+                                                 _global_py_pool));
+  if (PyErr_Occurred()) {
+    SWIG_fail;
+  }
+}
+#endif

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c Sun Dec  8 17:56:46 2013
@@ -25,6 +25,9 @@
 #include <apr_general.h>
 #include <apr_portable.h>
 
+/* Windows hack: Allow overriding some <perl.h> defaults */
+#include "swigutil_pl__pre_perl.h"
+
 #include <EXTERN.h>
 #include <perl.h>
 #include <XSUB.h>

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb__pre_ruby.h Sun Dec  8 17:56:46 2013
@@ -30,8 +30,6 @@
  */
 
 #include <ruby/config.h>
-#ifdef _MSC_VER
-#endif
 
 #undef NORETURN
 #undef DEPRECATED
@@ -87,6 +85,10 @@ typedef unsigned __int64   uint64_t;
 #undef HAVE_INTTYPES_H
 #endif
 
+#ifdef _MSC_VER
+#pragma warning(disable: 4702) /* warning C4702: unreachable code */
+#endif
+
 #endif /* defined(SVN_SWIG_RUBY__CUSTOM_RUBY_CONFIG) && defined(_MSC_VER) */
 
 #endif /* SVN_SWIG_SWIGUTIL_RB__PRE_RUBY_H */

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_fs_util.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_fs_util.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_fs_util.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_fs_util.h Sun Dec  8 17:56:46 2013
@@ -210,6 +210,17 @@ svn_fs__append_to_merged_froms(svn_merge
                                const char *rel_path,
                                apr_pool_t *pool);
 
+/* Given the FS creation options in CONFIG, return the oldest version that
+   we shall be compatible with in *COMPATIBLE_VERSION.  The patch level
+   is always set to 0 and the tag to "".   Allocate the result in POOL.
+
+   Note that the result will always be compatible to the current tool
+   version, i.e. will be a version number not more recent than this tool. */
+svn_error_t *
+svn_fs__compatible_version(svn_version_t **compatible_version,
+                           apr_hash_t *config,
+                           apr_pool_t *pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_io_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_io_private.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_io_private.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_io_private.h Sun Dec  8 17:56:46 2013
@@ -44,6 +44,15 @@ extern "C" {
 #define SVN__APR_FINFO_MASK_OUT (0)
 #endif
 
+/* 90% of the lines we encounter will be less than this many chars.
+ *
+ * Line-based functions like svn_stream_readline should fetch data in
+ * blocks no longer than this.  Although using a larger prefetch size is
+ * not illegal and must not break any functionality, it may be
+ * significantly less efficient in certain situations.
+ */
+#define SVN__LINE_CHUNK_SIZE 80
+
 
 /** Set @a *executable TRUE if @a file_info is executable for the
  * user, FALSE otherwise.

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_ra_svn_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_ra_svn_private.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_ra_svn_private.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_ra_svn_private.h Sun Dec  8 17:56:46 2013
@@ -43,6 +43,12 @@ svn_ra_svn__set_shim_callbacks(svn_ra_sv
                                svn_delta_shim_callbacks_t *shim_callbacks);
 
 /**
+ * Return the memory pool used to allocate @a conn.
+ */
+apr_pool_t *
+svn_ra_svn__get_pool(svn_ra_svn_conn_t *conn);
+
+/**
  * @defgroup ra_svn_deprecated ra_svn low-level functions
  * @{
  */
@@ -250,6 +256,33 @@ svn_ra_svn__read_cmd_response(svn_ra_svn
                               apr_pool_t *pool,
                               const char *fmt, ...);
 
+/** Check the receive buffer and socket of @a conn whether there is some
+ * unprocessed incomming data without waiting for new data to come in.
+ * If data is found, set @a *has_command to TRUE.  If the connection does
+ * not contain any more data and has been closed, set @a *terminated to
+ * TRUE.
+ */
+svn_error_t *
+svn_ra_svn__has_command(svn_boolean_t *has_command,
+                        svn_boolean_t *terminated,
+                        svn_ra_svn_conn_t *conn,
+                        apr_pool_t *pool);
+
+/** Accept a single command from @a conn and handle them according
+ * to @a cmd_hash.  Command handlers will be passed @a conn, @a pool,
+ * the parameters of the command, and @a baton.  @a *terminate will be
+ * set if either @a error_on_disconnect is FALSE and the connection got
+ * closed, or if the command being handled has the "terminate" flag set
+ * in the command table.
+ */
+svn_error_t *
+svn_ra_svn__handle_command(svn_boolean_t *terminate,
+                           apr_hash_t *cmd_hash,
+                           void *baton,
+                           svn_ra_svn_conn_t *conn,
+                           svn_boolean_t error_on_disconnect,
+                           apr_pool_t *pool);
+
 /** Accept commands over the network and handle them according to @a
  * commands.  Command handlers will be passed @a conn, a subpool of @a
  * pool (cleared after each command is handled), the parameters of the

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_sqlite.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_sqlite.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_sqlite.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_sqlite.h Sun Dec  8 17:56:46 2013
@@ -487,6 +487,32 @@ svn_sqlite__with_immediate_transaction(s
     SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err));   \
   } while (0)
 
+/* Evaluate the expression EXPR1..EXPR4 within a 'savepoint'.  Savepoints can
+ * be nested.
+ *
+ * Begin a savepoint in DB; evaluate the expression EXPR1, which would
+ * typically be a function call that does some work in DB; if no error occurred,
+ * run EXPR2; if no error occurred EXPR3; ... and finally release
+ * the savepoint if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
+ * to the savepoint and then release it.
+ */
+#define SVN_SQLITE__WITH_LOCK4(expr1, expr2, expr3, expr4, db)                \
+  do {                                                                        \
+    svn_sqlite__db_t *svn_sqlite__db = (db);                                  \
+    svn_error_t *svn_sqlite__err;                                             \
+                                                                              \
+    SVN_ERR(svn_sqlite__begin_savepoint(svn_sqlite__db));                     \
+    svn_sqlite__err = (expr1);                                                \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr2);                                              \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr3);                                              \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr4);                                              \
+    SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err));   \
+  } while (0)
+
+
 /* Helper function to handle several SQLite operations inside a shared lock.
    This callback is similar to svn_sqlite__with_transaction(), but can be
    nested (even with a transaction).

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_subr_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_subr_private.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_subr_private.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_subr_private.h Sun Dec  8 17:56:46 2013
@@ -221,6 +221,13 @@ svn_stream__from_spillbuf(svn_spillbuf_t
 
 /** @} */
 
+/*----------------------------------------------------*/
+
+/**
+ * @defgroup svn_checksum_private Checksumming helper APIs
+ * @{
+ */
+
 /**
  * Internal function for creating a MD5 checksum from a binary digest.
  *
@@ -240,6 +247,51 @@ svn_checksum_t *
 svn_checksum__from_digest_sha1(const unsigned char *digest,
                                apr_pool_t *result_pool);
 
+/**
+ * Internal function for creating a 32 bit FNV-1a checksum from a binary
+ * digest.
+ *
+ * @since New in 1.9
+ */
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32(const unsigned char *digest,
+                                   apr_pool_t *result_pool);
+
+/**
+ * Internal function for creating a modified 32 bit FNV-1a checksum from
+ * a binary digest.
+ *
+ * @since New in 1.9
+ */
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32x4(const unsigned char *digest,
+                                     apr_pool_t *result_pool);
+
+
+/**
+ * Return a 32 bit FNV-1a checksum for the first @a len bytes in @a input.
+ * The representation is in Big Endian.
+ *
+ * @since New in 1.9
+ */
+apr_uint32_t
+svn__fnv1a_32(const void *input, apr_size_t len);
+
+/**
+ * Return a 32 bit modified FNV-1a checksum for the first @a len bytes in
+ * @a input.  The representation is in Big Endian.
+ * 
+ * @note This is a proprietary checksumming algorithm based FNV-1a with
+ *       approximately the same strength.  It is up to 4 times faster
+ *       than plain FNV-1a for longer data blocks.
+ *
+ * @since New in 1.9
+ */
+apr_uint32_t
+svn__fnv1a_32x4(const void *input, apr_size_t len);
+
+/** @} */
+
 
 /**
  * @defgroup svn_hash_support Hash table serialization support

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_utf_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_utf_private.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_utf_private.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/private/svn_utf_private.h Sun Dec  8 17:56:46 2013
@@ -134,6 +134,22 @@ svn_utf__normcmp(int *result,
                  const char *str2, apr_size_t len2,
                  svn_membuf_t *buf1, svn_membuf_t *buf2);
 
+/* Normalize the UTF-8 string STR to form C, using BUF for temporary
+ * storage. If LEN is SVN_UTF__UNKNOWN_LENGTH, assume STR is
+ * null-terminated; otherwise, consider the string only up to the
+ * given length.
+ *
+ * Return the normalized string in *RESULT, which shares storage with
+ * BUF and is valid only until the next time BUF is modified.
+ *
+ * A returned error may indicate that STRING contains invalid UTF-8 or
+ * invalid Unicode codepoints.
+ */
+svn_error_t*
+svn_utf__normalize(const char **result,
+                   const char *str, apr_size_t len,
+                   svn_membuf_t *buf);
+
 /* Check if STRING is a valid, NFC-normalized UTF-8 string.  Note that
  * a FALSE return value may indicate that STRING is not valid UTF-8 at
  * all.

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_auth.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_auth.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_auth.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_auth.h Sun Dec  8 17:56:46 2013
@@ -884,7 +884,11 @@ svn_auth_get_platform_specific_client_pr
  * @note An administrative password reset may invalidate the account's
  * secret key. This function will detect that situation and behave as
  * if the password were not cached at all.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.  Use 
+ * svn_auth_get_platform_specific_provider with provider_name of "windows"
+ * and provider_type of "simple".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
                                      apr_pool_t *pool);
@@ -906,7 +910,11 @@ svn_auth_get_windows_simple_provider(svn
  * @note An administrative password reset may invalidate the account's
  * secret key. This function will detect that situation and behave as
  * if the password were not cached at all.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "windows" and provider_type of "ssl_client_cert_pw".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_windows_ssl_client_cert_pw_provider(
   svn_auth_provider_object_t **provider,
@@ -923,7 +931,11 @@ svn_auth_get_windows_ssl_client_cert_pw_
  *
  * @since New in 1.5.
  * @note This function is only available on Windows.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "windows" and provider_type of "ssl_server_trust".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_windows_ssl_server_trust_provider(
   svn_auth_provider_object_t **provider,
@@ -943,7 +955,11 @@ svn_auth_get_windows_ssl_server_trust_pr
  *
  * @since New in 1.4
  * @note This function is only available on Mac OS 10.2 and higher.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "keychain" and provider_type of "simple".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
                                       apr_pool_t *pool);
@@ -959,14 +975,21 @@ svn_auth_get_keychain_simple_provider(sv
  *
  * @since New in 1.6
  * @note This function is only available on Mac OS 10.2 and higher.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "keychain" and provider_type of "ssl_client_cert_pw".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_keychain_ssl_client_cert_pw_provider(
   svn_auth_provider_object_t **provider,
   apr_pool_t *pool);
 #endif /* DARWIN || DOXYGEN */
 
-#if (!defined(DARWIN) && !defined(WIN32)) || defined(DOXYGEN)
+/* Note that the gnome keyring unlock prompt related items below must be
+ * declared for all platforms in order to allow SWIG interfaces to be
+ * used regardless of the platform. */
+
 /** A type of callback function for obtaining the GNOME Keyring password.
  *
  * In this callback, the client should ask the user for default keyring
@@ -996,7 +1019,7 @@ typedef svn_error_t *(*svn_auth_gnome_ke
  * @c *SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_FUNC. */
 #define SVN_AUTH_PARAM_GNOME_KEYRING_UNLOCK_PROMPT_BATON "gnome-keyring-unlock-prompt-baton"
 
-
+#if (!defined(DARWIN) && !defined(WIN32)) || defined(DOXYGEN)
 /**
  * Get libsvn_auth_gnome_keyring version information.
  *
@@ -1026,7 +1049,11 @@ svn_auth_gnome_keyring_version(void);
  * @since New in 1.6
  * @note This function actually works only on systems with
  * libsvn_auth_gnome_keyring and GNOME Keyring installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gnome_keyring" and provider_type of "simple".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_gnome_keyring_simple_provider(
   svn_auth_provider_object_t **provider,
@@ -1053,7 +1080,11 @@ svn_auth_get_gnome_keyring_simple_provid
  * @since New in 1.6
  * @note This function actually works only on systems with
  * libsvn_auth_gnome_keyring and GNOME Keyring installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gnome_keyring" and provider_type of "ssl_client_cert_pw".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_gnome_keyring_ssl_client_cert_pw_provider(
   svn_auth_provider_object_t **provider,
@@ -1081,7 +1112,11 @@ svn_auth_kwallet_version(void);
  * @since New in 1.6
  * @note This function actually works only on systems with libsvn_auth_kwallet
  * and KWallet installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "kwallet" and provider_type of "simple".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_kwallet_simple_provider(svn_auth_provider_object_t **provider,
                                      apr_pool_t *pool);
@@ -1099,7 +1134,11 @@ svn_auth_get_kwallet_simple_provider(svn
  * @since New in 1.6
  * @note This function actually works only on systems with libsvn_auth_kwallet
  * and KWallet installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "kwallet" and provider_type of "ssl_client_cert_pw".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_kwallet_ssl_client_cert_pw_provider(
   svn_auth_provider_object_t **provider,
@@ -1121,7 +1160,11 @@ svn_auth_get_kwallet_ssl_client_cert_pw_
  * @since New in 1.8
  * @note This function actually works only on systems with
  * GNU Privacy Guard installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gpg_agent" and provider_type of "simple".
  */
+SVN_DEPRECATED
 void
 svn_auth_get_gpg_agent_simple_provider
     (svn_auth_provider_object_t **provider,

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_cache_config.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_cache_config.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_cache_config.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_cache_config.h Sun Dec  8 17:56:46 2013
@@ -41,6 +41,9 @@ extern "C" {
 /** Cache resource settings. It controls what caches, in what size and
    how they will be created. The settings apply for the whole process.
 
+   @note Do not extend this data structure as this would break binary
+         compatibility.
+   
    @since New in 1.7.
  */
 typedef struct svn_cache_config_t
@@ -56,6 +59,8 @@ typedef struct svn_cache_config_t
 
   /** is this application guaranteed to be single-threaded? */
   svn_boolean_t single_threaded;
+
+  /* DON'T add new members here.  Bump struct and API version instead. */
 } svn_cache_config_t;
 
 /** Get the current cache configuration. If it has not been set,

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_checksum.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_checksum.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_checksum.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_checksum.h Sun Dec  8 17:56:46 2013
@@ -48,7 +48,17 @@ typedef enum svn_checksum_kind_t
   svn_checksum_md5,
 
   /** The checksum is (or should be set to) a SHA1 checksum. */
-  svn_checksum_sha1
+  svn_checksum_sha1,
+
+  /** The checksum is (or should be set to) a FNV-1a 32 bit checksum,
+   * in big endian byte order.
+   * @since New in 1.9. */
+  svn_checksum_fnv1a_32,
+
+  /** The checksum is (or should be set to) a modified FNV-1a 32 bit,
+   * in big endian byte order.
+   * @since New in 1.9. */
+  svn_checksum_fnv1a_32x4
 } svn_checksum_kind_t;
 
 /**

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_client.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_client.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_client.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_client.h Sun Dec  8 17:56:46 2013
@@ -4060,8 +4060,15 @@ svn_client_mergeinfo_get_merged(apr_hash
  * If a depth other than #svn_depth_empty or #svn_depth_infinity is
  * requested then return a #SVN_ERR_UNSUPPORTED_FEATURE error.
  *
- * @a discover_changed_paths and @a revprops are the same as for
- * svn_client_log5().  Use @a scratch_pool for all temporary allocations.
+ * In addition to the behavior of @a discover_changed_paths described in
+ * svn_client_log5(), if set to TRUE it enables detection of sub-tree
+ * merges that are complete but can't be detected as complete without
+ * access to the changed paths.  Sub-tree merges detected as complete will
+ * be included if @a finding_merged is TRUE or filtered if @a finding_merged
+ * is FALSE.
+ *
+ * @a revprops is the same as for svn_client_log5().  Use @a scratch_pool for
+ * all temporary allocations.
  *
  * @a ctx is a context used for authentication.
  *
@@ -4158,11 +4165,11 @@ svn_client_mergeinfo_log_eligible(const 
  * @{
  */
 
-/** Recursively cleanup a working copy directory @a dir, finishing any
- * incomplete operations, removing lockfiles, etc.
+/** Recursively vacuum a working copy directory @a dir, removing unnecessary
+ * data.
  *
- * If @a include_externals is @c TRUE, recurse into externals and clean
- * them up as well.
+ * If @a include_externals is @c TRUE, recurse into externals and vacuum them
+ * as well.
  *
  * If @a remove_unversioned_items is @c TRUE, remove unversioned items
  * in @a dir after successfull working copy cleanup.
@@ -4170,10 +4177,36 @@ svn_client_mergeinfo_log_eligible(const 
  * in @a dir after successfull working copy cleanup.
  *
  * When asked to remove unversioned or ignored items, and the working copy
- * is already locked via a different client or WC context than @a ctx, return
- * #SVN_ERR_WC_LOCKED. This prevents accidental working copy corruption in
- * case users run the cleanup operation to remove unversioned items while
- * another client is performing some other operation on the working copy.
+ * is already locked, return #SVN_ERR_WC_LOCKED. This prevents accidental
+ * working copy corruption in case users run the cleanup operation to
+ * remove unversioned items while another client is performing some other
+ * operation on the working copy.
+ *
+ * If @a ctx->cancel_func is non-NULL, invoke it with @a
+ * ctx->cancel_baton at various points during the operation.  If it
+ * returns an error (typically #SVN_ERR_CANCELLED), return that error
+ * immediately.
+ *
+ * Use @a scratch_pool for any temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_vacuum(const char *dir_abspath,
+                  svn_boolean_t remove_unversioned_items,
+                  svn_boolean_t remove_ignored_items,
+                  svn_boolean_t fix_recorded_timestamps,
+                  svn_boolean_t vacuum_pristines,
+                  svn_boolean_t include_externals,
+                  svn_client_ctx_t *ctx,
+                  apr_pool_t *scratch_pool);
+
+
+/** Recursively cleanup a working copy directory @a dir, finishing any
+ * incomplete operations, removing lockfiles, etc.
+ *
+ * If @a include_externals is @c TRUE, recurse into externals and clean
+ * them up as well.
  *
  * If @a ctx->cancel_func is non-NULL, invoke it with @a
  * ctx->cancel_baton at various points during the operation.  If it
@@ -4185,15 +4218,17 @@ svn_client_mergeinfo_log_eligible(const 
  * @since New in 1.9.
  */
 svn_error_t *
-svn_client_cleanup2(const char *dir,
+svn_client_cleanup2(const char *dir_abspath,
+                    svn_boolean_t break_locks,
+                    svn_boolean_t fix_recorded_timestamps,
+                    svn_boolean_t clear_dav_cache,
+                    svn_boolean_t vacuum_pristines,
                     svn_boolean_t include_externals,
-                    svn_boolean_t remove_unversioned_items,
-                    svn_boolean_t remove_ignored_items,
                     svn_client_ctx_t *ctx,
                     apr_pool_t *scratch_pool);
 
-/* Like svn_client_cleanup2(), but no support for removing unversioned items
- * and cleaning up externals.
+/* Like svn_client_cleanup2(), but no support for not breaking locks and
+ * cleaning up externals and using a potentially non absolute path.
  *
  * @deprecated Provided for limited backwards compatibility with the 1.8 API.
  */
@@ -5786,10 +5821,12 @@ svn_client_ls(apr_hash_t **dirents,
 /**
  * Output the content of a file.
  *
- * @param[in] out           The stream to which the content will be written.
- * @param[in] path_or_url   The path or URL of the file.
- * @param[in] peg_revision  The peg revision.
- * @param[in] revision  The operative revision.
+ * @param[out] props           Optional output argument to obtain properties.
+ * @param[in] out              The stream to which the content will be written.
+ * @param[in] path_or_url      The path or URL of the file.
+ * @param[in] peg_revision     The peg revision.
+ * @param[in] revision         The operative revision.
+ * @param[in] expand_keywords  When true, keywords (when set) are expanded.
  * @param[in] ctx   The standard client context, used for possible
  *                  authentication.
  * @param[in] pool  Used for any temporary allocation.
@@ -5804,12 +5841,30 @@ svn_client_ls(apr_hash_t **dirents,
  *         determined. <br>
  *         If no error occurred, return #SVN_NO_ERROR.
  *
- * @since New in 1.2.
- *
  * @see #svn_client_ctx_t <br> @ref clnt_revisions for
  *      a discussion of operative and peg revisions.
+ *
+ * @since New in 1.9.
  */
 svn_error_t *
+svn_client_cat3(apr_hash_t **props,
+                svn_stream_t *out,
+                const char *path_or_url,
+                const svn_opt_revision_t *peg_revision,
+                const svn_opt_revision_t *revision,
+                svn_boolean_t expand_keywords,
+                svn_client_ctx_t *ctx,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_client_cat3() except without the option of directly
+ * reading the properties, and with @a expand_keywords always TRUE.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
+ */
+SVN_DEPRECATED
+svn_error_t *
 svn_client_cat2(svn_stream_t *out,
                 const char *path_or_url,
                 const svn_opt_revision_t *peg_revision,

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_config.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_config.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_config.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_config.h Sun Dec  8 17:56:46 2013
@@ -106,8 +106,11 @@ typedef struct svn_config_t svn_config_t
 
 #define SVN_CONFIG_CATEGORY_CONFIG          "config"
 #define SVN_CONFIG_SECTION_AUTH                 "auth"
+/** @since New in 1.6. */
 #define SVN_CONFIG_OPTION_PASSWORD_STORES           "password-stores"
+/** @since New in 1.6. */
 #define SVN_CONFIG_OPTION_KWALLET_WALLET            "kwallet-wallet"
+/** @since New in 1.6. */
 #define SVN_CONFIG_OPTION_KWALLET_SVN_APPLICATION_NAME_WITH_PID "kwallet-svn-application-name-with-pid"
 /** @since New in 1.8. */
 #define SVN_CONFIG_OPTION_SSL_CLIENT_CERT_FILE_PROMPT "ssl-client-cert-file-prompt"
@@ -133,7 +136,9 @@ typedef struct svn_config_t svn_config_t
 #define SVN_CONFIG_OPTION_NO_UNLOCK                 "no-unlock"
 #define SVN_CONFIG_OPTION_MIMETYPES_FILE            "mime-types-file"
 #define SVN_CONFIG_OPTION_PRESERVED_CF_EXTS         "preserved-conflict-file-exts"
+/** @since New in 1.7. */
 #define SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS     "interactive-conflicts"
+/** @since New in 1.7. */
 #define SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE         "memory-cache-size"
 /** @since New in 1.9. */
 #define SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE  "diff-ignore-content-type"

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_diff.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_diff.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_diff.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_diff.h Sun Dec  8 17:56:46 2013
@@ -911,8 +911,8 @@ typedef struct svn_diff_hunk_t svn_diff_
 
 /**
  * Allocate @a *stringbuf in @a result_pool, and read into it one line
- * of the diff text of @a hunk. The first line returned is the hunk header.
- * Any subsequent lines are unidiff data (starting with '+', '-', or ' ').
+ * of the diff text of @a hunk. The hunk header is not returned only the
+ * unidiff data lines (starting with '+', '-', or ' ') are returned.  
  * If the @a hunk is being interpreted in reverse (i.e. the reverse
  * parameter of svn_diff_parse_next_patch() was @c TRUE), the diff
  * text will be returned in reversed form.
@@ -922,6 +922,13 @@ typedef struct svn_diff_hunk_t svn_diff_
  * hunk does not end with a newline character and @a eol is not NULL.
  * Temporary allocations will be performed in @a scratch_pool.
  *
+ * @note The hunk header information can be retrievied with the following
+ * functions: 
+ * @see svn_diff_hunk_get_original_start()
+ * @see svn_diff_hunk_get_original_length()
+ * @see svn_diff_hunk_get_modified_start()
+ * @see svn_diff_hunk_get_modified_length()
+ *
  * @since New in 1.7.
  */
 svn_error_t *

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_dirent_uri.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_dirent_uri.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_dirent_uri.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_dirent_uri.h Sun Dec  8 17:56:46 2013
@@ -218,7 +218,7 @@ svn_dirent_join(const char *base,
 char *
 svn_dirent_join_many(apr_pool_t *result_pool,
                      const char *base,
-                     ...);
+                     ...) SVN_NEEDS_SENTINEL_NULL;
 
 /** Join a base relpath (@a base) with a component (@a component).
  * @a component need not be a single component.
@@ -354,6 +354,19 @@ char *
 svn_relpath_dirname(const char *relpath,
                     apr_pool_t *result_pool);
 
+/** Return a maximum of @a max_components components of @a relpath. This is
+ * an efficient way of calling svn_relpath_dirname() multiple times until only
+ * a specific number of components is left.
+ *
+ * Allocate the result in @a result_pool (or statically in case of 0)
+ *
+ * @since New in 1.9.
+ */
+const char *
+svn_relpath_limit(const char *relpath,
+                  int max_components,
+                  apr_pool_t *result_pool);
+
 
 /** Divide the canonicalized @a uri into a uri @a *dirpath and a
  * (URI-decoded) relpath @a *base_name.

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_error.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_error.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_error.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_error.h Sun Dec  8 17:56:46 2013
@@ -268,6 +268,10 @@ svn_error__locate(const char *file,
  * what code that used to call svn_handle_error() and now calls
  * svn_handle_error2() does.
  *
+ * Note that this should only be used from commandline specific code, or
+ * code that knows that @a stream is really where the application wants
+ * to receive its errors on.
+ *
  * @since New in 1.2.
  */
 void
@@ -387,10 +391,17 @@ svn_error_t *svn_error_purge_tracing(svn
   } while (0)
 
 
-/** A statement macro, similar to @c SVN_ERR, but returns an integer.
+/** A statement macro intended for the main() function of the 'svn' program.
+ *
+ * Evaluate @a expr. If it yields an error, display the error on stdout
+ * and return @c EXIT_FAILURE.
+ *
+ * @note Not for use in the library, as it prints to stderr. This macro
+ * no longer suits the needs of the 'svn' program, and is not generally
+ * suitable for third-party use as it assumes the program name is 'svn'.
  *
- * Evaluate @a expr. If it yields an error, handle that error and
- * return @c EXIT_FAILURE.
+ * @deprecated Provided for backward compatibility with the 1.8 API. Consider
+ * using svn_handle_error2() or svn_cmdline_handle_exit_error() instead.
  */
 #define SVN_INT_ERR(expr)                                        \
   do {                                                           \

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_fs.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_fs.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_fs.h Sun Dec  8 17:56:46 2013
@@ -908,10 +908,9 @@ svn_fs_unparse_id(const svn_fs_id_t *id,
  * pairs.  When you commit a transaction, all of its properties become
  * unversioned revision properties of the new revision.  (There is one
  * exception: the svn:date property will be automatically set on new
- * transactions to the date that the transaction was created, and will
+ * transactions to the date that the transaction was created, and can
  * be overwritten when the transaction is committed by the current
- * time; changes to a transaction's svn:date property will not affect
- * its committed value.)
+ * time; see svn_fs_commit_txn2.)
  *
  * Transaction names are guaranteed to contain only letters (upper-
  * and lower-case), digits, `-', and `.', from the ASCII character
@@ -1006,6 +1005,16 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
  * a new filesystem revision containing the changes made in @a txn,
  * storing that new revision number in @a *new_rev, and return zero.
  *
+ * If @a set_timestamp is FALSE any svn:date on the transaction will
+ * be become the unversioned property svn:date on the revision.
+ * svn:date can have any value, it does not have to be a timestamp.
+ * If the transaction has no svn:date the revision will have no
+ * svn:date.
+ *
+ * If @a set_timestamp is TRUE the new revision will have svn:date set
+ * to the current time at some point during the commit and any
+ * svn:date on the transaction will be lost.
+ * 
  * If @a conflict_p is non-zero, use it to provide details on any
  * conflicts encountered merging @a txn with the most recent committed
  * revisions.  If a conflict occurs, set @a *conflict_p to the path of
@@ -1056,7 +1065,10 @@ svn_fs_commit_txn2(const char **conflict
 /*
  * Same as svn_fs_commit_txn2(), but with @a set_timestamp
  * always set to @c TRUE.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_fs_commit_txn(const char **conflict_p,
                   svn_revnum_t *new_rev,

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_path.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_path.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_path.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_path.h Sun Dec  8 17:56:46 2013
@@ -131,7 +131,9 @@ svn_path_join(const char *base, const ch
  */
 SVN_DEPRECATED
 char *
-svn_path_join_many(apr_pool_t *pool, const char *base, ...);
+svn_path_join_many(apr_pool_t *pool,
+                   const char *base,
+                   ...) SVN_NEEDS_SENTINEL_NULL;
 
 
 /** Get the basename of the specified canonicalized @a path.  The

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_repos.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_repos.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_repos.h Sun Dec  8 17:56:46 2013
@@ -284,8 +284,43 @@ typedef enum svn_repos_notify_warning_t
    * @see svn_fs.h:"Directory entry names and directory paths" */
   /* ### TODO(doxygen): make that a proper doxygen link */
   /* See svn_fs__path_valid(). */
-  svn_repos_notify_warning_invalid_fspath
+  svn_repos_notify_warning_invalid_fspath,
 
+  /**
+   * Found a denormalized name. Reported when the name of a directoy
+   * entry is not normalized to Unicode Normalization Form C.
+   *
+   * @since New in 1.9.
+   */
+  svn_repos_notify_warning_denormalized_name,
+
+  /**
+   * Detected a name collision. Reported when the names of two or more
+   * entries in the same directory differ only in character
+   * representation (normalization), but are otherwise identical.
+   *
+   * @since New in 1.9.
+   */
+  svn_repos_notify_warning_name_collision,
+
+  /**
+   * Found a denormalized mergeinfo entry. Reported when the path in
+   * an entry in the svn:mergeinfo property is not normalized to
+   * Unicode Normalization Form C.
+   *
+   * @since New in 1.9.
+   */
+  svn_repos_notify_warning_denormalized_mergeinfo,
+
+  /**
+   * Detected a mergeinfo path collision. Reported when the paths in
+   * two or more entries in the same svn:mergeinfo property differ
+   * only in character representation (normalization), but are
+   * otherwise identical.
+   *
+   * @since New in 1.9.
+   */
+  svn_repos_notify_warning_mergeinfo_collision
 } svn_repos_notify_warning_t;
 
 /**
@@ -2659,6 +2694,12 @@ svn_repos_info_format(int *repos_format,
  * not notified. Finally, return an error if there were any failures during
  * verification, or SVN_NO_ERROR if there were no failures.
  *
+ * If @a check_normalization is @c TRUE, verify that all path names in
+ * the repository and in @c svn:mergeinfo entries are normaized to
+ * Unicode Normalization Form C, and report any name collisions within
+ * the same directory or svn:mergeinfo property where the names differ
+ * only in character representation, but are otherwise identical.
+ *
  * @since New in 1.9.
  */
 svn_error_t *
@@ -2666,6 +2707,7 @@ svn_repos_verify_fs3(svn_repos_t *repos,
                      svn_revnum_t start_rev,
                      svn_revnum_t end_rev,
                      svn_boolean_t keep_going,
+                     svn_boolean_t check_normalization,
                      svn_repos_notify_func_t notify_func,
                      void *notify_baton,
                      svn_cancel_func_t cancel,
@@ -2673,7 +2715,8 @@ svn_repos_verify_fs3(svn_repos_t *repos,
                      apr_pool_t *scratch_pool);
 
 /**
- * Like svn_repos_verify_fs3(), but with @a keep_going set to @c FALSE.
+ * Like svn_repos_verify_fs3(), but with @a keep_going and
+ * @a check_normalization set to @c FALSE.
  *
  * @since New in 1.7.
  * @deprecated Provided for backward compatibility with the 1.8 API.

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_types.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_types.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_types.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_types.h Sun Dec  8 17:56:46 2013
@@ -89,6 +89,24 @@ extern "C" {
 # endif
 #endif
 
+/** Macro used to mark functions that require a final null sentinel argument.
+ *
+ * @since New in 1.9.
+ */
+#ifndef SVN_NEEDS_SENTINEL_NULL
+#  if defined(__has_attribute)
+#    if __has_attribute(__sentinel__)
+#      define SVN_NEEDS_SENTINEL_NULL __attribute__((sentinel))
+#    else
+#      define SVN_NEEDS_SENTINEL_NULL
+#    endif
+#  elif defined(__GNUC__) && (__GNUC__ >= 4)
+#    define SVN_NEEDS_SENTINEL_NULL __attribute__((sentinel))
+#  else
+#    define SVN_NEEDS_SENTINEL_NULL
+#  endif
+#endif
+
 
 /** Indicate whether the current platform supports unaligned data access.
  *

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_wc.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_wc.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_wc.h Sun Dec  8 17:56:46 2013
@@ -7324,19 +7324,45 @@ svn_wc_get_pristine_copy_path(const char
 
 
 /**
- * Recurse from @a local_abspath, cleaning up unfinished log business.  Perform
- * any temporary allocations in @a scratch_pool.  Any working copy locks under
- * @a local_abspath will be taken over and then cleared by this function.
+ * Recurse from @a local_abspath, cleaning up unfinished tasks.  Perform
+ * any temporary allocations in @a scratch_pool.  If @a break_locks is TRUE
+ * Any working copy locks under @a local_abspath will be taken over and then
+ * cleared by this function.
+ * WARNING: If @a break_locks is TRUE there is no mechanism that will protect
+ * locks that are still being used.
+ *
+ * If @a fix_recorded_timestamps is TRUE the recorded timestamps of unmodified
+ * files will be updated, which will improve performance of future is-modified
+ * checks.
  *
- * WARNING: there is no mechanism that will protect locks that are still being
- * used.
+ * If @a vacuum_pristines is TRUE, try to remove unreferenced pristines from
+ * the working copy.
  *
  * If @a cancel_func is non-NULL, invoke it with @a cancel_baton at various
  * points during the operation.  If it returns an error (typically
  * #SVN_ERR_CANCELLED), return that error immediately.
  *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_wc_cleanup4(svn_wc_context_t *wc_ctx,
+                const char *local_abspath,
+                svn_boolean_t break_locks,
+                svn_boolean_t fix_recorded_timestamps,
+                svn_boolean_t clear_dav_cache,
+                svn_boolean_t vacuum_pristines,
+                svn_cancel_func_t cancel_func,
+                void *cancel_baton,
+                apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_wc_cleanup4() but will always break locks, fix recorded
+ * timestamps, clear the dav cache and vacuum pristines.
+ *
  * @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_cleanup3(svn_wc_context_t *wc_ctx,
                 const char *local_abspath,

Modified: subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_xml.h
URL: http://svn.apache.org/viewvc/subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_xml.h?rev=1549081&r1=1549080&r2=1549081&view=diff
==============================================================================
--- subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_xml.h (original)
+++ subversion/branches/invoke-diff-cmd-feature/subversion/include/svn_xml.h Sun Dec  8 17:56:46 2013
@@ -323,7 +323,7 @@ svn_xml_make_open_tag(svn_stringbuf_t **
                       apr_pool_t *pool,
                       enum svn_xml_open_tag_style style,
                       const char *tagname,
-                      ...);
+                      ...) SVN_NEEDS_SENTINEL_NULL;
 
 
 /** Like svn_xml_make_open_tag(), but takes a @c va_list instead of being