You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2010/08/04 16:08:20 UTC
svn commit: r982256 - in /subversion/trunk/subversion: include/svn_wc.h
libsvn_wc/adm_crawler.c
Author: rhuijben
Date: Wed Aug 4 14:08:19 2010
New Revision: 982256
URL: http://svn.apache.org/viewvc?rev=982256&view=rev
Log:
Add an libsvn_wc api for restoring missing nodes.
* subversion/include/svn_wc.h
(svn_wc_copy3): Fix reference to latest version.
(svn_wc_restore): New function.
* subversion/libsvn_wc/adm_crawler.c
(restore_file): Make removing text conflict optional.
(svn_wc_restore): New function.
(restore_node): Update caller.
Modified:
subversion/trunk/subversion/include/svn_wc.h
subversion/trunk/subversion/libsvn_wc/adm_crawler.c
Modified: subversion/trunk/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=982256&r1=982255&r2=982256&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Wed Aug 4 14:08:19 2010
@@ -4238,7 +4238,7 @@ svn_wc_status_set_repos_locks(void *set_
* @par Important:
* This is a variant of svn_wc_add4(). No changes will happen
* to the repository until a commit occurs. This scheduling can be
- * removed with svn_client_revert2().
+ * removed with svn_client_revert4().
*
* @since New in 1.7.
*/
@@ -6952,6 +6952,23 @@ svn_wc_revert(const char *path,
void *notify_baton,
apr_pool_t *pool);
+/**
+ * Restores a missing node, @a local_abspath using the @a wc_ctx. Records
+ * the new last modified time of the file for status processing.
+ *
+ * If @a use_commit_times is TRUE, then set restored files' timestamps
+ * to their last-commit-times.
+ *
+ * ### Before Single-DB this function can only restore missing files.
+ *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_wc_restore(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_boolean_t use_commit_times,
+ apr_pool_t *scratch_pool);
+
/* Tmp files */
Modified: subversion/trunk/subversion/libsvn_wc/adm_crawler.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_crawler.c?rev=982256&r1=982255&r2=982256&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_crawler.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_crawler.c Wed Aug 4 14:08:19 2010
@@ -60,12 +60,16 @@
last-commit-time. Either way, set entry-timestamp to match that of
the working file when all is finished.
+ If REMOVE_TEXT_CONFLICT is TRUE, remove an existing text conflict
+ from LOCAL_ABSPATH.
+
Not that a valid access baton with a write lock to the directory of
LOCAL_ABSPATH must be available in DB.*/
static svn_error_t *
restore_file(svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t use_commit_times,
+ svn_boolean_t remove_text_conflicts,
apr_pool_t *scratch_pool)
{
svn_skel_t *work_item;
@@ -87,8 +91,77 @@ restore_file(svn_wc__db_t *db,
scratch_pool));
/* Remove any text conflict */
- return svn_error_return(svn_wc__resolve_text_conflict(db, local_abspath,
+ if (remove_text_conflicts)
+ SVN_ERR(svn_wc__resolve_text_conflict(db, local_abspath, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc_restore(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_boolean_t use_commit_times,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_status_t status;
+ svn_wc__db_kind_t kind;
+ svn_node_kind_t disk_kind;
+
+ SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
+
+ if (disk_kind != svn_node_none)
+ return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
+ _("The existing node '%s' can not be restored."),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+
+
+
+ SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ switch (status)
+ {
+ case svn_wc__db_status_added:
+ SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+ if (status != svn_wc__db_status_added)
+ break; /* Has pristine version */
+ case svn_wc__db_status_deleted:
+ case svn_wc__db_status_not_present:
+ case svn_wc__db_status_absent:
+ case svn_wc__db_status_excluded:
+#ifndef SVN_WC__SINGLE_DB
+ case svn_wc__db_status_obstructed:
+ case svn_wc__db_status_obstructed_add:
+ case svn_wc__db_status_obstructed_delete:
+#endif
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' can not be restored."),
+ svn_dirent_local_style(local_abspath,
scratch_pool));
+ }
+
+ if (kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_symlink)
+ SVN_ERR(restore_file(wc_ctx->db, local_abspath, use_commit_times, FALSE,
+ scratch_pool));
+ else
+#ifdef SVN_WC__SINGLE_DB
+ SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool));
+#else
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' can not be restored."),
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
+#endif
+
+ return SVN_NO_ERROR;
}
/* Try to restore LOCAL_ABSPATH of node type KIND and if successfull,
@@ -116,7 +189,7 @@ restore_node(svn_boolean_t *restored,
if (kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_symlink)
{
/* Recreate file from text-base */
- SVN_ERR(restore_file(db, local_abspath, use_commit_times,
+ SVN_ERR(restore_file(db, local_abspath, use_commit_times, TRUE,
scratch_pool));
*restored = TRUE;