You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/08/24 17:16:55 UTC
svn commit: r1161147 [5/9] - in /subversion/branches/revprop-packing: ./
build/ build/ac-macros/ notes/ subversion/bindings/ctypes-python/csvn/
subversion/bindings/ctypes-python/test/ subversion/bindings/javahl/native/
subversion/bindings/javahl/src/or...
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_neon/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_neon/util.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_neon/util.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_neon/util.c Wed Aug 24 15:16:50 2011
@@ -1589,8 +1589,9 @@ svn_ra_neon__uri_unparse(const ne_uri *u
/* Unparse uri. */
unparsed_uri = ne_uri_unparse(uri);
- /* Copy string to result pool. */
- result = apr_pstrdup(pool, unparsed_uri);
+ /* Copy string to result pool, and make sure it conforms to
+ Subversion rules */
+ result = svn_uri_canonicalize(unparsed_uri, pool);
/* Free neon's allocated copy. */
ne_free(unparsed_uri);
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/blame.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/blame.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/blame.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/blame.c Wed Aug 24 15:16:50 2011
@@ -159,8 +159,7 @@ create_propval(blame_info_t *info)
info->prop_attr_len + 1);
}
- /* Include the null term. */
- s = svn_string_ncreate(info->prop_attr, info->prop_attr_len + 1, info->pool);
+ s = svn_string_ncreate(info->prop_attr, info->prop_attr_len, info->pool);
if (info->prop_base64)
{
s = svn_base64_decode_string(s, info->pool);
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/commit.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/commit.c Wed Aug 24 15:16:50 2011
@@ -94,7 +94,7 @@ typedef struct commit_context_t {
typedef struct proppatch_context_t {
apr_pool_t *pool;
- const char *name;
+ const char *relpath;
const char *path;
commit_context_t *commit;
@@ -146,7 +146,10 @@ typedef struct dir_context_t {
/* Our parent */
struct dir_context_t *parent_dir;
- /* The directory name; if NULL, we're the 'root' */
+ /* The directory name; if "", we're the 'root' */
+ const char *relpath;
+
+ /* The basename of the directory. "" for the 'root' */
const char *name;
/* The base revision of the dir. */
@@ -178,6 +181,7 @@ typedef struct file_context_t {
dir_context_t *parent_dir;
+ const char *relpath;
const char *name;
/* The checked out context for this file. */
@@ -311,63 +315,24 @@ handle_checkout(serf_request_t *request,
return err;
}
-/* Return the relative path from DIR's topmost parent to DIR, in
- Subversion's internal path style, allocated in POOL. Use POOL for
- temporary work as well. */
-static const char *
-relative_dir_path(dir_context_t *dir, apr_pool_t *pool)
-{
- const char *rel_path = "";
- apr_array_header_t *components;
- dir_context_t *dir_ptr = dir;
- int i;
-
- components = apr_array_make(pool, 1, sizeof(const char *));
-
- for (dir_ptr = dir; dir_ptr; dir_ptr = dir_ptr->parent_dir)
- APR_ARRAY_PUSH(components, const char *) = dir_ptr->name;
-
- for (i = 0; i < components->nelts; i++)
- {
- rel_path = svn_relpath_join(rel_path,
- APR_ARRAY_IDX(components, i, const char *),
- pool);
- }
-
- return rel_path;
-}
-
-
-/* Return the relative path from FILE's topmost parent to FILE, in
- Subversion's internal path style, allocated in POOL. Use POOL for
- temporary work as well. */
-static const char *
-relative_file_path(file_context_t *f, apr_pool_t *pool)
-{
- const char *dir_path = relative_dir_path(f->parent_dir, pool);
- return svn_relpath_join(dir_path, f->name, pool);
-}
-
-
static svn_error_t *
checkout_dir(dir_context_t *dir)
{
checkout_context_t *checkout_ctx;
svn_ra_serf__handler_t *handler;
svn_error_t *err;
- dir_context_t *parent_dir = dir->parent_dir;
+ dir_context_t *p_dir = dir;
if (dir->checkout)
{
return SVN_NO_ERROR;
}
- /* Is one of our parent dirs newly added? If so, we're already
- * implicitly checked out.
- */
- while (parent_dir)
+ /* Is this directory or one of our parent dirs newly added?
+ * If so, we're already implicitly checked out. */
+ while (p_dir)
{
- if (parent_dir->added)
+ if (p_dir->added)
{
/* Implicitly checkout this dir now. */
dir->checkout = apr_pcalloc(dir->pool, sizeof(*dir->checkout));
@@ -376,12 +341,11 @@ checkout_dir(dir_context_t *dir)
dir->checkout->activity_url = dir->commit->activity_url;
dir->checkout->resource_url =
svn_path_url_add_component2(dir->parent_dir->checkout->resource_url,
- svn_relpath_basename(dir->name, NULL),
- dir->pool);
+ dir->name, dir->pool);
return SVN_NO_ERROR;
}
- parent_dir = parent_dir->parent_dir;
+ p_dir = p_dir->parent_dir;
}
/* Checkout our directory into the activity URL now. */
@@ -429,8 +393,7 @@ checkout_dir(dir_context_t *dir)
if (err->apr_err == SVN_ERR_FS_CONFLICT)
SVN_ERR_W(err, apr_psprintf(dir->pool,
_("Directory '%s' is out of date; try updating"),
- svn_dirent_local_style(relative_dir_path(dir, dir->pool),
- dir->pool)));
+ svn_dirent_local_style(dir->relpath, dir->pool)));
return err;
}
@@ -564,8 +527,8 @@ checkout_file(file_context_t *file)
file->checkout->activity_url = file->commit->activity_url;
file->checkout->resource_url =
svn_path_url_add_component2(parent_dir->checkout->resource_url,
- svn_relpath__is_child(parent_dir->name,
- file->name,
+ svn_relpath__is_child(parent_dir->relpath,
+ file->relpath,
file->pool),
file->pool);
return SVN_NO_ERROR;
@@ -586,7 +549,7 @@ checkout_file(file_context_t *file)
SVN_ERR(get_version_url(&(file->checkout->checkout_url),
file->commit->session, file->commit->conn,
- file->name, file->base_revision,
+ file->relpath, file->base_revision,
NULL, file->pool));
handler->body_delegate = create_checkout_body;
@@ -612,8 +575,7 @@ checkout_file(file_context_t *file)
if (err->apr_err == SVN_ERR_FS_CONFLICT)
SVN_ERR_W(err, apr_psprintf(file->pool,
_("File '%s' is out of date; try updating"),
- svn_dirent_local_style(relative_file_path(file, file->pool),
- file->pool)));
+ svn_dirent_local_style(file->relpath, file->pool)));
return err;
}
@@ -840,11 +802,11 @@ setup_proppatch_headers(serf_bucket_t *h
proppatch->base_revision));
}
- if (proppatch->name && proppatch->commit->lock_tokens)
+ if (proppatch->relpath && proppatch->commit->lock_tokens)
{
const char *token;
- token = apr_hash_get(proppatch->commit->lock_tokens, proppatch->name,
+ token = apr_hash_get(proppatch->commit->lock_tokens, proppatch->relpath,
APR_HASH_KEY_STRING);
if (token)
@@ -1062,7 +1024,7 @@ setup_put_headers(serf_bucket_t *headers
{
const char *token;
- token = apr_hash_get(ctx->commit->lock_tokens, ctx->name,
+ token = apr_hash_get(ctx->commit->lock_tokens, ctx->relpath,
APR_HASH_KEY_STRING);
if (token)
@@ -1119,9 +1081,8 @@ setup_copy_dir_headers(serf_bucket_t *he
else
{
uri.path = (char *)svn_path_url_add_component2(
- dir->parent_dir->checkout->resource_url,
- svn_relpath_basename(dir->name, pool),
- pool);
+ dir->parent_dir->checkout->resource_url,
+ dir->name, pool);
}
absolute_uri = apr_uri_unparse(pool, &uri, 0);
@@ -1399,6 +1360,7 @@ open_root(void *edit_baton,
dir->pool = dir_pool;
dir->commit = ctx;
dir->base_revision = base_revision;
+ dir->relpath = "";
dir->name = "";
dir->changed_props = apr_hash_make(dir->pool);
dir->removed_props = apr_hash_make(dir->pool);
@@ -1480,12 +1442,13 @@ open_root(void *edit_baton,
dir->pool = dir_pool;
dir->commit = ctx;
dir->base_revision = base_revision;
+ dir->relpath = "";
dir->name = "";
dir->changed_props = apr_hash_make(dir->pool);
dir->removed_props = apr_hash_make(dir->pool);
SVN_ERR(get_version_url(&dir->url, dir->commit->session,
- dir->commit->conn, dir->name,
+ dir->commit->conn, dir->relpath,
dir->base_revision, ctx->checked_in_url,
dir->pool));
ctx->checked_in_url = dir->url;
@@ -1564,7 +1527,7 @@ delete_entry(const char *path,
SVN_ERR(checkout_dir(dir));
delete_target = svn_path_url_add_component2(dir->checkout->resource_url,
svn_relpath_basename(path,
- pool),
+ NULL),
pool);
}
@@ -1659,7 +1622,8 @@ add_directory(const char *path,
dir->base_revision = SVN_INVALID_REVNUM;
dir->copy_revision = copyfrom_revision;
dir->copy_path = copyfrom_path;
- dir->name = apr_pstrdup(dir->pool, path);
+ dir->relpath = apr_pstrdup(dir->pool, path);
+ dir->name = svn_relpath_basename(dir->relpath, NULL);
dir->changed_props = apr_hash_make(dir->pool);
dir->removed_props = apr_hash_make(dir->pool);
@@ -1675,11 +1639,10 @@ add_directory(const char *path,
SVN_ERR(checkout_dir(parent));
dir->url = svn_path_url_add_component2(parent->commit->checked_in_url,
- path, dir->pool);
+ dir->name, dir->pool);
mkcol_target = svn_path_url_add_component2(
parent->checkout->resource_url,
- svn_relpath_basename(path, dir->pool),
- dir->pool);
+ dir->name, dir->pool);
}
handler = apr_pcalloc(dir->pool, sizeof(*handler));
@@ -1773,7 +1736,8 @@ open_directory(const char *path,
dir->added = FALSE;
dir->base_revision = base_revision;
- dir->name = apr_pstrdup(dir->pool, path);
+ dir->relpath = apr_pstrdup(dir->pool, path);
+ dir->name = svn_relpath_basename(dir->relpath, NULL);
dir->changed_props = apr_hash_make(dir->pool);
dir->removed_props = apr_hash_make(dir->pool);
@@ -1786,7 +1750,7 @@ open_directory(const char *path,
{
SVN_ERR(get_version_url(&dir->url,
dir->commit->session, dir->commit->conn,
- dir->name, dir->base_revision,
+ dir->relpath, dir->base_revision,
dir->commit->checked_in_url, dir->pool));
}
*child_baton = dir;
@@ -1864,7 +1828,7 @@ close_directory(void *dir_baton,
proppatch_ctx->pool = pool;
proppatch_ctx->progress.pool = pool;
proppatch_ctx->commit = dir->commit;
- proppatch_ctx->name = dir->name;
+ proppatch_ctx->relpath = dir->relpath;
proppatch_ctx->changed_props = dir->changed_props;
proppatch_ctx->removed_props = dir->removed_props;
proppatch_ctx->base_revision = dir->base_revision;
@@ -1903,7 +1867,8 @@ add_file(const char *path,
new_file->parent_dir = dir;
new_file->commit = dir->commit;
- new_file->name = apr_pstrdup(new_file->pool, path);
+ new_file->relpath = apr_pstrdup(new_file->pool, path);
+ new_file->name = svn_relpath_basename(new_file->relpath, NULL);
new_file->added = TRUE;
new_file->base_revision = SVN_INVALID_REVNUM;
new_file->copy_path = copy_path;
@@ -1926,8 +1891,7 @@ add_file(const char *path,
new_file->url =
svn_path_url_add_component2(dir->checkout->resource_url,
- svn_relpath_basename(path, new_file->pool),
- new_file->pool);
+ new_file->name, new_file->pool);
}
while (deleted_parent && deleted_parent[0] != '\0')
@@ -1993,7 +1957,8 @@ open_file(const char *path,
new_file->parent_dir = parent;
new_file->commit = parent->commit;
- new_file->name = apr_pstrdup(new_file->pool, path); /* TODO: basename? */
+ new_file->relpath = apr_pstrdup(new_file->pool, path);
+ new_file->name = svn_relpath_basename(new_file->relpath, NULL);
new_file->added = FALSE;
new_file->base_revision = base_revision;
new_file->changed_props = apr_hash_make(new_file->pool);
@@ -2214,7 +2179,7 @@ close_file(void *file_baton,
proppatch = apr_pcalloc(ctx->pool, sizeof(*proppatch));
proppatch->pool = ctx->pool;
proppatch->progress.pool = pool;
- proppatch->name = ctx->name;
+ proppatch->relpath = ctx->relpath;
proppatch->path = ctx->url;
proppatch->commit = ctx->commit;
proppatch->changed_props = ctx->changed_props;
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/locks.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/locks.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/locks.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/locks.c Wed Aug 24 15:16:50 2011
@@ -385,14 +385,6 @@ handle_lock(serf_request_t *request,
return err;
}
- /* 405 == Method Not Allowed (Occurs when trying to lock a working
- copy path which no longer exists at HEAD in the repository. */
- if (sl.code == 405)
- return svn_error_createf(SVN_ERR_FS_OUT_OF_DATE,
- NULL,
- _("Lock request failed: %d %s"),
- ctx->status_code, ctx->reason);
-
headers = serf_bucket_response_get_headers(response);
val = serf_bucket_headers_get(headers, SVN_DAV_LOCK_OWNER_HEADER);
@@ -588,6 +580,8 @@ svn_ra_serf__lock(svn_ra_session_t *ra_s
subpool = svn_pool_create(pool);
+ /* ### TODO for issue 2263: Send all the locks over the wire at once. This
+ loop is just a temporary shim. */
for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi))
{
svn_ra_serf__handler_t *handler;
@@ -691,6 +685,8 @@ svn_ra_serf__unlock(svn_ra_session_t *ra
subpool = svn_pool_create(pool);
+ /* ### TODO for issue 2263: Send all the locks over the wire at once. This
+ loop is just a temporary shim. */
for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))
{
svn_ra_serf__handler_t *handler;
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/merge.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/merge.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/merge.c Wed Aug 24 15:16:50 2011
@@ -294,8 +294,7 @@ end_merge(svn_ra_serf__xml_parser_t *par
href = apr_hash_get(info->props, "href", APR_HASH_KEY_STRING);
if (! svn_urlpath__is_ancestor(ctx->merge_url, href))
{
- /* ### need something better than APR_EGENERAL */
- return svn_error_createf(APR_EGENERAL, NULL,
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
_("A MERGE response for '%s' is not "
"a child of the destination ('%s')"),
href, ctx->merge_url);
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/ra_serf.h?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/ra_serf.h Wed Aug 24 15:16:50 2011
@@ -179,6 +179,9 @@ struct svn_ra_serf__session_t {
/* Connection timeout value */
long timeout;
+ /* HTTPv1 flags */
+ svn_tristate_t supports_deadprop_count;
+
/*** HTTP v2 protocol stuff. ***
*
* We assume that if mod_dav_svn sends one of the special v2 OPTIONs
@@ -626,6 +629,11 @@ struct svn_ra_serf__xml_parser_t {
See libsvn_ra_serf/util.c */
struct svn_ra_serf__pending_t *pending;
+
+ /* Response restart support */
+ const void *headers_baton; /* Last pointer to headers */
+ apr_off_t skip_size; /* Number of bytes to skip */
+ apr_off_t read_size; /* Number of bytes read from response */
};
/*
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/serf.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/serf.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/serf.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/serf.c Wed Aug 24 15:16:50 2011
@@ -39,10 +39,11 @@
#include "../libsvn_ra/ra_loader.h"
#include "svn_config.h"
#include "svn_delta.h"
-#include "svn_version.h"
#include "svn_dirent_uri.h"
+#include "svn_hash.h"
#include "svn_path.h"
#include "svn_time.h"
+#include "svn_version.h"
#include "private/svn_dav_protocol.h"
#include "private/svn_dep_compat.h"
@@ -386,6 +387,8 @@ svn_ra_serf__open(svn_ra_session_t *sess
serf_sess->session_url_str = apr_pstrdup(serf_sess->pool, repos_URL);
serf_sess->using_ssl = (svn_cstring_casecmp(url.scheme, "https") == 0);
+ serf_sess->supports_deadprop_count = svn_tristate_unknown;
+
serf_sess->capabilities = apr_hash_make(serf_sess->pool);
SVN_ERR(load_config(serf_sess, config, serf_sess->pool));
@@ -660,6 +663,8 @@ struct dirent_walker_baton_t {
/* Update the fields in this entry. */
svn_dirent_t *entry;
+ svn_tristate_t *supports_deadprop_count;
+
/* If allocations are necessary, then use this pool. */
apr_pool_t *result_pool;
};
@@ -685,9 +690,16 @@ dirent_walker(void *baton,
{
if(strcmp(name, "deadprop-count") == 0)
{
- apr_int64_t deadprop_count;
- SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
- dwb->entry->has_props = deadprop_count > 0;
+ if (*val->data)
+ {
+ apr_int64_t deadprop_count;
+ SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data));
+ dwb->entry->has_props = deadprop_count > 0;
+ if (dwb->supports_deadprop_count)
+ *dwb->supports_deadprop_count = svn_tristate_true;
+ }
+ else if (dwb->supports_deadprop_count)
+ *dwb->supports_deadprop_count = svn_tristate_false;
}
}
else if (strcmp(ns, "DAV:") == 0)
@@ -734,6 +746,8 @@ struct path_dirent_visitor_t {
apr_hash_t *full_paths;
apr_hash_t *base_paths;
const char *orig_path;
+ svn_tristate_t supports_deadprop_count;
+ apr_pool_t *result_pool;
};
static svn_error_t *
@@ -771,57 +785,74 @@ path_dirent_walker(void *baton,
}
dwb.entry = entry;
- dwb.result_pool = pool; /* ### fix this! */
+ dwb.supports_deadprop_count = &dirents->supports_deadprop_count;
+ dwb.result_pool = dirents->result_pool;
return svn_error_trace(dirent_walker(&dwb, ns, name, val, pool));
}
static const svn_ra_serf__dav_props_t *
-get_dirent_props(apr_uint32_t dirent_fields, apr_pool_t *pool)
+get_dirent_props(apr_uint32_t dirent_fields,
+ svn_ra_serf__session_t *session,
+ apr_pool_t *pool)
{
svn_ra_serf__dav_props_t *prop;
apr_array_header_t *props = apr_array_make
(pool, 7, sizeof(svn_ra_serf__dav_props_t));
- if (dirent_fields & SVN_DIRENT_KIND)
+ if (session->supports_deadprop_count != svn_tristate_false
+ || ! (dirent_fields & SVN_DIRENT_HAS_PROPS))
{
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "resourcetype";
- }
+ if (dirent_fields & SVN_DIRENT_KIND)
+ {
+ prop = apr_array_push(props);
+ prop->namespace = "DAV:";
+ prop->name = "resourcetype";
+ }
- if (dirent_fields & SVN_DIRENT_SIZE)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = "getcontentlength";
- }
+ if (dirent_fields & SVN_DIRENT_SIZE)
+ {
+ prop = apr_array_push(props);
+ prop->namespace = "DAV:";
+ prop->name = "getcontentlength";
+ }
- if (dirent_fields & SVN_DIRENT_HAS_PROPS)
- {
- prop = apr_array_push(props);
- prop->namespace = SVN_DAV_PROP_NS_DAV;
- prop->name = "deadprop-count";
- }
+ if (dirent_fields & SVN_DIRENT_HAS_PROPS)
+ {
+ prop = apr_array_push(props);
+ prop->namespace = SVN_DAV_PROP_NS_DAV;
+ prop->name = "deadprop-count";
+ }
- if (dirent_fields & SVN_DIRENT_CREATED_REV)
- {
- svn_ra_serf__dav_props_t *p = apr_array_push(props);
- p->namespace = "DAV:";
- p->name = SVN_DAV__VERSION_NAME;
- }
+ if (dirent_fields & SVN_DIRENT_CREATED_REV)
+ {
+ svn_ra_serf__dav_props_t *p = apr_array_push(props);
+ p->namespace = "DAV:";
+ p->name = SVN_DAV__VERSION_NAME;
+ }
- if (dirent_fields & SVN_DIRENT_TIME)
- {
- prop = apr_array_push(props);
- prop->namespace = "DAV:";
- prop->name = SVN_DAV__CREATIONDATE;
- }
+ if (dirent_fields & SVN_DIRENT_TIME)
+ {
+ prop = apr_array_push(props);
+ prop->namespace = "DAV:";
+ prop->name = SVN_DAV__CREATIONDATE;
+ }
- if (dirent_fields & SVN_DIRENT_LAST_AUTHOR)
+ if (dirent_fields & SVN_DIRENT_LAST_AUTHOR)
+ {
+ prop = apr_array_push(props);
+ prop->namespace = "DAV:";
+ prop->name = "creator-displayname";
+ }
+ }
+ else
{
+ /* We found an old subversion server that can't handle
+ the deadprop-count property in the way we expect.
+
+ The neon behavior is to retrieve all properties in this case */
prop = apr_array_push(props);
prop->namespace = "DAV:";
- prop->name = "creator-displayname";
+ prop->name = "allprop";
}
prop = apr_array_push(props);
@@ -845,10 +876,12 @@ svn_ra_serf__stat(svn_ra_session_t *ra_s
svn_revnum_t fetched_rev;
svn_error_t *err;
struct dirent_walker_baton_t dwb;
+ svn_tristate_t deadprop_count = svn_tristate_unknown;
err = fetch_path_props(&prop_ctx, &props, &path, &fetched_rev,
session, rel_path, revision,
- get_dirent_props(SVN_DIRENT_ALL, pool), pool);
+ get_dirent_props(SVN_DIRENT_ALL, session, pool),
+ pool);
if (err)
{
if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
@@ -862,11 +895,33 @@ svn_ra_serf__stat(svn_ra_session_t *ra_s
}
dwb.entry = apr_pcalloc(pool, sizeof(*dwb.entry));
- dwb.result_pool = pool; /* ### fix this */
+ dwb.supports_deadprop_count = &deadprop_count;
+ dwb.result_pool = pool;
SVN_ERR(svn_ra_serf__walk_all_props(props, path, fetched_rev,
dirent_walker, &dwb,
pool));
+ if (deadprop_count == svn_tristate_false
+ && session->supports_deadprop_count == svn_tristate_unknown
+ && !dwb.entry->has_props)
+ {
+ /* We have to requery as the server didn't give us the right
+ information */
+ session->supports_deadprop_count = svn_tristate_false;
+
+ SVN_ERR(fetch_path_props(&prop_ctx, &props, &path, &fetched_rev,
+ session, rel_path, fetched_rev,
+ get_dirent_props(SVN_DIRENT_ALL, session, pool),
+ pool));
+
+ SVN_ERR(svn_ra_serf__walk_all_props(props, path, fetched_rev,
+ dirent_walker, &dwb,
+ pool));
+ }
+
+ if (deadprop_count != svn_tristate_unknown)
+ session->supports_deadprop_count = deadprop_count;
+
*dirent = dwb.entry;
return SVN_NO_ERROR;
@@ -943,7 +998,7 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
SVN_ERR(svn_ra_serf__retrieve_props(&props, session, session->conns[0],
path, revision, "1",
get_dirent_props(dirent_fields,
- pool),
+ session, pool),
pool, pool));
/* Check if the path is really a directory. */
@@ -956,11 +1011,38 @@ svn_ra_serf__get_dir(svn_ra_session_t *r
dirent_walk.full_paths = apr_hash_make(pool);
dirent_walk.base_paths = apr_hash_make(pool);
dirent_walk.orig_path = svn_urlpath__canonicalize(path, pool);
+ dirent_walk.supports_deadprop_count = svn_tristate_unknown;
+ dirent_walk.result_pool = pool;
SVN_ERR(svn_ra_serf__walk_all_paths(props, revision, path_dirent_walker,
&dirent_walk, pool));
+ if (dirent_walk.supports_deadprop_count == svn_tristate_false
+ && session->supports_deadprop_count == svn_tristate_unknown
+ && dirent_fields & SVN_DIRENT_HAS_PROPS)
+ {
+ /* We have to requery as the server didn't give us the right
+ information */
+ session->supports_deadprop_count = svn_tristate_false;
+ SVN_ERR(svn_ra_serf__retrieve_props(&props, session,
+ session->conns[0],
+ path, revision, "1",
+ get_dirent_props(dirent_fields,
+ session, pool),
+ pool, pool));
+
+ SVN_ERR(svn_hash__clear(dirent_walk.full_paths, pool));
+ SVN_ERR(svn_hash__clear(dirent_walk.base_paths, pool));
+
+ SVN_ERR(svn_ra_serf__walk_all_paths(props, revision,
+ path_dirent_walker,
+ &dirent_walk, pool));
+ }
+
*dirents = dirent_walk.base_paths;
+
+ if (dirent_walk.supports_deadprop_count != svn_tristate_unknown)
+ session->supports_deadprop_count = dirent_walk.supports_deadprop_count;
}
/* If we're asked for the directory properties, fetch them too. */
@@ -1028,7 +1110,7 @@ svn_ra_serf__get_uuid(svn_ra_session_t *
SVN_ERR(svn_ra_serf__discover_vcc(&vcc_url, session, NULL, pool));
if (!session->uuid)
{
- return svn_error_create(APR_EGENERAL, NULL,
+ return svn_error_create(SVN_ERR_RA_DAV_RESPONSE_HEADER_BADNESS, NULL,
_("The UUID property was not found on the "
"resource or any of its parents"));
}
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/update.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/update.c Wed Aug 24 15:16:50 2011
@@ -118,7 +118,7 @@ typedef struct report_dir_t
/* the canonical url for this directory after updating. (received) */
const char *url;
- /* The original repos_relpath of this url (from the workingcopy)
+ /* The original repos_relpath of this url (from the working copy)
or NULL if the repos_relpath can be calculated from the edit root. */
const char *repos_relpath;
@@ -918,6 +918,7 @@ handle_fetch(serf_request_t *request,
if (fetch_ctx->aborted_read)
{
+ apr_off_t skip;
/* We haven't caught up to where we were before. */
if (fetch_ctx->read_size < fetch_ctx->aborted_read_size)
{
@@ -938,9 +939,10 @@ handle_fetch(serf_request_t *request,
/* Woo-hoo. We're back. */
fetch_ctx->aborted_read = FALSE;
- /* Increment data and len by the difference. */
- data += fetch_ctx->read_size - fetch_ctx->aborted_read_size;
- len = fetch_ctx->read_size - fetch_ctx->aborted_read_size;
+ /* Update data and len to just provide the new data. */
+ skip = len - (fetch_ctx->read_size - fetch_ctx->aborted_read_size);
+ data += skip;
+ len -= skip;
}
if (fetch_ctx->delta_stream)
@@ -983,7 +985,12 @@ handle_fetch(serf_request_t *request,
### end of this block, so it will work for now. */
apr_pool_t *scratch_pool = info->editor_pool;
- err = info->textdelta(NULL, info->textdelta_baton);
+ if (fetch_ctx->delta_stream)
+ err = svn_error_trace(svn_stream_close(fetch_ctx->delta_stream));
+ else
+ err = svn_error_trace(info->textdelta(NULL,
+ info->textdelta_baton));
+
if (err)
{
return error_fetch(request, fetch_ctx, err);
@@ -1021,7 +1028,7 @@ handle_fetch(serf_request_t *request,
if (err)
{
- return error_fetch(request, fetch_ctx, err);
+ return svn_error_trace(error_fetch(request, fetch_ctx, err));
}
fetch_ctx->done = TRUE;
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_serf/util.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_serf/util.c Wed Aug 24 15:16:50 2011
@@ -821,7 +821,7 @@ start_error(svn_ra_serf__xml_parser_t *p
}
else
{
- ctx->error->apr_err = APR_EGENERAL;
+ ctx->error->apr_err = SVN_ERR_RA_DAV_REQUEST_FAILED;
}
/* Start collecting cdata. */
@@ -1497,6 +1497,21 @@ inject_to_parser(svn_ra_serf__xml_parser
return SVN_NO_ERROR;
}
+/* Apr pool cleanup handler to release an XML_Parser in success and error
+ conditions */
+static apr_status_t
+xml_parser_cleanup(void *baton)
+{
+ XML_Parser *xmlp = baton;
+
+ if (*xmlp)
+ {
+ XML_ParserFree(*xmlp);
+ *xmlp = NULL;
+ }
+
+ return APR_SUCCESS;
+}
svn_error_t *
svn_ra_serf__process_pending(svn_ra_serf__xml_parser_t *parser,
@@ -1633,7 +1648,7 @@ svn_ra_serf__process_pending(svn_ra_serf
return status. We just don't care. */
(void) XML_Parse(parser->xmlp, NULL, 0, 1);
- XML_ParserFree(parser->xmlp);
+ apr_pool_cleanup_run(parser->pool, &parser->xmlp, xml_parser_cleanup);
parser->xmlp = NULL;
add_done_item(parser);
}
@@ -1690,9 +1705,27 @@ svn_ra_serf__handle_xml_parser(serf_requ
return SVN_NO_ERROR;
}
+ if (ctx->headers_baton == NULL)
+ ctx->headers_baton = serf_bucket_response_get_headers(response);
+ else if (ctx->headers_baton != serf_bucket_response_get_headers(response))
+ {
+ /* We got a new response to an existing parser...
+ This tells us the connection has restarted and we should continue
+ where we stopped last time.
+ */
+
+ /* Is this a second attempt?? */
+ if (!ctx->skip_size)
+ ctx->skip_size = ctx->read_size;
+
+ ctx->read_size = 0; /* New request, nothing read */
+ }
+
if (!ctx->xmlp)
{
ctx->xmlp = XML_ParserCreate(NULL);
+ apr_pool_cleanup_register(ctx->pool, &ctx->xmlp, xml_parser_cleanup,
+ apr_pool_cleanup_null);
XML_SetUserData(ctx->xmlp, ctx);
XML_SetElementHandler(ctx->xmlp, start_xml, end_xml);
if (ctx->cdata)
@@ -1732,6 +1765,35 @@ svn_ra_serf__handle_xml_parser(serf_requ
return svn_error_wrap_apr(status, NULL);
}
+ ctx->read_size += len;
+
+ if (ctx->skip_size)
+ {
+ /* Handle restarted requests correctly: Skip what we already read */
+ apr_size_t skip;
+
+ if (ctx->skip_size >= ctx->read_size)
+ {
+ /* Eek. What did the file shrink or something? */
+ if (APR_STATUS_IS_EOF(status))
+ {
+ SVN_ERR_MALFUNCTION();
+ }
+
+ /* Skip on to the next iteration of this loop. */
+ if (APR_STATUS_IS_EAGAIN(status))
+ {
+ return svn_error_wrap_apr(status, NULL);
+ }
+ continue;
+ }
+
+ skip = (apr_size_t)(len - (ctx->read_size - ctx->skip_size));
+ data += skip;
+ len -= skip;
+ ctx->skip_size = 0;
+ }
+
/* Ensure that the parser's PAUSED state is correct before we test
the flag. */
PBTEST_SET_PAUSED(ctx);
@@ -1783,8 +1845,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
{
SVN_ERR_ASSERT(ctx->xmlp != NULL);
- XML_ParserFree(ctx->xmlp);
- ctx->xmlp = NULL;
+ apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
add_done_item(ctx);
return svn_error_trace(err);
}
@@ -1818,8 +1879,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
/* Ignore the return status. We just don't care. */
(void) XML_Parse(ctx->xmlp, NULL, 0, 1);
- XML_ParserFree(ctx->xmlp);
- ctx->xmlp = NULL;
+ apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
add_done_item(ctx);
}
@@ -2013,17 +2073,27 @@ handle_response(serf_request_t *request,
ctx->conn->last_status_code = sl.code;
- if (sl.code == 409 || sl.code >= 500)
+ if (sl.code == 405 || sl.code == 409 || sl.code >= 500)
{
- /* 409 Conflict: can indicate a hook error.
+ /* 405 Method Not allowed.
+ 409 Conflict: can indicate a hook error.
5xx (Internal) Server error. */
SVN_ERR(svn_ra_serf__handle_server_error(request, response, pool));
if (!ctx->session->pending_error)
{
+ apr_status_t apr_err = SVN_ERR_RA_DAV_REQUEST_FAILED;
+
+ /* 405 == Method Not Allowed (Occurs when trying to lock a working
+ copy path which no longer exists at HEAD in the repository. */
+
+ if (sl.code == 405 && !strcmp(ctx->method, "LOCK"))
+ apr_err = SVN_ERR_FS_OUT_OF_DATE;
+
return
- svn_error_createf(APR_EGENERAL, NULL,
- _("Unspecified error message: %d %s"), sl.code, sl.reason);
+ svn_error_createf(apr_err, NULL,
+ _("%s request on '%s' failed: %d %s"),
+ ctx->method, ctx->path, sl.code, sl.reason);
}
return SVN_NO_ERROR; /* Error is set in caller */
@@ -2249,7 +2319,7 @@ svn_ra_serf__discover_vcc(const char **v
if ((err->apr_err != SVN_ERR_FS_NOT_FOUND) &&
(err->apr_err != SVN_ERR_RA_DAV_FORBIDDEN))
{
- return err; /* found a _real_ error */
+ return svn_error_trace(err); /* found a _real_ error */
}
else
{
Modified: subversion/branches/revprop-packing/subversion/libsvn_ra_svn/cyrus_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_ra_svn/cyrus_auth.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_ra_svn/cyrus_auth.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_ra_svn/cyrus_auth.c Wed Aug 24 15:16:50 2011
@@ -28,7 +28,6 @@
#include <apr_want.h>
#include <apr_general.h>
#include <apr_strings.h>
-#include <apr_atomic.h>
#include <apr_thread_mutex.h>
#include <apr_version.h>
Modified: subversion/branches/revprop-packing/subversion/libsvn_repos/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_repos/log.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_repos/log.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_repos/log.c Wed Aug 24 15:16:50 2011
@@ -857,6 +857,9 @@ get_combined_mergeinfo_changes(svn_merge
iterpool));
mergeinfo = apr_hash_get(catalog, path, APR_HASH_KEY_STRING);
+ if (!prev_mergeinfo && !mergeinfo)
+ continue;
+
/* Compare, constrast, and combine the results. */
SVN_ERR(svn_mergeinfo_diff(&deleted, &added, prev_mergeinfo,
mergeinfo, FALSE, iterpool));
@@ -1514,6 +1517,7 @@ static svn_error_t *
do_logs(svn_fs_t *fs,
const apr_array_header_t *paths,
svn_mergeinfo_t log_target_history_as_mergeinfo,
+ svn_mergeinfo_t processed,
apr_hash_t *nested_merges,
svn_revnum_t hist_start,
svn_revnum_t hist_end,
@@ -1568,6 +1572,7 @@ handle_merged_revisions(svn_revnum_t rev
svn_fs_t *fs,
svn_mergeinfo_t log_target_history_as_mergeinfo,
apr_hash_t *nested_merges,
+ svn_mergeinfo_t processed,
svn_mergeinfo_t added_mergeinfo,
svn_mergeinfo_t deleted_mergeinfo,
svn_boolean_t discover_changed_paths,
@@ -1610,7 +1615,7 @@ handle_merged_revisions(svn_revnum_t rev
svn_pool_clear(iterpool);
SVN_ERR(do_logs(fs, pl_range->paths, log_target_history_as_mergeinfo,
- nested_merges,
+ processed, nested_merges,
pl_range->range.start, pl_range->range.end, 0,
discover_changed_paths, strict_node_history,
TRUE, pl_range->reverse_merge, TRUE, TRUE,
@@ -1633,6 +1638,115 @@ struct added_deleted_mergeinfo
svn_mergeinfo_t deleted_mergeinfo;
};
+/* Reduce the search range PATHS, HIST_START, HIST_END by removing
+ parts already covered by PROCESSED. If reduction is possible
+ elements may be removed from PATHS and *START_REDUCED and
+ *END_REDUCED may be set to a narrower range. */
+static svn_error_t *
+reduce_search(apr_array_header_t *paths,
+ svn_revnum_t *hist_start,
+ svn_revnum_t *hist_end,
+ svn_mergeinfo_t processed,
+ apr_pool_t *scratch_pool)
+{
+ /* We add 1 to end to compensate for store_search */
+ svn_revnum_t start = *hist_start <= *hist_end ? *hist_start : *hist_end;
+ svn_revnum_t end = *hist_start <= *hist_end ? *hist_end + 1 : *hist_start + 1;
+ int i;
+
+ for (i = 0; i < paths->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ apr_array_header_t *ranges = apr_hash_get(processed, path,
+ APR_HASH_KEY_STRING);
+ int j;
+
+ if (!ranges)
+ continue;
+
+ /* ranges is ordered, could we use some sort of binay search
+ rather than iterating? */
+ for (j = 0; j < ranges->nelts; ++j)
+ {
+ svn_merge_range_t *range = APR_ARRAY_IDX(ranges, j,
+ svn_merge_range_t *);
+ if (range->start <= start && range->end >= end)
+ {
+ for (j = i; j < paths->nelts - 1; ++j)
+ APR_ARRAY_IDX(paths, j, const char *)
+ = APR_ARRAY_IDX(paths, j + 1, const char *);
+
+ --paths->nelts;
+ --i;
+ break;
+ }
+
+ /* If there is only one path then we also check for a
+ partial overlap rather than the full overlap above, and
+ reduce the [hist_start, hist_end] range rather than
+ dropping the path. */
+ if (paths->nelts == 1)
+ {
+ if (range->start <= start && range->end > start)
+ {
+ if (start == *hist_start)
+ *hist_start = range->end - 1;
+ else
+ *hist_end = range->end - 1;
+ break;
+ }
+ if (range->start < end && range->end >= end)
+ {
+ if (start == *hist_start)
+ *hist_end = range->start;
+ else
+ *hist_start = range->start;
+ break;
+ }
+ }
+ }
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Extend PROCESSED to cover PATHS from HIST_START to HIST_END */
+static svn_error_t *
+store_search(svn_mergeinfo_t processed,
+ const apr_array_header_t *paths,
+ svn_revnum_t hist_start,
+ svn_revnum_t hist_end,
+ apr_pool_t *scratch_pool)
+{
+ /* We add 1 to end so that we can use the mergeinfo API to handle
+ singe revisions where HIST_START is equal to HIST_END. */
+ svn_revnum_t start = hist_start <= hist_end ? hist_start : hist_end;
+ svn_revnum_t end = hist_start <= hist_end ? hist_end + 1 : hist_start + 1;
+ svn_mergeinfo_t mergeinfo = apr_hash_make(scratch_pool);
+ apr_pool_t *processed_pool = apr_hash_pool_get(processed);
+ int i;
+
+ for (i = 0; i < paths->nelts; ++i)
+ {
+ const char *path = APR_ARRAY_IDX(paths, i, const char *);
+ apr_array_header_t *ranges = apr_array_make(processed_pool, 1,
+ sizeof(svn_merge_range_t*));
+ svn_merge_range_t *range = apr_palloc(processed_pool,
+ sizeof(svn_merge_range_t));
+
+ range->start = start;
+ range->end = end;
+ range->inheritable = TRUE;
+ APR_ARRAY_PUSH(ranges, svn_merge_range_t *) = range;
+ apr_hash_set(mergeinfo, apr_pstrdup(processed_pool, path),
+ APR_HASH_KEY_STRING, ranges);
+ }
+ SVN_ERR(svn_mergeinfo_merge(processed, mergeinfo,
+ apr_hash_pool_get(processed)));
+
+ return SVN_NO_ERROR;
+}
+
/* Find logs for PATHS from HIST_START to HIST_END in FS, and invoke
RECEIVER with RECEIVER_BATON on them. If DESCENDING_ORDER is TRUE, send
the logs back as we find them, else buffer the logs and send them back
@@ -1657,12 +1771,17 @@ struct added_deleted_mergeinfo
do_logs()/send_logs()/handle_merge_revisions() recursions, see also the
argument of the same name in send_logs().
+ PROCESSED is a mergeinfo hash that represents the paths and
+ revisions that have already been searched. Allocated like
+ NESTED_MERGES above.
+
All other parameters are the same as svn_repos_get_logs4().
*/
static svn_error_t *
do_logs(svn_fs_t *fs,
const apr_array_header_t *paths,
svn_mergeinfo_t log_target_history_as_mergeinfo,
+ svn_mergeinfo_t processed,
apr_hash_t *nested_merges,
svn_revnum_t hist_start,
svn_revnum_t hist_end,
@@ -1691,6 +1810,20 @@ do_logs(svn_fs_t *fs,
int send_count = 0;
int i;
+ if (processed)
+ {
+ /* Casting away const. This only happens on recursive calls when
+ it is known to be safe because we allocated paths. */
+ SVN_ERR(reduce_search((apr_array_header_t *)paths, &hist_start, &hist_end,
+ processed, pool));
+ }
+
+ if (!paths->nelts)
+ return SVN_NO_ERROR;
+
+ if (processed)
+ SVN_ERR(store_search(processed, paths, hist_start, hist_end, pool));
+
/* We have a list of paths and a revision range. But we don't care
about all the revisions in the range -- only the ones in which
one of our paths was changed. So let's go figure out which
@@ -1779,11 +1912,13 @@ do_logs(svn_fs_t *fs,
recursions so we can track and squelch duplicates. */
subpool = svn_pool_create(pool);
nested_merges = apr_hash_make(subpool);
+ processed = apr_hash_make(subpool);
}
SVN_ERR(handle_merged_revisions(
current, fs,
log_target_history_as_mergeinfo, nested_merges,
+ processed,
added_mergeinfo, deleted_mergeinfo,
discover_changed_paths,
strict_node_history,
@@ -1882,6 +2017,7 @@ do_logs(svn_fs_t *fs,
SVN_ERR(handle_merged_revisions(current, fs,
log_target_history_as_mergeinfo,
nested_merges,
+ processed,
added_mergeinfo,
deleted_mergeinfo,
discover_changed_paths,
@@ -2092,7 +2228,7 @@ svn_repos_get_logs4(svn_repos_t *repos,
svn_pool_destroy(subpool);
}
- return do_logs(repos->fs, paths, paths_history_mergeinfo, NULL, start, end,
+ return do_logs(repos->fs, paths, paths_history_mergeinfo, NULL, NULL, start, end,
limit, discover_changed_paths, strict_node_history,
include_merged_revisions, FALSE, FALSE, FALSE, revprops,
descending_order, receiver, receiver_baton,
Modified: subversion/branches/revprop-packing/subversion/libsvn_repos/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_repos/repos.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_repos/repos.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_repos/repos.c Wed Aug 24 15:16:50 2011
@@ -364,6 +364,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
_("Creating start-commit hook"));
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end start-commit hook */
/* Pre-commit hook. */
@@ -454,6 +456,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
_("Creating pre-commit hook"));
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end pre-commit hook */
@@ -530,6 +534,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
_("Creating pre-revprop-change hook"));
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end pre-revprop-change hook */
@@ -620,6 +626,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
"Creating pre-lock hook");
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end pre-lock hook */
@@ -702,6 +710,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
"Creating pre-unlock hook");
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end pre-unlock hook */
@@ -762,6 +772,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
_("Creating post-commit hook"));
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end post-commit hook */
@@ -823,6 +835,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
"Creating post-lock hook");
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end post-lock hook */
@@ -882,6 +896,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
"Creating post-unlock hook");
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end post-unlock hook */
@@ -948,6 +964,8 @@ PREWRITTEN_HOOKS_TEXT
SVN_ERR_W(svn_io_file_create(this_path, contents, pool),
_("Creating post-revprop-change hook"));
+
+ SVN_ERR(svn_io_set_file_executable(this_path, TRUE, FALSE, pool));
} /* end post-revprop-change hook */
return SVN_NO_ERROR;
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/cmdline.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/cmdline.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/cmdline.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/cmdline.c Wed Aug 24 15:16:50 2011
@@ -37,7 +37,6 @@
#include <apr_errno.h> /* for apr_strerror */
#include <apr_general.h> /* for apr_initialize/apr_terminate */
-#include <apr_atomic.h> /* for apr_atomic_init */
#include <apr_strings.h> /* for apr_snprintf */
#include <apr_pools.h>
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/io.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/io.c Wed Aug 24 15:16:50 2011
@@ -2118,12 +2118,6 @@ svn_io_remove_file2(const char *path,
apr_status_t apr_err;
const char *path_apr;
-#if defined(WIN32) || defined(__OS2__)
- /* Set the file writable but only on Windows & OS/2, because Windows and OS/2
- will not allow us to remove files that are read-only. */
- SVN_ERR(svn_io_set_file_read_write(path, TRUE, scratch_pool));
-#endif /* WIN32 */
-
SVN_ERR(cstring_from_utf8(&path_apr, path, scratch_pool));
apr_err = apr_file_remove(path_apr, scratch_pool);
@@ -2132,6 +2126,19 @@ svn_io_remove_file2(const char *path,
return SVN_NO_ERROR;
#ifdef WIN32
+ /* If the target is read only NTFS reports EACCESS and FAT/FAT32
+ reports EEXIST */
+ if (APR_STATUS_IS_EACCES(apr_err) || APR_STATUS_IS_EEXIST(apr_err))
+ {
+ /* Set the destination file writable because Windows will not
+ allow us to delete when path is read-only */
+ SVN_ERR(svn_io_set_file_read_write(path, ignore_enoent, scratch_pool));
+ apr_err = apr_file_remove(path_apr, scratch_pool);
+
+ if (!apr_err)
+ return SVN_NO_ERROR;
+ }
+
{
apr_status_t os_err = APR_TO_OS_ERROR(apr_err);
/* Check to make sure we aren't trying to delete a directory */
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/magic.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/magic.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/magic.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/magic.c Wed Aug 24 15:16:50 2011
@@ -45,8 +45,9 @@
struct svn_magic__cookie_t {
#ifdef SVN_HAVE_LIBMAGIC
magic_t magic;
-#endif
+#else
char dummy;
+#endif
};
#ifdef SVN_HAVE_LIBMAGIC
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/svn_cache_config.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/svn_cache_config.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/svn_cache_config.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/svn_cache_config.c Wed Aug 24 15:16:50 2011
@@ -113,6 +113,7 @@ svn_cache__get_global_membuffer_cache(vo
apr_pool_create_ex(&pool, NULL, NULL, allocator);
if (pool == NULL)
return NULL;
+ apr_allocator_owner_set(allocator, pool);
err = svn_cache__membuffer_cache_create(
&new_cache,
@@ -146,6 +147,9 @@ svn_cache__get_global_membuffer_cache(vo
/* Handle race condition: if we are the first to create a
* cache object, make it our global singleton. Otherwise,
* discard the new cache and keep the existing one.
+ *
+ * Cast is necessary because of APR bug:
+ * https://issues.apache.org/bugzilla/show_bug.cgi?id=50731
*/
old_cache = apr_atomic_casptr((volatile void **)&cache, new_cache, NULL);
if (old_cache != NULL)
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/utf.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/utf.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/utf.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/utf.c Wed Aug 24 15:16:50 2011
@@ -90,8 +90,8 @@ static apr_hash_t *xlate_handle_hash = N
* using atomic xchange ops, i.e. without further thread synchronization.
* If the respective item is NULL, fallback to hash lookup.
*/
-static volatile void *xlat_ntou_static_handle = NULL;
-static volatile void *xlat_uton_static_handle = NULL;
+static void * volatile xlat_ntou_static_handle = NULL;
+static void * volatile xlat_uton_static_handle = NULL;
/* Clean up the xlate handle cache. */
static apr_status_t
@@ -182,11 +182,13 @@ get_xlate_key(const char *topage,
* the caller.
*/
static APR_INLINE void*
-atomic_swap(volatile void **mem, void *new_value)
+atomic_swap(void * volatile * mem, void *new_value)
{
#if APR_HAS_THREADS
#if APR_VERSION_AT_LEAST(1,3,0)
- return apr_atomic_xchgptr(mem, new_value);
+ /* Cast is necessary because of APR bug:
+ https://issues.apache.org/bugzilla/show_bug.cgi?id=50731 */
+ return apr_atomic_xchgptr((volatile void **)mem, new_value);
#else
/* old APRs don't support atomic swaps. Simply return the
* input to the caller for further proccessing. */
Modified: subversion/branches/revprop-packing/subversion/libsvn_subr/validate.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_subr/validate.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_subr/validate.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_subr/validate.c Wed Aug 24 15:16:50 2011
@@ -45,6 +45,7 @@ svn_mime_type_validate(const char *mime_
specification, e.g., "text/html; charset=UTF-8", make sure we're
only looking at the media type here. */
const apr_size_t len = strcspn(mime_type, "; ");
+ const apr_size_t len2 = strlen(mime_type);
const char *const slash_pos = strchr(mime_type, '/');
apr_size_t i;
const char *tspecials = "()<>@,;:\\\"/[]?=";
@@ -69,7 +70,19 @@ svn_mime_type_validate(const char *mime_
|| (strchr(tspecials, mime_type[i]) != NULL)))
return svn_error_createf
(SVN_ERR_BAD_MIME_TYPE, NULL,
- _("MIME type '%s' contains invalid character '%c'"),
+ _("MIME type '%s' contains invalid character '%c' "
+ "in media type"),
+ mime_type, mime_type[i]);
+ }
+
+ /* Check the whole string for unsafe characters. (issue #2872) */
+ for (i = 0; i < len2; i++)
+ {
+ if (svn_ctype_iscntrl(mime_type[i]) && mime_type[i] != '\t')
+ return svn_error_createf(
+ SVN_ERR_BAD_MIME_TYPE, NULL,
+ _("MIME type '%s' contains invalid character '0x%02x' "
+ "in postfix"),
mime_type, mime_type[i]);
}
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/adm_ops.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/adm_ops.c Wed Aug 24 15:16:50 2011
@@ -29,6 +29,7 @@
#include <string.h>
+#include <stdlib.h>
#include <apr_pools.h>
#include <apr_tables.h>
@@ -1291,6 +1292,136 @@ remove_conflict_file(svn_boolean_t *noti
}
+/* Sort copied children obtained from the revert list based on
+ * their paths in descending order (longest paths first). */
+static int
+compare_revert_list_copied_children(const void *a, const void *b)
+{
+ const svn_wc__db_revert_list_copied_child_info_t *ca = a;
+ const svn_wc__db_revert_list_copied_child_info_t *cb = b;
+ int i;
+
+ i = svn_path_compare_paths(ca->abspath, cb->abspath);
+
+ /* Reverse the result of svn_path_compare_paths() to achieve
+ * descending order. */
+ return -i;
+}
+
+
+/* Remove all reverted copied children from the directory at LOCAL_ABSPATH.
+ * If REMOVE_SELF is TRUE, try to remove LOCAL_ABSPATH itself (REMOVE_SELF
+ * should be set if LOCAL_ABSPATH is itself a reverted copy).
+ *
+ * If REMOVED_SELF is not NULL, indicate in *REMOVED_SELF whether
+ * LOCAL_ABSPATH itself was removed.
+ *
+ * All reverted copied file children are removed from disk. Reverted copied
+ * directories left empty as a result are also removed from disk.
+ */
+static svn_error_t *
+revert_restore_handle_copied_dirs(svn_boolean_t *removed_self,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_boolean_t remove_self,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ const apr_array_header_t *copied_children;
+ svn_wc__db_revert_list_copied_child_info_t *child_info;
+ int i;
+ svn_node_kind_t on_disk;
+ apr_pool_t *iterpool;
+ svn_error_t *err;
+
+ if (removed_self)
+ *removed_self = FALSE;
+
+ SVN_ERR(svn_wc__db_revert_list_read_copied_children(&copied_children,
+ db, local_abspath,
+ scratch_pool,
+ scratch_pool));
+ iterpool = svn_pool_create(scratch_pool);
+
+ /* Remove all copied file children. */
+ for (i = 0; i < copied_children->nelts; i++)
+ {
+ child_info = APR_ARRAY_IDX(
+ copied_children, i,
+ svn_wc__db_revert_list_copied_child_info_t *);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ if (child_info->kind != svn_wc__db_kind_file)
+ continue;
+
+ svn_pool_clear(iterpool);
+
+ /* Make sure what we delete from disk is really a file. */
+ SVN_ERR(svn_io_check_path(child_info->abspath, &on_disk, iterpool));
+ if (on_disk != svn_node_file)
+ continue;
+
+ SVN_ERR(svn_io_remove_file2(child_info->abspath, TRUE, iterpool));
+ }
+
+ /* Delete every empty child directory.
+ * We cannot delete children recursively since we want to keep any files
+ * that still exist on disk (e.g. unversioned files within the copied tree).
+ * So sort the children list such that longest paths come first and try to
+ * remove each child directory in order. */
+ qsort(copied_children->elts, copied_children->nelts,
+ sizeof(svn_wc__db_revert_list_copied_child_info_t *),
+ compare_revert_list_copied_children);
+ for (i = 0; i < copied_children->nelts; i++)
+ {
+ child_info = APR_ARRAY_IDX(
+ copied_children, i,
+ svn_wc__db_revert_list_copied_child_info_t *);
+
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
+
+ if (child_info->kind != svn_wc__db_kind_dir)
+ continue;
+
+ svn_pool_clear(iterpool);
+
+ err = svn_io_dir_remove_nonrecursive(child_info->abspath, iterpool);
+ if (err)
+ {
+ if (APR_STATUS_IS_ENOENT(err->apr_err) ||
+ SVN__APR_STATUS_IS_ENOTDIR(err->apr_err) ||
+ APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+ svn_error_clear(err);
+ else
+ return svn_error_trace(err);
+ }
+ }
+
+ if (remove_self)
+ {
+ /* Delete LOCAL_ABSPATH itself if no children are left. */
+ err = svn_io_dir_remove_nonrecursive(local_abspath, iterpool);
+ if (err)
+ {
+ if (APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+ svn_error_clear(err);
+ else
+ return svn_error_trace(err);
+ }
+ else if (removed_self)
+ *removed_self = TRUE;
+ }
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
/* Make the working tree under LOCAL_ABSPATH to depth DEPTH match the
versioned tree. This function is called after svn_wc__db_op_revert
has done the database revert and created the revert list. Notifies
@@ -1321,6 +1452,8 @@ revert_restore(svn_wc__db_t *db,
#ifdef HAVE_SYMLINK
svn_boolean_t special;
#endif
+ svn_boolean_t copied_here;
+ svn_wc__db_kind_t reverted_kind;
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
@@ -1328,6 +1461,7 @@ revert_restore(svn_wc__db_t *db,
SVN_ERR(svn_wc__db_revert_list_read(¬ify_required,
&conflict_old, &conflict_new,
&conflict_working, &prop_reject,
+ &copied_here, &reverted_kind,
db, local_abspath,
scratch_pool, scratch_pool));
@@ -1342,17 +1476,31 @@ revert_restore(svn_wc__db_t *db,
{
svn_error_clear(err);
- if (notify_func && notify_required)
- notify_func(notify_baton,
- svn_wc_create_notify(local_abspath, svn_wc_notify_revert,
- scratch_pool),
- scratch_pool);
-
- if (notify_func)
- SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
- db, local_abspath,
- scratch_pool));
- return SVN_NO_ERROR;
+ if (!copied_here)
+ {
+ if (notify_func && notify_required)
+ notify_func(notify_baton,
+ svn_wc_create_notify(local_abspath,
+ svn_wc_notify_revert,
+ scratch_pool),
+ scratch_pool);
+
+ if (notify_func)
+ SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
+ db, local_abspath,
+ scratch_pool));
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ /* ### Initialise to values which prevent the code below from
+ * ### trying to restore anything to disk.
+ * ### 'status' should be status_unknown but that doesn't exist. */
+ status = svn_wc__db_status_normal;
+ kind = svn_wc__db_kind_unknown;
+ recorded_size = SVN_INVALID_FILESIZE;
+ recorded_mod_time = 0;
+ }
}
else if (err)
return svn_error_trace(err);
@@ -1387,6 +1535,27 @@ revert_restore(svn_wc__db_t *db,
#endif
}
+ if (copied_here)
+ {
+ /* The revert target itself is the op-root of a copy. */
+ if (reverted_kind == svn_wc__db_kind_file && on_disk == svn_node_file)
+ {
+ SVN_ERR(svn_io_remove_file2(local_abspath, TRUE, scratch_pool));
+ on_disk = svn_node_none;
+ }
+ else if (reverted_kind == svn_wc__db_kind_dir && on_disk == svn_node_dir)
+ {
+ svn_boolean_t removed;
+
+ SVN_ERR(revert_restore_handle_copied_dirs(&removed, db,
+ local_abspath, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+ if (removed)
+ on_disk = svn_node_none;
+ }
+ }
+
/* If we expect a versioned item to be present then check that any
item on disk matches the versioned item, if it doesn't match then
fix it or delete it. */
@@ -1567,6 +1736,10 @@ revert_restore(svn_wc__db_t *db,
const apr_array_header_t *children;
int i;
+ SVN_ERR(revert_restore_handle_copied_dirs(NULL, db, local_abspath, FALSE,
+ cancel_func, cancel_baton,
+ iterpool));
+
SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
local_abspath,
scratch_pool,
@@ -2327,9 +2500,11 @@ svn_wc__internal_changelist_match(svn_wc
return FALSE;
}
+ /* The empty changelist name is special-cased. */
return (changelist
- && apr_hash_get((apr_hash_t *)clhash, changelist,
- APR_HASH_KEY_STRING) != NULL);
+ ? apr_hash_get((apr_hash_t *)clhash, changelist, APR_HASH_KEY_STRING)
+ : apr_hash_get((apr_hash_t *)clhash, "", APR_HASH_KEY_STRING)
+ ) != NULL;
}
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/ambient_depth_filter_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/ambient_depth_filter_editor.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/ambient_depth_filter_editor.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/ambient_depth_filter_editor.c Wed Aug 24 15:16:50 2011
@@ -308,7 +308,7 @@ make_file_baton(struct file_baton **f_p,
/*** Editor Functions ***/
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
set_target_revision(void *edit_baton,
svn_revnum_t target_revision,
@@ -321,7 +321,7 @@ set_target_revision(void *edit_baton,
target_revision, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
open_root(void *edit_baton,
svn_revnum_t base_revision,
@@ -362,7 +362,7 @@ open_root(void *edit_baton,
pool, &b->wrapped_baton);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
delete_entry(const char *path,
svn_revnum_t base_revision,
@@ -400,7 +400,7 @@ delete_entry(const char *path,
pb->wrapped_baton, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
add_directory(const char *path,
void *parent_baton,
@@ -446,7 +446,7 @@ add_directory(const char *path,
pool, &b->wrapped_baton);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
open_directory(const char *path,
void *parent_baton,
@@ -491,7 +491,7 @@ open_directory(const char *path,
return SVN_NO_ERROR;
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
add_file(const char *path,
void *parent_baton,
@@ -515,7 +515,7 @@ add_file(const char *path,
pool, &b->wrapped_baton);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
open_file(const char *path,
void *parent_baton,
@@ -537,7 +537,7 @@ open_file(const char *path,
&b->wrapped_baton);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
apply_textdelta(void *file_baton,
const char *base_checksum,
@@ -561,7 +561,7 @@ apply_textdelta(void *file_baton,
handler, handler_baton);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
close_file(void *file_baton,
const char *text_checksum,
@@ -577,7 +577,7 @@ close_file(void *file_baton,
text_checksum, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
absent_file(const char *path,
void *parent_baton,
@@ -592,7 +592,7 @@ absent_file(const char *path,
return eb->wrapped_editor->absent_file(path, pb->wrapped_baton, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
close_directory(void *dir_baton,
apr_pool_t *pool)
@@ -606,7 +606,7 @@ close_directory(void *dir_baton,
return eb->wrapped_editor->close_directory(db->wrapped_baton, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
absent_directory(const char *path,
void *parent_baton,
@@ -622,7 +622,7 @@ absent_directory(const char *path,
return eb->wrapped_editor->absent_directory(path, pb->wrapped_baton, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
change_file_prop(void *file_baton,
const char *name,
@@ -639,7 +639,7 @@ change_file_prop(void *file_baton,
name, value, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
change_dir_prop(void *dir_baton,
const char *name,
@@ -656,7 +656,7 @@ change_dir_prop(void *dir_baton,
name, value, pool);
}
-/* */
+/* An svn_delta_editor_t function. */
static svn_error_t *
close_edit(void *edit_baton,
apr_pool_t *pool)
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/copy.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/copy.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/copy.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/copy.c Wed Aug 24 15:16:50 2011
@@ -627,6 +627,25 @@ copy_or_move(svn_wc_context_t *wc_ctx,
else
SVN_ERR(err);
+ switch (src_status)
+ {
+ case svn_wc__db_status_deleted:
+ return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+ _("Deleted node '%s' can't be copied."),
+ svn_dirent_local_style(src_abspath,
+ scratch_pool));
+
+ case svn_wc__db_status_excluded:
+ case svn_wc__db_status_server_excluded:
+ case svn_wc__db_status_not_present:
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("The node '%s' was not found."),
+ svn_dirent_local_style(src_abspath,
+ scratch_pool));
+ default:
+ break;
+ }
+
SVN_ERR(svn_wc__db_read_info(&dstdir_status, NULL, NULL, NULL,
&dst_repos_root_url, &dst_repos_uuid, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/diff_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/diff_editor.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/diff_editor.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/diff_editor.c Wed Aug 24 15:16:50 2011
@@ -1144,7 +1144,7 @@ report_wc_directory_as_added(struct edit
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
set_target_revision(void *edit_baton,
svn_revnum_t target_revision,
@@ -1156,7 +1156,7 @@ set_target_revision(void *edit_baton,
return SVN_NO_ERROR;
}
-/* An editor function. The root of the comparison hierarchy */
+/* An svn_delta_editor_t function. The root of the comparison hierarchy */
static svn_error_t *
open_root(void *edit_baton,
svn_revnum_t base_revision,
@@ -1173,7 +1173,7 @@ open_root(void *edit_baton,
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
delete_entry(const char *path,
svn_revnum_t base_revision,
@@ -1261,7 +1261,7 @@ delete_entry(const char *path,
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
add_directory(const char *path,
void *parent_baton,
@@ -1290,7 +1290,7 @@ add_directory(const char *path,
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
open_directory(const char *path,
void *parent_baton,
@@ -1321,8 +1321,8 @@ open_directory(const char *path,
}
-/* An editor function. When a directory is closed, all the directory
- * elements that have been added or replaced will already have been
+/* An svn_delta_editor_t function. When a directory is closed, all the
+ * directory elements that have been added or replaced will already have been
* diff'd. However there may be other elements in the working copy
* that have not yet been considered. */
static svn_error_t *
@@ -1413,7 +1413,7 @@ close_directory(void *dir_baton,
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
add_file(const char *path,
void *parent_baton,
@@ -1438,7 +1438,7 @@ add_file(const char *path,
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
open_file(const char *path,
void *parent_baton,
@@ -1502,7 +1502,7 @@ window_handler(svn_txdelta_window_t *win
return SVN_NO_ERROR;
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
apply_textdelta(void *file_baton,
const char *base_checksum,
@@ -1543,7 +1543,7 @@ apply_textdelta(void *file_baton,
return SVN_NO_ERROR;
}
-/* An editor function. When the file is closed we have a temporary
+/* An svn_delta_editor_t function. When the file is closed we have a temporary
* file containing a pristine version of the repository file. This can
* be compared against the working copy.
*
@@ -1795,7 +1795,7 @@ close_file(void *file_baton,
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
change_file_prop(void *file_baton,
const char *name,
@@ -1813,7 +1813,7 @@ change_file_prop(void *file_baton,
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
change_dir_prop(void *dir_baton,
const char *name,
@@ -1831,7 +1831,7 @@ change_dir_prop(void *dir_baton,
}
-/* An editor function. */
+/* An svn_delta_editor_t function. */
static svn_error_t *
close_edit(void *edit_baton,
apr_pool_t *pool)
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/diff_local.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/diff_local.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/diff_local.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/diff_local.c Wed Aug 24 15:16:50 2011
@@ -445,11 +445,25 @@ diff_status_callback(void *baton,
break; /* Go check other conditions */
}
- if (eb->changelist_hash != NULL
- && (!status->changelist
- || ! apr_hash_get(eb->changelist_hash, status->changelist,
- APR_HASH_KEY_STRING)))
- return SVN_NO_ERROR; /* Filtered via changelist */
+ /* Filter items by changelist. */
+ /* ### duplicated in ../libsvn_client/status.c */
+ if (eb->changelist_hash)
+ {
+ if (status->changelist)
+ {
+ /* Skip unless the caller requested this changelist. */
+ if (! apr_hash_get(eb->changelist_hash, status->changelist,
+ APR_HASH_KEY_STRING))
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ /* Skip unless the caller requested changelist-lacking items. */
+ if (! apr_hash_get(eb->changelist_hash, "",
+ APR_HASH_KEY_STRING))
+ return SVN_NO_ERROR;
+ }
+ }
/* ### The following checks should probably be reversed as it should decide
when *not* to show a diff, because generally all changed nodes should
@@ -474,8 +488,29 @@ diff_status_callback(void *baton,
SVN_ERR(file_diff(eb, local_abspath, path, scratch_pool));
}
}
- else
+ else /* it's a directory */
{
+ const char *path = svn_dirent_skip_ancestor(eb->anchor_abspath,
+ local_abspath);
+
+ /* Report the directory as deleted and/or opened or added. */
+ if (status->node_status == svn_wc_status_deleted
+ || status->node_status == svn_wc_status_replaced)
+ SVN_ERR(eb->callbacks->dir_deleted(NULL, NULL, path,
+ eb->callback_baton, scratch_pool));
+
+ if (status->node_status == svn_wc_status_added
+ || status->node_status == svn_wc_status_replaced)
+ SVN_ERR(eb->callbacks->dir_added(NULL, NULL, NULL, NULL,
+ path, status->revision,
+ path, status->revision /* ### ? */,
+ eb->callback_baton, scratch_pool));
+ else
+ SVN_ERR(eb->callbacks->dir_opened(NULL, NULL, NULL,
+ path, status->revision,
+ eb->callback_baton, scratch_pool));
+
+ /* Report the prop change. */
/* ### This case should probably be extended for git-diff, but this
is what the old diff code provided */
if (status->node_status == svn_wc_status_deleted
@@ -484,9 +519,6 @@ diff_status_callback(void *baton,
{
apr_array_header_t *propchanges;
apr_hash_t *baseprops;
- const char *path = svn_dirent_skip_ancestor(eb->anchor_abspath,
- local_abspath);
-
SVN_ERR(svn_wc__internal_propdiff(&propchanges, &baseprops,
eb->db, local_abspath,
@@ -498,6 +530,15 @@ diff_status_callback(void *baton,
eb->callback_baton,
scratch_pool));
}
+
+ /* Close the dir.
+ * ### This should be done after all children have been processed, not
+ * yet. The current Subversion-internal callers don't care. */
+ SVN_ERR(eb->callbacks->dir_closed(
+ NULL, NULL, NULL, path,
+ (status->node_status == svn_wc_status_added
+ || status->node_status == svn_wc_status_replaced),
+ eb->callback_baton, scratch_pool));
}
return SVN_NO_ERROR;
}
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/entries.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/entries.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/entries.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/entries.c Wed Aug 24 15:16:50 2011
@@ -272,7 +272,7 @@ get_info_for_deleted(svn_wc_entry_t *ent
SVN_ERR(svn_wc__db_scan_deletion(NULL,
NULL,
- &work_del_abspath,
+ &work_del_abspath, NULL,
db, entry_abspath,
scratch_pool, scratch_pool));
@@ -525,7 +525,7 @@ read_one_entry(const svn_wc_entry_t **ne
{
const char *work_del_abspath;
SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL,
- &work_del_abspath,
+ &work_del_abspath, NULL,
db, entry_abspath,
scratch_pool, scratch_pool));
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/info.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/info.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/info.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/info.c Wed Aug 24 15:16:50 2011
@@ -63,6 +63,11 @@ svn_wc_info_dup(const svn_wc_info_t *inf
new_info->copyfrom_url = apr_pstrdup(pool, info->copyfrom_url);
if (info->wcroot_abspath)
new_info->wcroot_abspath = apr_pstrdup(pool, info->wcroot_abspath);
+ if (info->moved_from_abspath)
+ new_info->moved_from_abspath = apr_pstrdup(pool, info->moved_from_abspath);
+ if (info->moved_to_abspath)
+ new_info->moved_to_abspath = apr_pstrdup(pool, info->moved_to_abspath);
+
return new_info;
}
@@ -146,6 +151,12 @@ build_info_for_node(svn_wc__info2_t **in
wc_info->copyfrom_rev = original_revision;
}
+
+ SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ &wc_info->moved_from_abspath, NULL,
+ db, local_abspath,
+ result_pool, scratch_pool));
}
else if (op_root)
{
@@ -199,8 +210,8 @@ build_info_for_node(svn_wc__info2_t **in
result_pool, scratch_pool));
/* And now fetch the url and revision of what will be deleted */
- SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL,
- &work_del_abspath,
+ SVN_ERR(svn_wc__db_scan_deletion(NULL, &wc_info->moved_to_abspath,
+ &work_del_abspath, NULL,
db, local_abspath,
scratch_pool, scratch_pool));
if (work_del_abspath != NULL)
Modified: subversion/branches/revprop-packing/subversion/libsvn_wc/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/revprop-packing/subversion/libsvn_wc/merge.c?rev=1161147&r1=1161146&r2=1161147&view=diff
==============================================================================
--- subversion/branches/revprop-packing/subversion/libsvn_wc/merge.c (original)
+++ subversion/branches/revprop-packing/subversion/libsvn_wc/merge.c Wed Aug 24 15:16:50 2011
@@ -814,7 +814,7 @@ setup_text_conflict_desc(const char *lef
svn_wc_conflict_description2_t *cdesc;
cdesc = svn_wc_conflict_description_create_text2(target_abspath, pool);
- cdesc->is_binary = FALSE;
+ cdesc->is_binary = is_binary;
cdesc->mime_type = (mimeprop && mimeprop->value)
? mimeprop->value->data : NULL,
cdesc->base_abspath = left_abspath;