On Tue, May 4, 2010 at 11:14, <julianf...@apache.org> wrote: >... > +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Tue May 4 15:14:13 2010 > @@ -2560,6 +2560,75 @@ svn_wc__db_pristine_install(svn_wc__db_t > > > svn_error_t * > +svn_wc__db_pristine_remove(svn_wc__db_t *db, > + const char *wri_abspath, > + const svn_checksum_t *sha1_checksum, > + apr_pool_t *scratch_pool) > +{ > + svn_wc__db_pdh_t *pdh; > + const char *local_relpath; > + const char *pristine_abspath; > + svn_error_t *err; > + const svn_checksum_t *md5_checksum; > + svn_boolean_t is_referenced = FALSE;
Why initialize this? It will be unconditionally set below. > + > + SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath)); > + SVN_ERR_ASSERT(sha1_checksum->kind == svn_checksum_sha1); > + > + SVN_ERR(parse_local_abspath(&pdh, &local_relpath, db, wri_abspath, > + svn_sqlite__mode_readwrite, > + scratch_pool, scratch_pool)); > + VERIFY_USABLE_PDH(pdh); > + > + err = get_pristine_fname(&pristine_abspath, pdh, sha1_checksum, > +#ifndef SVN__SKIP_SUBDIR > + TRUE /* create_subdir */, > +#endif > + scratch_pool, scratch_pool); > + SVN_ERR(err); Why compute the path so early? This won't be needed unless/until you actually determine the file should be removed. > + > + /* Find whether the SHA-1 (or the MD-5) is referenced; set IS_REFERENCED. > */ > + { > + svn_sqlite__stmt_t *stmt; > + > + /* ### Transitional: look for references to its MD-5 as well. */ > + SVN_ERR(svn_wc__db_pristine_get_md5(&md5_checksum, db, wri_abspath, > + sha1_checksum, scratch_pool, > scratch_pool)); > + > + SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb, > + STMT_SELECT_ANY_PRISTINE_REFERENCE)); > + SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, scratch_pool)); > + SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool)); > + SVN_ERR(svn_sqlite__step(&is_referenced, stmt)); > + > + SVN_ERR(svn_sqlite__reset(stmt)); > + } > + > + /* If not referenced, remove first the PRISTINE table row, then the file. > */ > + if (! is_referenced) > + { > + svn_sqlite__stmt_t *stmt; > + > + /* Remove the DB row. */ > + SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb, > + STMT_DELETE_PRISTINE)); > + SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, > scratch_pool)); > + SVN_ERR(svn_sqlite__update(NULL, stmt)); > + > + /* Remove the file */ > + SVN_ERR(svn_io_remove_file2(pristine_abspath, TRUE, scratch_pool)); > + SVN_DBG(("Was referenced: '%s'\n", > + svn_checksum_to_cstring_display(md5_checksum, scratch_pool))); Here... > + } > + else > + SVN_DBG(("Not referenced: '%s'\n", > + svn_checksum_to_cstring_display(md5_checksum, scratch_pool))); ... and here. SVN_DBG cannot be left in the committed source code. The macro does not exist in release builds. >... > +++ subversion/trunk/subversion/libsvn_wc/wc_db.h Tue May 4 15:14:13 2010 > @@ -866,6 +866,16 @@ svn_wc__db_pristine_get_md5(const svn_ch > apr_pool_t *scratch_pool); > > > +/* Remove the pristine text with SHA-1 checksum SHA1_CHECKSUM from the > + * pristine store, iff it is not referenced by any of the (other) WC DB > + * tables. */ Also remember that we don't want to remove pristines why administrative locks (WCLOCK) are present. That may signify a commit is occurring and needed pristines are transiently living in the pristine storage. >... Cheers, -g