This patch allows you to commit files without providing
get_func. Current code will lose information because it
will succeed to commit even when it should result in
conflict. It should version_url according to revision,
which is not always the latest revision.
My losssage in commit happened the same way because somehow
I mistyped and the code always used rsrc->url instead of the
URL based on the baseline collection.
Probably created flag in add_child can be removed because
revision is valid => created is false
revision is invalid => created is true
but I wanted to post this first to see whether this patch
is the right approach.
* commit.c
(get_version_url): Take revision as argument. Returns the
property of the latest revision when revision is invalid.
Otherwise, get the property of specified revision.
(add_child): Take revision as argument and pass it to
get_version_url.
(commit_open_root): Pass SVN_INVALID_REVNUM to get_version_url.
(commit_add_dir): Pass SVN_INVALID_REVNUM to add_child.
(commit_open_dir): Pass base_revision to add_child.
(commit_add_file): Pass SVN_INVALID_REVNUM to add_child.
(commit_open_file): Pass base_revision to add_child.
Index: ./subversion/libsvn_ra_dav/commit.c
===================================================================
--- ./subversion/libsvn_ra_dav/.svn/text-base/commit.c.svn-base Thu Nov 29 15:56:53 2001
+++ ./subversion/libsvn_ra_dav/commit.c Thu Nov 29 16:15:00 2001
@@ -179,9 +179,11 @@
return NULL;
}
-static svn_error_t * get_version_url(commit_ctx_t *cc, resource_t *rsrc)
+static svn_error_t * get_version_url(commit_ctx_t *cc, resource_t *rsrc,
+ svn_revnum_t revision)
{
svn_ra_dav_resource_t *propres;
+ const char *url;
if (cc->get_func != NULL)
{
@@ -197,8 +199,31 @@
/* whoops. it wasn't there. go grab it from the server. */
}
-
- SVN_ERR( svn_ra_dav__get_props_resource(&propres, cc->ras->sess, rsrc->url,
+
+ if (revision == SVN_INVALID_REVNUM)
+ url = rsrc->url;
+ else
+ {
+ svn_string_t bc_url, bc_relative;
+ svn_stringbuf_t *bc;
+
+ SVN_ERR( svn_ra_dav__get_baseline_info(NULL,
+ &bc_url, &bc_relative, NULL,
+ cc->ras->sess,
+ rsrc->url,
+ revision,
+ cc->ras->pool));
+ bc = svn_stringbuf_create(bc_url.data, cc->ras->pool);
+ svn_path_add_component_nts(bc, bc_relative.data,
+ svn_path_url_style);
+
+ SVN_ERR( svn_ra_dav__get_props_resource(&propres, cc->ras->sess,
+ bc->data, NULL, fetch_props,
+ cc->ras->pool) );
+ url = bc->data;
+ }
+
+ SVN_ERR( svn_ra_dav__get_props_resource(&propres, cc->ras->sess, url,
NULL, fetch_props, cc->ras->pool) );
rsrc->vsn_url = apr_hash_get(propres->propset,
SVN_RA_DAV__PROP_CHECKED_IN,
@@ -287,7 +312,8 @@
commit_ctx_t *cc,
const resource_t *parent,
const char *name,
- int created)
+ int created,
+ svn_revnum_t revision)
{
apr_pool_t *pool = cc->ras->pool;
resource_t *rsrc;
@@ -313,9 +339,7 @@
This means it has a VR URL already, and the WR URL won't exist
until it's "checked out". */
else
- {
- SVN_ERR( get_version_url(cc, rsrc) );
- }
+ SVN_ERR( get_version_url(cc, rsrc, revision) );
apr_hash_set(cc->resources, rsrc->url, APR_HASH_KEY_STRING, rsrc);
@@ -548,7 +572,7 @@
/* ### should we use the WC symbol? (SVN_WC_ENTRY_THIS_DIR) */
rsrc->local_path = svn_stringbuf_create("", cc->ras->pool);
- SVN_ERR( get_version_url(cc, rsrc) );
+ SVN_ERR( get_version_url(cc, rsrc, SVN_INVALID_REVNUM) );
apr_hash_set(cc->resources, rsrc->url, APR_HASH_KEY_STRING, rsrc);
@@ -619,7 +643,8 @@
/* create a child object that contains all the resource urls */
child = apr_pcalloc(pool, sizeof(*child));
child->cc = parent->cc;
- SVN_ERR( add_child(&child->rsrc, parent->cc, parent->rsrc, name->data, 1) );
+ SVN_ERR( add_child(&child->rsrc, parent->cc, parent->rsrc,
+ name->data, 1, SVN_INVALID_REVNUM) );
if (! copyfrom_path)
{
@@ -692,7 +717,8 @@
resource_baton_t *child = apr_pcalloc(pool, sizeof(*child));
child->cc = parent->cc;
- SVN_ERR( add_child(&child->rsrc, parent->cc, parent->rsrc, name->data, 0) );
+ SVN_ERR( add_child(&child->rsrc, parent->cc, parent->rsrc,
+ name->data, 0, base_revision) );
/*
** Note: open_dir simply means that a change has occurred somewhere
@@ -761,7 +787,8 @@
/* Construct a file_baton that contains all the resource urls. */
file = apr_pcalloc(pool, sizeof(*file));
file->cc = parent->cc;
- SVN_ERR( add_child(&file->rsrc, parent->cc, parent->rsrc, name->data, 1) );
+ SVN_ERR( add_child(&file->rsrc, parent->cc, parent->rsrc,
+ name->data, 1, SVN_INVALID_REVNUM) );
if (! copyfrom_path)
{
@@ -831,7 +858,8 @@
file = apr_pcalloc(pool, sizeof(*file));
file->cc = parent->cc;
- SVN_ERR( add_child(&file->rsrc, parent->cc, parent->rsrc, name->data, 0) );
+ SVN_ERR( add_child(&file->rsrc, parent->cc, parent->rsrc,
+ name->data, 0, base_revision) );
/* do the CHECKOUT now. we'll PUT the new file contents later on. */
SVN_ERR( checkout_resource(parent->cc, file->rsrc) );
--
Yoshiki Hayashi
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:36:49 2006