Author: breser
Date: Mon Dec 10 17:56:17 2012
New Revision: 1419609

URL: http://svn.apache.org/viewvc?rev=1419609&view=rev
Log:
Merge issue #4019 changes from trunk.

* r1295418, r1407131, r1407812, r1408650
   Properly handle incoming changes on symlinks (issue #4091)
   Justification:
     Regression since 1.6.x. Users get unexpected tree conflicts
     and assertions.
   Notes:
     The backport branch contains some testsuite plumbing to allow running
     the test to run on operating systems where we don't support symlinks.
   Branch:
     ^/subversion/branches/1.7.x-r1407131/
   Votes:
     +1: philip, rhuijben, breser


Modified:
    subversion/branches/1.7.x/   (props changed)
    subversion/branches/1.7.x/STATUS
    subversion/branches/1.7.x/subversion/libsvn_wc/update_editor.c
    subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py
    subversion/branches/1.7.x/subversion/tests/cmdline/svntest/   (props 
changed)
    subversion/branches/1.7.x/subversion/tests/cmdline/svntest/sandbox.py

Propchange: subversion/branches/1.7.x/
------------------------------------------------------------------------------
  Merged /subversion/branches/1.7.x-r1407131:r1407164-1419607
  Merged /subversion/trunk:r1295418,1407131,1407812,1408650

Modified: subversion/branches/1.7.x/STATUS
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.7.x/STATUS?rev=1419609&r1=1419608&r2=1419609&view=diff
==============================================================================
--- subversion/branches/1.7.x/STATUS (original)
+++ subversion/branches/1.7.x/STATUS Mon Dec 10 17:56:17 2012
@@ -63,15 +63,3 @@ Veto-blocked changes:
 Approved changes:
 =================
 
- * r1295418, r1407131, r1407812, r1408650
-   Properly handle incoming changes on symlinks (issue #4091)
-   Justification:
-     Regression since 1.6.x. Users get unexpected tree conflicts
-     and assertions.
-   Notes:
-     The backport branch contains some testsuite plumbing to allow running
-     the test to run on operating systems where we don't support symlinks.
-   Branch:
-     ^/subversion/branches/1.7.x-r1407131/
-   Votes:
-     +1: philip, rhuijben, breser

Modified: subversion/branches/1.7.x/subversion/libsvn_wc/update_editor.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/update_editor.c?rev=1419609&r1=1419608&r2=1419609&view=diff
==============================================================================
--- subversion/branches/1.7.x/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/1.7.x/subversion/libsvn_wc/update_editor.c Mon Dec 10 
17:56:17 2012
@@ -750,6 +750,10 @@ struct file_baton
      initialized, this is never NULL, but it may have zero elements.  */
   apr_array_header_t *propchanges;
 
+  /* For existing files, whether there are local modifications. FALSE for added
+     files */
+  svn_boolean_t local_prop_mods;
+
   /* Bump information for the directory this file lives in */
   struct bump_dir_info *bump_info;
 
@@ -3299,7 +3303,7 @@ open_file(const char *path,
                                &fb->changed_author, NULL,
                                &fb->original_checksum, NULL, NULL, NULL,
                                NULL, NULL, NULL, NULL, NULL, NULL,
-                               &conflicted, NULL, NULL, NULL,
+                               &conflicted, NULL, NULL, &fb->local_prop_mods,
                                NULL, NULL, &have_work,
                                eb->db, fb->local_abspath,
                                fb->pool, scratch_pool));
@@ -3522,6 +3526,85 @@ change_file_prop(void *file_baton,
   if (!fb->edited && svn_property_kind(NULL, name) == svn_prop_regular_kind)
     SVN_ERR(mark_file_edited(fb, scratch_pool));
 
+  if (! fb->shadowed
+      && strcmp(name, SVN_PROP_SPECIAL) == 0)
+    {
+      struct edit_baton *eb = fb->edit_baton;
+      svn_boolean_t modified = FALSE;
+      svn_boolean_t becomes_symlink;
+      svn_boolean_t was_symlink;
+
+      /* Let's see if we have a change as in some scenarios servers report
+         non-changes of properties. */
+      becomes_symlink = (value != NULL);
+
+      if (fb->adding_file)
+        was_symlink = becomes_symlink; /* No change */
+      else
+        {
+          apr_hash_t *props;
+
+          /* We read the server-props, not the ACTUAL props here as we just
+             want to see if this is really an incoming prop change. */
+          SVN_ERR(svn_wc__db_base_get_props(&props, eb->db,
+                                            fb->local_abspath,
+                                            scratch_pool, scratch_pool));
+
+          was_symlink = ((props
+                              && apr_hash_get(props, SVN_PROP_SPECIAL,
+                                              APR_HASH_KEY_STRING) != NULL)
+                              ? svn_tristate_true
+                              : svn_tristate_false);
+        }
+
+      if (was_symlink != becomes_symlink)
+        {
+          /* If the local node was not modified, we continue as usual, if
+             modified we want a tree conflict just like how we would handle
+             it when receiving a delete + add (aka "replace") */
+          if (fb->local_prop_mods)
+            modified = TRUE;
+          else
+            SVN_ERR(svn_wc__internal_file_modified_p(&modified, eb->db,
+                                                     fb->local_abspath,
+                                                     FALSE, scratch_pool));
+        }
+
+      if (modified)
+        {
+          svn_wc_conflict_description2_t *tree_conflict = NULL;
+
+          /* Create a copy of the existing (pre update) BASE node in WORKING,
+             mark a tree conflict and handle the rest of the update as
+             shadowed */
+          SVN_ERR(svn_wc__db_temp_op_make_copy(eb->db, fb->local_abspath,
+                                               scratch_pool));
+          /* ### Performance: We should just create the conflict here, without
+             ### verifying again */
+          SVN_ERR(check_tree_conflict(&tree_conflict, eb, fb->local_abspath,
+                                      svn_wc__db_status_added,
+                                      svn_wc__db_kind_file, TRUE,
+                                      svn_wc_conflict_action_edit,
+                                      svn_node_file, fb->new_relpath,
+                                      scratch_pool, scratch_pool));
+          SVN_ERR_ASSERT(tree_conflict != NULL);
+          SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db,
+                                                  fb->local_abspath,
+                                                  tree_conflict,
+                                                  scratch_pool));
+          fb->edit_conflict = tree_conflict;
+
+          do_notification(eb, fb->local_abspath, svn_node_file,
+                          svn_wc_notify_tree_conflict, scratch_pool);
+
+          /* Ok, we introduced a replacement, so we can now handle the rest
+             as a normal shadowed update */
+          fb->shadowed = TRUE;
+          fb->add_existed = FALSE;
+          fb->already_notified = TRUE;
+      }
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -4039,67 +4122,6 @@ close_file(void *file_baton,
   if (current_actual_props == NULL)
     current_actual_props = apr_hash_make(scratch_pool);
 
-  /* Catch symlink-ness change.
-   * add_file() doesn't know whether the incoming added node is a file or
-   * a symlink, because symlink-ness is saved in a prop :(
-   * So add_file() cannot notice when update wants to add a symlink where
-   * locally there already is a file scheduled for addition, or vice versa.
-   * It sees incoming symlinks as simple files and may wrongly try to offer
-   * a text conflict. So flag a tree conflict here. */
-  if (!fb->shadowed
-      && (! fb->adding_file || fb->add_existed))
-    {
-      svn_boolean_t local_is_link;
-      svn_boolean_t incoming_is_link;
-      int i;
-
-      local_is_link = apr_hash_get(local_actual_props,
-                                SVN_PROP_SPECIAL,
-                                APR_HASH_KEY_STRING) != NULL;
-
-      incoming_is_link = local_is_link;
-
-      /* Does an incoming propchange affect symlink-ness? */
-      for (i = 0; i < regular_prop_changes->nelts; ++i)
-        {
-          const svn_prop_t *prop = &APR_ARRAY_IDX(regular_prop_changes, i,
-                                                  svn_prop_t);
-
-          if (strcmp(prop->name, SVN_PROP_SPECIAL) == 0)
-            {
-              incoming_is_link = (prop->value != NULL);
-              break;
-            }
-        }
-
-      if (local_is_link != incoming_is_link)
-        {
-          svn_wc_conflict_description2_t *tree_conflict = NULL;
-
-          fb->shadowed = TRUE;
-          fb->obstruction_found = TRUE;
-          fb->add_existed = FALSE;
-
-          /* ### Performance: We should just create the conflict here, without
-             ### verifying again */
-          SVN_ERR(check_tree_conflict(&tree_conflict, eb, fb->local_abspath,
-                                      svn_wc__db_status_added,
-                                      svn_wc__db_kind_file, TRUE,
-                                      svn_wc_conflict_action_add,
-                                      svn_node_file, fb->new_relpath,
-                                      scratch_pool, scratch_pool));
-          SVN_ERR_ASSERT(tree_conflict != NULL);
-          SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db,
-                                                  fb->local_abspath,
-                                                  tree_conflict,
-                                                  scratch_pool));
-
-          fb->already_notified = TRUE;
-          do_notification(eb, fb->local_abspath, svn_node_unknown,
-                          svn_wc_notify_tree_conflict, scratch_pool);
-        }
-    }
-
   prop_state = svn_wc_notify_state_unknown;
 
   if (! fb->shadowed)

Modified: subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py?rev=1419609&r1=1419608&r2=1419609&view=diff
==============================================================================
--- subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py 
(original)
+++ subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py Mon Dec 
10 17:56:17 2012
@@ -937,6 +937,115 @@ def externals_as_symlink_targets(sbox):
   sbox.simple_commit()
     
 
+#----------------------------------------------------------------------
+def incoming_symlink_changes(sbox):
+  "verify incoming symlink change behavior"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  sbox.simple_add_symlink('iota', 's-replace')
+  sbox.simple_add_symlink('iota', 's-in-place')
+  sbox.simple_add_symlink('iota', 's-type')
+  sbox.simple_append('s-reverse', 'link iota')
+  sbox.simple_add('s-reverse')
+  sbox.simple_commit() # r2
+
+  # Replace s-replace
+  sbox.simple_rm('s-replace')
+  # Note that we don't use 'A/mu' as the length of that matches 'iota', which
+  # would make us depend on timestamp changes for detecting differences.
+  sbox.simple_add_symlink('A/D/G/pi', 's-replace')
+
+  # Change target of s-in-place
+  if svntest.main.is_posix_os():
+    os.remove(sbox.ospath('s-in-place'))
+    os.symlink('A/D/G/pi', sbox.ospath('s-in-place'))
+  else:
+    sbox.simple_append('s-in-place', 'link A/D/G/pi', truncate = True)
+
+  # r3
+  expected_output = svntest.wc.State(wc_dir, {
+    's-replace'         : Item(verb='Replacing'),
+    's-in-place'        : Item(verb='Sending'),
+  })
+  svntest.actions.run_and_verify_commit(wc_dir,
+                                        expected_output, None, None,
+                                        wc_dir)
+
+  # r4
+  svntest.main.run_svnmucc('propdel', 'svn:special',
+                           sbox.repo_url + '/s-type',
+                           '-m', 'Turn s-type into a file')
+
+  # r5
+  svntest.main.run_svnmucc('propset', 'svn:special', 'X',
+                           sbox.repo_url + '/s-reverse',
+                           '-m', 'Turn s-reverse into a symlink')
+
+  # Currently we expect to see 'U'pdates, but we would like to see
+  # replacements
+  expected_output = svntest.wc.State(wc_dir, {
+    's-reverse'         : Item(status=' U'),
+    's-type'            : Item(status=' U'),
+  })
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 5)
+  expected_status.add({
+    's-type'            : Item(status='  ', wc_rev='5'),
+    's-replace'         : Item(status='  ', wc_rev='5'),
+    's-reverse'         : Item(status='  ', wc_rev='5'),
+    's-in-place'        : Item(status='  ', wc_rev='5'),
+  })
+
+  # Update to HEAD/r5 to fetch the r4 and r5 symlink changes
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        None,
+                                        expected_status,
+                                        None, None, None, None, None,
+                                        check_props=True)
+
+  # Update back to r2, to prepare some local changes
+  expected_output = svntest.wc.State(wc_dir, {
+    # s-replace is D + A
+    's-replace'         : Item(status='A '),
+    's-in-place'        : Item(status='U '),
+    's-reverse'         : Item(status=' U'),
+    's-type'            : Item(status=' U'),
+  })
+  expected_status.tweak(wc_rev=2)
+
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        None,
+                                        expected_status,
+                                        None, None, None, None, None,
+                                        True,
+                                        wc_dir, '-r', '2')
+
+  # Ok, now add a property on all of them to make future symlinkness changes
+  # a tree conflict
+  # ### We should also try this with a 'textual change'
+  sbox.simple_propset('x', 'y', 's-replace', 's-in-place', 's-reverse', 
's-type')
+
+  expected_output = svntest.wc.State(wc_dir, {
+    's-replace'         : Item(status='  ', treeconflict='A'),
+    's-in-place'        : Item(status='U '),
+    's-reverse'         : Item(status='  ', treeconflict='C'),
+    's-type'            : Item(status='  ', treeconflict='C'),
+  })
+  expected_status.tweak(wc_rev=5)
+  expected_status.tweak('s-replace', 's-reverse', 's-type', status='RM',
+                        copied='+', treeconflict='C', wc_rev='-')
+  expected_status.tweak('s-in-place', status=' M')
+
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        None,
+                                        expected_status,
+                                        None, None, None, None, None,
+                                        True)
+
 ########################################################################
 # Run the tests
 
@@ -965,6 +1074,7 @@ test_list = [ None,
               symlink_to_wc_svnversion,
               update_symlink,
               externals_as_symlink_targets,
+              incoming_symlink_changes,
              ]
 
 if __name__ == '__main__':

Propchange: subversion/branches/1.7.x/subversion/tests/cmdline/svntest/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Mon Dec 10 17:56:17 2012
@@ -0,0 +1,107 @@
+/subversion/1.7.x-issue4059/subversion/tests/cmdline/svntest:1239661-1239744
+/subversion/branches/1.5.x-r30215/subversion/tests/cmdline/svntest:870312
+/subversion/branches/1.7.x-JavaHL-pools/subversion/tests/cmdline/svntest:1158684-1158722
+/subversion/branches/1.7.x-issue3888/subversion/tests/cmdline/svntest:1148937-1149162
+/subversion/branches/1.7.x-issue3975/subversion/tests/cmdline/svntest:1160761-1161546
+/subversion/branches/1.7.x-issue3976/subversion/tests/cmdline/svntest:1161731-1165397
+/subversion/branches/1.7.x-issue4032/subversion/tests/cmdline/svntest:1186668-1186784
+/subversion/branches/1.7.x-issue4035/subversion/tests/cmdline/svntest:1186202-1186315
+/subversion/branches/1.7.x-issue4035-r1185738/subversion/tests/cmdline/svntest:1186316-1186778
+/subversion/branches/1.7.x-issue4059/subversion/tests/cmdline/svntest:1239745-1242661
+/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svntest:1243707-1336073
+/subversion/branches/1.7.x-issue4093/subversion/tests/cmdline/svntest:1229839-1230236
+/subversion/branches/1.7.x-issue4102/subversion/tests/cmdline/svntest:1292401-1295402
+/subversion/branches/1.7.x-issue4123/subversion/tests/cmdline/svntest:1293358-1293812
+/subversion/branches/1.7.x-issue4144/subversion/tests/cmdline/svntest:1305854-1306143
+/subversion/branches/1.7.x-issue4161/subversion/tests/cmdline/svntest:1330697-1331209
+/subversion/branches/1.7.x-issue4166/subversion/tests/cmdline/svntest:1330474-1336071
+/subversion/branches/1.7.x-issue4169/subversion/tests/cmdline/svntest:1330537-1336116
+/subversion/branches/1.7.x-issue4k/subversion/tests/cmdline/svntest:1166502-1167193
+/subversion/branches/1.7.x-log-diff/subversion/tests/cmdline/svntest:1295670-1295699
+/subversion/branches/1.7.x-neon-default/subversion/tests/cmdline/svntest:1148803-1158680
+/subversion/branches/1.7.x-r1152189/subversion/tests/cmdline/svntest:1152759-1154249
+/subversion/branches/1.7.x-r1155160/subversion/tests/cmdline/svntest:1158704-1159223
+/subversion/branches/1.7.x-r1159093/subversion/tests/cmdline/svntest:1159097-1159230
+/subversion/branches/1.7.x-r1163557/subversion/tests/cmdline/svntest:1163574-1170648
+/subversion/branches/1.7.x-r1173425/subversion/tests/cmdline/svntest:1173429-1176454
+/subversion/branches/1.7.x-r1180154/subversion/tests/cmdline/svntest:1186224-1186351
+/subversion/branches/1.7.x-r1201824/subversion/tests/cmdline/svntest:1202121-1207333
+/subversion/branches/1.7.x-r1210147/subversion/tests/cmdline/svntest:1213310-1293110
+/subversion/branches/1.7.x-r1213331/subversion/tests/cmdline/svntest:1213684-1213756
+/subversion/branches/1.7.x-r1232221/subversion/tests/cmdline/svntest:1232358-1238008
+/subversion/branches/1.7.x-r1236343/subversion/tests/cmdline/svntest:1236628-1239394
+/subversion/branches/1.7.x-r1242759/subversion/tests/cmdline/svntest:1372522-1393041
+/subversion/branches/1.7.x-r1306111/subversion/tests/cmdline/svntest:1306301-1331207
+/subversion/branches/1.7.x-r1341012/subversion/tests/cmdline/svntest:1341013-1355629
+/subversion/branches/1.7.x-r1348822/subversion/tests/cmdline/svntest:1348878-1355700
+/subversion/branches/1.7.x-r1352068/subversion/tests/cmdline/svntest:1352087-1364232
+/subversion/branches/1.7.x-r1361007/subversion/tests/cmdline/svntest:1361110-1367853
+/subversion/branches/1.7.x-r1361341/subversion/tests/cmdline/svntest:1361342-1367855
+/subversion/branches/1.7.x-r1365554/subversion/tests/cmdline/svntest:1365558-1367850
+/subversion/branches/1.7.x-r1375052/subversion/tests/cmdline/svntest:1376643-1380970
+/subversion/branches/1.7.x-r1383483/subversion/tests/cmdline/svntest:1383601-1383951
+/subversion/branches/1.7.x-r1388975/subversion/tests/cmdline/svntest:1392898-1393044
+/subversion/branches/1.7.x-r1389851/subversion/tests/cmdline/svntest:1389853-1392834
+/subversion/branches/1.7.x-r1389878/subversion/tests/cmdline/svntest:1389879-1393126
+/subversion/branches/1.7.x-r1389928/subversion/tests/cmdline/svntest:1390384-1391747
+/subversion/branches/1.7.x-r1398325/subversion/tests/cmdline/svntest:1398353-1398633
+/subversion/branches/1.7.x-r1399174/subversion/tests/cmdline/svntest:1399176-1403964
+/subversion/branches/1.7.x-r1401915/subversion/tests/cmdline/svntest:1401934-1407349
+/subversion/branches/1.7.x-r1407131/subversion/tests/cmdline/svntest:1407164-1419607
+/subversion/branches/1.7.x-serf-server-root-segfaults/subversion/tests/cmdline/svntest:1383952-1392726
+/subversion/branches/1.7.x-svn-patch-eol-fixes/subversion/tests/cmdline/svntest:1207511-1235924
+/subversion/branches/atomic-revprop/subversion/tests/cmdline/svntest:965046-1000689
+/subversion/branches/bdb-reverse-deltas/subversion/tests/cmdline/svntest:872050-872529
+/subversion/branches/diff-callbacks3/subversion/tests/cmdline/svntest:870059-870761
+/subversion/branches/diff-optimizations/subversion/tests/cmdline/svntest:1031270-1037352
+/subversion/branches/diff-optimizations-bytes/subversion/tests/cmdline/svntest:1037353-1067789
+/subversion/branches/dont-save-plaintext-passwords-by-default/subversion/tests/cmdline/svntest:870728-871118
+/subversion/branches/double-delete/subversion/tests/cmdline/svntest:870511-872970
+/subversion/branches/explore-wc/subversion/tests/cmdline/svntest:875486,875493,875497,875507,875511,875514,875559,875580-875581,875584,875587,875611,875627,875647,875667-875668,875711-875712,875733-875734,875736,875744-875748,875751,875758,875782,875795-875796,875830,875836,875838,875842,875852,875855,875864,875870,875873,875880,875885-875888,875890,875897-875898,875905,875907-875909,875935,875943-875944,875946,875979,875982-875983,875985-875986,875990,875997
+/subversion/branches/file-externals/subversion/tests/cmdline/svntest:871779-873302
+/subversion/branches/fs-rep-sharing/subversion/tests/cmdline/svntest:869036-873803
+/subversion/branches/fsfs-pack/subversion/tests/cmdline/svntest:873717-874575
+/subversion/branches/gnome-keyring/subversion/tests/cmdline/svntest:870558-871410
+/subversion/branches/http-protocol-v2/subversion/tests/cmdline/svntest:874395-876041
+/subversion/branches/in-memory-cache/subversion/tests/cmdline/svntest:869829-871452
+/subversion/branches/integrate-cache-item-serialization/subversion/tests/cmdline/svntest:1068724-1068739
+/subversion/branches/integrate-cache-membuffer/subversion/tests/cmdline/svntest:998649-998852
+/subversion/branches/integrate-compression-level/subversion/tests/cmdline/svntest:1068651-1072287
+/subversion/branches/integrate-io-improvements/subversion/tests/cmdline/svntest:1068684-1072297
+/subversion/branches/integrate-is-cachable/subversion/tests/cmdline/svntest:1072568-1074082
+/subversion/branches/integrate-partial-getter/subversion/tests/cmdline/svntest:1072558-1076552
+/subversion/branches/integrate-readline-speedup/subversion/tests/cmdline/svntest:1072553-1072555
+/subversion/branches/integrate-stream-api-extensions/subversion/tests/cmdline/svntest:1068695-1072516
+/subversion/branches/integrate-txdelta-caching/subversion/tests/cmdline/svntest:1072541-1078213
+/subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest:965496-984198
+/subversion/branches/issue-2843-dev/subversion/tests/cmdline/svntest:871432-874179
+/subversion/branches/issue-3000/subversion/tests/cmdline/svntest:871713,871716-871719,871721-871726,871728,871734
+/subversion/branches/issue-3067-deleted-subtrees/subversion/tests/cmdline/svntest:873375-874084
+/subversion/branches/issue-3148-dev/subversion/tests/cmdline/svntest:875193-875204
+/subversion/branches/issue-3220-dev/subversion/tests/cmdline/svntest:872210-872226
+/subversion/branches/issue-3242-dev/subversion/tests/cmdline/svntest:879653-896436
+/subversion/branches/issue-3334-dirs/subversion/tests/cmdline/svntest:875156-875867
+/subversion/branches/issue-3975/subversion/tests/cmdline/svntest:1152931-1160746
+/subversion/branches/kwallet/subversion/tests/cmdline/svntest:870785-871314
+/subversion/branches/log-g-performance/subversion/tests/cmdline/svntest:870941-871032
+/subversion/branches/merge-skips-obstructions/subversion/tests/cmdline/svntest:874525-874615
+/subversion/branches/nfc-nfd-aware-client/subversion/tests/cmdline/svntest:870276,870376
+/subversion/branches/performance/subversion/tests/cmdline/svntest:979193,980118,981087,981090,981189,981194,981287,981684,981827,982043,982355,983398,983406,983430,983474,983488,983490,983760,983764,983766,983770,984927,984973,984984,985014,985037,985046,985472,985477,985482,985487-985488,985493,985497,985500,985514,985601,985603,985606,985669,985695,986453,986465,986485,986491-986492,986517,986521,986605,986608,986817,986832,987865,987868-987869,987872,987886-987888,987893,988319,988898,990330,990533,990535-990537,990541,990568,990572,990574-990575,990600,990759,992899,992904,992911,993127,993141,994956,995478,995507,995603,998012,998858,999098,1001413,1001417,1004291,1022668,1022670,1022676,1022715,1022719,1025660,1025672,1027193,1027203,1027206,1027214,1027227,1028077,1028092,1028094,1028104,1028107,1028111,1028354,1029038,1029042-1029043,1029054-1029055,1029062-1029063,1029078,1029080,1029090,1029092-1029093,1029111,1029151,1029158,1029229-1029230,1029232,1029335-1029336
 
,1029339-1029340,1029342,1029344,1030763,1030827,1031203,1031235,1032285,1032333,1033040,1033057,1033294,1035869,1035882,1039511,1043705,1053735,1056015,1066452,1067683,1067697-1078365
+/subversion/branches/py-tests-as-modules/subversion/tests/cmdline/svntest:956579-1033052
+/subversion/branches/ra_serf-digest-authn/subversion/tests/cmdline/svntest:875693-876404
+/subversion/branches/reintegrate-improvements/subversion/tests/cmdline/svntest:873853-874164
+/subversion/branches/revprop-packing/subversion/tests/cmdline/svntest:1143907,1143971,1143997,1144017,1144499,1144568
+/subversion/branches/subtree-mergeinfo/subversion/tests/cmdline/svntest:876734-878766
+/subversion/branches/svn-mergeinfo-enhancements/subversion/tests/cmdline/svntest:870119-870195,870197-870288
+/subversion/branches/svn-patch-improvements/subversion/tests/cmdline/svntest:918519-934609
+/subversion/branches/svnpatch-diff/subversion/tests/cmdline/svntest:865738-876477
+/subversion/branches/svnraisetc/subversion/tests/cmdline/svntest:874709-875149
+/subversion/branches/svnserve-logging/subversion/tests/cmdline/svntest:869828-870893
+/subversion/branches/tc-issue-3334/subversion/tests/cmdline/svntest:874697-874773
+/subversion/branches/tc-merge-notify/subversion/tests/cmdline/svntest:874017-874062
+/subversion/branches/tc-resolve/subversion/tests/cmdline/svntest:874191-874239
+/subversion/branches/tc_url_rev/subversion/tests/cmdline/svntest:874351-874483
+/subversion/branches/tree-conflicts/subversion/tests/cmdline/svntest:868291-873154
+/subversion/branches/tree-conflicts-notify/subversion/tests/cmdline/svntest:873926-874008
+/subversion/branches/uris-as-urls/subversion/tests/cmdline/svntest:1060426-1064427
+/subversion/trunk/subversion/tests/cmdline/svntest:1146013,1146121,1146219,1146222,1146274,1146492,1146555,1146606,1146620,1146684,1146762,1146781,1146832,1146834,1146870,1146899,1146904,1147293,1147299,1147309,1147882,1148071,1148083,1148094,1148131,1148374,1148424,1148566,1148588,1148652,1148662,1148699,1148853,1148877,1148882,1148936,1149103,1149105,1149135,1149141,1149160,1149228,1149240,1149343,1149371-1149372,1149377,1149398,1149401,1149539,1149572,1149627,1149675,1149701,1149713,1150242,1150254,1150260-1150261,1150266,1150302,1150327,1150344,1150368,1150372,1150441,1150506,1150812,1150853,1151036,1151177,1151610,1151854,1151906,1151911,1152129,1152140,1152189-1152190,1152267,1152282,1152286,1152726,1152809,1153138,1153141,1153416,1153540,1153566,1153799,1153807,1153968,1154009,1154023,1154115,1154119,1154121,1154144,1154155,1154159,1154165,1154215,1154225,1154273,1154278,1154379,1154382,1154461,1154717-1154718,1154733,1154908,1154982,1155015,1155044,1155124,1155131,11
 
55160,1155313,1155334,1155391,1155404,1156085,1156098,1156216,1156218,1156312,1156527,1156717,1156721,1156750,1156827,1156838,1157416,1158187,1158193-1158194,1158196,1158201,1158207,1158209-1158210,1158217,1158285,1158288,1158303,1158309,1158407,1158419,1158421,1158436,1158455,1158616-1158617,1158634,1158854,1158875,1158886,1158893,1158896,1158919,1158923-1158924,1158929,1158963,1159093,1159098,1159101,1159132,1159136,1159148,1159230,1159275,1159400,1159686,1159760,1159772,1160605,1160671,1160682,1160704-1160705,1160756,1161063,1161080,1161185,1161210,1161683,1161721,1162024,1162033,1162201,1162516,1162880,1162974,1162995,1163243,1163372,1163383,1163557,1163792,1163953,1164027,1164386,1164426,1164517,1164535,1164554,1164580,1164614,1164645,1164760,1164765,1164929,1166267,1166500,1166555,1166678,1167062,1167173,1167209,1167269,1167503,1167659,1167681,1169524,1169531,1169650,1171708,1173111,1173425,1173639,1174051,1174060,1174342,1174652,1174761,1174797-1174798,1174806,1175888
 
,1176915,1176949,1177001,1177492,1177732,1178280,1178282,1178942,1179680,1179767,1179776,1180154,1181090,1181110,1181155,1181215,1181609,1181666,1182115,1182527,1182771,1182904,1182909,1183054,1183263,1183347,1185222,1185242,1185280,1185282,1185730,1185738,1185746,1185763,1185768,1185886,1185911,1185918,1186059,1186092,1186101,1186107,1186109,1186121,1186231,1186240,1186422,1186434,1186732,1186755,1186784,1186815,1186928,1186944,1186981,1186983,1187311,1187676,1187695,1188609,1188652,1188677,1188762,1188774,1189190,1189261,1189395,1189580,1189665,1190463,1195480,1197135,1197998,1199876,1199950,1200277,1200837,1200896,1201002,1201072,1201419,1201824,1202132,1202135,1202187,1202333,1202630,1202807,1203546,1203651,1203653,1203977,1204167,1204478,1204610,1204673,1205188,1205193,1205209,1205726,1205839,1205848,1205968,1206523,1206533,1206576,1206718-1206719,1206724,1206741,1206748,1207555,1207656,1207663,1207808,1207823,1207858,1207949,1208840,1209631,1209654,1210147,1210195,1210
 
913,1211048,1211483,1211859,1211885,1212476,1212482,1212484,1213331,1213673,1213681,1213690,1213711,1213716,1214139,1215260,1215288,1215374-1215375,1215379,1220740,1220742,1220750,1220861,1221178,1221303,1221767,1221780,1221793,1222521,1222628,1222644,1222693,1222699,1225491,1226597,1227146,1227237,1227250,1227352,1227372,1227384-1227385,1227900,1228340,1229252,1229303,1229677,1229833,1229980,1230212,1230714,1231029,1231944-1231945,1232202,1232207,1232221-1232222,1232267,1232413,1233292,1235264,1235296,1235302,1235736,1236163,1236173,1236283,1236343,1237720,1237779,1238121,1239382,1239596,1239631,1239655,1239747,1240314,1240485,1240619,1240752,1241530,1241553,1241599,1241626,1241713,1241726,1242116,1242537,1242607,1242759,1242770,1242794,1243694,1243840,1243920,1243976,1244303,1244317,1244466,1244551,1245284-1245285,1245711,1245738,1245746,1245764,1245809,1245817,1245929,1245935,1291429,1291446,1291520,1291594,1291680,1291685,1291700,1291704,1291726,1291729,1291797,1291810,1
 
291941,1292090,1292248,1292255,1292260,1292296,1292322,1292507,1292516,1292768,1292827,1292926,1293229,1293577,1293945,1293972,1293976,1293998,1294134,1294136,1294147,1294236,1294470,1294586,1295007,1295303,1295372,1295418,1296251,1296303,1296369,1296691,1297522,1298343,1300265,1302399,1302417,1302539,1302588,1302591,1302613,1305853,1306111,1306334,1307177,1309992,1310378,1310428,1310535,1310594,1311702,1311935,1325361,1327474,1327490,1327495,1327979,1328002,1328038,1328144,1328267-1328268,1328353,1328846-1328847,1328852,1328878,1329388,1329417,1329876,1330258,1330382,1330444,1330520,1335104,1335555,1337441,1338810,1339164,1340556,1341012,1341031,1341034,1341076,1342984,1344864-1344865,1344869,1345482,1345740,1346765,1348822,1349215,1349367,1349371,1349380,1349778,1351117,1351772,1352068,1353572,1354626,1354652,1354876,1354907,1355340,1361007,1361019,1361341,1362508,1365519,1365549,1365554,1365556,1365592,1367498,1368065,1368128,1368197-1368198,1371282,1374198,1374800,137480
 
2,1375052,1375089,1376414,1378847,1380175,1380295,1380697,1382843,1383029,1383466,1383483,1383946,1387226,1387943,1388975,1389364,1389499,1389658,1389851,1389878,1389928,1390653,1390965,1391020,1391022,1391641,1391935,1392502,1392599,1393061,1393156,1393165,1393542,1393551,1393598,1394519,1396285,1398100,1399174,1401915,1402417,1402421,1403258,1403583,1403588,1403691,1403964,1403982,1407035,1407075,1407131,1407812,1408650,1409146,1410106,1410203

Modified: subversion/branches/1.7.x/subversion/tests/cmdline/svntest/sandbox.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/tests/cmdline/svntest/sandbox.py?rev=1419609&r1=1419608&r2=1419609&view=diff
==============================================================================
--- subversion/branches/1.7.x/subversion/tests/cmdline/svntest/sandbox.py 
(original)
+++ subversion/branches/1.7.x/subversion/tests/cmdline/svntest/sandbox.py Mon 
Dec 10 17:56:17 2012
@@ -262,6 +262,17 @@ class Sandbox:
     targets = self.ospaths(targets)
     svntest.main.run_svn(False, 'propdel', name, *targets)
 
+  def simple_add_symlink(self, dest, target):
+    """Create a symlink TARGET pointing to DEST and add it to subversion"""
+    if svntest.main.is_posix_os():
+      os.symlink(dest, self.ospath(target))
+    else:
+      svntest.main.file_write(self.ospath(target), "link %s" % dest)
+    self.simple_add(target)
+    if not svntest.main.is_posix_os():
+      # '*' is evaluated on Windows
+      self.simple_propset('svn:special', 'X', target)
+
   def simple_copy(self, source, dest):
     """SOURCE and DEST are relpaths relative to the WC."""
     source = self.ospath(source)
@@ -280,6 +291,10 @@ class Sandbox:
                          self.repo_url + '/' + source,
                          self.repo_url + '/' + dest)
 
+  def simple_append(self, dest, contents, truncate=False):
+    """Append CONTENTS to file DEST, optionally truncating it first."""
+    open(self.ospath(dest), truncate and 'w' or 'a').write(contents)
+
 
 def is_url(target):
   return (target.startswith('^/')


Reply via email to