blob: 4f70de389b0eddc0a9403618936a48308ea7046a [file] [log] [blame]
/*
* ====================================================================
* Copyright (c) 2000-2002 CollabNet. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://subversion.tigris.org/license-1.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://subversion.tigris.org/.
* ====================================================================
*/
#include <ruby.h>
#include <svn_error.h>
#include "svn_ruby.h"
#include "error.h"
static VALUE mSvnError, eGeneral;
/* ### This will break if first or last error is changed. */
#define SVN_RUBY_ERR_START SVN_WARNING
#define SVN_RUBY_ERR_END SVN_ERR_CL_ADM_DIR_RESERVED
#define SVN_RUBY_ERR_PROTECTED APR_OS_START_SYSERR - 1
#define SVN_RUBY_ERR_OBJECT "svn-ruby-error-object"
static VALUE error_list[SVN_RUBY_ERR_END - SVN_RUBY_ERR_START + 1];
/* To protect exception from GC. */
static VALUE error_hash;
EXTERN VALUE ruby_errinfo;
svn_error_t *
svn_ruby_error (const char *msg, apr_pool_t *pool)
{
svn_error_t *err;
err = svn_error_createf (SVN_RUBY_ERR_PROTECTED, 0, 0, pool,
"%s", msg);
apr_pool_userdata_set ((void *) ruby_errinfo, SVN_RUBY_ERR_OBJECT,
apr_pool_cleanup_null, err->pool);
if (ruby_errinfo != Qnil)
rb_hash_aset (error_hash, ruby_errinfo, Qnil);
return err;
}
void
svn_ruby_raise (svn_error_t *err)
{
VALUE err_obj;
if (err->apr_err == SVN_RUBY_ERR_PROTECTED)
{
void *value;
apr_pool_userdata_get (&value, SVN_RUBY_ERR_OBJECT, err->pool);
err_obj = (VALUE) value;
if (err_obj == Qnil)
err_obj = rb_exc_new2 (rb_eException, err->message);
else
rb_funcall (error_hash, rb_intern ("delete"), 1, err_obj);
}
else
{
VALUE err_class;
if (SVN_RUBY_ERR_START <= err->apr_err && err->apr_err <= SVN_RUBY_ERR_END)
err_class = error_list[err->apr_err - SVN_RUBY_ERR_START];
else
err_class = eGeneral;
/* #### What about err->child? Shouldn't we accumulate error messages? */
err_obj = rb_exc_new2 (err_class, err->message);
rb_iv_set (err_obj, "aprErr", INT2FIX (err->apr_err));
rb_iv_set (err_obj, "srcErr", INT2FIX (err->apr_err));
}
rb_exc_raise (err_obj);
}
static void
define_error (int svn_err, const char *err_class)
{
VALUE obj;
obj = rb_define_class_under (mSvnError, err_class, rb_eStandardError);
error_list[svn_err - SVN_RUBY_ERR_START] = obj;
}
void
svn_ruby_init_error (void)
{
mSvnError = rb_define_module_under (svn_ruby_mSvn, "Error");
eGeneral = rb_define_class_under (mSvnError, "General",
rb_eStandardError);
define_error (SVN_WARNING, "Warning");
define_error (SVN_ERR_PLUGIN_LOAD_FAILURE, "PluginLoadFailure");
define_error (SVN_ERR_UNKNOWN_FS_ACTION, "UnknownFsAction");
define_error (SVN_ERR_UNEXPECTED_EOF, "UnexpectedEof");
define_error (SVN_ERR_MALFORMED_FILE, "MalformedFile");
define_error (SVN_ERR_INCOMPLETE_DATA, "IncompleteData");
define_error (SVN_ERR_MALFORMED_XML, "MalformedXml");
define_error (SVN_ERR_UNVERSIONED_RESOURCE, "UnversionedResource");
define_error (SVN_ERR_UNFRUITFUL_DESCENT, "UnfruitfulDescent");
define_error (SVN_ERR_BAD_FILENAME, "BadFilename");
define_error (SVN_ERR_BAD_URL, "BadURL");
define_error (SVN_ERR_UNSUPPORTED_FEATURE, "UnsupportedFeature");
define_error (SVN_ERR_UNKNOWN_NODE_KIND, "UnknownNodeKind");
define_error (SVN_ERR_DELTA_MD5_CHECKSUM_ABSENT, "DeltaMd5ChecksumAbsent");
define_error (SVN_ERR_XML_ATTRIB_NOT_FOUND, "XmlAttribNotFound");
define_error (SVN_ERR_XML_MISSING_ANCESTRY, "XmlMissingAncestry");
define_error (SVN_ERR_XML_UNKNOWN_ENCODING, "XmlUnknownEncoding");
define_error (SVN_ERR_IO_INCONSISTENT_EOL, "IoInconsistentEOL");
define_error (SVN_ERR_IO_UNKNOWN_EOL, "IoUnknownEOL");
define_error (SVN_ERR_IO_CORRUPT_EOL, "IoCorruptEOL");
define_error (SVN_ERR_ENTRY_NOT_FOUND, "EntryNotFound");
define_error (SVN_ERR_ENTRY_EXISTS, "EntryExists");
define_error (SVN_ERR_ENTRY_MISSING_REVISION, "EntryMissingRevision");
define_error (SVN_ERR_ENTRY_MISSING_URL, "EntryMissingURL");
define_error (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, "EntryAttributeInvalid");
define_error (SVN_ERR_WC_OBSTRUCTED_UPDATE, "WcObstructedUpdate");
define_error (SVN_ERR_WC_UNWIND_MISMATCH, "WcUnwindMismatch");
define_error (SVN_ERR_WC_UNWIND_EMPTY, "WcUnwindEmpty");
define_error (SVN_ERR_WC_UNWIND_NOT_EMPTY, "WcUnwindNotEmpty");
define_error (SVN_ERR_WC_LOCKED, "WcLocked");
define_error (SVN_ERR_WC_NOT_DIRECTORY, "WcNotDirectory");
define_error (SVN_ERR_WC_NOT_FILE, "WcNotFile");
define_error (SVN_ERR_WC_BAD_ADM_LOG, "WcBadAdmLog");
define_error (SVN_ERR_WC_PATH_NOT_FOUND, "WcPathNotFound");
define_error (SVN_ERR_WC_UNEXPECTED_KIND, "WcUnexpectedKind");
define_error (SVN_ERR_WC_NOT_UP_TO_DATE, "WcNotUpToDate");
define_error (SVN_ERR_WC_LEFT_LOCAL_MOD, "WcLeftLocalMod");
define_error (SVN_ERR_IO_UNIQUE_NAMES_EXHAUSTED, "IoUniqueNamesExhausted");
define_error (SVN_ERR_WC_FOUND_CONFLICT, "WcFoundConflict");
define_error (SVN_ERR_WC_CORRUPT, "WcCorrupt");
define_error (SVN_ERR_FS_GENERAL, "FsGeneral");
define_error (SVN_ERR_FS_CLEANUP, "FsCleanup");
define_error (SVN_ERR_FS_ALREADY_OPEN, "FsAlreadyOpen");
define_error (SVN_ERR_FS_NOT_OPEN, "FsNotOpen");
define_error (SVN_ERR_FS_CORRUPT, "FsCorrupt");
define_error (SVN_ERR_FS_PATH_SYNTAX, "FsPathSyntax");
define_error (SVN_ERR_FS_NO_SUCH_REVISION, "FsNoSuchRevision");
define_error (SVN_ERR_FS_NO_SUCH_TRANSACTION, "FsNoSuchTransaction");
define_error (SVN_ERR_FS_NO_SUCH_ENTRY, "FsNoSuchEntry");
define_error (SVN_ERR_FS_NO_SUCH_REPRESENTATION, "FsNoSuchRepresentation");
define_error (SVN_ERR_FS_NO_SUCH_STRING, "FsNoSuchString");
define_error (SVN_ERR_FS_NOT_FOUND, "FsNotFound");
define_error (SVN_ERR_FS_ID_NOT_FOUND, "FsIdNotFound");
define_error (SVN_ERR_FS_NOT_ID, "FsNotId");
define_error (SVN_ERR_FS_NOT_DIRECTORY, "FsNotDirectory");
define_error (SVN_ERR_FS_NOT_FILE, "FsNotFile");
define_error (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, "FsNotSinglePathComponent");
define_error (SVN_ERR_FS_NOT_MUTABLE, "FsNotMutable");
define_error (SVN_ERR_FS_ALREADY_EXISTS, "FsAlreadyExists");
define_error (SVN_ERR_FS_DIR_NOT_EMPTY, "FsDirNotEmpty");
define_error (SVN_ERR_FS_ROOT_DIR, "FsRootDir");
define_error (SVN_ERR_FS_NOT_TXN_ROOT, "FsNotTxnRoot");
define_error (SVN_ERR_FS_NOT_REVISION_ROOT, "FsNotRevisionRoot");
define_error (SVN_ERR_FS_CONFLICT, "FsConflict");
define_error (SVN_ERR_FS_REP_CHANGED, "FsRepChanged");
define_error (SVN_ERR_FS_REP_NOT_MUTABLE, " SvnErrFsRepNotMutable");
define_error (SVN_ERR_TXN_OUT_OF_DATE, "TxnOutOfDate");
define_error (SVN_ERR_REPOS_LOCKED, "ReposLocked");
define_error (SVN_ERR_REPOS_HOOK_FAILURE, "ReposHookFailure");
define_error (SVN_ERR_EXTERNAL_PROGRAM, "ExternalProgram");
define_error (SVN_ERR_BERKELEY_DB, "BerkeleyDb");
define_error (SVN_ERR_RA_ILLEGAL_URL, "RaIllegalUrl");
define_error (SVN_ERR_RA_NOT_AUTHORIZED, "RaNotAuthorized");
define_error (SVN_ERR_RA_UNKNOWN_AUTH, "RaUnknownAuth");
define_error (SVN_ERR_RA_SOCK_INIT, "RaSockInit");
define_error (SVN_ERR_RA_HOSTNAME_LOOKUP, "RaHostnameLookup");
define_error (SVN_ERR_RA_CREATING_REQUEST, "RaCreatingRequest");
define_error (SVN_ERR_RA_REQUEST_FAILED, "RaRequestFailed");
define_error (SVN_ERR_RA_MKACTIVITY_FAILED, "RaMkactivityFailed");
define_error (SVN_ERR_RA_DELETE_FAILED, "RaDeleteFailed");
define_error (SVN_ERR_RA_PROPS_NOT_FOUND, "RaPropsNotFound");
define_error (SVN_ERR_RA_NOT_VERSIONED_RESOURCE, "RaNotVersionedResource");
define_error (SVN_ERR_RA_BAD_REVISION_REPORT, "RaBadRevisionReport");
define_error (SVN_ERR_SVNDIFF_INVALID_HEADER, "SvndiffInvalidHeader");
define_error (SVN_ERR_SVNDIFF_CORRUPT_WINDOW, "SvndiffCorruptWindow");
define_error (SVN_ERR_SVNDIFF_BACKWARD_VIEW, "SvndiffBackwardView");
define_error (SVN_ERR_SVNDIFF_INVALID_OPS, "SvndiffInvalidOps");
define_error (SVN_ERR_SVNDIFF_UNEXPECTED_END, "SvndiffUnexpectedEnd");
define_error (SVN_ERR_BAD_CONTAINING_POOL, "BadContainingPool");
define_error (SVN_ERR_APMOD_MISSING_PATH_TO_FS, "ApmodMissingPathToFs");
define_error (SVN_ERR_APMOD_MALFORMED_URI, "ApmodMalformedUri");
define_error (SVN_ERR_TEST_FAILED, "TestFailed");
define_error (SVN_ERR_CL_ARG_PARSING_ERROR, "ClArgParsingError");
define_error (SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, "ClMutuallyExclusiveArgs");
define_error (SVN_ERR_CL_ADM_DIR_RESERVED, "ClAdmDirReserved");
error_hash = rb_hash_new ();
rb_global_variable (&error_hash);
}