Author: hwright Date: Fri Aug 12 03:32:50 2011 New Revision: 1156952 URL: http://svn.apache.org/viewvc?rev=1156952&view=rev Log: On the fs-py branch: Write the skeleton configuration file when creating a filesystem in Python. Also tweak some error handling.
* subversion/python/svn/err.py: New. * subversion/python/svn/__init__.py (SubversionException.__init__): Switch order of arguments, since that's how we were calling them. * subversion/python/svn/_cache.py: New. * subversion/python/svn/fs.py (): More constants and imports. (FS._write_config): New. (FS._ensure_revision_exists): Remove i18n wrapper from error message. (FS.__setup_paths): Add a path for the config file. * subversion/libsvn_fs_py/fs_fs.c (svn_fs_py__create): Remove the call to create the config. Added: subversion/branches/fs-py/subversion/python/svn/_cache.py (with props) subversion/branches/fs-py/subversion/python/svn/err.py (with props) Modified: subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c subversion/branches/fs-py/subversion/python/svn/__init__.py subversion/branches/fs-py/subversion/python/svn/fs.py Modified: subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c?rev=1156952&r1=1156951&r2=1156952&view=diff ============================================================================== --- subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c (original) +++ subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c Fri Aug 12 03:32:50 2011 @@ -6286,8 +6286,6 @@ svn_fs_py__create(svn_fs_t *fs, SVN_ERR(svn_fs_py__get_int_attr(&max_files_per_dir, ffd->p_fs, "max_files_per_dir")); - SVN_ERR(write_config(fs, pool)); - SVN_ERR(read_config(fs, pool)); /* Create the txn-current file if the repository supports Modified: subversion/branches/fs-py/subversion/python/svn/__init__.py URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/python/svn/__init__.py?rev=1156952&r1=1156951&r2=1156952&view=diff ============================================================================== --- subversion/branches/fs-py/subversion/python/svn/__init__.py (original) +++ subversion/branches/fs-py/subversion/python/svn/__init__.py Fri Aug 12 03:32:50 2011 @@ -20,7 +20,7 @@ class SubversionException(Exception): - def __init__(self, msg, code = 0): + def __init__(self, code, msg): self.message = msg self.code = code Added: subversion/branches/fs-py/subversion/python/svn/_cache.py URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/python/svn/_cache.py?rev=1156952&view=auto ============================================================================== --- subversion/branches/fs-py/subversion/python/svn/_cache.py (added) +++ subversion/branches/fs-py/subversion/python/svn/_cache.py Fri Aug 12 03:32:50 2011 @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +CONFIG_CATEGORY_MEMCACHED_SERVERS = "memcached-servers" Propchange: subversion/branches/fs-py/subversion/python/svn/_cache.py ------------------------------------------------------------------------------ svn:eol-style = native Added: subversion/branches/fs-py/subversion/python/svn/err.py URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/python/svn/err.py?rev=1156952&view=auto ============================================================================== --- subversion/branches/fs-py/subversion/python/svn/err.py (added) +++ subversion/branches/fs-py/subversion/python/svn/err.py Fri Aug 12 03:32:50 2011 @@ -0,0 +1,279 @@ +#!/usr/bin/env python +### This file automatically generated by tools/dev/gen-py-error.py, +### which see for more information +### +### It is versioned for convenience. + +APMOD_ACTIVITY_NOT_FOUND = 190002 +APMOD_BAD_BASELINE = 190003 +APMOD_CONNECTION_ABORTED = 190004 +APMOD_MALFORMED_URI = 190001 +APMOD_MISSING_PATH_TO_FS = 190000 +ASSERTION_FAIL = 235000 +ASSERTION_ONLY_TRACING_LINKS = 235001 +ATOMIC_INIT_FAILURE = 200029 +AUTHN_CREDS_NOT_SAVED = 215003 +AUTHN_CREDS_UNAVAILABLE = 215000 +AUTHN_FAILED = 215004 +AUTHN_NO_PROVIDER = 215001 +AUTHN_PROVIDERS_EXHAUSTED = 215002 +AUTHZ_INVALID_CONFIG = 220003 +AUTHZ_PARTIALLY_READABLE = 220002 +AUTHZ_ROOT_UNREADABLE = 220000 +AUTHZ_UNREADABLE = 220001 +AUTHZ_UNWRITABLE = 220004 +BAD_CHANGELIST_NAME = 125014 +BAD_CHECKSUM_KIND = 125011 +BAD_CHECKSUM_PARSE = 125012 +BAD_CONFIG_VALUE = 125009 +BAD_CONTAINING_POOL = 125000 +BAD_DATE = 125003 +BAD_FILENAME = 125001 +BAD_MIME_TYPE = 125004 +BAD_PROPERTY_VALUE = 125005 +BAD_PROP_KIND = 200008 +BAD_RELATIVE_PATH = 125007 +BAD_SERVER_SPECIFICATION = 125010 +BAD_TOKEN = 125013 +BAD_URL = 125002 +BAD_UUID = 125008 +BAD_VERSION_FILE_FORMAT = 125006 +BASE = 200000 +CANCELLED = 200015 +CATEGORY_SIZE = 5000 +CEASE_INVOCATION = 200021 +CHECKSUM_MISMATCH = 200014 +CLIENT_BAD_REVISION = 195002 +CLIENT_CYCLE_DETECTED = 195019 +CLIENT_DUPLICATE_COMMIT_URL = 195003 +CLIENT_FILE_EXTERNAL_OVERWRITE_VERSIONED = 195017 +CLIENT_INVALID_EXTERNALS_DESCRIPTION = 195005 +CLIENT_INVALID_RELOCATION = 195009 +CLIENT_IS_BINARY_FILE = 195004 +CLIENT_IS_DIRECTORY = 195007 +CLIENT_MISSING_LOCK_TOKEN = 195013 +CLIENT_MODIFIED = 195006 +CLIENT_MULTIPLE_SOURCES_DISALLOWED = 195014 +CLIENT_NOT_READY_TO_MERGE = 195016 +CLIENT_NO_VERSIONED_PARENT = 195015 +CLIENT_PATCH_BAD_STRIP_COUNT = 195018 +CLIENT_PROPERTY_NAME = 195011 +CLIENT_RA_ACCESS_REQUIRED = 195001 +CLIENT_REVISION_AUTHOR_CONTAINS_NEWLINE = 195010 +CLIENT_REVISION_RANGE = 195008 +CLIENT_UNRELATED_RESOURCES = 195012 +CLIENT_VERSIONED_PATH_REQUIRED = 195000 +CL_ADM_DIR_RESERVED = 205003 +CL_ARG_PARSING_ERROR = 205000 +CL_BAD_LOG_MESSAGE = 205008 +CL_COMMIT_IN_ADDED_DIR = 205006 +CL_ERROR_PROCESSING_EXTERNALS = 205011 +CL_INSUFFICIENT_ARGS = 205001 +CL_LOG_MESSAGE_IS_PATHNAME = 205005 +CL_LOG_MESSAGE_IS_VERSIONED_FILE = 205004 +CL_MUTUALLY_EXCLUSIVE_ARGS = 205002 +CL_NO_EXTERNAL_EDITOR = 205007 +CL_NO_EXTERNAL_MERGE_TOOL = 205010 +CL_UNNECESSARY_LOG_MESSAGE = 205009 +DELTA_MD5_CHECKSUM_ABSENT = 200010 +DIFF_DATASOURCE_MODIFIED = 225000 +DIR_NOT_EMPTY = 200011 +ENTRY_ATTRIBUTE_INVALID = 150005 +ENTRY_EXISTS = 150002 +ENTRY_FORBIDDEN = 150006 +ENTRY_MISSING_REVISION = 150003 +ENTRY_MISSING_URL = 150004 +ENTRY_NOT_FOUND = 150000 +EXTERNAL_PROGRAM = 200012 +FS_ALREADY_EXISTS = 160020 +FS_ALREADY_OPEN = 160002 +FS_BAD_LOCK_TOKEN = 160037 +FS_BERKELEY_DB = 160029 +FS_BERKELEY_DB_DEADLOCK = 160030 +FS_CLEANUP = 160001 +FS_CONFLICT = 160024 +FS_CORRUPT = 160004 +FS_GENERAL = 160000 +FS_ID_NOT_FOUND = 160014 +FS_LOCK_EXPIRED = 160041 +FS_LOCK_OWNER_MISMATCH = 160039 +FS_MALFORMED_SKEL = 160027 +FS_NOT_DIRECTORY = 160016 +FS_NOT_FILE = 160017 +FS_NOT_FOUND = 160013 +FS_NOT_ID = 160015 +FS_NOT_MUTABLE = 160019 +FS_NOT_OPEN = 160003 +FS_NOT_REVISION_ROOT = 160023 +FS_NOT_SINGLE_PATH_COMPONENT = 160018 +FS_NOT_TXN_ROOT = 160022 +FS_NO_LOCK_TOKEN = 160038 +FS_NO_SUCH_CHECKSUM_REP = 160048 +FS_NO_SUCH_COPY = 160011 +FS_NO_SUCH_ENTRY = 160008 +FS_NO_SUCH_LOCK = 160040 +FS_NO_SUCH_NODE_ORIGIN = 160046 +FS_NO_SUCH_REPRESENTATION = 160009 +FS_NO_SUCH_REVISION = 160006 +FS_NO_SUCH_STRING = 160010 +FS_NO_SUCH_TRANSACTION = 160007 +FS_NO_USER = 160034 +FS_OUT_OF_DATE = 160042 +FS_PATH_ALREADY_LOCKED = 160035 +FS_PATH_NOT_LOCKED = 160036 +FS_PATH_SYNTAX = 160005 +FS_PROP_BASEVALUE_MISMATCH = 160049 +FS_REP_BEING_WRITTEN = 160044 +FS_REP_CHANGED = 160025 +FS_REP_NOT_MUTABLE = 160026 +FS_ROOT_DIR = 160021 +FS_TRANSACTION_DEAD = 160031 +FS_TRANSACTION_NOT_DEAD = 160032 +FS_TRANSACTION_NOT_MUTABLE = 160012 +FS_TXN_NAME_TOO_LONG = 160045 +FS_TXN_OUT_OF_DATE = 160028 +FS_UNKNOWN_FS_TYPE = 160033 +FS_UNSUPPORTED_FORMAT = 160043 +FS_UNSUPPORTED_UPGRADE = 160047 +ILLEGAL_TARGET = 200009 +INCOMPLETE_DATA = 200003 +INCORRECT_PARAMS = 200004 +INVALID_DIFF_OPTION = 200016 +IO_CORRUPT_EOL = 135002 +IO_INCONSISTENT_EOL = 135000 +IO_PIPE_FRAME_ERROR = 135004 +IO_PIPE_READ_ERROR = 135005 +IO_UNIQUE_NAMES_EXHAUSTED = 135003 +IO_UNKNOWN_EOL = 135001 +IO_WRITE_ERROR = 135006 +ITER_BREAK = 200023 +LAST = 235002 +MALFORMED_FILE = 200002 +MERGEINFO_PARSE_ERROR = 200020 +NODE_UNEXPECTED_KIND = 145001 +NODE_UNKNOWN_KIND = 145000 +NO_APR_MEMCACHE = 200028 +NO_AUTH_FILE_PATH = 200018 +PLUGIN_LOAD_FAILURE = 200001 +PROPERTY_NOT_FOUND = 200017 +RA_DAV_ALREADY_EXISTS = 175005 +RA_DAV_CONN_TIMEOUT = 175012 +RA_DAV_CREATING_REQUEST = 175001 +RA_DAV_FORBIDDEN = 175013 +RA_DAV_INVALID_CONFIG_VALUE = 175006 +RA_DAV_MALFORMED_DATA = 175009 +RA_DAV_OPTIONS_REQ_FAILED = 175003 +RA_DAV_PATH_NOT_FOUND = 175007 +RA_DAV_PROPPATCH_FAILED = 175008 +RA_DAV_PROPS_NOT_FOUND = 175004 +RA_DAV_RELOCATED = 175011 +RA_DAV_REQUEST_FAILED = 175002 +RA_DAV_RESPONSE_HEADER_BADNESS = 175010 +RA_DAV_SOCK_INIT = 175000 +RA_ILLEGAL_URL = 170000 +RA_LOCAL_REPOS_NOT_FOUND = 180000 +RA_LOCAL_REPOS_OPEN_FAILED = 180001 +RA_NOT_AUTHORIZED = 170001 +RA_NOT_IMPLEMENTED = 170003 +RA_NOT_LOCKED = 170007 +RA_NO_REPOS_UUID = 170005 +RA_OUT_OF_DATE = 170004 +RA_PARTIAL_REPLAY_NOT_SUPPORTED = 170008 +RA_REPOS_ROOT_URL_MISMATCH = 170010 +RA_SERF_GSSAPI_INITIALISATION_FAILED = 230002 +RA_SERF_SSL_CERT_UNTRUSTED = 230001 +RA_SERF_SSPI_INITIALISATION_FAILED = 230000 +RA_SERF_WRAPPED_ERROR = 230003 +RA_SESSION_URL_MISMATCH = 170011 +RA_SVN_BAD_VERSION = 210006 +RA_SVN_CMD_ERR = 210000 +RA_SVN_CONNECTION_CLOSED = 210002 +RA_SVN_EDIT_ABORTED = 210008 +RA_SVN_IO_ERROR = 210003 +RA_SVN_MALFORMED_DATA = 210004 +RA_SVN_NO_MECHANISMS = 210007 +RA_SVN_REPOS_NOT_FOUND = 210005 +RA_SVN_UNKNOWN_CMD = 210001 +RA_UNKNOWN_AUTH = 170002 +RA_UNSUPPORTED_ABI_VERSION = 170006 +RA_UUID_MISMATCH = 170009 +REPOS_BAD_ARGS = 165002 +REPOS_BAD_REVISION_REPORT = 165004 +REPOS_DISABLED_FEATURE = 165006 +REPOS_HOOK_FAILURE = 165001 +REPOS_LOCKED = 165000 +REPOS_NO_DATA_FOR_REPORT = 165003 +REPOS_POST_COMMIT_HOOK_FAILED = 165007 +REPOS_POST_LOCK_HOOK_FAILED = 165008 +REPOS_POST_UNLOCK_HOOK_FAILED = 165009 +REPOS_UNSUPPORTED_UPGRADE = 165010 +REPOS_UNSUPPORTED_VERSION = 165005 +RESERVED_FILENAME_SPECIFIED = 200025 +REVNUM_PARSE_FAILURE = 200022 +SQLITE_BUSY = 200033 +SQLITE_ERROR = 200030 +SQLITE_READONLY = 200031 +SQLITE_RESETTING_FOR_ROLLBACK = 200034 +SQLITE_UNSUPPORTED_SCHEMA = 200032 +STREAM_MALFORMED_DATA = 140001 +STREAM_SEEK_NOT_SUPPORTED = 140003 +STREAM_UNEXPECTED_EOF = 140000 +STREAM_UNRECOGNIZED_DATA = 140002 +SVNDIFF_BACKWARD_VIEW = 185002 +SVNDIFF_CORRUPT_WINDOW = 185001 +SVNDIFF_INVALID_COMPRESSED_DATA = 185005 +SVNDIFF_INVALID_HEADER = 185000 +SVNDIFF_INVALID_OPS = 185003 +SVNDIFF_UNEXPECTED_END = 185004 +SWIG_PY_EXCEPTION_SET = 200013 +TEST_FAILED = 200006 +TEST_SKIPPED = 200027 +UNKNOWN_CAPABILITY = 200026 +UNKNOWN_CHANGELIST = 200024 +UNSUPPORTED_FEATURE = 200007 +UNVERSIONED_RESOURCE = 200005 +VERSION_MISMATCH = 200019 +WC_BAD_ADM_LOG = 155009 +WC_BAD_ADM_LOG_START = 155020 +WC_BAD_PATH = 155022 +WC_CANNOT_DELETE_FILE_EXTERNAL = 155030 +WC_CANNOT_MOVE_FILE_EXTERNAL = 155031 +WC_CHANGELIST_MOVE = 155029 +WC_CLEANUP_REQUIRED = 155037 +WC_CONFLICT_RESOLVER_FAILURE = 155027 +WC_COPYFROM_PATH_NOT_FOUND = 155028 +WC_CORRUPT = 155016 +WC_CORRUPT_TEXT_BASE = 155017 +WC_DB_ERROR = 155032 +WC_FOUND_CONFLICT = 155015 +WC_INVALID_LOCK = 155006 +WC_INVALID_OPERATION_DEPTH = 155038 +WC_INVALID_OP_ON_CWD = 155019 +WC_INVALID_RELOCATION = 155024 +WC_INVALID_SCHEDULE = 155023 +WC_INVALID_SWITCH = 155025 +WC_LEFT_LOCAL_MOD = 155012 +WC_LOCKED = 155004 +WC_MISMATCHED_CHANGELIST = 155026 +WC_MISSING = 155033 +WC_NODE_KIND_CHANGE = 155018 +WC_NOT_FILE = 155008 +WC_NOT_LOCKED = 155005 +WC_NOT_SYMLINK = 155034 +WC_NOT_UP_TO_DATE = 155011 +WC_NOT_WORKING_COPY = 155007 +WC_OBSTRUCTED_UPDATE = 155000 +WC_PATH_FOUND = 155014 +WC_PATH_NOT_FOUND = 155010 +WC_PATH_UNEXPECTED_STATUS = 155035 +WC_SCHEDULE_CONFLICT = 155013 +WC_UNSUPPORTED_FORMAT = 155021 +WC_UNWIND_EMPTY = 155002 +WC_UNWIND_MISMATCH = 155001 +WC_UNWIND_NOT_EMPTY = 155003 +WC_UPGRADE_REQUIRED = 155036 +XML_ATTRIB_NOT_FOUND = 130000 +XML_MALFORMED = 130003 +XML_MISSING_ANCESTRY = 130001 +XML_UNESCAPABLE_DATA = 130004 +XML_UNKNOWN_ENCODING = 130002 Propchange: subversion/branches/fs-py/subversion/python/svn/err.py ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/branches/fs-py/subversion/python/svn/fs.py URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/python/svn/fs.py?rev=1156952&r1=1156951&r2=1156952&view=diff ============================================================================== --- subversion/branches/fs-py/subversion/python/svn/fs.py (original) +++ subversion/branches/fs-py/subversion/python/svn/fs.py Fri Aug 12 03:32:50 2011 @@ -23,6 +23,8 @@ import os, uuid, stat, shutil, tempfile, import svn import svn.hash import svn.prop +import svn._cache +import svn.err # Some constants CONFIG_PRE_1_4_COMPATIBLE = "pre-1.4-compatible" @@ -39,6 +41,7 @@ PATH_TXNS_DIR = "transacti PATH_TXN_PROTOS_DIR = "txn-protorevs" # Directory of proto-revs PATH_MIN_UNPACKED_REV = "min-unpacked-rev" # Oldest revision which # has not been packed. +PATH_CONFIG = "fsfs.conf" # Configuration FORMAT_NUMBER = 4 @@ -50,6 +53,56 @@ MIN_PACKED_FORMAT = 4 _DEFAULT_MAX_FILES_PER_DIR = 1000 _TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ' +# Names of sections and options in fsfs.conf. +CONFIG_SECTION_CACHES = "caches" +CONFIG_OPTION_FAIL_STOP = "fail-stop" +CONFIG_SECTION_REP_SHARING = "rep-sharing" +CONFIG_OPTION_ENABLE_REP_SHARING = "enable-rep-sharing" + +_DEFAULT_CONFIG_CONTENTS = \ +'''### This file controls the configuration of the FSFS filesystem. + +[%s] +### These options name memcached servers used to cache internal FSFS +### data. See http://www.danga.com/memcached/ for more information on +### memcached. To use memcached with FSFS, run one or more memcached +### servers, and specify each of them as an option like so: +# first-server = 127.0.0.1:11211 +# remote-memcached = mymemcached.corp.example.com:11212 +### The option name is ignored; the value is of the form HOST:PORT. +### memcached servers can be shared between multiple repositories; +### however, if you do this, you *must* ensure that repositories have +### distinct UUIDs and paths, or else cached data from one repository +### might be used by another accidentally. Note also that memcached has +### no authentication for reads or writes, so you must ensure that your +### memcached servers are only accessible by trusted users. + +[%s] +### When a cache-related error occurs, normally Subversion ignores it +### and continues, logging an error if the server is appropriately +### configured (and ignoring it with file:// access). To make +### Subversion never ignore cache errors, uncomment this line. +# %s = true + +[%s] +### To conserve space, the filesystem can optionally avoid storing +### duplicate representations. This comes at a slight cost in +### performance, as maintaining a database of shared representations can +### increase commit times. The space savings are dependent upon the size +### of the repository, the number of objects it contains and the amount of +### duplication between them, usually a function of the branching and +### merging process. +### +### The following parameter enables rep-sharing in the repository. It can +### be switched on and off at will, but for best space-saving results +### should be enabled consistently over the life of the repository. +### 'svnadmin verify' will check the rep-cache regardless of this setting. +### rep-sharing is enabled by default. +# %s = true +''' % (svn._cache.CONFIG_CATEGORY_MEMCACHED_SERVERS, CONFIG_SECTION_CACHES, + CONFIG_OPTION_FAIL_STOP, CONFIG_SECTION_REP_SHARING, + CONFIG_OPTION_ENABLE_REP_SHARING) + class FS(object): def __path_rev_shard(self, rev): @@ -111,6 +164,10 @@ class FS(object): shutil.copymode(self.__path_current, self.__path_uuid) + def _write_config(self): + with open(self.__path_config, 'w') as f: + f.write(_DEFAULT_CONFIG_CONTENTS) + def _ensure_revision_exists(self, rev): if not svn.is_valid_revnum(rev): raise svn.SubversionException(svn.err.FS_NO_SUCH_REVISION, @@ -126,7 +183,7 @@ class FS(object): return raise svn.SubversionException(svn.err.FS_NO_SUCH_REVISION, - _("No such revision %ld") % rev) + "No such revision %ld" % rev) def _set_revision_proplist(self, rev, props): self._ensure_revision_exists(rev) @@ -262,6 +319,7 @@ class FS(object): self.__path_min_unpacked_rev = os.path.join(self.path, PATH_MIN_UNPACKED_REV) self.__path_lock = os.path.join(self.path, PATH_LOCK_FILE) + self.__path_config = os.path.join(self.path, PATH_CONFIG) def __init__(self, path, create=False, config=None):