You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2012/01/10 19:37:52 UTC
svn commit: r1229677 - in /subversion/trunk/subversion: libsvn_wc/status.c
tests/cmdline/stat_tests.py
Author: philip
Date: Tue Jan 10 18:37:52 2012
New Revision: 1229677
URL: http://svn.apache.org/viewvc?rev=1229677&view=rev
Log:
Fix a status SEGV caused by an unversioned directory "obstructing"
a newer directory in the repository.
* subversion/libsvn_wc/status.c
(find_dir_repos_relpath): Recurse up and always return a non-NULL relpath.
(close_file): No need to handle NULL.
* subversion/tests/cmdline/stat_tests.py
(status_update_with_nested_adds): Extend.
Modified:
subversion/trunk/subversion/libsvn_wc/status.c
subversion/trunk/subversion/tests/cmdline/stat_tests.py
Modified: subversion/trunk/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/status.c?rev=1229677&r1=1229676&r2=1229677&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/status.c Tue Jan 10 18:37:52 2012
@@ -1649,7 +1649,7 @@ tweak_statushash(void *baton,
return SVN_NO_ERROR;
}
-/* Returns the URL for DB, or NULL: */
+/* Returns the URL for DB */
static const char *
find_dir_repos_relpath(const struct dir_baton *db, apr_pool_t *pool)
{
@@ -1666,14 +1666,11 @@ find_dir_repos_relpath(const struct dir_
/* Note that status->repos_relpath could be NULL in the case of a missing
* directory, which means we need to recurse up another level to get
* a useful relpath. */
- if (status)
+ if (status && status->repos_relpath)
return status->repos_relpath;
repos_relpath = find_dir_repos_relpath(pb, pool);
- if (repos_relpath)
- return svn_relpath_join(repos_relpath, db->name, pool);
- else
- return NULL;
+ return svn_relpath_join(repos_relpath, db->name, pool);
}
}
@@ -2369,19 +2366,15 @@ close_file(void *file_baton,
const char *dir_repos_relpath = find_dir_repos_relpath(fb->dir_baton,
pool);
- if (dir_repos_relpath)
- {
- /* repos_lock still uses the deprecated filesystem absolute path
- format */
-
- const char *repos_relpath = svn_relpath_join(dir_repos_relpath,
- fb->name, pool);
-
- repos_lock = apr_hash_get(fb->edit_baton->wb.repos_locks,
- svn_fspath__join("/", repos_relpath,
- pool),
- APR_HASH_KEY_STRING);
- }
+ /* repos_lock still uses the deprecated filesystem absolute path
+ format */
+ const char *repos_relpath = svn_relpath_join(dir_repos_relpath,
+ fb->name, pool);
+
+ repos_lock = apr_hash_get(fb->edit_baton->wb.repos_locks,
+ svn_fspath__join("/", repos_relpath,
+ pool),
+ APR_HASH_KEY_STRING);
}
}
else
Modified: subversion/trunk/subversion/tests/cmdline/stat_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/stat_tests.py?rev=1229677&r1=1229676&r2=1229677&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/stat_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/stat_tests.py Tue Jan 10 18:37:52 2012
@@ -117,6 +117,12 @@ def status_update_with_nested_adds(sbox)
svntest.actions.run_and_verify_unquiet_status(wc_backup,
expected_status)
+ # At one time an obstructing 'newdir' caused a SEGV on 'newdir/newfile'
+ os.makedirs(os.path.join(wc_backup, 'newdir'))
+ expected_status.tweak('newdir', status='? ')
+ svntest.actions.run_and_verify_unquiet_status(wc_backup,
+ expected_status)
+
#----------------------------------------------------------------------
# svn status -vN should include all entries in a directory