Deleted Added
full compact
revert.c (302408) revert.c (362181)
1/*
2 * revert.c: Handling of the in-wc side of the revert operation
3 *
4 * ====================================================================
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file

--- 48 unchanged lines hidden (view full) ---

57
58 - For files, svn_wc_remove_from_revision_control(), baby.
59
60 - Added directories may contain nothing but added children, and
61 reverting the addition of a directory necessarily means reverting
62 the addition of all the directory's children. Again,
63 svn_wc_remove_from_revision_control() should do the trick.
64
1/*
2 * revert.c: Handling of the in-wc side of the revert operation
3 *
4 * ====================================================================
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file

--- 48 unchanged lines hidden (view full) ---

57
58 - For files, svn_wc_remove_from_revision_control(), baby.
59
60 - Added directories may contain nothing but added children, and
61 reverting the addition of a directory necessarily means reverting
62 the addition of all the directory's children. Again,
63 svn_wc_remove_from_revision_control() should do the trick.
64
65 - For a copy, we remove the item from disk as well. The thinking here
66 is that Subversion is responsible for the existence of the item: it
67 must have been created by something like 'svn copy' or 'svn merge'.
68
69 - For a plain add, removing the file or directory from disk is optional.
70 The user's idea of Subversion's involvement could be either that
71 Subversion was just responsible for adding an existing item to version
72 control, as with 'svn add', and so should not be responsible for
73 deleting it from disk; or that Subversion is responsible for the
74 existence of the item, e.g. if created by 'svn patch' or svn mkdir'.
75 It depends on the use case.
76
65 Deletes
66
67 - Restore properties to their unmodified state.
68
69 - For files, restore the pristine contents, and reset the schedule
70 to 'normal'.
71
72 - For directories, reset the schedule to 'normal'. All children

--- 207 unchanged lines hidden (view full) ---

280static svn_error_t *
281revert_restore(svn_boolean_t *run_wq,
282 svn_wc__db_t *db,
283 const char *local_abspath,
284 svn_depth_t depth,
285 svn_boolean_t metadata_only,
286 svn_boolean_t use_commit_times,
287 svn_boolean_t revert_root,
77 Deletes
78
79 - Restore properties to their unmodified state.
80
81 - For files, restore the pristine contents, and reset the schedule
82 to 'normal'.
83
84 - For directories, reset the schedule to 'normal'. All children

--- 207 unchanged lines hidden (view full) ---

292static svn_error_t *
293revert_restore(svn_boolean_t *run_wq,
294 svn_wc__db_t *db,
295 const char *local_abspath,
296 svn_depth_t depth,
297 svn_boolean_t metadata_only,
298 svn_boolean_t use_commit_times,
299 svn_boolean_t revert_root,
300 svn_boolean_t added_keep_local,
288 const struct svn_wc__db_info_t *info,
289 svn_cancel_func_t cancel_func,
290 void *cancel_baton,
291 svn_wc_notify_func2_t notify_func,
292 void *notify_baton,
293 apr_pool_t *scratch_pool)
294{
295 svn_wc__db_status_t status;

--- 43 unchanged lines hidden (view full) ---

339 {
340 status = info->status;
341 kind = info->kind;
342 recorded_size = info->recorded_size;
343 recorded_time = info->recorded_time;
344 }
345 else
346 {
301 const struct svn_wc__db_info_t *info,
302 svn_cancel_func_t cancel_func,
303 void *cancel_baton,
304 svn_wc_notify_func2_t notify_func,
305 void *notify_baton,
306 apr_pool_t *scratch_pool)
307{
308 svn_wc__db_status_t status;

--- 43 unchanged lines hidden (view full) ---

352 {
353 status = info->status;
354 kind = info->kind;
355 recorded_size = info->recorded_size;
356 recorded_time = info->recorded_time;
357 }
358 else
359 {
347 if (!copied_here)
360 if (added_keep_local && !copied_here)
348 {
361 {
362 /* It is a plain add, and we want to keep the local file/dir. */
349 if (notify_func && notify_required)
350 notify_func(notify_baton,
351 svn_wc_create_notify(local_abspath,
352 svn_wc_notify_revert,
353 scratch_pool),
354 scratch_pool);
355
356 if (notify_func)
357 SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
358 db, local_abspath,
359 scratch_pool));
360 return SVN_NO_ERROR;
361 }
363 if (notify_func && notify_required)
364 notify_func(notify_baton,
365 svn_wc_create_notify(local_abspath,
366 svn_wc_notify_revert,
367 scratch_pool),
368 scratch_pool);
369
370 if (notify_func)
371 SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
372 db, local_abspath,
373 scratch_pool));
374 return SVN_NO_ERROR;
375 }
376 else if (!copied_here)
377 {
378 /* It is a plain add, and we don't want to keep the local file/dir. */
379 status = svn_wc__db_status_not_present;
380 kind = svn_node_none;
381 recorded_size = SVN_INVALID_FILESIZE;
382 recorded_time = 0;
383 }
362 else
363 {
384 else
385 {
386 /* It is a copy, so we don't want to keep the local file/dir. */
364 /* ### Initialise to values which prevent the code below from
365 * ### trying to restore anything to disk.
366 * ### 'status' should be status_unknown but that doesn't exist. */
367 status = svn_wc__db_status_normal;
368 kind = svn_node_unknown;
369 recorded_size = SVN_INVALID_FILESIZE;
370 recorded_time = 0;
371 }

--- 52 unchanged lines hidden (view full) ---

424
425 svn_pool_clear(iterpool);
426
427 child_abspath = svn_dirent_join(local_abspath, child_name, iterpool);
428
429 SVN_ERR(revert_restore(run_wq,
430 db, child_abspath, depth, metadata_only,
431 use_commit_times, FALSE /* revert root */,
387 /* ### Initialise to values which prevent the code below from
388 * ### trying to restore anything to disk.
389 * ### 'status' should be status_unknown but that doesn't exist. */
390 status = svn_wc__db_status_normal;
391 kind = svn_node_unknown;
392 recorded_size = SVN_INVALID_FILESIZE;
393 recorded_time = 0;
394 }

--- 52 unchanged lines hidden (view full) ---

447
448 svn_pool_clear(iterpool);
449
450 child_abspath = svn_dirent_join(local_abspath, child_name, iterpool);
451
452 SVN_ERR(revert_restore(run_wq,
453 db, child_abspath, depth, metadata_only,
454 use_commit_times, FALSE /* revert root */,
455 added_keep_local,
432 apr_hash_this_val(hi),
433 cancel_func, cancel_baton,
434 notify_func, notify_baton,
435 iterpool));
436 }
437
438 /* Run the queue per directory */
439 if (*run_wq)

--- 91 unchanged lines hidden (view full) ---

531 if (removed)
532 on_disk = svn_node_none;
533 }
534 }
535
536 /* If we expect a versioned item to be present then check that any
537 item on disk matches the versioned item, if it doesn't match then
538 fix it or delete it. */
456 apr_hash_this_val(hi),
457 cancel_func, cancel_baton,
458 notify_func, notify_baton,
459 iterpool));
460 }
461
462 /* Run the queue per directory */
463 if (*run_wq)

--- 91 unchanged lines hidden (view full) ---

555 if (removed)
556 on_disk = svn_node_none;
557 }
558 }
559
560 /* If we expect a versioned item to be present then check that any
561 item on disk matches the versioned item, if it doesn't match then
562 fix it or delete it. */
539 if (on_disk != svn_node_none
540 && status != svn_wc__db_status_server_excluded
541 && status != svn_wc__db_status_deleted
542 && status != svn_wc__db_status_excluded
543 && status != svn_wc__db_status_not_present)
563 if (on_disk != svn_node_none)
544 {
545 if (on_disk == svn_node_dir && kind != svn_node_dir)
546 {
547 SVN_ERR(svn_io_remove_dir2(local_abspath, FALSE,
548 cancel_func, cancel_baton, scratch_pool));
549 on_disk = svn_node_none;
550 }
551 else if (on_disk == svn_node_file && kind != svn_node_file)
552 {
553#ifdef HAVE_SYMLINK
554 /* Preserve symlinks pointing at directories. Changes on the
555 * directory node have been reverted. The symlink should remain. */
556 if (!(special && kind == svn_node_dir))
557#endif
558 {
559 SVN_ERR(svn_io_remove_file2(local_abspath, FALSE, scratch_pool));
560 on_disk = svn_node_none;
561 }
562 }
564 {
565 if (on_disk == svn_node_dir && kind != svn_node_dir)
566 {
567 SVN_ERR(svn_io_remove_dir2(local_abspath, FALSE,
568 cancel_func, cancel_baton, scratch_pool));
569 on_disk = svn_node_none;
570 }
571 else if (on_disk == svn_node_file && kind != svn_node_file)
572 {
573#ifdef HAVE_SYMLINK
574 /* Preserve symlinks pointing at directories. Changes on the
575 * directory node have been reverted. The symlink should remain. */
576 if (!(special && kind == svn_node_dir))
577#endif
578 {
579 SVN_ERR(svn_io_remove_file2(local_abspath, FALSE, scratch_pool));
580 on_disk = svn_node_none;
581 }
582 }
563 else if (on_disk == svn_node_file)
583 else if (on_disk == svn_node_file
584 && status != svn_wc__db_status_server_excluded
585 && status != svn_wc__db_status_deleted
586 && status != svn_wc__db_status_excluded
587 && status != svn_wc__db_status_not_present)
564 {
565 svn_boolean_t modified;
566 apr_hash_t *props;
567#ifdef HAVE_SYMLINK
568 svn_string_t *special_prop;
569#endif
570
571 SVN_ERR(svn_wc__db_read_pristine_props(&props, db, local_abspath,

--- 135 unchanged lines hidden (view full) ---

707/* Revert tree LOCAL_ABSPATH to depth DEPTH and notify for all reverts. */
708static svn_error_t *
709revert(svn_wc__db_t *db,
710 const char *local_abspath,
711 svn_depth_t depth,
712 svn_boolean_t use_commit_times,
713 svn_boolean_t clear_changelists,
714 svn_boolean_t metadata_only,
588 {
589 svn_boolean_t modified;
590 apr_hash_t *props;
591#ifdef HAVE_SYMLINK
592 svn_string_t *special_prop;
593#endif
594
595 SVN_ERR(svn_wc__db_read_pristine_props(&props, db, local_abspath,

--- 135 unchanged lines hidden (view full) ---

731/* Revert tree LOCAL_ABSPATH to depth DEPTH and notify for all reverts. */
732static svn_error_t *
733revert(svn_wc__db_t *db,
734 const char *local_abspath,
735 svn_depth_t depth,
736 svn_boolean_t use_commit_times,
737 svn_boolean_t clear_changelists,
738 svn_boolean_t metadata_only,
739 svn_boolean_t added_keep_local,
715 svn_cancel_func_t cancel_func,
716 void *cancel_baton,
717 svn_wc_notify_func2_t notify_func,
718 void *notify_baton,
719 apr_pool_t *scratch_pool)
720{
721 svn_error_t *err;
722 const struct svn_wc__db_info_t *info = NULL;

--- 34 unchanged lines hidden (view full) ---

757 info = NULL;
758 }
759 }
760
761 if (!err)
762 err = svn_error_trace(
763 revert_restore(&run_queue, db, local_abspath, depth, metadata_only,
764 use_commit_times, TRUE /* revert root */,
740 svn_cancel_func_t cancel_func,
741 void *cancel_baton,
742 svn_wc_notify_func2_t notify_func,
743 void *notify_baton,
744 apr_pool_t *scratch_pool)
745{
746 svn_error_t *err;
747 const struct svn_wc__db_info_t *info = NULL;

--- 34 unchanged lines hidden (view full) ---

782 info = NULL;
783 }
784 }
785
786 if (!err)
787 err = svn_error_trace(
788 revert_restore(&run_queue, db, local_abspath, depth, metadata_only,
789 use_commit_times, TRUE /* revert root */,
790 added_keep_local,
765 info, cancel_func, cancel_baton,
766 notify_func, notify_baton,
767 scratch_pool));
768
769 if (run_queue)
770 err = svn_error_compose_create(err,
771 svn_wc__wq_run(db, local_abspath,
772 cancel_func, cancel_baton,

--- 13 unchanged lines hidden (view full) ---

786static svn_error_t *
787revert_changelist(svn_wc__db_t *db,
788 const char *local_abspath,
789 svn_depth_t depth,
790 svn_boolean_t use_commit_times,
791 apr_hash_t *changelist_hash,
792 svn_boolean_t clear_changelists,
793 svn_boolean_t metadata_only,
791 info, cancel_func, cancel_baton,
792 notify_func, notify_baton,
793 scratch_pool));
794
795 if (run_queue)
796 err = svn_error_compose_create(err,
797 svn_wc__wq_run(db, local_abspath,
798 cancel_func, cancel_baton,

--- 13 unchanged lines hidden (view full) ---

812static svn_error_t *
813revert_changelist(svn_wc__db_t *db,
814 const char *local_abspath,
815 svn_depth_t depth,
816 svn_boolean_t use_commit_times,
817 apr_hash_t *changelist_hash,
818 svn_boolean_t clear_changelists,
819 svn_boolean_t metadata_only,
820 svn_boolean_t added_keep_local,
794 svn_cancel_func_t cancel_func,
795 void *cancel_baton,
796 svn_wc_notify_func2_t notify_func,
797 void *notify_baton,
798 apr_pool_t *scratch_pool)
799{
800 apr_pool_t *iterpool;
801 const apr_array_header_t *children;
802 int i;
803
804 if (cancel_func)
805 SVN_ERR(cancel_func(cancel_baton));
806
807 /* Revert this node (depth=empty) if it matches one of the changelists. */
808 if (svn_wc__internal_changelist_match(db, local_abspath, changelist_hash,
809 scratch_pool))
810 SVN_ERR(revert(db, local_abspath,
811 svn_depth_empty, use_commit_times, clear_changelists,
821 svn_cancel_func_t cancel_func,
822 void *cancel_baton,
823 svn_wc_notify_func2_t notify_func,
824 void *notify_baton,
825 apr_pool_t *scratch_pool)
826{
827 apr_pool_t *iterpool;
828 const apr_array_header_t *children;
829 int i;
830
831 if (cancel_func)
832 SVN_ERR(cancel_func(cancel_baton));
833
834 /* Revert this node (depth=empty) if it matches one of the changelists. */
835 if (svn_wc__internal_changelist_match(db, local_abspath, changelist_hash,
836 scratch_pool))
837 SVN_ERR(revert(db, local_abspath,
838 svn_depth_empty, use_commit_times, clear_changelists,
812 metadata_only,
839 metadata_only, added_keep_local,
813 cancel_func, cancel_baton,
814 notify_func, notify_baton,
815 scratch_pool));
816
817 if (depth == svn_depth_empty)
818 return SVN_NO_ERROR;
819
820 iterpool = svn_pool_create(scratch_pool);

--- 19 unchanged lines hidden (view full) ---

840 child_abspath = svn_dirent_join(local_abspath,
841 APR_ARRAY_IDX(children, i,
842 const char *),
843 iterpool);
844
845 SVN_ERR(revert_changelist(db, child_abspath, depth,
846 use_commit_times, changelist_hash,
847 clear_changelists, metadata_only,
840 cancel_func, cancel_baton,
841 notify_func, notify_baton,
842 scratch_pool));
843
844 if (depth == svn_depth_empty)
845 return SVN_NO_ERROR;
846
847 iterpool = svn_pool_create(scratch_pool);

--- 19 unchanged lines hidden (view full) ---

867 child_abspath = svn_dirent_join(local_abspath,
868 APR_ARRAY_IDX(children, i,
869 const char *),
870 iterpool);
871
872 SVN_ERR(revert_changelist(db, child_abspath, depth,
873 use_commit_times, changelist_hash,
874 clear_changelists, metadata_only,
875 added_keep_local,
848 cancel_func, cancel_baton,
849 notify_func, notify_baton,
850 iterpool));
851 }
852
853 svn_pool_destroy(iterpool);
854
855 return SVN_NO_ERROR;

--- 10 unchanged lines hidden (view full) ---

866 ### partially recursive revert should handle actual-only nodes. */
867static svn_error_t *
868revert_partial(svn_wc__db_t *db,
869 const char *local_abspath,
870 svn_depth_t depth,
871 svn_boolean_t use_commit_times,
872 svn_boolean_t clear_changelists,
873 svn_boolean_t metadata_only,
876 cancel_func, cancel_baton,
877 notify_func, notify_baton,
878 iterpool));
879 }
880
881 svn_pool_destroy(iterpool);
882
883 return SVN_NO_ERROR;

--- 10 unchanged lines hidden (view full) ---

894 ### partially recursive revert should handle actual-only nodes. */
895static svn_error_t *
896revert_partial(svn_wc__db_t *db,
897 const char *local_abspath,
898 svn_depth_t depth,
899 svn_boolean_t use_commit_times,
900 svn_boolean_t clear_changelists,
901 svn_boolean_t metadata_only,
902 svn_boolean_t added_keep_local,
874 svn_cancel_func_t cancel_func,
875 void *cancel_baton,
876 svn_wc_notify_func2_t notify_func,
877 void *notify_baton,
878 apr_pool_t *scratch_pool)
879{
880 apr_pool_t *iterpool;
881 const apr_array_header_t *children;

--- 5 unchanged lines hidden (view full) ---

887 SVN_ERR(cancel_func(cancel_baton));
888
889 iterpool = svn_pool_create(scratch_pool);
890
891 /* Revert the root node itself (depth=empty), then move on to the
892 children. */
893 SVN_ERR(revert(db, local_abspath, svn_depth_empty,
894 use_commit_times, clear_changelists, metadata_only,
903 svn_cancel_func_t cancel_func,
904 void *cancel_baton,
905 svn_wc_notify_func2_t notify_func,
906 void *notify_baton,
907 apr_pool_t *scratch_pool)
908{
909 apr_pool_t *iterpool;
910 const apr_array_header_t *children;

--- 5 unchanged lines hidden (view full) ---

916 SVN_ERR(cancel_func(cancel_baton));
917
918 iterpool = svn_pool_create(scratch_pool);
919
920 /* Revert the root node itself (depth=empty), then move on to the
921 children. */
922 SVN_ERR(revert(db, local_abspath, svn_depth_empty,
923 use_commit_times, clear_changelists, metadata_only,
924 added_keep_local,
895 cancel_func, cancel_baton,
896 notify_func, notify_baton, iterpool));
897
898 SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
899 local_abspath,
900 scratch_pool,
901 iterpool));
902 for (i = 0; i < children->nelts; ++i)

--- 18 unchanged lines hidden (view full) ---

921 iterpool));
922 if (kind != svn_node_file)
923 continue;
924 }
925
926 /* Revert just this node (depth=empty). */
927 SVN_ERR(revert(db, child_abspath,
928 svn_depth_empty, use_commit_times, clear_changelists,
925 cancel_func, cancel_baton,
926 notify_func, notify_baton, iterpool));
927
928 SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
929 local_abspath,
930 scratch_pool,
931 iterpool));
932 for (i = 0; i < children->nelts; ++i)

--- 18 unchanged lines hidden (view full) ---

951 iterpool));
952 if (kind != svn_node_file)
953 continue;
954 }
955
956 /* Revert just this node (depth=empty). */
957 SVN_ERR(revert(db, child_abspath,
958 svn_depth_empty, use_commit_times, clear_changelists,
929 metadata_only,
959 metadata_only, added_keep_local,
930 cancel_func, cancel_baton,
931 notify_func, notify_baton,
932 iterpool));
933 }
934
935 svn_pool_destroy(iterpool);
936
937 return SVN_NO_ERROR;
938}
939
940
941svn_error_t *
960 cancel_func, cancel_baton,
961 notify_func, notify_baton,
962 iterpool));
963 }
964
965 svn_pool_destroy(iterpool);
966
967 return SVN_NO_ERROR;
968}
969
970
971svn_error_t *
942svn_wc_revert5(svn_wc_context_t *wc_ctx,
972svn_wc_revert6(svn_wc_context_t *wc_ctx,
943 const char *local_abspath,
944 svn_depth_t depth,
945 svn_boolean_t use_commit_times,
946 const apr_array_header_t *changelist_filter,
947 svn_boolean_t clear_changelists,
948 svn_boolean_t metadata_only,
973 const char *local_abspath,
974 svn_depth_t depth,
975 svn_boolean_t use_commit_times,
976 const apr_array_header_t *changelist_filter,
977 svn_boolean_t clear_changelists,
978 svn_boolean_t metadata_only,
979 svn_boolean_t added_keep_local,
949 svn_cancel_func_t cancel_func,
950 void *cancel_baton,
951 svn_wc_notify_func2_t notify_func,
952 void *notify_baton,
953 apr_pool_t *scratch_pool)
954{
955 if (changelist_filter && changelist_filter->nelts)
956 {
957 apr_hash_t *changelist_hash;
958
959 SVN_ERR(svn_hash_from_cstring_keys(&changelist_hash, changelist_filter,
960 scratch_pool));
961 return svn_error_trace(revert_changelist(wc_ctx->db, local_abspath,
962 depth, use_commit_times,
963 changelist_hash,
964 clear_changelists,
965 metadata_only,
980 svn_cancel_func_t cancel_func,
981 void *cancel_baton,
982 svn_wc_notify_func2_t notify_func,
983 void *notify_baton,
984 apr_pool_t *scratch_pool)
985{
986 if (changelist_filter && changelist_filter->nelts)
987 {
988 apr_hash_t *changelist_hash;
989
990 SVN_ERR(svn_hash_from_cstring_keys(&changelist_hash, changelist_filter,
991 scratch_pool));
992 return svn_error_trace(revert_changelist(wc_ctx->db, local_abspath,
993 depth, use_commit_times,
994 changelist_hash,
995 clear_changelists,
996 metadata_only,
997 added_keep_local,
966 cancel_func, cancel_baton,
967 notify_func, notify_baton,
968 scratch_pool));
969 }
970
971 if (depth == svn_depth_empty || depth == svn_depth_infinity)
972 return svn_error_trace(revert(wc_ctx->db, local_abspath,
973 depth, use_commit_times, clear_changelists,
974 metadata_only,
998 cancel_func, cancel_baton,
999 notify_func, notify_baton,
1000 scratch_pool));
1001 }
1002
1003 if (depth == svn_depth_empty || depth == svn_depth_infinity)
1004 return svn_error_trace(revert(wc_ctx->db, local_abspath,
1005 depth, use_commit_times, clear_changelists,
1006 metadata_only,
1007 added_keep_local,
975 cancel_func, cancel_baton,
976 notify_func, notify_baton,
977 scratch_pool));
978
979 /* The user may expect svn_depth_files/svn_depth_immediates to work
980 on copied dirs with one level of children. It doesn't, the user
981 will get an error and will need to invoke an infinite revert. If
982 we identified those cases where svn_depth_infinity would not
983 revert too much we could invoke the recursive call above. */
984
985 if (depth == svn_depth_files || depth == svn_depth_immediates)
986 return svn_error_trace(revert_partial(wc_ctx->db, local_abspath,
987 depth, use_commit_times,
988 clear_changelists, metadata_only,
1008 cancel_func, cancel_baton,
1009 notify_func, notify_baton,
1010 scratch_pool));
1011
1012 /* The user may expect svn_depth_files/svn_depth_immediates to work
1013 on copied dirs with one level of children. It doesn't, the user
1014 will get an error and will need to invoke an infinite revert. If
1015 we identified those cases where svn_depth_infinity would not
1016 revert too much we could invoke the recursive call above. */
1017
1018 if (depth == svn_depth_files || depth == svn_depth_immediates)
1019 return svn_error_trace(revert_partial(wc_ctx->db, local_abspath,
1020 depth, use_commit_times,
1021 clear_changelists, metadata_only,
1022 added_keep_local,
989 cancel_func, cancel_baton,
990 notify_func, notify_baton,
991 scratch_pool));
992
993 /* Bogus depth. Tell the caller. */
994 return svn_error_create(SVN_ERR_WC_INVALID_OPERATION_DEPTH, NULL, NULL);
995}
1023 cancel_func, cancel_baton,
1024 notify_func, notify_baton,
1025 scratch_pool));
1026
1027 /* Bogus depth. Tell the caller. */
1028 return svn_error_create(SVN_ERR_WC_INVALID_OPERATION_DEPTH, NULL, NULL);
1029}