You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2009/12/12 05:43:34 UTC

svn commit: r889890 - in /subversion/branches/1.6.x-r889840: ./ CHANGES STATUS subversion/include/private/svn_mergeinfo_private.h subversion/include/svn_mergeinfo.h subversion/libsvn_subr/mergeinfo.c subversion/tests/libsvn_subr/mergeinfo-test.c

Author: pburba
Date: Sat Dec 12 04:43:33 2009
New Revision: 889890

URL: http://svn.apache.org/viewvc?rev=889890&view=rev
Log:
Merge r889840 from ^/subversion/trunk.

Resolve some very minor text conflicts in mergeinfo.c due to differing local
variable names.

Modified:
    subversion/branches/1.6.x-r889840/   (props changed)
    subversion/branches/1.6.x-r889840/CHANGES   (props changed)
    subversion/branches/1.6.x-r889840/STATUS
    subversion/branches/1.6.x-r889840/subversion/include/private/svn_mergeinfo_private.h
    subversion/branches/1.6.x-r889840/subversion/include/svn_mergeinfo.h
    subversion/branches/1.6.x-r889840/subversion/libsvn_subr/mergeinfo.c
    subversion/branches/1.6.x-r889840/subversion/tests/libsvn_subr/mergeinfo-test.c

Propchange: subversion/branches/1.6.x-r889840/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Dec 12 04:43:33 2009
@@ -1,50 +1,49 @@
+/subversion/branches/1.5.x-r30215:870312
+/subversion/branches/1.6.x-UNC-paths:876471-876545
+/subversion/branches/1.6.x-dirent-basename:876130-876262
 /subversion/branches/1.6.x-future-proof:880259-884209
-/subversion/trunk:879688,880274-880275,880474,881905,886164,886197
-subversion/branches/1.5.x-r30215:870312
-subversion/branches/1.6.x-UNC-paths:876471-876545
-subversion/branches/1.6.x-dirent-basename:876130-876262
-subversion/branches/1.6.x-issue3443:878597-879480
-subversion/branches/1.6.x-no-svn_uri:876360-876415
-subversion/branches/1.6.x-r36178:877876-877884
-subversion/branches/1.6.x-r36252:876328-876788
-subversion/branches/1.6.x-r37622:877699-877993
-subversion/branches/1.6.x-r37627:877704-877928
-subversion/branches/1.6.x-r37857:877932-877936
-subversion/branches/1.6.x-r37953:879809-880071
-subversion/branches/1.6.x-r37988:878063-878897
-subversion/branches/1.6.x-r38000:879083-879767
-subversion/branches/1.6.x-r38222:878299-878891
-subversion/branches/1.6.x-r38572:878661-878666
-subversion/branches/1.6.x-r38799:878880-878917
-subversion/branches/1.6.x-r38927:879002-879176
-subversion/branches/1.6.x-r39557:879668-879907
-subversion/branches/1.6.x-r39887:880024-880066
-subversion/branches/bdb-reverse-deltas:872050-872529
-subversion/branches/diff-callbacks3:870059-870761
-subversion/branches/dont-save-plaintext-passwords-by-default:870728-871118
-subversion/branches/double-delete:870511-872970
-subversion/branches/file-externals:871779-873302
-subversion/branches/fs-rep-sharing:869036-873803
-subversion/branches/fsfs-pack:873717-874575
-subversion/branches/gnome-keyring:870558-871410
-subversion/branches/in-memory-cache:869829-871452
-subversion/branches/issue-2843-dev:871432-874179
-subversion/branches/issue-3000:871713,871716-871719,871721-871726,871728,871734
-subversion/branches/issue-3067-deleted-subtrees:873375-874084
-subversion/branches/issue-3148-dev:875193-875204
-subversion/branches/issue-3220-dev:872210-872226
-subversion/branches/issue-3334-dirs:875156-875867
-subversion/branches/kwallet:870785-871314
-subversion/branches/log-g-performance:870941-871032
-subversion/branches/merge-skips-obstructions:874525-874615
-subversion/branches/reintegrate-improvements:873853-874164
-subversion/branches/svn-mergeinfo-enhancements:870119-870195,870197-870288
-subversion/branches/svnpatch-diff:871905,871986
-subversion/branches/svnserve-logging:869828-870893
-subversion/branches/tc-issue-3334:874697-874773
-subversion/branches/tc-merge-notify:874017-874062
-subversion/branches/tc-resolve:874191-874239
-subversion/branches/tc_url_rev:874351-874483
-subversion/branches/tree-conflicts:868291-873154
-subversion/branches/tree-conflicts-notify:873926-874008
-subversion/trunk:875965,875968,876004,876012,876017,876019,876022,876024,876041-876042,876048,876051,876055-876056,876059,876083,876091,876097,876101,876109,876123-876125,876129,876132,876138,876160,876167,876180,876185,876205,876223-876225,876230,876233,876252,876256,876283,876287,876312,876326-876327,876330,876366,876372,876374,876376,876383,876386,876442,876456-876457,876462-876464,876467,876469,876480,876486,876495-876497,876516-876518,876524,876526,876583,876601,876614,876628,876633,876641,876659,876687,876689,876705,876715,876726,876760,876763,876794,876804,876815-876816,876821,876825,876837,876840-876841,876843,876849,876857-876858,876873,876890,876897,876905,876908,876925,876931,876934,876948-876949,876953,876987,876993,877011,877028-877029,877038,877119,877127,877146,877157,877191,877195,877211,877230,877234,877237,877243,877249,877259,877261,877304,877319,877407,877437,877441-877442,877453,877459,877472,877544,877553,877565,877568,877573,877593,877601,877612,877667
 ,877681,877692,877696,877701,877720,877730,877784,877793,877797,877809,877815,877819,877821,877842,877848,877853,877867,877869,877873,877901,877909,877916,877931,877942,877953,877964,877968,877970,877981-877982,878005,878013,878015,878020,878046,878053,878062,878074,878080,878089,878091,878093,878095,878127,878129,878131,878142,878173-878176,878240,878242,878255,878272,878279,878296-878297,878303,878335,878338,878353,878364,878367-878368,878385,878462,878484,878491,878498,878532,878595,878646,878659,878673,878682-878683,878690-878691,878693,878723,878760-878761,878873,878875,878877,878879,878905,878915,878924-878925,878946,878949,878955,878960,878970,878981,879001,879033,879056,879074,879076,879081-879082,879105,879126,879148,879170,879198-879199,879201,879271,879293,879357,879375-879376,879403,879631,879635-879636,879709-879711,879747,879954,879961,880082,880095,880105,880162,880226
+/subversion/branches/1.6.x-issue3443:878597-879480
+/subversion/branches/1.6.x-no-svn_uri:876360-876415
+/subversion/branches/1.6.x-r36178:877876-877884
+/subversion/branches/1.6.x-r36252:876328-876788
+/subversion/branches/1.6.x-r37622:877699-877993
+/subversion/branches/1.6.x-r37627:877704-877928
+/subversion/branches/1.6.x-r37857:877932-877936
+/subversion/branches/1.6.x-r37953:879809-880071
+/subversion/branches/1.6.x-r37988:878063-878897
+/subversion/branches/1.6.x-r38000:879083-879767
+/subversion/branches/1.6.x-r38222:878299-878891
+/subversion/branches/1.6.x-r38572:878661-878666
+/subversion/branches/1.6.x-r38799:878880-878917
+/subversion/branches/1.6.x-r38927:879002-879176
+/subversion/branches/1.6.x-r39557:879668-879907
+/subversion/branches/1.6.x-r39887:880024-880066
+/subversion/branches/bdb-reverse-deltas:872050-872529
+/subversion/branches/diff-callbacks3:870059-870761
+/subversion/branches/dont-save-plaintext-passwords-by-default:870728-871118
+/subversion/branches/double-delete:870511-872970
+/subversion/branches/file-externals:871779-873302
+/subversion/branches/fs-rep-sharing:869036-873803
+/subversion/branches/fsfs-pack:873717-874575
+/subversion/branches/gnome-keyring:870558-871410
+/subversion/branches/in-memory-cache:869829-871452
+/subversion/branches/issue-2843-dev:871432-874179
+/subversion/branches/issue-3000:871713,871716-871719,871721-871726,871728,871734
+/subversion/branches/issue-3067-deleted-subtrees:873375-874084
+/subversion/branches/issue-3148-dev:875193-875204
+/subversion/branches/issue-3220-dev:872210-872226
+/subversion/branches/issue-3334-dirs:875156-875867
+/subversion/branches/kwallet:870785-871314
+/subversion/branches/log-g-performance:870941-871032
+/subversion/branches/merge-skips-obstructions:874525-874615
+/subversion/branches/reintegrate-improvements:873853-874164
+/subversion/branches/svn-mergeinfo-enhancements:870119-870195,870197-870288
+/subversion/branches/svnpatch-diff:871905,871986
+/subversion/branches/svnserve-logging:869828-870893
+/subversion/branches/tc-issue-3334:874697-874773
+/subversion/branches/tc-merge-notify:874017-874062
+/subversion/branches/tc-resolve:874191-874239
+/subversion/branches/tc_url_rev:874351-874483
+/subversion/branches/tree-conflicts:868291-873154
+/subversion/branches/tree-conflicts-notify:873926-874008
+/subversion/trunk:875965,875968,876004,876012,876017,876019,876022,876024,876041-876042,876048,876051,876055-876056,876059,876083,876091,876097,876101,876109,876123-876125,876129,876132,876138,876160,876167,876180,876185,876205,876223-876225,876230,876233,876252,876256,876283,876287,876312,876326-876327,876330,876366,876372,876374,876376,876383,876386,876442,876456-876457,876462-876464,876467,876469,876480,876486,876495-876497,876516-876518,876524,876526,876583,876601,876614,876628,876633,876641,876659,876687,876689,876705,876715,876726,876760,876763,876794,876804,876815-876816,876821,876825,876837,876840-876841,876843,876849,876857-876858,876873,876890,876897,876905,876908,876925,876931,876934,876948-876949,876953,876987,876993,877011,877028-877029,877038,877119,877127,877146,877157,877191,877195,877211,877230,877234,877237,877243,877249,877259,877261,877304,877319,877407,877437,877441-877442,877453,877459,877472,877544,877553,877565,877568,877573,877593,877601,877612,87766
 7,877681,877692,877696,877701,877720,877730,877784,877793,877797,877809,877815,877819,877821,877842,877848,877853,877867,877869,877873,877901,877909,877916,877931,877942,877953,877964,877968,877970,877981-877982,878005,878013,878015,878020,878046,878053,878062,878074,878080,878089,878091,878093,878095,878127,878129,878131,878142,878173-878176,878240,878242,878255,878272,878279,878296-878297,878303,878335,878338,878353,878364,878367-878368,878385,878462,878484,878491,878498,878532,878595,878646,878659,878673,878682-878683,878690-878691,878693,878723,878760-878761,878873,878875,878877,878879,878905,878915,878924-878925,878946,878949,878955,878960,878970,878981,879001,879033,879056,879074,879076,879081-879082,879105,879126,879148,879170,879198-879199,879201,879271,879293,879357,879375-879376,879403,879631,879635-879636,879688,879709-879711,879747,879954,879961,880082,880095,880105,880162,880226,880274-880275,880474,881905,886164,886197,889840

Propchange: subversion/branches/1.6.x-r889840/CHANGES
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Dec 12 04:43:33 2009
@@ -1,50 +1,49 @@
+/subversion/branches/1.5.x-r30215/CHANGES:870312
+/subversion/branches/1.6.x-UNC-paths/CHANGES:876471-876545
+/subversion/branches/1.6.x-dirent-basename/CHANGES:876130-876262
 /subversion/branches/1.6.x-future-proof/CHANGES:880259-884209
-/subversion/trunk/CHANGES:879688,880274-880275,880474,881905,886164,886197
-subversion/branches/1.5.x-r30215/CHANGES:870312
-subversion/branches/1.6.x-UNC-paths/CHANGES:876471-876545
-subversion/branches/1.6.x-dirent-basename/CHANGES:876130-876262
-subversion/branches/1.6.x-issue3443/CHANGES:878597-879480
-subversion/branches/1.6.x-no-svn_uri/CHANGES:876360-876415
-subversion/branches/1.6.x-r36178/CHANGES:877876-877884
-subversion/branches/1.6.x-r36252/CHANGES:876328-876788
-subversion/branches/1.6.x-r37622/CHANGES:877699-877993
-subversion/branches/1.6.x-r37627/CHANGES:877704-877928
-subversion/branches/1.6.x-r37857/CHANGES:877932-877936
-subversion/branches/1.6.x-r37953/CHANGES:879809-880071
-subversion/branches/1.6.x-r37988/CHANGES:878063-878897
-subversion/branches/1.6.x-r38000/CHANGES:879083-879767
-subversion/branches/1.6.x-r38222/CHANGES:878299-878891
-subversion/branches/1.6.x-r38572/CHANGES:878661-878666
-subversion/branches/1.6.x-r38799/CHANGES:878880-878917
-subversion/branches/1.6.x-r38927/CHANGES:879002-879176
-subversion/branches/1.6.x-r39557/CHANGES:879668-879907
-subversion/branches/1.6.x-r39887/CHANGES:880024-880066
-subversion/branches/bdb-reverse-deltas/CHANGES:872050-872529
-subversion/branches/diff-callbacks3/CHANGES:870059-870761
-subversion/branches/dont-save-plaintext-passwords-by-default/CHANGES:870728-871118
-subversion/branches/double-delete/CHANGES:870511-872970
-subversion/branches/file-externals/CHANGES:871779-873302
-subversion/branches/fs-rep-sharing/CHANGES:869036-873803
-subversion/branches/fsfs-pack/CHANGES:873717-874575
-subversion/branches/gnome-keyring/CHANGES:870558-871410
-subversion/branches/in-memory-cache/CHANGES:869829-871452
-subversion/branches/issue-2843-dev/CHANGES:871432-874179
-subversion/branches/issue-3000/CHANGES:871713,871716-871719,871721-871726,871728,871734
-subversion/branches/issue-3067-deleted-subtrees/CHANGES:873375-874084
-subversion/branches/issue-3148-dev/CHANGES:875193-875204
-subversion/branches/issue-3220-dev/CHANGES:872210-872226
-subversion/branches/issue-3334-dirs/CHANGES:875156-875867
-subversion/branches/kwallet/CHANGES:870785-871314
-subversion/branches/log-g-performance/CHANGES:870941-871032
-subversion/branches/merge-skips-obstructions/CHANGES:874525-874615
-subversion/branches/reintegrate-improvements/CHANGES:873853-874164
-subversion/branches/svn-mergeinfo-enhancements/CHANGES:870119-870195,870197-870288
-subversion/branches/svnpatch-diff/CHANGES:871905,871986
-subversion/branches/svnserve-logging/CHANGES:869828-870893
-subversion/branches/tc-issue-3334/CHANGES:874697-874773
-subversion/branches/tc-merge-notify/CHANGES:874017-874062
-subversion/branches/tc-resolve/CHANGES:874191-874239
-subversion/branches/tc_url_rev/CHANGES:874351-874483
-subversion/branches/tree-conflicts/CHANGES:868291-873154
-subversion/branches/tree-conflicts-notify/CHANGES:873926-874008
-subversion/trunk/CHANGES:836421-841355,875962-880126,880162,880226
+/subversion/branches/1.6.x-issue3443/CHANGES:878597-879480
+/subversion/branches/1.6.x-no-svn_uri/CHANGES:876360-876415
+/subversion/branches/1.6.x-r36178/CHANGES:877876-877884
+/subversion/branches/1.6.x-r36252/CHANGES:876328-876788
+/subversion/branches/1.6.x-r37622/CHANGES:877699-877993
+/subversion/branches/1.6.x-r37627/CHANGES:877704-877928
+/subversion/branches/1.6.x-r37857/CHANGES:877932-877936
+/subversion/branches/1.6.x-r37953/CHANGES:879809-880071
+/subversion/branches/1.6.x-r37988/CHANGES:878063-878897
+/subversion/branches/1.6.x-r38000/CHANGES:879083-879767
+/subversion/branches/1.6.x-r38222/CHANGES:878299-878891
+/subversion/branches/1.6.x-r38572/CHANGES:878661-878666
+/subversion/branches/1.6.x-r38799/CHANGES:878880-878917
+/subversion/branches/1.6.x-r38927/CHANGES:879002-879176
+/subversion/branches/1.6.x-r39557/CHANGES:879668-879907
+/subversion/branches/1.6.x-r39887/CHANGES:880024-880066
+/subversion/branches/bdb-reverse-deltas/CHANGES:872050-872529
+/subversion/branches/diff-callbacks3/CHANGES:870059-870761
+/subversion/branches/dont-save-plaintext-passwords-by-default/CHANGES:870728-871118
+/subversion/branches/double-delete/CHANGES:870511-872970
+/subversion/branches/file-externals/CHANGES:871779-873302
+/subversion/branches/fs-rep-sharing/CHANGES:869036-873803
+/subversion/branches/fsfs-pack/CHANGES:873717-874575
+/subversion/branches/gnome-keyring/CHANGES:870558-871410
+/subversion/branches/in-memory-cache/CHANGES:869829-871452
+/subversion/branches/issue-2843-dev/CHANGES:871432-874179
+/subversion/branches/issue-3000/CHANGES:871713,871716-871719,871721-871726,871728,871734
+/subversion/branches/issue-3067-deleted-subtrees/CHANGES:873375-874084
+/subversion/branches/issue-3148-dev/CHANGES:875193-875204
+/subversion/branches/issue-3220-dev/CHANGES:872210-872226
+/subversion/branches/issue-3334-dirs/CHANGES:875156-875867
+/subversion/branches/kwallet/CHANGES:870785-871314
+/subversion/branches/log-g-performance/CHANGES:870941-871032
+/subversion/branches/merge-skips-obstructions/CHANGES:874525-874615
+/subversion/branches/reintegrate-improvements/CHANGES:873853-874164
+/subversion/branches/svn-mergeinfo-enhancements/CHANGES:870119-870195,870197-870288
+/subversion/branches/svnpatch-diff/CHANGES:871905,871986
+/subversion/branches/svnserve-logging/CHANGES:869828-870893
+/subversion/branches/tc-issue-3334/CHANGES:874697-874773
+/subversion/branches/tc-merge-notify/CHANGES:874017-874062
+/subversion/branches/tc-resolve/CHANGES:874191-874239
+/subversion/branches/tc_url_rev/CHANGES:874351-874483
+/subversion/branches/tree-conflicts/CHANGES:868291-873154
+/subversion/branches/tree-conflicts-notify/CHANGES:873926-874008
+/subversion/trunk/CHANGES:836421-841355,875962-880126,880162,880226,880274-880275,880474,881905,886164,886197,889840

Modified: subversion/branches/1.6.x-r889840/STATUS
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x-r889840/STATUS?rev=889890&r1=889889&r2=889890&view=diff
==============================================================================
--- subversion/branches/1.6.x-r889840/STATUS (original)
+++ subversion/branches/1.6.x-r889840/STATUS Sat Dec 12 04:43:33 2009
@@ -161,14 +161,16 @@
    Votes:
      +1: stsp
 
- * r888979, r889081
-   Make 'svnadmin load --parent-dir PATH' smart enough to know to prepend a
-   leading slash onto PATH when using it as a prefix for fixed-up mergeinfo.
+ * r889840
+   When producing svn_mergeinfo_t from string representations, or vice-versa,
+   tolerate relative merge source paths, but convert such paths to absolute
+   paths in the resulting string/mergeinfo.  
    Justification:
-     This bug is the reason why all the mergeinfo in our project
-     history at the moment is syntactically invalid.
+     This prevents any syntactically invalid mergeinfo created by issue #3547
+     from breaking just about everything that uses mergeinfo, see http://
+     mail-archives.apache.org/mod_mbox/subversion-dev/200912.mbox/browser.
    Votes:
-     +1: cmpilato, stylesen
+     +1: pburba
 
 Veto-blocked changes:
 
@@ -205,3 +207,12 @@
 
 Approved changes:
 =================
+
+ * r888979, r889081
+   Make 'svnadmin load --parent-dir PATH' smart enough to know to prepend a
+   leading slash onto PATH when using it as a prefix for fixed-up mergeinfo.
+   Justification:
+     This bug is the reason why all the mergeinfo in our project
+     history at the moment is syntactically invalid.
+   Votes:
+     +1: cmpilato, stylesen, pburba

Modified: subversion/branches/1.6.x-r889840/subversion/include/private/svn_mergeinfo_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x-r889840/subversion/include/private/svn_mergeinfo_private.h?rev=889890&r1=889889&r2=889890&view=diff
==============================================================================
--- subversion/branches/1.6.x-r889840/subversion/include/private/svn_mergeinfo_private.h (original)
+++ subversion/branches/1.6.x-r889840/subversion/include/private/svn_mergeinfo_private.h Sat Dec 12 04:43:33 2009
@@ -87,7 +87,10 @@
    appropriate newline terminated string.  If KEY_PREFIX is not NULL then
    prepend KEY_PREFIX to each key (path) in *OUTPUT.  if VAL_PREFIX is not
    NULL then prepend VAL_PREFIX to each merge source:rangelist line in
-   *OUTPUT. */
+   *OUTPUT.
+
+   Any relative merge source paths in the mergeinfo in CATALOG are converted
+   to absolute paths in *OUTPUT. */
 svn_error_t *
 svn_mergeinfo__catalog_to_formatted_string(svn_string_t **output,
                                            svn_mergeinfo_catalog_t catalog,
@@ -99,7 +102,10 @@
    Unlike svn_mergeinfo_to_string(), NULL MERGEINFO is tolerated and results
    in *OUTPUT set to "\n".  If SVN_DEBUG is true, then NULL or empty MERGEINFO
    causes *OUTPUT to be set to an appropriate newline terminated string.  If
-   PREFIX is not NULL then prepend PREFIX to each line in *OUTPUT. */
+   PREFIX is not NULL then prepend PREFIX to each line in *OUTPUT.
+
+   Any relative merge source paths in MERGEINFO are converted to absolute
+   paths in *OUTPUT.*/
 svn_error_t *
 svn_mergeinfo__to_formatted_string(svn_string_t **output,
                                    svn_mergeinfo_t mergeinfo,

Modified: subversion/branches/1.6.x-r889840/subversion/include/svn_mergeinfo.h
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x-r889840/subversion/include/svn_mergeinfo.h?rev=889890&r1=889889&r2=889890&view=diff
==============================================================================
--- subversion/branches/1.6.x-r889840/subversion/include/svn_mergeinfo.h (original)
+++ subversion/branches/1.6.x-r889840/subversion/include/svn_mergeinfo.h Sat Dec 12 04:43:33 2009
@@ -152,6 +152,9 @@
  * inheritability are also allowed, but will be combined into a single
  * range when placed into @a *mergeinfo.
  *
+ * @a input may contain relative merge source paths, but these are
+ * converted to absolute paths in @a *mergeinfo.
+ *
  * @since New in 1.5.
  */
 svn_error_t *
@@ -363,6 +366,9 @@
  *  mergeinfo in *OUTPUT.  If INPUT contains no elements, return the
  *  empty string.
  *
+ * @a mergeinput may contain relative merge source paths, but these are
+ * converted to absolute paths in @a *output.
+ *
  * @since New in 1.5.
 */
 svn_error_t *

Modified: subversion/branches/1.6.x-r889840/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x-r889840/subversion/libsvn_subr/mergeinfo.c?rev=889890&r1=889889&r2=889890&view=diff
==============================================================================
--- subversion/branches/1.6.x-r889840/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/branches/1.6.x-r889840/subversion/libsvn_subr/mergeinfo.c Sat Dec 12 04:43:33 2009
@@ -66,8 +66,10 @@
 
 /* pathname -> PATHNAME */
 static svn_error_t *
-parse_pathname(const char **input, const char *end,
-               svn_stringbuf_t **pathname, apr_pool_t *pool)
+parse_pathname(const char **input,
+               const char *end,
+               svn_stringbuf_t **pathname,
+               apr_pool_t *pool)
 {
   const char *curr = *input;
   const char *last_colon = NULL;
@@ -89,7 +91,18 @@
     return svn_error_create(SVN_ERR_MERGEINFO_PARSE_ERROR, NULL,
                             _("No pathname preceding ':'"));
 
-  *pathname = svn_stringbuf_ncreate(*input, last_colon - *input, pool);
+  /* Tolerate relative repository paths, but convert them to absolute. */
+  if (**input == '/')
+    {
+      *pathname = svn_stringbuf_ncreate(*input, last_colon - *input, pool);
+    }
+  else
+    {
+      const char *repos_rel_path = apr_pstrndup(pool, *input,
+                                                last_colon - *input);
+      *pathname = svn_stringbuf_createf(pool, "/%s",  repos_rel_path);
+    }
+
   *input = last_colon;
 
   return SVN_NO_ERROR;
@@ -487,6 +500,7 @@
                     apr_pool_t *pool)
 {
   svn_stringbuf_t *pathname;
+  apr_array_header_t *existing_rangelist;
   apr_array_header_t *revlist = apr_array_make(pool, 1,
                                                sizeof(svn_merge_range_t *));
 
@@ -559,6 +573,17 @@
           lastrange = APR_ARRAY_IDX(revlist, i, svn_merge_range_t *);
         }
     }
+
+  /* Handle any funky mergeinfo with relative merge source paths that
+     might exist due to issue #3547.  It's possible that this issue allowed
+     the creation of mergeinfo with path keys that differ only by a
+     leading slash, e.g. "trunk:4033\n/trunk:4039-4995".  In the event
+     we encounter this we merge the rangelists together under a single
+     absolute path key. */
+  if (existing_rangelist = apr_hash_get(hash, pathname->data,
+                                        APR_HASH_KEY_STRING))
+    svn_rangelist_merge(&revlist, existing_rangelist, pool);
+
   apr_hash_set(hash, pathname->data, APR_HASH_KEY_STRING, revlist);
 
   return SVN_NO_ERROR;
@@ -1235,7 +1260,9 @@
 
 /* Converts a mergeinfo INPUT to an unparsed mergeinfo in OUTPUT.  If PREFIX
    is not NULL then prepend PREFIX to each line in OUTPUT.  If INPUT contains
-   no elements, return the empty string.
+   no elements, return the empty string.  If INPUT contains any merge source
+   path keys that are relative then convert these to absolute paths in
+   *OUTPUT.
  */
 static svn_error_t *
 mergeinfo_to_stringbuf(svn_stringbuf_t **output,
@@ -1257,11 +1284,13 @@
           svn_string_t *revlist;
 
           SVN_ERR(svn_rangelist_to_string(&revlist, elt.value, pool));
-          svn_stringbuf_appendcstr(*output,
-                                   apr_psprintf(pool, "%s%s:%s",
-                                                prefix ? prefix : "",
-                                                (const char *) elt.key,
-                                                revlist->data));
+          svn_stringbuf_appendcstr(
+            *output,
+            apr_psprintf(pool, "%s%s%s:%s",
+                         prefix ? prefix : "",
+                         *((const char *) elt.key) == '/' ? "" : "/",
+                         (const char *) elt.key,
+                         revlist->data));
           if (i < sorted->nelts - 1)
             svn_stringbuf_appendcstr(*output, "\n");
         }

Modified: subversion/branches/1.6.x-r889840/subversion/tests/libsvn_subr/mergeinfo-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x-r889840/subversion/tests/libsvn_subr/mergeinfo-test.c?rev=889890&r1=889889&r2=889890&view=diff
==============================================================================
--- subversion/branches/1.6.x-r889840/subversion/tests/libsvn_subr/mergeinfo-test.c (original)
+++ subversion/branches/1.6.x-r889840/subversion/tests/libsvn_subr/mergeinfo-test.c Sat Dec 12 04:43:33 2009
@@ -149,9 +149,12 @@
     "/trunk",
     "/trunk",
     "/branch",
-    "patch-common::netasq-bpf.c",
-    "patch-common_netasq-bpf.c:",
-    ":patch:common:netasq:bpf.c",
+
+    /* svn_mergeinfo_parse converts relative merge soure paths to absolute. */
+    "/patch-common::netasq-bpf.c",
+    "/patch-common_netasq-bpf.c:",
+    "/:patch:common:netasq:bpf.c",
+    
     "/trunk",
     "/trunk",
     "/trunk",
@@ -1115,6 +1118,22 @@
   if (svn_string_compare(expected, output) != TRUE)
     return fail(pool, "Mergeinfo string not what we expected");
 
+  /* Manually construct some mergeinfo with relative path
+     merge source keys.  These should be tolerated as input
+     to svn_mergeinfo_to_string(), but the resulting svn_string_t
+     should have absolute keys. */
+  info2 = apr_hash_make(pool);
+  apr_hash_set(info2, "fred",
+               APR_HASH_KEY_STRING,
+               apr_hash_get(info1, "/fred", APR_HASH_KEY_STRING));
+  apr_hash_set(info2, "trunk",
+               APR_HASH_KEY_STRING,
+               apr_hash_get(info1, "/trunk", APR_HASH_KEY_STRING));
+  SVN_ERR(svn_mergeinfo_to_string(&output, info2, pool));
+  
+  if (svn_string_compare(expected, output) != TRUE)
+    return fail(pool, "Mergeinfo string not what we expected");
+
   return SVN_NO_ERROR;
 }