##// END OF EJS Templates
bundle1: fix bundle1-denied reporting for push over ssh...
bundle1: fix bundle1-denied reporting for push over ssh Changeset b288fb2724bf introduced a config option to have the server deny push using bundle1. The original protocol has not really be design to allow such kind of error reporting so some hack was used. It turned the hack only works on HTTP and that ssh wire peer hangs forever when the same hack is used. After further digging, there is no way to report the error in a unified way. Using 'ooberror' freeze ssh and raising 'Abort' makes HTTP return a HTTP500 without further details. So with sadness we implement a version that dispatch according to the protocol used. We also add a test for pushing over ssh to make sure we won't regress in the future. That test show that the hint is missing, this is another bug fixed in the next changeset.

File last commit:

r30895:c32454d6 default
r30909:d554e624 stable
Show More
compressionparams.c
226 lines | 7.0 KiB | text/x-c | CLexer
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 /**
* Copyright (c) 2016-present, Gregory Szorc
* All rights reserved.
*
* This software may be modified and distributed under the terms
* of the BSD license. See the LICENSE file for details.
*/
#include "python-zstandard.h"
void ztopy_compression_parameters(CompressionParametersObject* params, ZSTD_compressionParameters* zparams) {
zparams->windowLog = params->windowLog;
zparams->chainLog = params->chainLog;
zparams->hashLog = params->hashLog;
zparams->searchLog = params->searchLog;
zparams->searchLength = params->searchLength;
zparams->targetLength = params->targetLength;
zparams->strategy = params->strategy;
}
CompressionParametersObject* get_compression_parameters(PyObject* self, PyObject* args) {
int compressionLevel;
unsigned PY_LONG_LONG sourceSize = 0;
Py_ssize_t dictSize = 0;
ZSTD_compressionParameters params;
CompressionParametersObject* result;
if (!PyArg_ParseTuple(args, "i|Kn", &compressionLevel, &sourceSize, &dictSize)) {
return NULL;
}
params = ZSTD_getCParams(compressionLevel, sourceSize, dictSize);
result = PyObject_New(CompressionParametersObject, &CompressionParametersType);
if (!result) {
return NULL;
}
result->windowLog = params.windowLog;
result->chainLog = params.chainLog;
result->hashLog = params.hashLog;
result->searchLog = params.searchLog;
result->searchLength = params.searchLength;
result->targetLength = params.targetLength;
result->strategy = params.strategy;
return result;
}
PyObject* estimate_compression_context_size(PyObject* self, PyObject* args) {
CompressionParametersObject* params;
ZSTD_compressionParameters zparams;
PyObject* result;
if (!PyArg_ParseTuple(args, "O!", &CompressionParametersType, &params)) {
return NULL;
}
ztopy_compression_parameters(params, &zparams);
result = PyLong_FromSize_t(ZSTD_estimateCCtxSize(zparams));
return result;
}
PyDoc_STRVAR(CompressionParameters__doc__,
"CompressionParameters: low-level control over zstd compression");
static PyObject* CompressionParameters_new(PyTypeObject* subtype, PyObject* args, PyObject* kwargs) {
CompressionParametersObject* self;
unsigned windowLog;
unsigned chainLog;
unsigned hashLog;
unsigned searchLog;
unsigned searchLength;
unsigned targetLength;
unsigned strategy;
if (!PyArg_ParseTuple(args, "IIIIIII", &windowLog, &chainLog, &hashLog, &searchLog,
&searchLength, &targetLength, &strategy)) {
return NULL;
}
if (windowLog < ZSTD_WINDOWLOG_MIN || windowLog > ZSTD_WINDOWLOG_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid window log value");
return NULL;
}
if (chainLog < ZSTD_CHAINLOG_MIN || chainLog > ZSTD_CHAINLOG_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid chain log value");
return NULL;
}
if (hashLog < ZSTD_HASHLOG_MIN || hashLog > ZSTD_HASHLOG_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid hash log value");
return NULL;
}
if (searchLog < ZSTD_SEARCHLOG_MIN || searchLog > ZSTD_SEARCHLOG_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid search log value");
return NULL;
}
if (searchLength < ZSTD_SEARCHLENGTH_MIN || searchLength > ZSTD_SEARCHLENGTH_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid search length value");
return NULL;
}
if (targetLength < ZSTD_TARGETLENGTH_MIN || targetLength > ZSTD_TARGETLENGTH_MAX) {
PyErr_SetString(PyExc_ValueError, "invalid target length value");
return NULL;
}
if (strategy < ZSTD_fast || strategy > ZSTD_btopt) {
PyErr_SetString(PyExc_ValueError, "invalid strategy value");
return NULL;
}
self = (CompressionParametersObject*)subtype->tp_alloc(subtype, 1);
if (!self) {
return NULL;
}
self->windowLog = windowLog;
self->chainLog = chainLog;
self->hashLog = hashLog;
self->searchLog = searchLog;
self->searchLength = searchLength;
self->targetLength = targetLength;
self->strategy = strategy;
return (PyObject*)self;
}
static void CompressionParameters_dealloc(PyObject* self) {
PyObject_Del(self);
}
static Py_ssize_t CompressionParameters_length(PyObject* self) {
return 7;
Danek Duvall
zstd: fix compilation with Solaris Studio...
r30498 }
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435
static PyObject* CompressionParameters_item(PyObject* o, Py_ssize_t i) {
CompressionParametersObject* self = (CompressionParametersObject*)o;
switch (i) {
case 0:
return PyLong_FromLong(self->windowLog);
case 1:
return PyLong_FromLong(self->chainLog);
case 2:
return PyLong_FromLong(self->hashLog);
case 3:
return PyLong_FromLong(self->searchLog);
case 4:
return PyLong_FromLong(self->searchLength);
case 5:
return PyLong_FromLong(self->targetLength);
case 6:
return PyLong_FromLong(self->strategy);
default:
PyErr_SetString(PyExc_IndexError, "index out of range");
return NULL;
}
}
static PySequenceMethods CompressionParameters_sq = {
CompressionParameters_length, /* sq_length */
0, /* sq_concat */
0, /* sq_repeat */
CompressionParameters_item, /* sq_item */
0, /* sq_ass_item */
0, /* sq_contains */
0, /* sq_inplace_concat */
0 /* sq_inplace_repeat */
};
PyTypeObject CompressionParametersType = {
PyVarObject_HEAD_INIT(NULL, 0)
"CompressionParameters", /* tp_name */
sizeof(CompressionParametersObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)CompressionParameters_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
&CompressionParameters_sq, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
CompressionParameters__doc__, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
CompressionParameters_new, /* tp_new */
};
void compressionparams_module_init(PyObject* mod) {
Py_TYPE(&CompressionParametersType) = &PyType_Type;
if (PyType_Ready(&CompressionParametersType) < 0) {
return;
}
Py_IncRef((PyObject*)&CompressionParametersType);
PyModule_AddObject(mod, "CompressionParameters",
(PyObject*)&CompressionParametersType);
}