Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BE812DB18 for ; Sun, 21 Oct 2012 02:02:46 +0000 (UTC) Received: (qmail 84995 invoked by uid 500); 21 Oct 2012 02:02:46 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 84973 invoked by uid 500); 21 Oct 2012 02:02:46 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 84958 invoked by uid 99); 21 Oct 2012 02:02:46 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 21 Oct 2012 02:02:46 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_FRT_CONTACT X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 21 Oct 2012 02:02:42 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 19F692388C73; Sun, 21 Oct 2012 02:01:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r1400556 [21/29] - in /subversion/branches/ev2-export: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/hudson/ contrib/client-side/emacs/ contrib/client-side/svn-push/ contrib/client-side/svnmerge/ contrib/hook-... Date: Sun, 21 Oct 2012 02:00:47 -0000 To: commits@subversion.apache.org From: hwright@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121021020112.19F692388C73@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_private.h URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_private.h?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_private.h (original) +++ subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_private.h Sun Oct 21 02:00:31 2012 @@ -36,7 +36,7 @@ struct svn_wc__db_t { /* We need the config whenever we run into a new WC directory, in order to figure out where we should look for the corresponding datastore. */ - const svn_config_t *config; + svn_config_t *config; /* Should we attempt to automatically upgrade the database when it is opened, and found to be not-current? */ @@ -170,6 +170,7 @@ svn_wc__db_util_open_db(svn_sqlite__db_t const char *dir_abspath, const char *sdb_fname, svn_sqlite__mode_t smode, + svn_boolean_t exclusive, const char *const *my_statements, apr_pool_t *result_pool, apr_pool_t *scratch_pool); Modified: subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_util.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_util.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_util.c (original) +++ subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_util.c Sun Oct 21 02:00:31 2012 @@ -114,6 +114,7 @@ svn_wc__db_util_open_db(svn_sqlite__db_t const char *dir_abspath, const char *sdb_fname, svn_sqlite__mode_t smode, + svn_boolean_t exclusive, const char *const *my_statements, apr_pool_t *result_pool, apr_pool_t *scratch_pool) @@ -140,6 +141,9 @@ svn_wc__db_util_open_db(svn_sqlite__db_t my_statements ? my_statements : statements, 0, NULL, result_pool, scratch_pool)); + if (exclusive) + SVN_ERR(svn_sqlite__exec_statements(*sdb, STMT_PRAGMA_LOCKING_MODE)); + SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1, relpath_depth, NULL)); Modified: subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_wcroot.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_wcroot.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_wcroot.c (original) +++ subversion/branches/ev2-export/subversion/libsvn_wc/wc_db_wcroot.c Sun Oct 21 02:00:31 2012 @@ -26,6 +26,7 @@ #include #include "svn_dirent_uri.h" +#include "svn_path.h" #include "wc.h" #include "adm_files.h" @@ -185,7 +186,7 @@ close_wcroot(void *data) svn_error_t * svn_wc__db_open(svn_wc__db_t **db, - const svn_config_t *config, + svn_config_t *config, svn_boolean_t auto_upgrade, svn_boolean_t enforce_empty_wq, apr_pool_t *result_pool, @@ -353,6 +354,40 @@ compute_relpath(const svn_wc__db_wcroot_ } +/* Return in *LINK_TARGET_ABSPATH the absolute path the symlink at + * LOCAL_ABSPATH is pointing to. Perform all allocations in POOL. */ +static svn_error_t * +read_link_target(const char **link_target_abspath, + const char *local_abspath, + apr_pool_t *pool) +{ + svn_string_t *link_target; + const char *canon_link_target; + + SVN_ERR(svn_io_read_link(&link_target, local_abspath, pool)); + if (link_target->len == 0) + return svn_error_createf(SVN_ERR_WC_NOT_SYMLINK, NULL, + _("The symlink at '%s' points nowhere"), + svn_dirent_local_style(local_abspath, pool)); + + canon_link_target = svn_dirent_canonicalize(link_target->data, pool); + + /* Treat relative symlinks as relative to LOCAL_ABSPATH's parent. */ + if (!svn_dirent_is_absolute(canon_link_target)) + canon_link_target = svn_dirent_join(svn_dirent_dirname(local_abspath, + pool), + canon_link_target, pool); + + /* Collapse any .. in the symlink part of the path. */ + if (svn_path_is_backpath_present(canon_link_target)) + SVN_ERR(svn_dirent_get_absolute(link_target_abspath, canon_link_target, + pool)); + else + *link_target_abspath = canon_link_target; + + return SVN_NO_ERROR; +} + svn_error_t * svn_wc__db_wcroot_parse_local_abspath(svn_wc__db_wcroot_t **wcroot, const char **local_relpath, @@ -473,6 +508,18 @@ svn_wc__db_wcroot_parse_local_abspath(sv if (adm_subdir_kind == svn_node_dir) { + svn_boolean_t sqlite_exclusive = FALSE; + + err = svn_config_get_bool(db->config, &sqlite_exclusive, + SVN_CONFIG_SECTION_WORKING_COPY, + SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE, + FALSE); + if (err) + { + svn_error_clear(err); + sqlite_exclusive = FALSE; + } + /* We always open the database in read/write mode. If the database isn't writable in the filesystem, SQLite will internally open it as read-only, and we'll get an error if we try to do a write @@ -482,7 +529,8 @@ svn_wc__db_wcroot_parse_local_abspath(sv we're caching database handles, it make sense to be as permissive as the filesystem allows. */ err = svn_wc__db_util_open_db(&sdb, local_abspath, SDB_FILE, - svn_sqlite__mode_readwrite, NULL, + svn_sqlite__mode_readwrite, + sqlite_exclusive, NULL, db->state_pool, scratch_pool); if (err == NULL) { @@ -543,6 +591,8 @@ svn_wc__db_wcroot_parse_local_abspath(sv if (found_wcroot) break; + SVN_ERR(read_link_target(&local_abspath, local_abspath, + scratch_pool)); try_symlink_as_dir: kind = svn_kind_dir; moved_upwards = FALSE; @@ -599,11 +649,22 @@ try_symlink_as_dir: inside the wcroot, but we know the abspath is this directory (ie. where we found it). */ - SVN_ERR(svn_wc__db_pdh_create_wcroot(wcroot, + err = svn_wc__db_pdh_create_wcroot(wcroot, apr_pstrdup(db->state_pool, local_abspath), sdb, wc_id, FORMAT_FROM_SDB, db->auto_upgrade, db->enforce_empty_wq, - db->state_pool, scratch_pool)); + db->state_pool, scratch_pool); + if (err && err->apr_err == SVN_ERR_WC_UNSUPPORTED_FORMAT && + kind == svn_kind_symlink) + { + /* We found an unsupported WC after traversing upwards from a + * symlink. Fall through to code below to check if the symlink + * points at a supported WC. */ + svn_error_clear(err); + *wcroot = NULL; + } + else + SVN_ERR(err); } else { @@ -615,16 +676,17 @@ try_symlink_as_dir: db->state_pool, scratch_pool)); } - { - const char *dir_relpath; + if (*wcroot) + { + const char *dir_relpath; + + /* The subdirectory's relpath is easily computed relative to the + wcroot that we just found. */ + dir_relpath = compute_relpath(*wcroot, local_dir_abspath, NULL); - /* The subdirectory's relpath is easily computed relative to the - wcroot that we just found. */ - dir_relpath = compute_relpath(*wcroot, local_dir_abspath, NULL); - - /* And the result local_relpath may include a filename. */ - *local_relpath = svn_relpath_join(dir_relpath, build_relpath, result_pool); - } + /* And the result local_relpath may include a filename. */ + *local_relpath = svn_relpath_join(dir_relpath, build_relpath, result_pool); + } if (kind == svn_kind_symlink) { @@ -638,33 +700,38 @@ try_symlink_as_dir: * points to a directory, try to find a wcroot in that directory * instead. */ - err = svn_wc__db_read_info_internal(&status, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, - NULL, &conflicted, NULL, NULL, NULL, - NULL, NULL, NULL, - *wcroot, *local_relpath, - scratch_pool, scratch_pool); - if (err) + if (*wcroot) { - if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND - && !SVN_WC__ERR_IS_NOT_CURRENT_WC(err)) - return svn_error_trace(err); + err = svn_wc__db_read_info_internal(&status, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, &conflicted, + NULL, NULL, NULL, NULL, NULL, + NULL, *wcroot, *local_relpath, + scratch_pool, scratch_pool); + if (err) + { + if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND + && !SVN_WC__ERR_IS_NOT_CURRENT_WC(err)) + return svn_error_trace(err); - svn_error_clear(err); - retry_if_dir = TRUE; /* The symlink is unversioned. */ + svn_error_clear(err); + retry_if_dir = TRUE; /* The symlink is unversioned. */ + } + else + { + /* The symlink is versioned, or obstructs a versioned node. + * Ignore non-conflicted not-present/excluded nodes. + * This allows the symlink to redirect the wcroot query to a + * directory, regardless of 'invisible' nodes in this WC. */ + retry_if_dir = ((status == svn_wc__db_status_not_present || + status == svn_wc__db_status_excluded || + status == svn_wc__db_status_server_excluded) + && !conflicted); + } } else - { - /* The symlink is versioned, or obstructs a versioned node. - * Ignore non-conflicted not-present/excluded nodes. - * This allows the symlink to redirect the wcroot query to a - * directory, regardless of 'invisible' nodes in this WC. */ - retry_if_dir = ((status == svn_wc__db_status_not_present || - status == svn_wc__db_status_excluded || - status == svn_wc__db_status_server_excluded) - && !conflicted); - } + retry_if_dir = TRUE; if (retry_if_dir) { @@ -675,7 +742,11 @@ try_symlink_as_dir: scratch_pool)); if (resolved_kind == svn_node_dir) { - local_abspath = original_abspath; + SVN_ERR(read_link_target(&local_abspath, original_abspath, + scratch_pool)); + /* This handle was opened in this function but is not going + to be used further so close it. */ + SVN_ERR(svn_sqlite__close(sdb)); goto try_symlink_as_dir; } } Modified: subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.c (original) +++ subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.c Sun Oct 21 02:00:31 2012 @@ -739,6 +739,7 @@ run_file_remove(svn_wc__db_t *db, svn_error_t * svn_wc__wq_build_file_remove(svn_skel_t **work_item, svn_wc__db_t *db, + const char *wri_abspath, const char *local_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool) @@ -746,7 +747,7 @@ svn_wc__wq_build_file_remove(svn_skel_t const char *local_relpath; *work_item = svn_skel__make_empty_list(result_pool); - SVN_ERR(svn_wc__db_to_relpath(&local_relpath, db, local_abspath, + SVN_ERR(svn_wc__db_to_relpath(&local_relpath, db, wri_abspath, local_abspath, result_pool, scratch_pool)); svn_skel__prepend_str(local_relpath, *work_item, result_pool); Modified: subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.h URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.h?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.h (original) +++ subversion/branches/ev2-export/subversion/libsvn_wc/workqueue.h Sun Oct 21 02:00:31 2012 @@ -114,10 +114,12 @@ svn_wc__wq_build_file_install(svn_skel_t /* Set *WORK_ITEM to a new work item that will remove a single - file. */ + file LOCAL_ABSPATH from the working copy identified by the pair DB, + WRI_ABSPATH. */ svn_error_t * svn_wc__wq_build_file_remove(svn_skel_t **work_item, svn_wc__db_t *db, + const char *wri_abspath, const char *local_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool); Modified: subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c (original) +++ subversion/branches/ev2-export/subversion/mod_authz_svn/mod_authz_svn.c Sun Oct 21 02:00:31 2012 @@ -44,6 +44,7 @@ #include "svn_config.h" #include "svn_string.h" #include "svn_repos.h" +#include "svn_pools.h" #include "svn_dirent_uri.h" #include "private/svn_fspath.h" @@ -164,7 +165,8 @@ static const command_rec authz_svn_cmds[ * Get the, possibly cached, svn_authz_t for this request. */ static svn_authz_t * -get_access_conf(request_rec *r, authz_svn_config_rec *conf) +get_access_conf(request_rec *r, authz_svn_config_rec *conf, + apr_pool_t *scratch_pool) { const char *cache_key = NULL; const char *access_file; @@ -182,7 +184,7 @@ get_access_conf(request_rec *r, authz_sv ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "%s", dav_err->desc); return NULL; } - access_file = svn_dirent_join_many(r->pool, repos_path, "conf", + access_file = svn_dirent_join_many(scratch_pool, repos_path, "conf", conf->repo_relative_access_file, NULL); } @@ -194,7 +196,7 @@ get_access_conf(request_rec *r, authz_sv ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "Path to authz file is %s", access_file); - cache_key = apr_pstrcat(r->pool, "mod_authz_svn:", + cache_key = apr_pstrcat(scratch_pool, "mod_authz_svn:", access_file, (char *)NULL); apr_pool_userdata_get(&user_data, cache_key, r->connection->pool); access_conf = user_data; @@ -243,12 +245,13 @@ convert_case(char *text, svn_boolean_t t /* Return the username to authorize, with case-conversion performed if CONF->force_username_case is set. */ static char * -get_username_to_authorize(request_rec *r, authz_svn_config_rec *conf) +get_username_to_authorize(request_rec *r, authz_svn_config_rec *conf, + apr_pool_t *pool) { char *username_to_authorize = r->user; if (username_to_authorize && conf->force_username_case) { - username_to_authorize = apr_pstrdup(r->pool, r->user); + username_to_authorize = apr_pstrdup(pool, r->user); convert_case(username_to_authorize, strcasecmp(conf->force_username_case, "upper") == 0); } @@ -283,7 +286,8 @@ req_check_access(request_rec *r, svn_authz_t *access_conf = NULL; svn_error_t *svn_err; char errbuf[256]; - const char *username_to_authorize = get_username_to_authorize(r, conf); + const char *username_to_authorize = get_username_to_authorize(r, conf, + r->pool); switch (r->method_number) { @@ -419,7 +423,7 @@ req_check_access(request_rec *r, } /* Retrieve/cache authorization file */ - access_conf = get_access_conf(r,conf); + access_conf = get_access_conf(r,conf, r->pool); if (access_conf == NULL) return DECLINED; @@ -577,14 +581,13 @@ log_access_verdict(LOG_ARGS_SIGNATURE, } /* - * This function is used as a provider to allow mod_dav_svn to bypass the - * generation of an apache request when checking GET access from - * "mod_dav_svn/authz.c" . + * Implementation of subreq_bypass with scratch_pool parameter. */ static int -subreq_bypass(request_rec *r, - const char *repos_path, - const char *repos_name) +subreq_bypass2(request_rec *r, + const char *repos_path, + const char *repos_name, + apr_pool_t *scratch_pool) { svn_error_t *svn_err = NULL; svn_authz_t *access_conf = NULL; @@ -595,7 +598,7 @@ subreq_bypass(request_rec *r, conf = ap_get_module_config(r->per_dir_config, &authz_svn_module); - username_to_authorize = get_username_to_authorize(r, conf); + username_to_authorize = get_username_to_authorize(r, conf, scratch_pool); /* If configured properly, this should never be true, but just in case. */ if (!conf->anonymous @@ -606,7 +609,7 @@ subreq_bypass(request_rec *r, } /* Retrieve authorization file */ - access_conf = get_access_conf(r, conf); + access_conf = get_access_conf(r, conf, scratch_pool); if (access_conf == NULL) return HTTP_FORBIDDEN; @@ -620,7 +623,7 @@ subreq_bypass(request_rec *r, username_to_authorize, svn_authz_none|svn_authz_read, &authz_access_granted, - r->pool); + scratch_pool); if (svn_err) { ap_log_rerror(APLOG_MARK, APLOG_ERR, @@ -650,6 +653,26 @@ subreq_bypass(request_rec *r, } /* + * This function is used as a provider to allow mod_dav_svn to bypass the + * generation of an apache request when checking GET access from + * "mod_dav_svn/authz.c" . + */ +static int +subreq_bypass(request_rec *r, + const char *repos_path, + const char *repos_name) +{ + int status; + apr_pool_t *scratch_pool; + + scratch_pool = svn_pool_create(r->pool); + status = subreq_bypass2(r, repos_path, repos_name, scratch_pool); + svn_pool_destroy(scratch_pool); + + return status; +} + +/* * Hooks */ Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/activity.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/activity.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/activity.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/activity.c Sun Oct 21 02:00:31 2012 @@ -240,16 +240,21 @@ dav_svn__store_activity(const dav_svn_re dav_error * dav_svn__create_txn(const dav_svn_repos *repos, const char **ptxn_name, + apr_hash_t *revprops, apr_pool_t *pool) { svn_revnum_t rev; svn_fs_txn_t *txn; svn_error_t *serr; - apr_hash_t *revprop_table = apr_hash_make(pool); + + if (! revprops) + { + revprops = apr_hash_make(pool); + } if (repos->username) { - apr_hash_set(revprop_table, SVN_PROP_REVISION_AUTHOR, APR_HASH_KEY_STRING, + apr_hash_set(revprops, SVN_PROP_REVISION_AUTHOR, APR_HASH_KEY_STRING, svn_string_create(repos->username, pool)); } @@ -262,8 +267,7 @@ dav_svn__create_txn(const dav_svn_repos } serr = svn_repos_fs_begin_txn_for_commit2(&txn, repos->repos, rev, - revprop_table, - repos->pool); + revprops, repos->pool); if (serr != NULL) { return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/dav_svn.h URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/dav_svn.h?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/dav_svn.h (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/dav_svn.h Sun Oct 21 02:00:31 2012 @@ -304,9 +304,6 @@ svn_boolean_t dav_svn__get_autoversionin /* for the repository referred to by this request, are bulk updates allowed? */ svn_boolean_t dav_svn__get_bulk_updates_flag(request_rec *r); -/* for the repository referred to by this request, should httpv2 be advertised? */ -svn_boolean_t dav_svn__get_v2_protocol_flag(request_rec *r); - /* for the repository referred to by this request, are subrequests active? */ svn_boolean_t dav_svn__get_pathauthz_flag(request_rec *r); @@ -328,6 +325,17 @@ authz_svn__subreq_bypass_func_t dav_svn_ SVNParentPath allowed? */ svn_boolean_t dav_svn__get_list_parentpath_flag(request_rec *r); +/* For the repository referred to by this request, should HTTPv2 + protocol support be advertised? Note that this also takes into + account the support level expected of based on the specified + master server version (if provided via SVNMasterVersion). */ +svn_boolean_t dav_svn__check_httpv2_support(request_rec *r); + +/* For the repository referred to by this request, should ephemeral + txnprop support be advertised? */ +svn_boolean_t dav_svn__check_ephemeral_txnprops_support(request_rec *r); + + /* SPECIAL URI @@ -376,6 +384,11 @@ const char *dav_svn__get_xslt_uri(reques /* ### Is this assumed to be URI-encoded? */ const char *dav_svn__get_master_uri(request_rec *r); +/* Return the version of the master server (used for mirroring) iff a + master URI is in place for this location; otherwise, return NULL. + Comes from the directive. */ +svn_version_t *dav_svn__get_master_version(request_rec *r); + /* Return the disk path to the activities db. Comes from the directive. */ const char *dav_svn__get_activities_db(request_rec *r); @@ -386,10 +399,10 @@ const char *dav_svn__get_activities_db(r const char *dav_svn__get_root_dir(request_rec *r); /* Return the data compression level to be used over the wire. */ -int dav_svn__get_compression_level(void); +int dav_svn__get_compression_level(request_rec *r); /* Return the hook script environment parsed from the configuration. */ -apr_hash_t *dav_svn__get_hooks_env(request_rec *r); +const char *dav_svn__get_hooks_env(request_rec *r); /** For HTTP protocol v2, these are the new URIs and URI stubs returned to the client in our OPTIONS response. They all depend @@ -420,10 +433,17 @@ const char *dav_svn__get_vtxn_root_stub( /*** activity.c ***/ /* Create a new transaction based on HEAD in REPOS, setting *PTXN_NAME - to the name of that transaction. Use POOL for allocations. */ + to the name of that transaction. REVPROPS is an optional hash of + const char * property names and const svn_string_t * values which + will be set as transactions properties on the transaction this + function creates. Use POOL for allocations. + + NOTE: This function will overwrite the svn:author property, if + any, found in REVPROPS. */ dav_error * dav_svn__create_txn(const dav_svn_repos *repos, const char **ptxn_name, + apr_hash_t *revprops, apr_pool_t *pool); /* If it exists, abort the transaction named TXN_NAME from REPOS. Use @@ -620,6 +640,7 @@ static const dav_report_elem dav_svn__re { SVN_XML_NAMESPACE, "replay-report" }, { SVN_XML_NAMESPACE, "get-deleted-rev-report" }, { SVN_XML_NAMESPACE, SVN_DAV__MERGEINFO_REPORT }, + { SVN_XML_NAMESPACE, SVN_DAV__INHERITED_PROPS_REPORT }, { NULL, NULL }, }; @@ -667,23 +688,22 @@ dav_svn__get_deleted_rev_report(const da const apr_xml_doc *doc, ap_filter_t *output); +dav_error * +dav_svn__get_inherited_props_report(const dav_resource *resource, + const apr_xml_doc *doc, + ap_filter_t *output); /*** posts/ ***/ -/* The list of Subversion's custom POSTs. */ -/* ### TODO: Populate this list and transmit its contents in the - ### OPTIONS response. -static const char * dav_svn__posts_list[] = { - "create-txn", - NULL -}; -*/ - /* The various POST handlers, defined in posts/, and used by repos.c. */ dav_error * dav_svn__post_create_txn(const dav_resource *resource, svn_skel_t *request_skel, ap_filter_t *output); +dav_error * +dav_svn__post_create_txn_with_props(const dav_resource *resource, + svn_skel_t *request_skel, + ap_filter_t *output); /*** authz.c ***/ Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/deadprops.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/deadprops.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/deadprops.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/deadprops.c Sun Oct 21 02:00:31 2012 @@ -1,5 +1,7 @@ /* - * deadprops.c: mod_dav_svn dead property provider functions for Subversion + * deadprops.c: mod_dav_svn provider functions for "dead properties" + * (properties implemented by Subversion or its users, + * not as part of the WebDAV specification). * * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one @@ -512,10 +514,6 @@ db_store(dav_db *db, /* ### namespace check? */ if (elem->first_child && !strcmp(elem->first_child->name, SVN_DAV__OLD_VALUE)) { - const char *propname; - - get_repos_propname(db, name, &propname); - /* Parse OLD_PROPVAL. */ old_propval = svn_string_create(dav_xml_get_cdata(elem->first_child, pool, 0 /* strip_white */), Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/liveprops.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/liveprops.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/liveprops.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/liveprops.c Sun Oct 21 02:00:31 2012 @@ -1,5 +1,7 @@ /* - * liveprops.c: mod_dav_svn live property provider functions for Subversion + * liveprops.c: mod_dav_svn provider functions for "live properties" + * (properties implemented by the WebDAV specification + * itself, not unique to Subversion or its users). * * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one @@ -281,7 +283,7 @@ insert_prop_internal(const dav_resource const char *value = NULL; const char *s; const dav_liveprop_spec *info; - int global_ns; + long global_ns; svn_error_t *serr; /* ### TODO proper errors */ @@ -785,11 +787,11 @@ insert_prop_internal(const dav_resource if (what == DAV_PROP_INSERT_NAME || (what == DAV_PROP_INSERT_VALUE && *value == '\0')) { - s = apr_psprintf(result_pool, "" DEBUG_CR, global_ns, + s = apr_psprintf(result_pool, "" DEBUG_CR, global_ns, info->name); } else if (what == DAV_PROP_INSERT_VALUE) { - s = apr_psprintf(result_pool, "%s" DEBUG_CR, + s = apr_psprintf(result_pool, "%s" DEBUG_CR, global_ns, info->name, value, global_ns, info->name); } else { Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/mod_dav_svn.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/mod_dav_svn.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/mod_dav_svn.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/mod_dav_svn.c Sun Oct 21 02:00:31 2012 @@ -42,6 +42,7 @@ #include "mod_dav_svn.h" #include "private/svn_fspath.h" +#include "private/svn_subr_private.h" #include "dav_svn.h" #include "mod_authz_svn.h" @@ -59,6 +60,12 @@ typedef struct server_conf_t { const char *special_uri; svn_boolean_t use_utf8; + + /* The compression level we will pass to svn_txdelta_to_svndiff3() + * for wire-compression. Negative value used to specify default + compression level. */ + int compression_level; + } server_conf_t; @@ -92,11 +99,12 @@ typedef struct dir_conf_t { enum conf_flag list_parentpath; /* whether to allow GET of parentpath */ const char *root_dir; /* our top-level directory */ const char *master_uri; /* URI to the master SVN repos */ + svn_version_t *master_version; /* version of master server */ const char *activities_db; /* path to activities database(s) */ enum conf_flag txdelta_cache; /* whether to enable txdelta caching */ enum conf_flag fulltext_cache; /* whether to enable fulltext caching */ enum conf_flag revprop_cache; /* whether to enable revprop caching */ - apr_hash_t *hooks_env; /* environment for hook scripts */ + const char *hooks_env; /* path to hook script env config file */ } dir_conf_t; @@ -109,10 +117,6 @@ extern module AP_MODULE_DECLARE_DATA dav /* The authz_svn provider for bypassing path authz. */ static authz_svn__subreq_bypass_func_t pathauthz_bypass_func = NULL; -/* The compression level we will pass to svn_txdelta_to_svndiff3() - * for wire-compression */ -static int svn__compression_level = SVN_DELTA_COMPRESSION_LEVEL_DEFAULT; - static int init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { @@ -163,7 +167,11 @@ init_dso(apr_pool_t *pconf, apr_pool_t * static void * create_server_config(apr_pool_t *p, server_rec *s) { - return apr_pcalloc(p, sizeof(server_conf_t)); + server_conf_t *conf = apr_pcalloc(p, sizeof(server_conf_t)); + + conf->compression_level = -1; + + return conf; } @@ -179,6 +187,17 @@ merge_server_config(apr_pool_t *p, void newconf->special_uri = INHERIT_VALUE(parent, child, special_uri); + if (child->compression_level < 0) + { + /* Inherit compression level from parent if not configured for this + VirtualHost. */ + newconf->compression_level = parent->compression_level; + } + else + { + newconf->compression_level = child->compression_level; + } + return newconf; } @@ -214,6 +233,7 @@ merge_dir_config(apr_pool_t *p, void *ba newconf->fs_path = INHERIT_VALUE(parent, child, fs_path); newconf->master_uri = INHERIT_VALUE(parent, child, master_uri); + newconf->master_version = INHERIT_VALUE(parent, child, master_version); newconf->activities_db = INHERIT_VALUE(parent, child, activities_db); newconf->repo_name = INHERIT_VALUE(parent, child, repo_name); newconf->xslt_uri = INHERIT_VALUE(parent, child, xslt_uri); @@ -282,6 +302,25 @@ SVNMasterURI_cmd(cmd_parms *cmd, void *c static const char * +SVNMasterVersion_cmd(cmd_parms *cmd, void *config, const char *arg1) +{ + dir_conf_t *conf = config; + svn_error_t *err; + svn_version_t *version; + + err = svn_version__parse_version_string(&version, arg1, cmd->pool); + if (err) + { + svn_error_clear(err); + return "Malformed master server version string."; + } + + conf->master_version = version; + return NULL; +} + + +static const char * SVNActivitiesDB_cmd(cmd_parms *cmd, void *config, const char *arg1) { dir_conf_t *conf = config; @@ -513,6 +552,7 @@ SVNInMemoryCacheSize_cmd(cmd_parms *cmd, static const char * SVNCompressionLevel_cmd(cmd_parms *cmd, void *config, const char *arg1) { + server_conf_t *conf; int value = 0; svn_error_t *err = svn_cstring_atoi(&value, arg1); if (err) @@ -530,7 +570,9 @@ SVNCompressionLevel_cmd(cmd_parms *cmd, (int)SVN_DELTA_COMPRESSION_LEVEL_NONE, (int)SVN_DELTA_COMPRESSION_LEVEL_MAX); - svn__compression_level = value; + conf = ap_get_module_config(cmd->server->module_config, + &dav_svn_module); + conf->compression_level = value; return NULL; } @@ -550,43 +592,9 @@ SVNUseUTF8_cmd(cmd_parms *cmd, void *con static const char * SVNHooksEnv_cmd(cmd_parms *cmd, void *config, const char *arg1) { - apr_array_header_t *var; - - var = svn_cstring_split(arg1, "=", TRUE, cmd->pool); - if (var && var->nelts >= 2) - { - dir_conf_t *conf = config; - const char *name; - const char *val; - - if (! conf->hooks_env) - conf->hooks_env = apr_hash_make(cmd->pool); - - name = apr_pstrdup(apr_hash_pool_get(conf->hooks_env), - APR_ARRAY_IDX(var, 0, const char *)); - - /* Special case for values which contain '='. */ - if (var->nelts > 2) - { - svn_stringbuf_t *buf; - int i; - - buf = svn_stringbuf_create(APR_ARRAY_IDX(var, 1, const char *), - cmd->pool); - for (i = 2; i < var->nelts; i++) - { - svn_stringbuf_appendbyte(buf, '='); - svn_stringbuf_appendcstr(buf, APR_ARRAY_IDX(var, i, const char *)); - } + dir_conf_t *conf = config; - val = apr_pstrdup(apr_hash_pool_get(conf->hooks_env), buf->data); - } - else - val = apr_pstrdup(apr_hash_pool_get(conf->hooks_env), - APR_ARRAY_IDX(var, 1, const char *)); - - apr_hash_set(conf->hooks_env, name, APR_HASH_KEY_STRING, val); - } + conf->hooks_env = svn_dirent_internal_style(arg1, cmd->pool); return NULL; } @@ -689,6 +697,16 @@ dav_svn__get_master_uri(request_rec *r) } +svn_version_t * +dav_svn__get_master_version(request_rec *r) +{ + dir_conf_t *conf; + + conf = ap_get_module_config(r->per_dir_config, &dav_svn_module); + return conf->master_uri ? conf->master_version : NULL; +} + + const char * dav_svn__get_xslt_uri(request_rec *r) { @@ -786,12 +804,39 @@ dav_svn__get_bulk_updates_flag(request_r svn_boolean_t -dav_svn__get_v2_protocol_flag(request_rec *r) +dav_svn__check_httpv2_support(request_rec *r) { dir_conf_t *conf; + svn_boolean_t available; conf = ap_get_module_config(r->per_dir_config, &dav_svn_module); - return conf->v2_protocol == CONF_FLAG_ON; + available = conf->v2_protocol == CONF_FLAG_ON; + + /* If our configuration says that HTTPv2 is available, but we are + proxying requests to a master Subversion server which lacks + support for HTTPv2, we dumb ourselves down. */ + if (available) + { + svn_version_t *version = dav_svn__get_master_version(r); + if (version && (! svn_version__at_least(version, 1, 7, 0))) + available = FALSE; + } + return available; +} + + +svn_boolean_t +dav_svn__check_ephemeral_txnprops_support(request_rec *r) +{ + svn_version_t *version = dav_svn__get_master_version(r); + + /* We know this server supports ephemeral txnprops. But if we're + proxying requests to a master server, we need to see if it + supports them, too. */ + if (version && (! svn_version__at_least(version, 1, 8, 0))) + return FALSE; + + return TRUE; } @@ -873,12 +918,24 @@ dav_svn__get_revprop_cache_flag(request_ int -dav_svn__get_compression_level(void) +dav_svn__get_compression_level(request_rec *r) { - return svn__compression_level; + server_conf_t *conf; + + conf = ap_get_module_config(r->server->module_config, + &dav_svn_module); + + if (conf->compression_level < 0) + { + return SVN_DELTA_COMPRESSION_LEVEL_DEFAULT; + } + else + { + return conf->compression_level; + } } -apr_hash_t * +const char * dav_svn__get_hooks_env(request_rec *r) { dir_conf_t *conf; @@ -1077,6 +1134,11 @@ static const command_rec cmds[] = "specifies a URI to access a master Subversion repository"), /* per directory/location */ + AP_INIT_TAKE1("SVNMasterVersion", SVNMasterVersion_cmd, NULL, ACCESS_CONF, + "specifies the Subversion release version of a master " + "Subversion server "), + + /* per directory/location */ AP_INIT_TAKE1("SVNActivitiesDB", SVNActivitiesDB_cmd, NULL, ACCESS_CONF, "specifies the location in the filesystem in which the " "activities database(s) should be stored"), @@ -1136,10 +1198,12 @@ static const command_rec cmds[] = "use UTF-8 as native character encoding (default is ASCII)."), /* per directory/location */ - AP_INIT_ITERATE("SVNHooksEnv", SVNHooksEnv_cmd, NULL, - ACCESS_CONF|RSRC_CONF, - "Set the environment of hook scripts via any number of " - "VAR=VAL arguments (the default hook environment is empty)."), + AP_INIT_TAKE1("SVNHooksEnv", SVNHooksEnv_cmd, NULL, + ACCESS_CONF|RSRC_CONF, + "Sets the path to the configuration file for the environment " + "of hook scripts. If not absolute, the path is relative to " + "the repository's conf directory (by default the hooks-env " + "file in the repository is used)."), { NULL } }; Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/posts/create_txn.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/posts/create_txn.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/posts/create_txn.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/posts/create_txn.c Sun Oct 21 02:00:31 2012 @@ -42,13 +42,64 @@ dav_svn__post_create_txn(const dav_resou request_rec *r = resource->info->r; /* Create a Subversion repository transaction based on HEAD. */ - if ((derr = dav_svn__create_txn(resource->info->repos, &txn_name, + if ((derr = dav_svn__create_txn(resource->info->repos, &txn_name, NULL, resource->pool))) return derr; /* Build a "201 Created" response with header that tells the client our new transaction's name. */ - vtxn_name = apr_table_get(r->headers_in, SVN_DAV_VTXN_NAME_HEADER); + vtxn_name = apr_table_get(r->headers_in, SVN_DAV_VTXN_NAME_HEADER); + if (vtxn_name && vtxn_name[0]) + { + /* If the client supplied a vtxn name then store a mapping from + the client name to the FS transaction name in the activity + database. */ + if ((derr = dav_svn__store_activity(resource->info->repos, + vtxn_name, txn_name))) + return derr; + apr_table_set(r->headers_out, SVN_DAV_VTXN_NAME_HEADER, vtxn_name); + } + else + apr_table_set(r->headers_out, SVN_DAV_TXN_NAME_HEADER, txn_name); + + r->status = HTTP_CREATED; + + return NULL; +} + + +/* Respond to a "create-txn-with-props" POST request. + * + * Syntax: ( create-txn-with-props (PROPNAME PROPVAL [PROPNAME PROPVAL ...]) + */ +dav_error * +dav_svn__post_create_txn_with_props(const dav_resource *resource, + svn_skel_t *request_skel, + ap_filter_t *output) +{ + const char *txn_name; + const char *vtxn_name; + dav_error *derr; + svn_error_t *err; + request_rec *r = resource->info->r; + apr_hash_t *revprops; + svn_skel_t *proplist_skel = request_skel->children->next; + + if ((err = svn_skel__parse_proplist(&revprops, proplist_skel, + resource->pool))) + { + return dav_svn__convert_err(err, HTTP_BAD_REQUEST, + "Malformatted request skel", resource->pool); + } + + /* Create a Subversion repository transaction based on HEAD. */ + if ((derr = dav_svn__create_txn(resource->info->repos, &txn_name, + revprops, resource->pool))) + return derr; + + /* Build a "201 Created" response with header that tells the + client our new transaction's name. */ + vtxn_name = apr_table_get(r->headers_in, SVN_DAV_VTXN_NAME_HEADER); if (vtxn_name && vtxn_name[0]) { /* If the client supplied a vtxn name then store a mapping from Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/reports/file-revs.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/reports/file-revs.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/reports/file-revs.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/reports/file-revs.c Sun Oct 21 02:00:31 2012 @@ -52,6 +52,9 @@ struct file_rev_baton { /* SVNDIFF version to use when sending to client. */ int svndiff_version; + /* Compression level to use for SVNDIFF. */ + int compression_level; + /* Used by the delta iwndow handler. */ svn_txdelta_window_handler_t window_handler; void *window_baton; @@ -208,7 +211,7 @@ file_rev_handler(void *baton, pool); svn_txdelta_to_svndiff3(&frb->window_handler, &frb->window_baton, base64_stream, frb->svndiff_version, - dav_svn__get_compression_level(), pool); + frb->compression_level, pool); *window_handler = delta_window_handler; *window_baton = frb; /* Start the txdelta element wich will be terminated by the window @@ -306,6 +309,7 @@ dav_svn__file_revs_report(const dav_reso frb.output = output; frb.needs_header = TRUE; frb.svndiff_version = resource->info->svndiff_version; + frb.compression_level = dav_svn__get_compression_level(resource->info->r); /* file_rev_handler will send header first time it is called. */ Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/reports/replay.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/reports/replay.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/reports/replay.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/reports/replay.c Sun Oct 21 02:00:31 2012 @@ -47,6 +47,7 @@ typedef struct edit_baton_t { ap_filter_t *output; svn_boolean_t started; svn_boolean_t sending_textdelta; + int compression_level; } edit_baton_t; @@ -326,7 +327,7 @@ apply_textdelta(void *file_baton, eb->output, pool), 0, - dav_svn__get_compression_level(), + eb->compression_level, pool); eb->sending_textdelta = TRUE; @@ -367,6 +368,7 @@ make_editor(const svn_delta_editor_t **e void **edit_baton, apr_bucket_brigade *bb, ap_filter_t *output, + int compression_level, apr_pool_t *pool) { edit_baton_t *eb = apr_pcalloc(pool, sizeof(*eb)); @@ -376,6 +378,7 @@ make_editor(const svn_delta_editor_t **e eb->output = output; eb->started = FALSE; eb->sending_textdelta = FALSE; + eb->compression_level = compression_level; e->set_target_revision = set_target_revision; e->open_root = open_root; @@ -506,7 +509,9 @@ dav_svn__replay_report(const dav_resourc goto cleanup; } - make_editor(&editor, &edit_baton, bb, output, resource->pool); + make_editor(&editor, &edit_baton, bb, output, + dav_svn__get_compression_level(resource->info->r), + resource->pool); if ((err = svn_repos_replay2(root, base_dir, low_water_mark, send_deltas, editor, edit_baton, Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/reports/update.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/reports/update.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/reports/update.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/reports/update.c Sun Oct 21 02:00:31 2012 @@ -81,9 +81,16 @@ typedef struct update_ctx_t { /* True iff client requested all data inline in the report. */ svn_boolean_t send_all; + /* True iff client requested that properties be transmitted + inline. (This is implied when "send_all" is set.) */ + svn_boolean_t include_props; + /* SVNDIFF version to send to client. */ int svndiff_version; + /* Compression level of SVNDIFF deltas. */ + int compression_level; + /* Did the client submit this REPORT request via the HTTPv2 "me resource" and are we advertising support for as much? */ svn_boolean_t enable_v2_response; @@ -119,6 +126,10 @@ typedef struct item_baton_t { /* File/dir copied? */ svn_boolean_t copyfrom; + /* Does the client need to fetch additional properties for this + item? */ + svn_boolean_t fetch_props; + /* Array of const char * names of removed properties. (Used only for copied files/dirs in skelta mode.) */ apr_array_header_t *removed_props; @@ -432,7 +443,7 @@ open_helper(svn_boolean_t is_dir, static svn_error_t * -close_helper(svn_boolean_t is_dir, item_baton_t *baton) +close_helper(svn_boolean_t is_dir, item_baton_t *baton, apr_pool_t *pool) { if (baton->uc->resource_walk) return SVN_NO_ERROR; @@ -446,14 +457,21 @@ close_helper(svn_boolean_t is_dir, item_ for (i = 0; i < baton->removed_props->nelts; i++) { - /* We already XML-escaped the property name in change_xxx_prop. */ qname = APR_ARRAY_IDX(baton->removed_props, i, const char *); + qname = apr_xml_quote_string(pool, qname, 1); SVN_ERR(dav_svn__brigade_printf(baton->uc->bb, baton->uc->output, "" DEBUG_CR, qname)); } } + /* If our client need to fetch properties, let it know. */ + if (baton->fetch_props) + SVN_ERR(dav_svn__brigade_printf(baton->uc->bb, baton->uc->output, + "" DEBUG_CR)); + + + /* Let's tie it off, nurse. */ if (baton->added) SVN_ERR(dav_svn__brigade_printf(baton->uc->bb, baton->uc->output, "" DEBUG_CR, @@ -473,13 +491,13 @@ maybe_start_update_report(update_ctx_t * { if ((! uc->resource_walk) && (! uc->started_update)) { - SVN_ERR(dav_svn__brigade_printf(uc->bb, uc->output, - DAV_XML_HEADER DEBUG_CR - "" DEBUG_CR, - uc->send_all ? "send-all=\"true\"" : "")); + SVN_ERR(dav_svn__brigade_printf( + uc->bb, uc->output, + DAV_XML_HEADER DEBUG_CR "" DEBUG_CR, + uc->send_all ? "send-all=\"true\"" : "", + uc->include_props ? "inline-props=\"true\"" : "")); uc->started_update = TRUE; } @@ -593,87 +611,117 @@ upd_open_directory(const char *path, static svn_error_t * +send_propchange(item_baton_t *b, + const char *name, + const svn_string_t *value, + apr_pool_t *pool) +{ + const char *qname; + + /* Ensure that the property name is XML-safe. + apr_xml_quote_string() doesn't realloc if there is nothing to + quote, so dup the name, but only if necessary. */ + qname = apr_xml_quote_string(b->pool, name, 1); + if (qname == name) + qname = apr_pstrdup(b->pool, name); + + if (value) + { + const char *qval; + + if (svn_xml_is_xml_safe(value->data, value->len)) + { + svn_stringbuf_t *tmp = NULL; + svn_xml_escape_cdata_string(&tmp, value, pool); + qval = tmp->data; + SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, + "", + qname)); + } + else + { + qval = svn_base64_encode_string2(value, TRUE, pool)->data; + SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, + "" DEBUG_CR, + qname)); + } + + SVN_ERR(dav_svn__brigade_puts(b->uc->bb, b->uc->output, qval)); + SVN_ERR(dav_svn__brigade_puts(b->uc->bb, b->uc->output, + "" DEBUG_CR)); + } + else /* value is null, so this is a prop removal */ + { + SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, + "" + DEBUG_CR, + qname)); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * upd_change_xxx_prop(void *baton, const char *name, const svn_string_t *value, apr_pool_t *pool) { item_baton_t *b = baton; - const char *qname; /* Resource walks say nothing about props. */ if (b->uc->resource_walk) return SVN_NO_ERROR; - /* Else this not a resource walk, so either send props or cache them - to send later, depending on whether this is a modern report - response or not. */ - - qname = apr_xml_quote_string(b->pool, name, 1); - - /* apr_xml_quote_string doesn't realloc if there is nothing to - quote, so dup the name, but only if necessary. */ - if (qname == name) - qname = apr_pstrdup(b->pool, name); + /* If we get here, this not a resource walk, so either send props or + cache them to send later, depending on whether this is a modern + report response or not. */ /* Even if we are not in send-all mode we have the prop changes already, so send them to the client now instead of telling the client to fetch them later. */ - if (b->uc->send_all || !b->added) + if (b->uc->send_all) { - if (value) + SVN_ERR(send_propchange(b, name, value, pool)); + } + else + { + if (b->added) { - const char *qval; - - if (svn_xml_is_xml_safe(value->data, value->len)) + /* This is an addition in "skelta" (that is, "not send-all") + mode so there is no strict need for an inline response. + Clients will assume that added objects need all to have + all their properties explicitly fetched from the + server. */ + + /* That said, beginning in Subversion 1.8, clients might + request even in skelta mode that we transmit properties + on newly added files explicitly. */ + if ((! b->copyfrom) && value && b->uc->include_props) { - svn_stringbuf_t *tmp = NULL; - svn_xml_escape_cdata_string(&tmp, value, pool); - qval = tmp->data; - SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, - "", - qname)); + SVN_ERR(send_propchange(b, name, value, pool)); } - else + + /* Now, if the object is actually a copy and this is a + property removal, we'll still need to cache (and later + transmit) property removals, because fetching the + object's current property set alone isn't sufficient to + communicate the fact that additional properties were, in + fact, removed from the copied base object in order to + arrive at that set. */ + if (b->copyfrom && (! value)) { - qval = svn_base64_encode_string2(value, TRUE, pool)->data; - SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, - "" DEBUG_CR, - qname)); + if (! b->removed_props) + b->removed_props = apr_array_make(b->pool, 1, sizeof(name)); + + APR_ARRAY_PUSH(b->removed_props, const char *) = name; } - - SVN_ERR(dav_svn__brigade_puts(b->uc->bb, b->uc->output, qval)); - SVN_ERR(dav_svn__brigade_puts(b->uc->bb, b->uc->output, - "" DEBUG_CR)); } - else /* value is null, so this is a prop removal */ - { - SVN_ERR(dav_svn__brigade_printf(b->uc->bb, b->uc->output, - "" - DEBUG_CR, - qname)); - } - } - else if (!value) - { - /* This is an addition in "skelta" (that is, "not send-all") - mode so there is no strict need for an inline response. - Clients will assume that added objects need all to have all - their properties explicitly fetched from the server. */ - - /* Now, if the object is actually a copy, we'll still need to - cache (and later transmit) property removals, because - fetching the object's current property set alone isn't - sufficient to communicate the fact that additional properties - were, in fact, removed from the copied base object in order - to arrive at that set. */ - if (b->copyfrom) + else { - if (! b->removed_props) - b->removed_props = apr_array_make(b->pool, 1, sizeof(name)); - - APR_ARRAY_PUSH(b->removed_props, const char *) = qname; + /* "skelta" mode non-addition. Just send the change. */ + SVN_ERR(send_propchange(b, name, value, pool)); } } @@ -684,7 +732,7 @@ upd_change_xxx_prop(void *baton, static svn_error_t * upd_close_directory(void *dir_baton, apr_pool_t *pool) { - return close_helper(TRUE /* is_dir */, dir_baton); + return close_helper(TRUE /* is_dir */, dir_baton, pool); } @@ -795,7 +843,7 @@ upd_apply_textdelta(void *file_baton, svn_txdelta_to_svndiff3(&(wb->handler), &(wb->handler_baton), base64_stream, file->uc->svndiff_version, - dav_svn__get_compression_level(), file->pool); + file->uc->compression_level, file->pool); *handler = window_handler; *handler_baton = wb; @@ -845,7 +893,7 @@ upd_close_file(void *file_baton, const c text_checksum)); } - return close_helper(FALSE /* is_dir */, file); + return close_helper(FALSE /* is_dir */, file, pool); } @@ -944,6 +992,7 @@ dav_svn__update_report(const dav_resourc && (strcmp(this_attr->value, "true") == 0)) { uc.send_all = TRUE; + uc.include_props = TRUE; break; } } @@ -1066,6 +1115,14 @@ dav_svn__update_report(const dav_resourc if (strcmp(cdata, "no") == 0) text_deltas = FALSE; } + if (child->ns == ns && strcmp(child->name, "include-props") == 0) + { + cdata = dav_xml_get_cdata(child, resource->pool, 1); + if (! *cdata) + return malformed_element_error(child->name, resource->pool); + if (strcmp(cdata, "no") != 0) + uc.include_props = TRUE; + } } if (!saw_depth && !saw_recursive && (requested_depth == svn_depth_unknown)) @@ -1096,6 +1153,7 @@ dav_svn__update_report(const dav_resourc } uc.svndiff_version = resource->info->svndiff_version; + uc.compression_level = dav_svn__get_compression_level(resource->info->r); uc.resource = resource; uc.output = output; uc.anchor = src_path; @@ -1165,7 +1223,7 @@ dav_svn__update_report(const dav_resourc editor->close_file = upd_close_file; editor->absent_file = upd_absent_file; editor->close_edit = upd_close_edit; - if ((serr = svn_repos_begin_report2(&rbaton, revnum, + if ((serr = svn_repos_begin_report3(&rbaton, revnum, repos->repos, src_path, target, dst_path, @@ -1176,6 +1234,7 @@ dav_svn__update_report(const dav_resourc editor, &uc, dav_svn__authz_read_func(&arb), &arb, + 0, /* disable zero-copy for now */ resource->pool))) { return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/repos.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/repos.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/repos.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/repos.c Sun Oct 21 02:00:31 2012 @@ -1149,8 +1149,11 @@ create_private_resource(const dav_resour comb->res.collection = TRUE; /* ### always true? */ /* versioned = baselined = working = FALSE */ - comb->res.uri = apr_pstrcat(base->pool, base->info->repos->root_path, - path->data, (char *)NULL); + if (base->info->repos->root_path[1]) + comb->res.uri = apr_pstrcat(base->pool, base->info->repos->root_path, + path->data, (char *)NULL); + else + comb->res.uri = path->data; comb->res.info = &comb->priv; comb->res.hooks = &dav_svn__hooks_repository; comb->res.pool = base->pool; @@ -1499,7 +1502,7 @@ get_parentpath_resource(request_rec *r, repos->xslt_uri = dav_svn__get_xslt_uri(r); repos->autoversioning = dav_svn__get_autoversioning_flag(r); repos->bulk_updates = dav_svn__get_bulk_updates_flag(r); - repos->v2_protocol = dav_svn__get_v2_protocol_flag(r); + repos->v2_protocol = dav_svn__check_httpv2_support(r); repos->base_url = ap_construct_url(r->pool, "", r); repos->special_uri = dav_svn__get_special_uri(r); repos->username = r->user; @@ -1908,9 +1911,11 @@ parse_querystring(request_rec *r, const only use a temporary redirect. */ apr_table_setn(r->headers_out, "Location", ap_construct_url(r->pool, - apr_psprintf(r->pool, "%s%s?p=%ld", - comb->priv.repos->root_path, - newpath, working_rev), + apr_psprintf(r->pool, "%s%s?p=%ld", + (comb->priv.repos->root_path[1] + ? comb->priv.repos->root_path + : ""), + newpath, working_rev), r)); return dav_svn__new_error(r->pool, prevstr ? HTTP_MOVED_PERMANENTLY @@ -2077,7 +2082,7 @@ get_resource(request_rec *r, repos->bulk_updates = dav_svn__get_bulk_updates_flag(r); /* Are we advertising HTTP v2 protocol support? */ - repos->v2_protocol = dav_svn__get_v2_protocol_flag(r); + repos->v2_protocol = dav_svn__check_httpv2_support(r); /* Path to activities database */ repos->activities_db = dav_svn__get_activities_db(r); @@ -2217,8 +2222,13 @@ get_resource(request_rec *r, HTTP_INTERNAL_SERVER_ERROR, r); } - /* Configure the hooks environment, if not empty. */ - svn_repos_hooks_setenv(repos->repos, dav_svn__get_hooks_env(r)); + /* Configure hook script environment variables. */ + serr = svn_repos_hooks_setenv(repos->repos, dav_svn__get_hooks_env(r), + r->connection->pool, r->pool); + if (serr) + return dav_svn__sanitize_error(serr, + "Error settings hooks environment", + HTTP_INTERNAL_SERVER_ERROR, r); } /* cache the filesystem object */ @@ -3077,6 +3087,13 @@ set_headers(request_rec *r, const dav_re if ((serr == NULL) && (info.rev != SVN_INVALID_REVNUM)) { mimetype = SVN_SVNDIFF_MIME_TYPE; + + /* Note the base that this svndiff is based on, and tell any + intermediate caching proxies that this header is + significant. */ + apr_table_setn(r->headers_out, "Vary", SVN_DAV_DELTA_BASE_HEADER); + apr_table_setn(r->headers_out, SVN_DAV_DELTA_BASE_HEADER, + resource->info->delta_base); } svn_error_clear(serr); } @@ -3158,7 +3175,7 @@ typedef struct diff_ctx_t { } diff_ctx_t; -static svn_error_t * +static svn_error_t * __attribute__((warn_unused_result)) write_to_filter(void *baton, const char *buffer, apr_size_t *len) { diff_ctx_t *dc = baton; @@ -3179,7 +3196,7 @@ write_to_filter(void *baton, const char } -static svn_error_t * +static svn_error_t * __attribute__((warn_unused_result)) close_filter(void *baton) { diff_ctx_t *dc = baton; @@ -3629,7 +3646,7 @@ deliver(const dav_resource *resource, ap /* get a handler/baton for writing into the output stream */ svn_txdelta_to_svndiff3(&handler, &h_baton, o_stream, resource->info->svndiff_version, - dav_svn__get_compression_level(), + dav_svn__get_compression_level(resource->info->r), resource->pool); /* got everything set up. read in delta windows and shove them into @@ -4345,8 +4362,11 @@ dav_svn__create_working_resource(dav_res res->baselined = base->baselined; /* collection = FALSE. ### not necessarily correct */ - res->uri = apr_pstrcat(base->pool, base->info->repos->root_path, - path, (char *)NULL); + if (base->info->repos->root_path[1]) + res->uri = apr_pstrcat(base->pool, base->info->repos->root_path, + path, (char *)NULL); + else + res->uri = path; res->hooks = &dav_svn__hooks_repository; res->pool = base->pool; @@ -4444,7 +4464,7 @@ handle_post_request(request_rec *r, dav_resource *resource, ap_filter_t *output) { - svn_skel_t *request_skel; + svn_skel_t *request_skel, *post_skel; int status; apr_pool_t *pool = resource->pool; @@ -4461,16 +4481,23 @@ handle_post_request(request_rec *r, return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, "Unable to identify skel POST request flavor."); - if (svn_skel__matches_atom(request_skel->children, "create-txn")) + post_skel = request_skel->children; + + /* NOTE: If you add POST handlers here, you'll want to advertise + that the server supports them, too. See version.c:get_option(). */ + + if (svn_skel__matches_atom(post_skel, "create-txn")) { return dav_svn__post_create_txn(resource, request_skel, output); } - else + else if (svn_skel__matches_atom(post_skel, "create-txn-with-props")) { - return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, - "Unsupported skel POST request flavor."); + return dav_svn__post_create_txn_with_props(resource, + request_skel, output); } - /* NOTREACHED */ + + return dav_svn__new_error(pool, HTTP_BAD_REQUEST, 0, + "Unsupported skel POST request flavor."); } int dav_svn__method_post(request_rec *r) Modified: subversion/branches/ev2-export/subversion/mod_dav_svn/version.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/mod_dav_svn/version.c?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/mod_dav_svn/version.c (original) +++ subversion/branches/ev2-export/subversion/mod_dav_svn/version.c Sun Oct 21 02:00:31 2012 @@ -37,7 +37,9 @@ #include "svn_props.h" #include "svn_dav.h" #include "svn_base64.h" +#include "svn_version.h" #include "private/svn_repos_private.h" +#include "private/svn_subr_private.h" #include "private/svn_dav_protocol.h" #include "private/svn_log.h" #include "private/svn_fspath.h" @@ -146,6 +148,7 @@ get_vsn_options(apr_pool_t *p, apr_text_ apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_LOG_REVPROPS); apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_ATOMIC_REVPROPS); apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_PARTIAL_REPLAY); + apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_INHERITED_PROPS); /* Mergeinfo is a special case: here we merely say that the server * knows how to handle mergeinfo -- whether the repository does too * is a separate matter. @@ -192,6 +195,14 @@ get_option(const dav_resource *resource, } } + /* If we're allowed (by configuration) to do so, advertise support + for ephemeral transaction properties. */ + if (dav_svn__check_ephemeral_txnprops_support(r)) + { + apr_table_addn(r->headers_out, "DAV", + SVN_DAV_NS_DAV_SVN_EPHEMERAL_TXNPROPS); + } + if (resource->info->repos->fs) { svn_error_t *serr; @@ -234,6 +245,19 @@ get_option(const dav_resource *resource, DeltaV-free! If we're configured to advise this support, do so. */ if (resource->info->repos->v2_protocol) { + /* The list of Subversion's custom POSTs. You'll want to keep + this in sync with the handling of these suckers in + handle_post_request(). */ + int i; + svn_version_t *master_version = dav_svn__get_master_version(r); + struct posts_versions_t { + const char *post_name; + svn_version_t min_version; + } posts_versions[] = { + { "create-txn", { 1, 7, 0, "" } }, + { "create-txn-with-props", { 1, 8, 0, "" } }, + }; + apr_table_set(r->headers_out, SVN_DAV_ROOT_URI_HEADER, repos_root_uri); apr_table_set(r->headers_out, SVN_DAV_ME_RESOURCE_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", @@ -256,6 +280,23 @@ get_option(const dav_resource *resource, apr_table_set(r->headers_out, SVN_DAV_VTXN_STUB_HEADER, apr_pstrcat(resource->pool, repos_root_uri, "/", dav_svn__get_vtxn_stub(r), (char *)NULL)); + + /* Report the supported POST types. */ + for (i = 0; i < sizeof(posts_versions)/sizeof(posts_versions[0]); ++i) + { + /* If we're proxying to a master server and its version + number is declared, we can selectively filter out POST + types that it doesn't support. */ + if (master_version + && (! svn_version__at_least(master_version, + posts_versions[i].min_version.major, + posts_versions[i].min_version.minor, + posts_versions[i].min_version.patch))) + continue; + + apr_table_addn(r->headers_out, SVN_DAV_SUPPORTED_POSTS_HEADER, + apr_pstrdup(resource->pool, posts_versions[i].post_name)); + } } return NULL; @@ -398,7 +439,7 @@ dav_svn__checkout(dav_resource *resource shared_activity = apr_pstrdup(resource->info->r->pool, uuid_buf); derr = dav_svn__create_txn(resource->info->repos, &shared_txn_name, - resource->info->r->pool); + NULL, resource->info->r->pool); if (derr) return derr; derr = dav_svn__store_activity(resource->info->repos, @@ -1093,6 +1134,10 @@ deliver_report(request_rec *r, { return dav_svn__get_deleted_rev_report(resource, doc, output); } + else if (strcmp(doc->root->name, SVN_DAV__INHERITED_PROPS_REPORT) == 0) + { + return dav_svn__get_inherited_props_report(resource, doc, output); + } /* NOTE: if you add a report, don't forget to add it to the * dav_svn__reports_list[] array. */ @@ -1138,7 +1183,8 @@ make_activity(dav_resource *resource) SVN_DAV_ERROR_NAMESPACE, SVN_DAV_ERROR_TAG); - err = dav_svn__create_txn(resource->info->repos, &txn_name, resource->pool); + err = dav_svn__create_txn(resource->info->repos, &txn_name, + NULL, resource->pool); if (err != NULL) return err; Modified: subversion/branches/ev2-export/subversion/po/de.po URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/po/de.po?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/po/de.po [UTF-8] (original) +++ subversion/branches/ev2-export/subversion/po/de.po [UTF-8] Sun Oct 21 02:00:31 2012 @@ -4973,9 +4973,8 @@ msgid "Creating pre-revprop-change hook" msgstr "Erzeuge Aktion »pre-revprop-change«" #: ../libsvn_repos/repos.c:618 -#, fuzzy msgid "Creating pre-obliterate hook" -msgstr "Erzeuge Aktion »pre-commit«" +msgstr "Erzeuge Aktion »pre-obliterate«" #: ../libsvn_repos/repos.c:846 msgid "Creating post-commit hook" @@ -4986,9 +4985,8 @@ msgid "Creating post-revprop-change hook msgstr "Erzeuge Aktion »post-revprop-change«" #: ../libsvn_repos/repos.c:1090 -#, fuzzy msgid "Creating post-obliterate hook" -msgstr "Erzeuge Aktion »post-commit«" +msgstr "Erzeuge Aktion »post-obliterate«" #: ../libsvn_repos/repos.c:1100 msgid "Creating conf directory" @@ -7142,14 +7140,14 @@ msgid "Error restoring text for '%s'" msgstr "Fehler beim Wiederherstellen des Textes für »%s«" #: ../libsvn_wc/workqueue.c:1294 -#, fuzzy, c-format +#, c-format msgid "Error processing post-commit work for '%s'" -msgstr "Fehler beim Bearbeiten des Befehls »%s« in »%s«" +msgstr "Fehler beim Verarbeiten der Arbeitsschritte nach Übertragung für »%s«" #: ../libsvn_wc/workqueue.c:2213 -#, fuzzy, c-format +#, c-format msgid "Unrecognized work item in the queue associated with '%s'" -msgstr "Unbekannter Revisionstyp für »%s« angefragt" +msgstr "Unbekannter Arbeitsschritt in Warteschlange von »%s« " #: ../svn/blame-cmd.c:302 ../svn/list-cmd.c:232 msgid "'verbose' option invalid in XML mode" @@ -7177,7 +7175,7 @@ msgstr "»%s« scheint keine URL zu sein #: ../svn/commit-cmd.c:107 #, c-format msgid "svn: warning: The depth of this commit is '%s', but copied directories will regardless be committed with depth '%s'. You must remove unwanted children of those directories in a separate commit.\n" -msgstr "" +msgstr "svn: Warnung: Die Tiefe dieser Übertragung ist »%s«, jedoch werden kopierte Verzeichnisse dennoch mit Tiefe »%s« übertragen. Sie müssen nicht gewollte Kinder dieser Verzeichnisse in einer gesonderten Übertragung entfernen.\n" #: ../svn/conflict-callbacks.c:158 msgid "||||||| ORIGINAL" @@ -7381,14 +7379,13 @@ msgstr "" "Ungültige Option; es gibt keine zusammengeführte Version zum Vergleichen.\n" "\n" -# CHECKME: proper English? #: ../svn/conflict-callbacks.c:651 -#, fuzzy, c-format +#, c-format msgid "" "Invalid option; cannot resolve property conflicts with an external merge tool.\n" "\n" msgstr "" -"Ungültige Option; Auswahl anhand von Konflikten ist in einer Binärdatei nicht möglich.\n" +"Ungültige Option; kann Konflikte in Eigenschaften nicht mit externem Werkzeug zum Zusammenführen auflösen\n" "\n" #: ../svn/conflict-callbacks.c:666 ../svn/conflict-callbacks.c:680 @@ -7934,11 +7931,8 @@ msgstr "" " übergeben" #: ../svn/main.c:210 -#, fuzzy msgid "limit operation by depth ARG ('empty', 'files',\n" -msgstr "" -"begrenzt Operation durch Tiefe PAR (»empty«,\n" -" »files«, »immediates« oder »infinity«)" +msgstr "begrenzt Operation durch Tiefe PAR (»empty«, »files«,\n" #: ../svn/main.c:214 msgid "set new working copy depth to ARG ('exclude',\n" @@ -8038,11 +8032,8 @@ msgstr "" " PAR lesen" #: ../svn/main.c:254 -#, fuzzy msgid "set user configuration option in the format:\n" -msgstr "" -"Benutzerkonfigurationsdateien aus dem Verzeichnis\n" -" PAR lesen" +msgstr "Konfigurationsoption in diesem Format setzen:\n" #: ../svn/main.c:261 msgid "enable automatic properties" @@ -8203,7 +8194,6 @@ msgstr "" " Falls angegeben, bestimmt REV, in welcher Revision zuerst nachgeschaut wird.\n" #: ../svn/main.c:433 -#, fuzzy msgid "" "Associate (or dissociate) changelist CLNAME with the named files.\n" "usage: 1. changelist CLNAME PATH...\n" @@ -8211,8 +8201,8 @@ msgid "" msgstr "" "Verknüpft Änderungsliste CLNAME (oder löst diese Verknüpfung)\n" "mit den angegebenen Dateien.\n" -"Aufruf: 1. changelist CLNAME ZIEL...\n" -" 2. changelist --remove ZIEL...\n" +"Aufruf: 1. changelist CLNAME PFAD...\n" +" 2. changelist --remove PFAD...\n" #: ../svn/main.c:439 msgid "" @@ -8265,7 +8255,6 @@ msgstr "" " die die durchgeführte Aktion beschreiben.\n" #: ../svn/main.c:466 -#, fuzzy msgid "" "Recursively clean up the working copy, removing locks, resuming\n" "unfinished operations, etc.\n" @@ -8273,7 +8262,7 @@ msgid "" msgstr "" "Räumt die Arbeitskopie rekursiv auf, gibt Sperren frei,\n" "nimmt unvollständige Operationen wieder auf, usw.\n" -"Aufruf: cleanup [PFAD...]\n" +"Aufruf: cleanup [AKPFAD...]\n" #: ../svn/main.c:472 msgid "" @@ -8340,7 +8329,6 @@ msgstr "" "von der Quelle der Kopie in das Ziel weiterzureichen.\n" #: ../svn/main.c:505 -#, fuzzy msgid "" "Remove files and directories from version control.\n" "usage: 1. delete PATH...\n" @@ -8356,8 +8344,7 @@ msgid "" " 2. Each item specified by a URL is deleted from the repository\n" " via an immediate commit.\n" msgstr "" -"Entfernt Dateien und Verzeichnisse aus der\n" -"Versionskontrolle.\n" +"Entfernt Dateien und Verzeichnisse aus der Versionskontrolle.\n" "Aufruf: 1. delete PFAD...\n" " 2. delete URL...\n" "\n" @@ -8367,10 +8354,10 @@ msgstr "" " die Option --keep-local wurde angegeben.\n" " PFAD(e), die nicht versioniert oder geändert sind, bzw.\n" " entsprechende Einträge enthalten, werden nur gelöscht, wenn\n" -" die Option »--force« angegeben wird.\n" +" die Optionen --force oder --keep-local angegeben wird.\n" "\n" -" 2. Jede URL wird mittels einer sofortigen Übertragung aus dem\n" -" Projektarchiv entfernt.\n" +" 2. Jedes mit einer URL angegebene Element wird mittels sofortiger\n" +" Übertragung aus dem Projektarchiv entfernt.\n" #: ../svn/main.c:521 msgid "" @@ -9564,6 +9551,8 @@ msgid "" "Upgrade the metadata storage format for a working copy.\n" "usage: upgrade WCPATH...\n" msgstr "" +"Überführt die Metadaten einer Arbeitskopie in ein neues Speicherformat\n" +"Aufruf: upgrade AKPATH...\n" #: ../svn/main.c:1221 ../svnadmin/main.c:86 ../svnlook/main.c:354 #: ../svnsync/main.c:263 @@ -9585,7 +9574,7 @@ msgstr "-c kann nicht mit --old verwende #: ../svn/main.c:1391 #, c-format msgid "Negative number in range (%s) not supported with -c" -msgstr "" +msgstr "Negative Zahl im Bereich (%s) ist mit -c nicht unterstützt" #: ../svn/main.c:1404 #, c-format @@ -9855,42 +9844,42 @@ msgstr "Konflikt von »%s« aufgelöst\n #: ../svn/notify.c:320 ../svn/notify.c:360 #, c-format msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with offset %s" -msgstr "" +msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## mit Versatz %s angewandt" #: ../svn/notify.c:337 ../svn/notify.c:374 #, c-format msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with offset %s" -msgstr "" +msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ mit Versatz %s angewandt" #: ../svn/notify.c:395 #, c-format msgid "> applied hunk ## -%lu,%lu +%lu,%lu ## with fuzz %d (%s)\n" -msgstr "" +msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## mit Unschärfe %d (%s) angewandt\n" #: ../svn/notify.c:405 #, c-format msgid "> applied hunk @@ -%lu,%lu +%lu,%lu @@ with fuzz %d\n" -msgstr "" +msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ mit Unschärfe %d angewandt\n" #: ../svn/notify.c:423 #, c-format msgid "> rejected hunk ## -%lu,%lu +%lu,%lu ## (%s)\n" -msgstr "" +msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## (%s) zurückgewiesen\n" #: ../svn/notify.c:432 #, c-format msgid "> rejected hunk @@ -%lu,%lu +%lu,%lu @@\n" -msgstr "" +msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ zurückgewiesen\n" #: ../svn/notify.c:446 #, c-format msgid "> hunk ## -%lu,%lu +%lu,%lu ## already applied (%s)\n" -msgstr "" +msgstr "> Abschnitt ## -%lu,%lu +%lu,%lu ## bereits angewandt (%s)\n" #: ../svn/notify.c:456 #, c-format msgid "> hunk @@ -%lu,%lu +%lu,%lu @@ already applied\n" -msgstr "" +msgstr "> Abschnitt @@ -%lu,%lu +%lu,%lu @@ bereits angewandt\n" # Currently this is used for checkouts and switches too. If we # want different output, we'll have to add new actions. @@ -10157,7 +10146,7 @@ msgstr "Ziel muss die Revision als Zahl #: ../svn/obliterate-cmd.c:119 msgid "Target must specify a URL" -msgstr "" +msgstr "Ziel muss eine URL angeben" #: ../svn/propdel-cmd.c:117 #, c-format @@ -10303,7 +10292,7 @@ msgstr "hinzugefügt" #: ../svn/tree-conflicts.c:41 ../svn/tree-conflicts.c:63 msgid "replace" -msgstr "" +msgstr "ersetzt" #: ../svn/tree-conflicts.c:60 msgid "missing" @@ -11154,7 +11143,7 @@ msgstr "Filterstatistik nicht anzeigen." #: ../svndumpfilter/main.c:926 msgid "Treat the path prefixes as file glob patterns." -msgstr "" +msgstr "Pfadpräfix als Dateiplatzhalter behandeln." #: ../svndumpfilter/main.c:928 msgid "Remove revisions emptied by filtering." @@ -11754,7 +11743,7 @@ msgstr "Versuchen Sie »svnlook help« f #: ../svnrdump/load_editor.c:97 ../svnsync/main.c:351 msgid "Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program" -msgstr "" +msgstr "Zielserver unterstützt keine atomaren Änderungen von Revisionseigenschaften; Verwenden Sie entweder 1.7 oder ein externes Programm zum Sperren." #: ../svnrdump/load_editor.c:106 ../svnsync/main.c:360 #, c-format @@ -11775,7 +11764,7 @@ msgstr "Konnte Sperre für Zielprojektar #: ../svnrdump/load_editor.c:684 msgid "\"svnrdump load\"'s lock was stolen; can't remove it" -msgstr "" +msgstr "Die Sperre von »svnrump load« wurde gestohlen und konnte nicht entfernt werden" #: ../svnrdump/svnrdump.c:58 msgid "" @@ -11784,6 +11773,10 @@ msgid "" "Dump revisions LOWER to UPPER of repository at remote URL to stdout in a 'dumpfile' portable format.\n" "If only LOWER is given, dump that one revision.\n" msgstr "" +"Aufruf: svnrdump dump URL [-r VON[:BIS]]\n" +"\n" +"Gibt einen Abzug der Revisionen VON:BIS eines Projektarchivs an der entferten URL in einem portablen »Dump«-Format aus.\n" +"Falls nur VON angegeben wurde, wird nur diese Revision ausgegeben.\n" #: ../svnrdump/svnrdump.c:64 msgid "" @@ -11791,6 +11784,9 @@ msgid "" "\n" "Load a 'dumpfile' given on stdin to a repository at remote URL.\n" msgstr "" +"Aufruf: svnrdump load URL\n" +"\n" +"Liest einen Datenstrom im »Dump«-Format von der Standardeingabe in ein Projektarchive an entfertner URL.\n" #: ../svnrdump/svnrdump.c:69 msgid "" @@ -11839,7 +11835,7 @@ msgstr "Revision %ld existiert nicht.\n" #: ../svnrdump/svnrdump.c:592 #, c-format msgid "LOWER cannot be greater than UPPER.\n" -msgstr "" +msgstr "VON kann nicht größer als BIS sein.\n" #: ../svnserve/cyrus_auth.c:264 #, c-format @@ -11928,6 +11924,11 @@ msgid "" " at the same time is not supported in daemon mode.\n" " Use inetd mode or tunnel mode if you need this.]" msgstr "" +"Bevorzuge IPv6 beim Auflösen des abzuhörenden Rechnernamens\n" +" [IPv4 ist als bevorzugt vorgegeben. Gleichzeitige\n" +" Verwendung von IPv4 und IPv6 ist im Daemon-Modus\n" +" nicht unterstützt. Verwenden Sie bei Bedarf inetd\n" +" oder den Tunnel-Modus." #. ### Making the assumption here that WIN32 never has fork and so #. * ### this option never exists when --service exists. Modified: subversion/branches/ev2-export/subversion/po/pl.po URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/po/pl.po?rev=1400556&r1=1400555&r2=1400556&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/po/pl.po [UTF-8] (original) +++ subversion/branches/ev2-export/subversion/po/pl.po [UTF-8] Sun Oct 21 02:00:31 2012 @@ -2225,7 +2225,7 @@ msgstr "Nieznany typ systemu plików: '% #: ../libsvn_fs/fs-loader.c:313 #, c-format msgid "Can't allocate FS mutex" -msgstr "Nie udało się utworzyć semefora FS" +msgstr "Nie udało się utworzyć semafora FS" #: ../libsvn_fs/fs-loader.c:348 #, c-format @@ -3675,7 +3675,7 @@ msgstr "Uzyskano nierozpoznane kodowanie #: ../libsvn_ra_neon/get_locks.c:425 ../libsvn_ra_neon/get_locks.c:429 #: ../libsvn_ra_serf/locks.c:566 msgid "Server does not support locking features" -msgstr "Serwer nie obsługuje blokowania zatwiedzeń" +msgstr "Serwer nie obsługuje blokowania zatwierdzeń" #: ../libsvn_ra_neon/lock.c:196 msgid "Invalid creation date header value in response." @@ -3703,7 +3703,7 @@ msgstr "'%s' nie jest zablokowane w repo #: ../libsvn_ra_neon/lock.c:553 msgid "Failed to fetch lock information" -msgstr "Nieudało się pobrać informacji o blokadzie" +msgstr "Nie udało się pobrać informacji o blokadzie" #: ../libsvn_ra_neon/log.c:169 ../libsvn_ra_serf/log.c:228 #, c-format @@ -4751,7 +4751,7 @@ msgstr "Błąd podczas zamykania pliku n #: ../libsvn_repos/hooks.c:379 #, c-format msgid "Failed to run '%s' hook; broken symlink" -msgstr "Niepowiodło się uruchomienie skryptu hook '%s'; uszkodzone dowiązanie symboliczne" +msgstr "Nie powiodło się uruchomienie skryptu hook '%s'; uszkodzone dowiązanie symboliczne" #: ../libsvn_repos/hooks.c:589 msgid "" @@ -4863,7 +4863,7 @@ msgstr "Brak uprawnień do otwarcia kata #: ../libsvn_repos/reporter.c:1234 #, c-format msgid "Target path '%s' does not exist" -msgstr "Docelowa śieżka '%s' nie istnieje" +msgstr "Docelowa ścieżka '%s' nie istnieje" #: ../libsvn_repos/reporter.c:1242 msgid "Cannot replace a directory from within" @@ -5215,7 +5215,7 @@ msgstr "W pliku '%s' w linii %d: asercja #: ../libsvn_subr/error.c:602 #, c-format msgid "In file '%s' line %d: internal malfunction" -msgstr "W pliku '%s' w linii %d: wewnątrzne niepoprawne funkcjonowanie" +msgstr "W pliku '%s' w linii %d: wewnętrzne niepoprawne funkcjonowanie" #: ../libsvn_subr/io.c:169 #, c-format @@ -5230,7 +5230,7 @@ msgstr "Nie można sprawdzić ścieżki #: ../libsvn_subr/io.c:457 ../libsvn_subr/io.c:3771 #, c-format msgid "Can't open '%s'" -msgstr "Nie mozna otworzyć '%s'" +msgstr "Nie można otworzyć '%s'" #: ../libsvn_subr/io.c:483 ../libsvn_subr/io.c:569 #, c-format @@ -6280,7 +6280,7 @@ msgstr "Format logów zbyt stary. Prosz� #: ../libsvn_wc/conflicts.c:299 msgid "Invalid 'conflict_result' argument" -msgstr "Błądny argument 'conflict_result'" +msgstr "Błędny argument 'conflict_result'" #: ../libsvn_wc/conflicts.c:409 #, c-format @@ -6731,7 +6731,7 @@ msgstr "Nieprawidłowy atrybut %s dla '% #: ../libsvn_wc/props.c:2643 #, c-format msgid "Invalid %s property on '%s': target '%s' is an absolute path or involves '..'" -msgstr "Błędny atrybut %s dla '%s': cel '%s' jest ścieżką bezwględną albo wykorzystuje '..'" +msgstr "Błędny atrybut %s dla '%s': cel '%s' jest ścieżką bezwzględną albo wykorzystuje '..'" #: ../libsvn_wc/questions.c:203 #, fuzzy, c-format @@ -8245,7 +8245,7 @@ msgstr "" "\n" "OSTRZEŻENIE: Dla kompatybilności z poprzednimi wersjami Subversion kopiowania\n" "wykonywane pomiędzy dwoma ścieżkami kopii roboczej (KR -> KR) nie kontaktują\n" -"się z reporytorium. W związku z tym nie mogą domyślnie propagować informacji\n" +"się z repozytorium. W związku z tym nie mogą domyślnie propagować informacji\n" "o łączeniach zmian ze źródła kopii do celu.\n" #: ../svn/main.c:505 @@ -8673,7 +8673,7 @@ msgstr "" " E Istniały (Existed)\n" " R Zastąpiony (Replaced)\n" "\n" -" Znaki w pierwszej kolumnia informują o samym obiekcie. Znaki w drugiej\n" +" Znaki w pierwszej kolumnie informują o samym obiekcie. Znaki w drugiej\n" " kolumnie informują o atrybutach obiektu. 'C' w trzeciej kolumnie wskazuje\n" " na konflikt drzewny, podczas gdy 'C' w pierwszej i drugiej kolumnie\n" " wskazuje odpowiednio na konflikt tekstowy w plikach i w atrybutach plików.\n" @@ -9663,7 +9663,7 @@ msgstr "Opis zmian jest ścieżką (chci #: ../svn/main.c:2065 msgid "The lock comment is a pathname (was -F intended?); use '--force-log' to override" -msgstr "Opis blokady jest ścieżką (chciano użyć -F?); użyj --force-log, bywymusić użycie takiego opisu" +msgstr "Opis blokady jest ścieżką (chciano użyć -F?); użyj --force-log, by wymusić użycie takiego opisu" #: ../svn/main.c:2079 msgid "--relocate and --depth are mutually exclusive"