Index: subversion/include/svn_repos.h =================================================================== --- subversion/include/svn_repos.h (revision 21732) +++ subversion/include/svn_repos.h (working copy) @@ -835,6 +835,24 @@ apr_pool_t *pool); +/** + * Set @a *deleted to the revision @a path was most recently deleted + * in @a fs, within the inclusive revision bounds set by @a start and + * @end. If @a path does not exist in @a root within the @a start and + * @a end bounds, or is not deleted within those bounds, set @a *deleted + * to SVN_INVALID_REVNUM. Use @a pool for memory allocation. + * + * @since New in 1.5. + */ +svn_error_t * +svn_repos_deleted_rev(svn_fs_t *fs, + const char *path, + svn_revnum_t start, + svn_revnum_t end, + svn_revnum_t *deleted, + apr_pool_t *pool); + + /** Callback type for use with svn_repos_history(). @a path and @a * revision represent interesting history locations in the lifetime * of the path passed to svn_repos_history(). @a baton is the same Index: subversion/libsvn_repos/reporter.c =================================================================== --- subversion/libsvn_repos/reporter.c (revision 21732) +++ subversion/libsvn_repos/reporter.c (working copy) @@ -625,7 +625,12 @@ /* If there's a source and it's not related to the target, nuke it. */ if (s_entry && !related) { - SVN_ERR(b->editor->delete_entry(e_path, SVN_INVALID_REVNUM, dir_baton, + svn_revnum_t deleted_rev; + + SVN_ERR(svn_repos_deleted_rev(svn_fs_root_fs(b->t_root), t_path, + s_rev, b->t_rev, &deleted_rev, + pool)); + SVN_ERR(b->editor->delete_entry(e_path, deleted_rev, dir_baton, pool)); s_path = NULL; } @@ -765,11 +770,20 @@ if (apr_hash_get(t_entries, s_entry->name, APR_HASH_KEY_STRING) == NULL) { + svn_revnum_t deleted_rev; + /* There is no corresponding target entry, so delete. */ e_fullpath = svn_path_join(e_path, s_entry->name, subpool); + SVN_ERR(svn_repos_deleted_rev(svn_fs_root_fs(b->t_root), + svn_path_join(t_path, + s_entry->name, + subpool), + s_rev, b->t_rev, + &deleted_rev, subpool)); + if (b->recurse || s_entry->kind != svn_node_dir) SVN_ERR(b->editor->delete_entry(e_fullpath, - SVN_INVALID_REVNUM, + deleted_rev, dir_baton, subpool)); } } Index: subversion/libsvn_repos/rev_hunt.c =================================================================== --- subversion/libsvn_repos/rev_hunt.c (revision 21732) +++ subversion/libsvn_repos/rev_hunt.c (working copy) @@ -299,6 +299,66 @@ } +svn_error_t * +svn_repos_deleted_rev(svn_fs_t *fs, + const char *path, + svn_revnum_t start, + svn_revnum_t end, + svn_revnum_t *deleted, + apr_pool_t *pool) +{ + apr_pool_t *subpool = svn_pool_create(pool); + svn_fs_root_t *root; + svn_revnum_t curr_rev; + *deleted = SVN_INVALID_REVNUM; + + /* Validate the revision range. */ + if (! SVN_IS_VALID_REVNUM(start)) + return svn_error_createf + (SVN_ERR_FS_NO_SUCH_REVISION, 0, + _("Invalid start revision %ld"), start); + if (! SVN_IS_VALID_REVNUM(end)) + return svn_error_createf + (SVN_ERR_FS_NO_SUCH_REVISION, 0, + _("Invalid end revision %ld"), end); + + /* Ensure that the input is ordered. */ + if (start > end) + { + svn_revnum_t tmprev = start; + start = end; + end = tmprev; + } + + curr_rev = end; + + while (curr_rev >= start) + { + svn_node_kind_t kind_p; + svn_pool_clear(subpool); + + /* Get a revision root for curr_rev. */ + SVN_ERR(svn_fs_revision_root(&root, fs, curr_rev, subpool)); + + SVN_ERR(svn_fs_check_path(&kind_p, root, path, subpool)); + + if (kind_p == svn_node_none) + { + curr_rev--; + } + else + { + if (curr_rev != end) + *deleted = curr_rev + 1; + break; + } + } + + svn_pool_destroy(subpool); + return SVN_NO_ERROR; +} + + /* Helper func: return SVN_ERR_AUTHZ_UNREADABLE if ROOT/PATH is unreadable. */ static svn_error_t * Index: subversion/libsvn_wc/status.c =================================================================== --- subversion/libsvn_wc/status.c (revision 21732) +++ subversion/libsvn_wc/status.c (working copy) @@ -999,18 +999,42 @@ /* Look up the key PATH in BATON->STATII. IS_DIR_BATON indicates whether baton is a struct *dir_baton or struct *file_baton. If the value doesn't yet exist, and the REPOS_TEXT_STATUS indicates that this is an - addition, create a new status struct using the hash's pool. Merge - REPOS_TEXT_STATUS and REPOS_PROP_STATUS into the status structure's + addition, create a new status struct using the hash's pool. + + If IS_DIR_BATON is true, OOD_BATON is a *dir_baton cotaining the ood + information we want to set in BATON. This is necessary because this + function tweaks the status of out of date directories (BATON == OOD_BATON) + and out of date directories' parents (BATON == OOD_BATON->parent_baton). + In the latter case OOD_BATON contains the ood info we want to bubble up + to ancestor directories so these accurately reflect the fact they have + and ood descendent. + + Merge REPOS_TEXT_STATUS and REPOS_PROP_STATUS into the status structure's "network" fields. + + Iff IS_DIR_BATON is true, DELETED_REV is used as follows, otherwise it + is ignored: + + If REPOS_TEXT_STATUS is svn_wc_status_deleted then DELETED_REV is + optionally the revision path was deleted, in all other cases it must + be set to SVN_INVALID_REVNUM. If DELETED_REV is not + SVN_INVALID_REVNUM and REPOS_TEXT_STATUS is svn_wc_status_deleted, + then use DELETED_REV to set PATH's ood_last_cmt_rev field in BATON. + If DELETED_REV is SVN_INVALID_REVNUM and REPOS_TEXT_STATUS is + svn_wc_status_deleted, set PATH's ood_last_cmt_rev to it's parent's + ood_last_cmt_rev value - see comment below. + If a new struct was added, set the repos_lock to REPOS_LOCK. */ static svn_error_t * tweak_statushash(void *baton, + void *ood_baton, svn_boolean_t is_dir_baton, svn_wc_adm_access_t *adm_access, const char *path, svn_boolean_t is_dir, enum svn_wc_status_kind repos_text_status, enum svn_wc_status_kind repos_prop_status, + svn_revnum_t deleted_rev, svn_lock_t *repos_lock) { svn_wc_status2_t *statstruct; @@ -1064,20 +1088,50 @@ /* Copy out of date info. */ if (is_dir_baton) { - struct dir_baton *b = baton; + struct dir_baton *b = ood_baton; + if (b->url) - statstruct->url = apr_pstrdup(pool, b->url); - statstruct->ood_kind = b->ood_kind; - /* The last committed rev, date, and author for deleted items + { + if (statstruct->repos_text_status == svn_wc_status_deleted) + { + /* When deleting PATH, BATON is for PATH's parent, + so we must construct PATH's real statstruct->url. */ + statstruct->url = + svn_path_url_add_component(b->url, + svn_path_basename(path, pool), + pool); + } + else + statstruct->url = apr_pstrdup(pool, b->url); + } + + /* The last committed date, and author for deleted items isn't available. */ - if (statstruct->repos_text_status != svn_wc_status_deleted) + if (statstruct->repos_text_status == svn_wc_status_deleted) { + statstruct->ood_kind = is_dir ? svn_node_dir : svn_node_file; + + /* Pre 1.5 servers don't provide the revision a path was deleted. + So we punt and use the last committed revision of the path's + parent, which has some chance of being correct. At worse it + is a higher revision than the path was deleted, but this is + better than nothing... */ + if (deleted_rev == SVN_INVALID_REVNUM) + statstruct->ood_last_cmt_rev = + ((struct dir_baton *) baton)->ood_last_cmt_rev; + else + statstruct->ood_last_cmt_rev = deleted_rev; + } + else + { + statstruct->ood_kind = b->ood_kind; statstruct->ood_last_cmt_rev = b->ood_last_cmt_rev; statstruct->ood_last_cmt_date = b->ood_last_cmt_date; if (b->ood_last_cmt_author) statstruct->ood_last_cmt_author = apr_pstrdup(pool, b->ood_last_cmt_author); } + } else { @@ -1468,17 +1522,18 @@ SVN_ERR(svn_wc_entries_read(&entries, adm_access, FALSE, pool)); if (apr_hash_get(entries, hash_key, APR_HASH_KEY_STRING)) - SVN_ERR(tweak_statushash(db, TRUE, eb->adm_access, + SVN_ERR(tweak_statushash(db, db, TRUE, eb->adm_access, full_path, kind == svn_node_dir, - svn_wc_status_deleted, 0, NULL)); + svn_wc_status_deleted, 0, revision, NULL)); /* Mark the parent dir -- it lost an entry (unless that parent dir is the root node and we're not supposed to report on the root node). */ if (db->parent_baton && (! *eb->target)) - SVN_ERR(tweak_statushash(db->parent_baton, TRUE, eb->adm_access, + SVN_ERR(tweak_statushash(db->parent_baton, db, TRUE, eb->adm_access, db->path, kind == svn_node_dir, - svn_wc_status_modified, 0, NULL)); + svn_wc_status_modified, 0, SVN_INVALID_REVNUM, + NULL)); return SVN_NO_ERROR; } @@ -1560,8 +1615,10 @@ struct edit_baton *eb = db->edit_baton; svn_wc_status2_t *dir_status = NULL; - /* If nothing has changed, return. */ - if (db->added || db->prop_changed || db->text_changed) + /* If nothing has changed and directory has no out of + date descendents, return. */ + if (db->added || db->prop_changed || db->text_changed + || db->ood_last_cmt_rev != SVN_INVALID_REVNUM) { enum svn_wc_status_kind repos_text_status; enum svn_wc_status_kind repos_prop_status; @@ -1588,11 +1645,12 @@ { /* ### When we add directory locking, we need to find a ### directory lock here. */ - SVN_ERR(tweak_statushash(pb, TRUE, + SVN_ERR(tweak_statushash(pb, db, TRUE, eb->adm_access, db->path, TRUE, repos_text_status, - repos_prop_status, NULL)); + repos_prop_status, SVN_INVALID_REVNUM, + NULL)); } else { @@ -1601,6 +1659,16 @@ trigger invocation of the status callback below. */ eb->anchor_status->repos_prop_status = repos_prop_status; eb->anchor_status->repos_text_status = repos_text_status; + + /* If the root dir is out of date set the ood info directly too. */ + if (db->ood_last_cmt_rev != eb->anchor_status->entry->revision) + { + eb->anchor_status->ood_last_cmt_rev = db->ood_last_cmt_rev; + eb->anchor_status->ood_last_cmt_date = db->ood_last_cmt_date; + eb->anchor_status->ood_kind = db->ood_kind; + eb->anchor_status->ood_last_cmt_author = + apr_pstrdup(pool, db->ood_last_cmt_author); + } } } @@ -1799,11 +1867,11 @@ repos_prop_status = fb->prop_changed ? svn_wc_status_modified : 0; } - SVN_ERR(tweak_statushash(fb, FALSE, + SVN_ERR(tweak_statushash(fb, NULL, FALSE, fb->edit_baton->adm_access, fb->path, FALSE, repos_text_status, - repos_prop_status, + repos_prop_status, SVN_INVALID_REVNUM, repos_lock)); return SVN_NO_ERROR; --=_mixed 006C6CF9852571FB_Content-Type: text/plain; name="svn status extra-strength verbose.diff.txt" Content-Disposition: attachment; filename="svn status extra-strength verbose.diff.txt" Content-Transfer-Encoding: quoted-printable Index: subversion/svn/status.c =================================================================== --- subversion/svn/status.c (revision 21732) +++ subversion/svn/status.c (working copy) @@ -89,6 +89,57 @@ svn_wc_status2_t *status, apr_pool_t *pool) { +#ifdef SVN_DEBUG + if (status->entry) + { + svn_cmdline_printf (pool, "\tstatus->entry->name = %s\n", status->entry->name); + svn_cmdline_printf (pool, "\tstatus->entry->revision = %d\n", status->entry->revision); + svn_cmdline_printf (pool, "\tstatus->entry->url = %s\n", status->entry->url); + svn_cmdline_printf (pool, "\tstatus->entry->repos = %s\n", status->entry->repos); + svn_cmdline_printf (pool, "\tstatus->entry->uuid = %s\n", status->entry->uuid); + svn_cmdline_printf (pool, "\tstatus->entry->kind = %d\n", status->entry->kind); + svn_cmdline_printf (pool, "\tstatus->entry->schedule = %d\n", status->entry->schedule); + svn_cmdline_printf (pool, "\tstatus->entry->copied = %d\n", status->entry->copied); + svn_cmdline_printf (pool, "\tstatus->entry->deleted = %d\n", status->entry->deleted); + svn_cmdline_printf (pool, "\tstatus->entry->absent = %d\n", status->entry->absent); + svn_cmdline_printf (pool, "\tstatus->entry->incomplete = %d\n", status->entry->incomplete); + } + else + svn_cmdline_printf (pool, "\tstatus->entry = (null) i.e. An added item.\n"); + svn_cmdline_printf (pool, "\t--------------------------------------------------------------\n"); + svn_cmdline_printf (pool, "\tstatus->text_status = %d (%s)\n", + status->text_status, + generate_status_desc(status->text_status)); + svn_cmdline_printf (pool, "\tstatus->prop_status = %d (%s)\n", + status->prop_status, + generate_status_desc(status->prop_status)); + svn_cmdline_printf (pool, "\tstatus->locked = %d\n", status->locked); + svn_cmdline_printf (pool, "\tstatus->copied = %d\n", status->copied); + svn_cmdline_printf (pool, "\tstatus->switched = %d\n", status->switched); + svn_cmdline_printf (pool, "\tstatus->repos_text_status = %d (%s)\n", + status->repos_text_status, + generate_status_desc(status->repos_text_status)); + svn_cmdline_printf (pool, "\tstatus->repos_prop_status = %d (%s)\n", + status->repos_prop_status, + generate_status_desc(status->repos_prop_status)); + svn_cmdline_printf (pool, "\t--------------------------------------------------------------\n"); + + if (status->ood_last_cmt_rev == SVN_INVALID_REVNUM) + svn_cmdline_printf (pool, "\tstatus->OOD_last_cmt_rev = %d (SVN_INVALID_REVNUM)\n", status->ood_last_cmt_rev); + else + svn_cmdline_printf (pool, "\tstatus->OOD_last_cmt_rev = %d\n", status->ood_last_cmt_rev); + + if (status->ood_last_cmt_date == 0) + svn_cmdline_printf (pool, "\tstatus->OOD_last_cmt_date = 0\n"); + else + svn_cmdline_printf (pool, "\tstatus->OOD_last_cmt_date = %s\n", svn_time_to_human_cstring (status->ood_last_cmt_date, pool)); + + svn_cmdline_printf (pool, "\tstatus->OOD_kind = %d\n", status->ood_kind); + svn_cmdline_printf (pool, "\tstatus->url = %s\n", status->url); + svn_cmdline_printf (pool, "\tstatus->OOD_last_cmt_author = %s\n", status->ood_last_cmt_author); + svn_cmdline_printf (pool, "\t----- Normal CL output: --------------------------------------\n"); +#endif + if (detailed) { char ood_status, lock_status; @@ -190,7 +241,9 @@ ((status->entry && status->entry->lock_token) ? 'K' : ' '), path)); - +#ifdef SVN_DEBUG + svn_cmdline_printf (pool, "======================================================================\n"); +#endif SVN_ERR(svn_cmdline_fflush(stdout)); return SVN_NO_ERROR; Index: subversion/tests/cmdline/stat_tests.py =================================================================== --- subversion/tests/cmdline/stat_tests.py (revision 21732) +++ subversion/tests/cmdline/stat_tests.py (working copy) @@ -1256,6 +1256,208 @@ [], "status", "-uN", A_path) +#---------------------------------------------------------------------- +def ood_testing(sbox): + "setup various ood scenarios" + + sbox.build() + wc_dir = sbox.wc_dir + + # Make a backup copy of the working copy +# wc_backup = sbox.add_wc_path('backup') +# svntest.actions.duplicate_dir(wc_dir, wc_backup) + + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + + # --- r2 : Modify a file ------------------------------------------ + rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho') + svntest.main.file_append (rho_path, 'modification to rho\n') + expected_output = wc.State(wc_dir, {'A/D/G/rho' : Item(verb='Sending')}) + expected_status.tweak('A/D/G/rho', wc_rev=2) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r3 : Delete a file ------------------------------------------ + pi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi') + svntest.actions.run_and_verify_svn("Unexpected error during delete", + ["D " + pi_path + "\n"], + [], "delete", pi_path) + expected_output = wc.State(wc_dir, {'A/D/G/pi' : Item(verb='Deleting')}) + expected_status.remove('A/D/G/pi') + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r4 : Modify a file ------------------------------------------ + tau_path = os.path.join(wc_dir, 'A', 'D', 'G', 'tau') + svntest.main.file_append (tau_path, 'modification to tau\n') + expected_output = wc.State(wc_dir, {'A/D/G/tau' : Item(verb='Sending')}) + expected_status.tweak('A/D/G/tau', wc_rev=4) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r5 : Delete a dir with no children -------------------------- + C_path = os.path.join(wc_dir, 'A', 'C') + svntest.actions.run_and_verify_svn("Unexpected error during delete", + ["D " + C_path + "\n"], + [], "delete", C_path) + expected_output = wc.State(wc_dir, {'A/C' : Item(verb='Deleting')}) + expected_status.remove('A/C') + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r6 : Add a dir ---------------------------------------------- + I_path = os.path.join(wc_dir, 'A', 'B', 'I') + os.mkdir(I_path) + svntest.actions.run_and_verify_svn("Unexpected error during add", + ["A " + I_path + "\n"], + [], "add", I_path) + expected_output = wc.State(wc_dir, {'A/B/I' : Item(verb='Adding')}) + expected_status.add({'A/B/I' : Item(status=' ', wc_rev=6)}) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- Update --------------------------------------------------------- + svntest.actions.run_and_verify_svn("Unexpected error during update", + ["At revision 6.\n"], + [], "update", + wc_dir) + expected_status.tweak(wc_rev=6) + + # --- r7 : Prop change on root dir ----------------------------------- + svntest.actions.run_and_verify_svn("Unexpected error during propset", + ["property 'propname' set on '" + + wc_dir + "'\n"], + [], "ps", "propname", "propval", + wc_dir) + + expected_output = wc.State(wc_dir, {'' : Item(verb='Sending')}) + expected_status.tweak('', wc_rev=7) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r8 : Add a file --------------------------------------------- + nu_path = os.path.join(wc_dir, 'A', 'D', 'H', 'nu') + svntest.main.file_append (nu_path, "This is the file 'nu'\n") + svntest.actions.run_and_verify_svn("Unexpected error during add", + ["A " + nu_path + "\n"], + [], "add", nu_path) + expected_output = wc.State(wc_dir, {'A/D/H/nu' : Item(verb='Adding')}) + expected_status.add({'A/D/H/nu' : Item(status=' ', wc_rev=8)}) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r9 : Prop change on a dir ----------------------------------- + F_path = os.path.join(wc_dir, 'A', 'B', 'F') + svntest.actions.run_and_verify_svn("Unexpected error during propset", + ["property 'propname' set on '" + + F_path + "'\n"], + [], "ps", "propname", "propval", + F_path) + + expected_output = wc.State(wc_dir, {'A/B/F' : Item(verb='Sending')}) + expected_status.tweak('A/B/F', wc_rev=9) + svntest.actions.run_and_verify_commit(wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r10-11 : Replace a file with a file ------------------------- + chi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'chi') + svntest.actions.run_and_verify_svn("Unexpected error during delete", + ["D " + chi_path + "\n"], + [], "delete", chi_path) + expected_output = wc.State(wc_dir, {'A/D/H/chi' : Item(verb='Deleting')}) + expected_status.remove('A/D/H/chi') + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + svntest.main.file_append (chi_path, "This is the replaced file 'chi'\n") + svntest.actions.run_and_verify_svn("Unexpected error during add", + ["A " + chi_path + "\n"], + [], "add", chi_path) + expected_output = wc.State(wc_dir, {'A/D/H/chi' : Item(verb='Adding')}) + expected_status.add({'A/D/H/chi' : Item(status=' ', wc_rev=11)}) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r12-13 : Replace a file with a dir -------------------------- + psi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'psi') + svntest.actions.run_and_verify_svn("Unexpected error during delete", + ["D " + psi_path + "\n"], + [], "delete", psi_path) + expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Deleting')}) + expected_status.remove('A/D/H/psi') + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + os.mkdir(psi_path) + + svntest.actions.run_and_verify_svn("Unexpected error during update", + ["At revision 12.\n"], + [], "update", + wc_dir) + expected_status.tweak(wc_rev=12) + + svntest.actions.run_and_verify_svn("Unexpected error during add", + ["A " + psi_path + "\n"], + [], "add", psi_path) + expected_output = wc.State(wc_dir, {'A/D/H/psi' : Item(verb='Adding')}) + expected_status.add({'A/D/H/psi' : Item(status=' ', wc_rev=13)}) + svntest.actions.run_and_verify_commit (wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # --- r14 : Delete a dir with children ----------------------------- + E_path = os.path.join(wc_dir, 'A', 'B', 'E') + alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') + beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta') + svntest.actions.run_and_verify_svn("Unexpected error during delete", + ["D " + alpha_path + "\n", + "D " + beta_path + "\n", + "D " + E_path + "\n"], + [], "delete", E_path) + expected_output = wc.State(wc_dir, {'A/B/E' : Item(verb='Deleting')}) + expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta') + svntest.actions.run_and_verify_commit(wc_dir, expected_output, + expected_status, None, + None, None, None, None, wc_dir) + + # Update WC back to rev 1 so it's out of date. + expected_output = svntest.wc.State(wc_dir, { + 'A/B/I' : Item(status='D '), + 'A/B/E' : Item(status='A '), + 'A/B/E/alpha' : Item(status='A '), + 'A/B/E/beta' : Item(status='A '), + 'A/B/F' : Item(status=' U'), + 'A/D/H/psi' : Item(status='D '), + 'A/D/H/psi' : Item(status='A '), + 'A/D/H/nu' : Item(status='D '), + 'A/D/H/chi' : Item(status='D '), + 'A/D/H/chi' : Item(status='A '), + 'A/D/G/pi' : Item(status='A '), + 'A/D/G/rho' : Item(status='U '), + 'A/D/G/tau' : Item(status='U '), + 'A/C' : Item(status='A '), + '' : Item(status=' U'), + }) + expected_disk = svntest.main.greek_state.copy() + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + svntest.actions.run_and_verify_update(wc_dir, + expected_output, + expected_disk, + expected_status, + None, None, None, None, None, 1, + '-r', '1', wc_dir) + + raise svntest.Failure("Not testing anything, just setting up for manual testing...") + ######################################################################## # Run the tests