Author: svn-role Date: Thu Mar 1 04:00:59 2012 New Revision: 1295403 URL: http://svn.apache.org/viewvc?rev=1295403&view=rev Log: Reintegrate the 1.7.x-issue4102 branch:
* r1233292, r1245711, r1245746, r1245764, r1245809, r1245929, r1245935, r1293577 Fix various problems with symlinks pointing at externals (issue #4102). Justification: Regression from 1.6.x. Users complained: http://svn.haxx.se/users/archive-2012-02/0266.shtml Branch: ^/subversion/branches/1.7.x-issue4102 Votes: +1: stsp, rhuijben, neels Modified: subversion/branches/1.7.x/ (props changed) subversion/branches/1.7.x/STATUS subversion/branches/1.7.x/subversion/libsvn_wc/adm_ops.c subversion/branches/1.7.x/subversion/libsvn_wc/status.c subversion/branches/1.7.x/subversion/libsvn_wc/wc_db.c subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_private.h subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_wcroot.c subversion/branches/1.7.x/subversion/tests/cmdline/special_tests.py Propchange: subversion/branches/1.7.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Mar 1 04:00:59 2012 @@ -9,6 +9,7 @@ /subversion/branches/1.7.x-issue4035-r1185738:1186316-1186778 /subversion/branches/1.7.x-issue4059:1239745-1242661 /subversion/branches/1.7.x-issue4093:1229839-1230236 +/subversion/branches/1.7.x-issue4102:1292401-1295402 /subversion/branches/1.7.x-issue4123:1293358-1293812 /subversion/branches/1.7.x-issue4k:1166502-1167193 /subversion/branches/1.7.x-neon-default:1148803-1158680 @@ -78,4 +79,4 @@ /subversion/branches/tree-conflicts:868291-873154 /subversion/branches/tree-conflicts-notify:873926-874008 /subversion/branches/uris-as-urls:1060426-1064427 -/subversion/trunk: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,1155160,1155313,1155334,1155391,115 5404,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,1166267,1166500,1166555,1166678,1167062,1167173,1167209,1167269,1167503,1167659,1167681,1169524,1169531,1169650,1171708,1173111,1173425,1173639,1174051,1174060,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,1195480,1197135,1197998,1199876,1199950,1200837,1201002,1201072,1201419,1201824,1202132,1202135,1202187,1202333,1202630,1202807,1203546,1203651,1203653,1204167,1204478,1204610,1204673,1205188,1205193,1205209,1205726,1205839,1205848,1206523,1206533,1206576,1206718-1206719,1206724,1206741,1206748,1207555,1207656,1207663,1207808,1207823,1207858,1207949,1208840,1209631,1209654,1210147,1210195,1211483,1211859,1211885,1212476,1212482,1212484,1213331,1213673,1213681,1213690,1213711,12137 16,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,1232413,1235264,1235296,1235302,1235736,1236163,1236173,1236283,1236343,1237720,1238121,1239382,1239596,1239631,1239655,1239747,1240314,1240485,1240619,1240752,1241530,1241553,1241599,1241626,1241713,1241726,1242116,1242537,1242607,1243976,1244303,1244317,1245284-1245285,1245738,1245817,1291429,1291446,1291520,1291680,1291685,1291700,1291704,1291726,1291729,1291941,1292090,1292255,1292507,1292516,1292768,1292827,1292926,1293229,1294470,1295303 +/subversion/trunk: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,1155160,1155313,1155334,1155391,115 5404,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,1166267,1166500,1166555,1166678,1167062,1167173,1167209,1167269,1167503,1167659,1167681,1169524,1169531,1169650,1171708,1173111,1173425,1173639,1174051,1174060,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,1195480,1197135,1197998,1199876,1199950,1200837,1201002,1201072,1201419,1201824,1202132,1202135,1202187,1202333,1202630,1202807,1203546,1203651,1203653,1204167,1204478,1204610,1204673,1205188,1205193,1205209,1205726,1205839,1205848,1206523,1206533,1206576,1206718-1206719,1206724,1206741,1206748,1207555,1207656,1207663,1207808,1207823,1207858,1207949,1208840,1209631,1209654,1210147,1210195,1211483,1211859,1211885,1212476,1212482,1212484,1213331,1213673,1213681,1213690,1213711,12137 16,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,1232413,1233292,1235264,1235296,1235302,1235736,1236163,1236173,1236283,1236343,1237720,1238121,1239382,1239596,1239631,1239655,1239747,1240314,1240485,1240619,1240752,1241530,1241553,1241599,1241626,1241713,1241726,1242116,1242537,1242607,1243976,1244303,1244317,1245284-1245285,1245711,1245738,1245746,1245764,1245809,1245817,1245929,1245935,1291429,1291446,1291520,1291680,1291685,1291700,1291704,1291726,1291729,1291941,1292090,1292255,1292507,1292516,1292768,1292827,1292926,1293229,1293577,1294470,1295303 Modified: subversion/branches/1.7.x/STATUS URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/STATUS?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/STATUS (original) +++ subversion/branches/1.7.x/STATUS Thu Mar 1 04:00:59 2012 @@ -87,13 +87,3 @@ Veto-blocked changes: Approved changes: ================= - - * r1233292, r1245711, r1245746, r1245764, r1245809, r1245929, r1245935, r1293577 - Fix various problems with symlinks pointing at externals (issue #4102). - Justification: - Regression from 1.6.x. Users complained: - http://svn.haxx.se/users/archive-2012-02/0266.shtml - Branch: - ^/subversion/branches/1.7.x-issue4102 - Votes: - +1: stsp, rhuijben, neels Modified: subversion/branches/1.7.x/subversion/libsvn_wc/adm_ops.c URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/adm_ops.c?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/subversion/libsvn_wc/adm_ops.c (original) +++ subversion/branches/1.7.x/subversion/libsvn_wc/adm_ops.c Thu Mar 1 04:00:59 2012 @@ -1553,8 +1553,15 @@ revert_restore(svn_wc__db_t *db, } else if (on_disk == svn_node_file && kind != svn_wc__db_kind_file) { - SVN_ERR(svn_io_remove_file2(local_abspath, FALSE, scratch_pool)); - on_disk = svn_node_none; +#ifdef HAVE_SYMLINK + /* Preserve symlinks pointing at directories. Changes on the + * directory node have been reverted. The symlink should remain. */ + if (!(special && kind == svn_wc__db_kind_dir)) +#endif + { + SVN_ERR(svn_io_remove_file2(local_abspath, FALSE, scratch_pool)); + on_disk = svn_node_none; + } } else if (on_disk == svn_node_file) { Modified: subversion/branches/1.7.x/subversion/libsvn_wc/status.c URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/status.c?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/subversion/libsvn_wc/status.c (original) +++ subversion/branches/1.7.x/subversion/libsvn_wc/status.c Thu Mar 1 04:00:59 2012 @@ -2383,6 +2383,28 @@ svn_wc__internal_walk_status(svn_wc__db_ SVN_ERR(svn_io_stat_dirent(&dirent, local_abspath, TRUE, scratch_pool, scratch_pool)); +#ifdef HAVE_SYMLINK + if (dirent->special && !skip_root) + { + svn_io_dirent2_t *this_dirent = svn_io_dirent2_dup(dirent, + scratch_pool); + + /* We're being pointed to the status root via a symlink. + * Get the real node kind and pretend the path is not a symlink. + * This prevents send_status_structure() from treating the root + * as a directory obstructed by a file. */ + SVN_ERR(svn_io_check_resolved_path(local_abspath, + &this_dirent->kind, scratch_pool)); + this_dirent->special = FALSE; + SVN_ERR(send_status_structure(&wb, local_abspath, + NULL, NULL, NULL, + dir_info, this_dirent, get_all, + status_func, status_baton, + scratch_pool)); + skip_root = TRUE; + } +#endif + SVN_ERR(get_dir_status(&wb, anchor_abspath, target_name, Modified: subversion/branches/1.7.x/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/wc_db.c?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/subversion/libsvn_wc/wc_db.c (original) +++ subversion/branches/1.7.x/subversion/libsvn_wc/wc_db.c Thu Mar 1 04:00:59 2012 @@ -6670,6 +6670,49 @@ read_info(svn_wc__db_status_t *status, svn_error_t * +svn_wc__db_read_info_internal(svn_wc__db_status_t *status, + svn_wc__db_kind_t *kind, + svn_revnum_t *revision, + const char **repos_relpath, + apr_int64_t *repos_id, + svn_revnum_t *changed_rev, + apr_time_t *changed_date, + const char **changed_author, + svn_depth_t *depth, + const svn_checksum_t **checksum, + const char **target, + const char **original_repos_relpath, + apr_int64_t *original_repos_id, + svn_revnum_t *original_revision, + svn_wc__db_lock_t **lock, + svn_filesize_t *recorded_size, + apr_time_t *recorded_mod_time, + const char **changelist, + svn_boolean_t *conflicted, + svn_boolean_t *op_root, + svn_boolean_t *had_props, + svn_boolean_t *props_mod, + svn_boolean_t *have_base, + svn_boolean_t *have_more_work, + svn_boolean_t *have_work, + svn_wc__db_wcroot_t *wcroot, + const char *local_relpath, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + return svn_error_trace( + read_info(status, kind, revision, repos_relpath, repos_id, + changed_rev, changed_date, changed_author, + depth, checksum, target, original_repos_relpath, + original_repos_id, original_revision, lock, + recorded_size, recorded_mod_time, changelist, conflicted, + op_root, had_props, props_mod, + have_base, have_more_work, have_work, + wcroot, local_relpath, result_pool, scratch_pool)); +} + + +svn_error_t * svn_wc__db_read_info(svn_wc__db_status_t *status, svn_wc__db_kind_t *kind, svn_revnum_t *revision, Modified: subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_private.h URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_private.h?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_private.h (original) +++ subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_private.h Thu Mar 1 04:00:59 2012 @@ -55,6 +55,7 @@ struct svn_wc__db_t { { svn_stringbuf_t *abspath; svn_node_kind_t kind; + svn_boolean_t is_symlink; } parse_cache; /* As we grow the state of this DB, allocate that state here. */ @@ -174,6 +175,39 @@ svn_wc__db_util_open_db(svn_sqlite__db_t apr_pool_t *result_pool, apr_pool_t *scratch_pool); +/* Like svn_wc__db_read_info(), but taking WCROOT+LOCAL_RELPATH instead of + DB+LOCAL_ABSPATH, and outputting repos ids instead of URL+UUID. */ +svn_error_t * +svn_wc__db_read_info_internal(svn_wc__db_status_t *status, + svn_wc__db_kind_t *kind, + svn_revnum_t *revision, + const char **repos_relpath, + apr_int64_t *repos_id, + svn_revnum_t *changed_rev, + apr_time_t *changed_date, + const char **changed_author, + svn_depth_t *depth, + const svn_checksum_t **checksum, + const char **target, + const char **original_repos_relpath, + apr_int64_t *original_repos_id, + svn_revnum_t *original_revision, + svn_wc__db_lock_t **lock, + svn_filesize_t *recorded_size, + apr_time_t *recorded_mod_time, + const char **changelist, + svn_boolean_t *conflicted, + svn_boolean_t *op_root, + svn_boolean_t *had_props, + svn_boolean_t *props_mod, + svn_boolean_t *have_base, + svn_boolean_t *have_more_work, + svn_boolean_t *have_work, + svn_wc__db_wcroot_t *wcroot, + const char *local_relpath, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + /* Transaction handling */ Modified: subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_wcroot.c URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_wcroot.c?rev=1295403&r1=1295402&r2=1295403&view=diff ============================================================================== --- subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_wcroot.c (original) +++ subversion/branches/1.7.x/subversion/libsvn_wc/wc_db_wcroot.c Thu Mar 1 04:00:59 2012 @@ -105,12 +105,11 @@ get_old_version(int *version, Sets *KIND to svn_node_dir for symlinks. */ static svn_error_t * get_path_kind(svn_node_kind_t *kind, + svn_boolean_t *is_symlink, svn_wc__db_t *db, const char *local_abspath, apr_pool_t *scratch_pool) { - svn_boolean_t special; - /* This implements a *really* simple LRU cache, where "simple" is defined as "only one element". In other words, we remember the most recently queried path, and nothing else. This gives >80% cache hits. */ @@ -120,6 +119,7 @@ get_path_kind(svn_node_kind_t *kind, { /* Cache hit! */ *kind = db->parse_cache.kind; + *is_symlink = db->parse_cache.is_symlink; return SVN_NO_ERROR; } @@ -133,13 +133,11 @@ get_path_kind(svn_node_kind_t *kind, svn_stringbuf_set(db->parse_cache.abspath, local_abspath); } - SVN_ERR(svn_io_check_special_path(local_abspath, &db->parse_cache.kind, - &special, scratch_pool)); + SVN_ERR(svn_io_check_special_path(local_abspath, kind, + is_symlink, scratch_pool)); - /* The wcroot could be a symlink to a directory. (Issue #2557, #3987) */ - if (special) - db->parse_cache.kind = svn_node_dir; - *kind = db->parse_cache.kind; + db->parse_cache.kind = *kind; + db->parse_cache.is_symlink = *is_symlink; return SVN_NO_ERROR; } @@ -374,6 +372,7 @@ svn_wc__db_wcroot_parse_local_abspath(sv svn_sqlite__db_t *sdb; svn_boolean_t moved_upwards = FALSE; svn_boolean_t always_check = FALSE; + svn_boolean_t is_symlink; int wc_format = 0; /* ### we need more logic for finding the database (if it is located @@ -401,8 +400,8 @@ svn_wc__db_wcroot_parse_local_abspath(sv ### rid of this stat() call. it is going to happen for EVERY call ### into wc_db which references a file. calls for directories could ### get an early-exit in the hash lookup just above. */ - SVN_ERR(get_path_kind(&kind, db, local_abspath, scratch_pool)); - if (kind != svn_node_dir) + SVN_ERR(get_path_kind(&kind, &is_symlink, db, local_abspath, scratch_pool)); + if (kind != svn_node_dir || is_symlink) { /* If the node specified by the path is NOT present, then it cannot possibly be a directory containing ".svn/wc.db". @@ -511,6 +510,39 @@ svn_wc__db_wcroot_parse_local_abspath(sv if (svn_dirent_is_root(local_abspath, strlen(local_abspath))) { /* Hit the root without finding a wcroot. */ + + /* The wcroot could be a symlink to a directory. + * (Issue #2557, #3987). If so, try again, this time scanning + * for a db within the directory the symlink points to, + * rather than within the symlink's parent directory. */ + if (is_symlink) + { + svn_node_kind_t resolved_kind; + + local_abspath = original_abspath; + + SVN_ERR(svn_io_check_resolved_path(local_abspath, + &resolved_kind, + scratch_pool)); + if (resolved_kind == svn_node_dir) + { + /* Is this directory recorded in our hash? */ + found_wcroot = apr_hash_get(db->dir_data, local_abspath, + APR_HASH_KEY_STRING); + if (found_wcroot) + break; + +try_symlink_as_dir: + kind = svn_node_dir; + is_symlink = FALSE; + moved_upwards = FALSE; + local_dir_abspath = local_abspath; + build_relpath = ""; + + continue; + } + } + return svn_error_createf(SVN_ERR_WC_NOT_WORKING_COPY, NULL, _("'%s' is not a working copy"), svn_dirent_local_style(original_abspath, @@ -584,6 +616,61 @@ svn_wc__db_wcroot_parse_local_abspath(sv *local_relpath = svn_relpath_join(dir_relpath, build_relpath, result_pool); } + if (is_symlink) + { + svn_boolean_t retry_if_dir = FALSE; + svn_wc__db_status_t status; + svn_boolean_t conflicted; + svn_error_t *err; + + /* Check if the symlink is versioned or obstructs a versioned node + * in this DB -- in that case, use this wcroot. Else, if the symlink + * points to a directory, try to find a wcroot in that directory + * instead. */ + + err = svn_wc__db_read_info_internal(&status, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, &conflicted, NULL, NULL, NULL, + NULL, NULL, NULL, + *wcroot, *local_relpath, + scratch_pool, scratch_pool); + if (err) + { + if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND + && !SVN_WC__ERR_IS_NOT_CURRENT_WC(err)) + return svn_error_trace(err); + + svn_error_clear(err); + retry_if_dir = TRUE; /* The symlink is unversioned. */ + } + else + { + /* The symlink is versioned, or obstructs a versioned node. + * Ignore non-conflicted not-present/excluded nodes. + * This allows the symlink to redirect the wcroot query to a + * directory, regardless of 'invisible' nodes in this WC. */ + retry_if_dir = ((status == svn_wc__db_status_not_present || + status == svn_wc__db_status_excluded || + status == svn_wc__db_status_server_excluded) + && !conflicted); + } + + if (retry_if_dir) + { + svn_node_kind_t resolved_kind; + + SVN_ERR(svn_io_check_resolved_path(original_abspath, + &resolved_kind, + scratch_pool)); + if (resolved_kind == svn_node_dir) + { + local_abspath = original_abspath; + goto try_symlink_as_dir; + } + } + } + /* We've found the appropriate WCROOT for the requested path. Stash it into that path's directory. */ apr_hash_set(db->dir_data, 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=1295403&r1=1295402&r2=1295403&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 Thu Mar 1 04:00:59 2012 @@ -906,6 +906,37 @@ def update_symlink(sbox): None, None, None, None, None, 1) +@Issue(4102) +@SkipUnless(svntest.main.is_posix_os) +def externals_as_symlink_targets(sbox): + "externals as symlink targets" + sbox.build() + wc = sbox.ospath + + # Control: symlink to normal dir and file. + os.symlink('E', wc('sym_E')) + os.symlink('mu', wc('sym_mu')) + + # Test case: symlink to external dir and file. + sbox.simple_propset("svn:externals", + '^/A/B/E ext_E\n' + '^/A/mu ext_mu', + '') + sbox.simple_update() + os.symlink('ext_E', wc('sym_ext_E')) + os.symlink('ext_mu', wc('sym_ext_mu')) + + # Adding symlinks to normal items and to a file external is OK. + sbox.simple_add('sym_E', 'sym_mu', 'sym_ext_mu') + + ### Adding a symlink to an external dir failed with + ### svn: E200009: Could not add all targets because some targets are + ### already versioned + sbox.simple_add('sym_ext_E') + + sbox.simple_commit() + + ######################################################################## # Run the tests @@ -933,6 +964,7 @@ test_list = [ None, symlink_to_wc_basic, symlink_to_wc_svnversion, update_symlink, + externals_as_symlink_targets, ] if __name__ == '__main__':