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/03/14 17:13:43 UTC
svn commit: r922884 - in /subversion/trunk/subversion/libsvn_wc:
update_editor.c wc-queries.sql wc_db.c wc_db.h
Author: rhuijben
Date: Sun Mar 14 16:13:43 2010
New Revision: 922884
URL: http://svn.apache.org/viewvc?rev=922884&view=rev
Log:
Following up on r922839, replace the temporary start_directory_update()
function with a new temporary wc_db operation.
* subversion/libsvn_wc/update_editor.c
(start_directory_update): Remove function.
(open_root, open_directory):
Use svn_wc__db_temp_op_start_directory_update.
* subversion/libsvn_wc/wc-queries.sql
(STMT_UPDATE_BASE_PRESENCE_AND_REVNUM): New query.
(STMT_UPDATE_BASE_PRESENCE_REVNUM_AND_REPOS_RELPATH): New query.
* subversion/libsvn_wc/wc_db.c
(start_directory_update_baton): New struct.
(start_directory_update_txn): New function.
(svn_wc__db_temp_op_start_directory_update): New function.
* subversion/libsvn_wc/wc_db.h
(svn_wc__db_temp_op_start_directory_update): New function.
Modified:
subversion/trunk/subversion/libsvn_wc/update_editor.c
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/libsvn_wc/wc_db.h
Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=922884&r1=922883&r2=922884&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Sun Mar 14 16:13:43 2010
@@ -1338,38 +1338,6 @@ set_target_revision(void *edit_baton,
return SVN_NO_ERROR;
}
-/* Mark directory as being NEW_RELPATH at NEW_REV, but incomplete. */
-static svn_error_t *
-start_directory_update(svn_wc__db_t *db,
- const char *local_dir_abspath,
- const char *new_relpath,
- svn_revnum_t new_rev,
- apr_pool_t *scratch_pool)
-{
- svn_wc_entry_t tmp_entry;
- const char *repos_root;
-
- SVN_ERR(svn_wc__db_scan_base_repos(NULL, &repos_root, NULL, db,
- local_dir_abspath, scratch_pool,
- scratch_pool));
-
- tmp_entry.revision = new_rev;
- tmp_entry.url = svn_path_url_add_component2(repos_root, new_relpath,
- scratch_pool);
-
- SVN_ERR(svn_wc__entry_modify2(db, local_dir_abspath, svn_node_dir,
- FALSE, &tmp_entry,
- SVN_WC__ENTRY_MODIFY_REVISION
- | SVN_WC__ENTRY_MODIFY_URL,
- scratch_pool));
-
- SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(db, local_dir_abspath,
- TRUE, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-
/* An svn_delta_editor_t function. */
static svn_error_t *
open_root(void *edit_baton,
@@ -1442,9 +1410,11 @@ open_root(void *edit_baton,
/* ### TODO: Skip if inside a conflicted tree. */
- SVN_ERR(start_directory_update(eb->db, db->local_abspath,
- db->new_relpath, *eb->target_revision,
- pool));
+ SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db,
+ db->local_abspath,
+ db->new_relpath,
+ *eb->target_revision,
+ pool));
}
return SVN_NO_ERROR;
@@ -3122,8 +3092,10 @@ open_directory(const char *path,
}
/* Mark directory as being at target_revision and URL, but incomplete. */
- SVN_ERR(start_directory_update(eb->db, db->local_abspath, db->new_relpath,
- *eb->target_revision, pool));
+ SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, db->local_abspath,
+ db->new_relpath,
+ *eb->target_revision,
+ pool));
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=922884&r1=922883&r2=922884&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Sun Mar 14 16:13:43 2010
@@ -243,6 +243,14 @@ where wc_id = ?1 and local_relpath = ?2;
update working_node set presence = ?3
where wc_id = ?1 and local_relpath =?2;
+-- STMT_UPDATE_BASE_PRESENCE_AND_REVNUM
+update base_node set presence = ?3, revnum = ?4
+where wc_id = ?1 and local_relpath = ?2;
+
+-- STMT_UPDATE_BASE_PRESENCE_REVNUM_AND_REPOS_RELPATH
+update base_node set presence = ?3, revnum = ?4, repos_relpath = ?5
+where wc_id = ?1 and local_relpath = ?2;
+
-- STMT_LOOK_FOR_WORK
SELECT id FROM WORK_QUEUE LIMIT 1;
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=922884&r1=922883&r2=922884&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Sun Mar 14 16:13:43 2010
@@ -6350,3 +6350,91 @@ svn_wc__db_temp_op_set_working_last_chan
return SVN_NO_ERROR;
}
+
+struct start_directory_update_baton
+{
+ svn_wc__db_t *db;
+ const char *local_abspath;
+ apr_int64_t wc_id;
+ const char *local_relpath;
+ svn_revnum_t new_rev;
+ const char *new_repos_relpath;
+};
+
+static svn_error_t *
+start_directory_update_txn(void *baton,
+ svn_sqlite__db_t *db,
+ apr_pool_t *scratch_pool)
+{
+ struct start_directory_update_baton *du = baton;
+ const char *repos_relpath;
+ svn_sqlite__stmt_t *stmt;
+
+ SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath, NULL, NULL,
+ du->db, du->local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (strcmp(du->new_repos_relpath, repos_relpath) == 0)
+ {
+ /* Just update revision and status */
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, db,
+ STMT_UPDATE_BASE_PRESENCE_AND_REVNUM));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "isti",
+ du->wc_id,
+ du->local_relpath,
+ presence_map, svn_wc__db_status_incomplete,
+ (apr_int64_t)du->new_rev));
+ }
+ else
+ {
+ /* ### TODO: Maybe check if we can make repos_relpath NULL. */
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, db,
+ STMT_UPDATE_BASE_PRESENCE_REVNUM_AND_REPOS_RELPATH));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "istis",
+ du->wc_id,
+ du->local_relpath,
+ presence_map, svn_wc__db_status_incomplete,
+ (apr_int64_t)du->new_rev,
+ du->new_repos_relpath));
+ }
+
+ return svn_error_return(svn_sqlite__step_done(stmt));
+}
+
+svn_error_t *
+svn_wc__db_temp_op_start_directory_update(svn_wc__db_t *db,
+ const char *local_abspath,
+ const char* new_repos_relpath,
+ svn_revnum_t new_rev,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_pdh_t *pdh;
+ struct start_directory_update_baton du;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(new_rev));
+ SVN_ERR_ASSERT(svn_relpath_is_canonical(new_repos_relpath, scratch_pool));
+
+ SVN_ERR(parse_local_abspath(&pdh, &du.local_relpath, db, local_abspath,
+ svn_sqlite__mode_readwrite,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_PDH(pdh);
+
+ du.db = db;
+ du.wc_id = pdh->wcroot->wc_id;
+ du.local_abspath = local_abspath;
+ du.new_rev = new_rev;
+ du.new_repos_relpath = new_repos_relpath;
+
+ SVN_ERR(svn_sqlite__with_transaction(pdh->wcroot->sdb,
+ start_directory_update_txn, &du,
+ scratch_pool));
+
+ flush_entries(pdh);
+
+ return SVN_NO_ERROR;
+}
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=922884&r1=922883&r2=922884&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Sun Mar 14 16:13:43 2010
@@ -2048,6 +2048,15 @@ svn_wc__db_temp_op_set_working_last_chan
const char *changed_author,
apr_pool_t *scratch_pool);
+/* Update the BASE_NODE of directory LOCAL_ABSPATH to be NEW_REPOS_RELPATH
+ at revision NEW_REV with status incomplete. */
+svn_error_t *
+svn_wc__db_temp_op_start_directory_update(svn_wc__db_t *db,
+ const char *local_abspath,
+ const char* new_repos_relpath,
+ svn_revnum_t new_rev,
+ apr_pool_t *scratch_pool);
+
/** @} */
Re: svn commit: r922884 - in /subversion/trunk/subversion/libsvn_wc:
update_editor.c wc-queries.sql wc_db.c wc_db.h
Posted by Greg Stein <gs...@gmail.com>.
On Sun, Mar 14, 2010 at 12:13, <rh...@apache.org> wrote:
>...
> +++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Sun Mar 14 16:13:43 2010
> @@ -243,6 +243,14 @@ where wc_id = ?1 and local_relpath = ?2;
> update working_node set presence = ?3
> where wc_id = ?1 and local_relpath =?2;
>
> +-- STMT_UPDATE_BASE_PRESENCE_AND_REVNUM
> +update base_node set presence = ?3, revnum = ?4
> +where wc_id = ?1 and local_relpath = ?2;
> +
> +-- STMT_UPDATE_BASE_PRESENCE_REVNUM_AND_REPOS_RELPATH
> +update base_node set presence = ?3, revnum = ?4, repos_relpath = ?5
> +where wc_id = ?1 and local_relpath = ?2;
As mentioned on IRC, you cannot update 'repos_relpath' without
ensuring that 'repos_id' follows along. The two columns must both be
set, or must both be null. You can't update one without the other.
>...
> +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Sun Mar 14 16:13:43 2010
> @@ -6350,3 +6350,91 @@ svn_wc__db_temp_op_set_working_last_chan
>
> return SVN_NO_ERROR;
> }
> +
> +struct start_directory_update_baton
> +{
> + svn_wc__db_t *db;
> + const char *local_abspath;
> + apr_int64_t wc_id;
> + const char *local_relpath;
> + svn_revnum_t new_rev;
> + const char *new_repos_relpath;
> +};
> +
> +static svn_error_t *
> +start_directory_update_txn(void *baton,
> + svn_sqlite__db_t *db,
> + apr_pool_t *scratch_pool)
> +{
> + struct start_directory_update_baton *du = baton;
> + const char *repos_relpath;
> + svn_sqlite__stmt_t *stmt;
> +
> + SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath, NULL, NULL,
> + du->db, du->local_abspath,
> + scratch_pool, scratch_pool));
> +
> + if (strcmp(du->new_repos_relpath, repos_relpath) == 0)
> + {
You're not validating that these came from the same repository. All
code in wc_db should enable/allow for mixed-repository working copies.
Especially where it is a simple strcmp() of the root (or uuid?).
If it is horrendous to support mixed-repos for some reason, then I
expect to see a large ### block noting the lack of capability and an
explanation why.
>...
> + else
> + {
> + /* ### TODO: Maybe check if we can make repos_relpath NULL. */
> + SVN_ERR(svn_sqlite__get_statement(
> + &stmt, db,
> + STMT_UPDATE_BASE_PRESENCE_REVNUM_AND_REPOS_RELPATH));
See comment above re: setting just one column.
>...
> +svn_error_t *
> +svn_wc__db_temp_op_start_directory_update(svn_wc__db_t *db,
> + const char *local_abspath,
> + const char* new_repos_relpath,
> + svn_revnum_t new_rev,
> + apr_pool_t *scratch_pool)
Style nit alert: mis-positioned *
>...
Cheers,
-g