diff --git a/.travis.sh b/.travis.sh index b9835f2..09befbb 100755 --- a/.travis.sh +++ b/.travis.sh @@ -2,7 +2,7 @@ cd ~ -git clone --depth=1 -b maint/v0.24 https://github.com/libgit2/libgit2.git +git clone --depth=1 -b maint/v0.25 https://github.com/libgit2/libgit2.git cd libgit2/ mkdir build && cd build diff --git a/appveyor.yml b/appveyor.yml index 228279f..21919aa 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -25,7 +25,7 @@ init: build_script: - cmd: | set LIBGIT2=%APPVEYOR_BUILD_FOLDER%\build\libgit2 - git clone --depth=1 -b maint/v0.24 https://github.com/libgit2/libgit2.git libgit2 + git clone --depth=1 -b maint/v0.25 https://github.com/libgit2/libgit2.git libgit2 mkdir build cd build diff --git a/docs/install.rst b/docs/install.rst index 094333e..2f3c737 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -14,7 +14,7 @@ Requirements ============ - Python 2.7, 3.2+ or PyPy 2.6+ (including the development headers) -- Libgit2 v0.23.x +- Libgit2 v0.25.x - cffi 1.0+ - six - tox (optional) @@ -43,11 +43,11 @@ while the last number |lq| *.micro* |rq| auto-increments independently. As illustration see this table of compatible releases: -+-----------+-----------------------+----------------------------------------+ -|**libgit2**| 0.24.0, 0.24.1 0.24.2 | 0.23.0, 0.23.1, 0.23.2, 0.23.3, 0.23.4 | -+-----------+-----------------------+----------------------------------------+ -|**pygit2** | 0.24.0, 0.24.1 0.24.2 | 0.23.0, 0.23.1, 0.23.2, 0.23.3 | -+-----------+-----------------------+----------------------------------------+ ++-----------+--------+--------------+--------+ +|**libgit2**| 0.25.0 | 0.24.0, 0.24.1 0.24.2 | ++-----------+--------+--------------+--------+ +|**pygit2** | 0.25.0 | 0.24.0, 0.24.1 0.24.2 | ++-----------+--------+--------------+--------+ .. warning:: @@ -64,9 +64,9 @@ directory, do: .. code-block:: sh - $ wget https://github.com/libgit2/libgit2/archive/v0.24.2.tar.gz - $ tar xzf v0.24.2.tar.gz - $ cd libgit2-0.24.2/ + $ wget https://github.com/libgit2/libgit2/archive/v0.25.0.tar.gz + $ tar xzf v0.25.0.tar.gz + $ cd libgit2-0.25.0/ $ cmake . $ make $ sudo make install @@ -148,9 +148,9 @@ Install libgit2 (see we define the installation prefix): .. code-block:: sh - $ wget https://github.com/libgit2/libgit2/archive/v0.23.4.tar.gz - $ tar xzf v0.23.4.tar.gz - $ cd libgit2-0.23.4/ + $ wget https://github.com/libgit2/libgit2/archive/v0.25.0.tar.gz + $ tar xzf v0.25.0.tar.gz + $ cd libgit2-0.25.0/ $ cmake . -DCMAKE_INSTALL_PREFIX=$LIBGIT2 $ make $ make install @@ -186,7 +186,7 @@ everytime. Verify yourself if curious: .. code-block:: sh - $ readelf --dynamic lib/python2.7/site-packages/pygit2-0.23.0-py2.7-linux-x86_64.egg/_pygit2.so | grep PATH + $ readelf --dynamic lib/python2.7/site-packages/pygit2-0.25.0-py2.7-linux-x86_64.egg/_pygit2.so | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/tmp/venv/lib] @@ -203,9 +203,9 @@ from a bash shell: .. code-block:: sh $ export LIBGIT2=C:/Dev/libgit2 - $ wget https://github.com/libgit2/libgit2/archive/v0.23.4.tar.gz - $ tar xzf v0.23.4.tar.gz - $ cd libgit2-0.23.4/ + $ wget https://github.com/libgit2/libgit2/archive/v0.25.0.tar.gz + $ tar xzf v0.25.0.tar.gz + $ cd libgit2-0.25.0/ $ cmake . -DSTDCALL=OFF -DCMAKE_INSTALL_PREFIX=$LIBGIT2 -G "Visual Studio 9 2008" $ cmake --build . --config release --target install $ ctest -v diff --git a/pygit2/decl.h b/pygit2/decl.h index 4f56006..58676ac 100644 --- a/pygit2/decl.h +++ b/pygit2/decl.h @@ -207,11 +207,30 @@ struct git_remote_callbacks { typedef struct git_remote_callbacks git_remote_callbacks; +typedef enum { + GIT_PROXY_NONE, + GIT_PROXY_AUTO, + GIT_PROXY_SPECIFIED, +} git_proxy_t; + +typedef struct { + unsigned int version; + git_proxy_t type; + const char *url; + git_cred_acquire_cb credentials; + git_transport_certificate_check_cb certificate_check; + void *payload; +} git_proxy_options; + +#define GIT_PROXY_OPTIONS_VERSION ... +int git_proxy_init_options(git_proxy_options *opts, unsigned int version); + typedef struct { unsigned int version; unsigned int pb_parallelism; git_remote_callbacks callbacks; - git_strarray custom_headers; + git_proxy_options proxy_opts; + git_strarray custom_headers; } git_push_options; #define GIT_PUSH_OPTIONS_VERSION ... @@ -236,7 +255,8 @@ typedef struct { git_fetch_prune_t prune; int update_fetchhead; git_remote_autotag_option_t download_tags; - git_strarray custom_headers; + git_proxy_options proxy_opts; + git_strarray custom_headers; } git_fetch_options; #define GIT_FETCH_OPTIONS_VERSION ... @@ -738,7 +758,8 @@ typedef struct { unsigned int rename_threshold; unsigned int target_limit; git_diff_similarity_metric *metric; - unsigned int recursion_limit; + unsigned int recursion_limit; + const char *default_driver; git_merge_file_favor_t file_favor; unsigned int file_flags; } git_merge_options; diff --git a/src/repository.c b/src/repository.c index ad3f4e8..355070e 100644 --- a/src/repository.c +++ b/src/repository.c @@ -862,38 +862,17 @@ Repository_create_blob_fromdisk(Repository *self, PyObject *args) } +#define BUFSIZE 4096 + PyDoc_STRVAR(Repository_create_blob_fromiobase__doc__, "create_blob_fromiobase(io.IOBase) -> Oid\n" "\n" "Create a new blob from an IOBase object."); - -int read_chunk(char *content, size_t max_length, void *payload) -{ - PyObject *py_file; - PyObject *py_bytes; - char *bytes; - Py_ssize_t size; - - py_file = (PyObject *)payload; - py_bytes = PyObject_CallMethod(py_file, "read", "i", max_length); - if (!py_bytes) - return -1; - - size = 0; - if (py_bytes != Py_None) { - bytes = PyBytes_AsString(py_bytes); - size = PyBytes_Size(py_bytes); - memcpy(content, bytes, size); - } - - Py_DECREF(py_bytes); - return size; -} - PyObject * Repository_create_blob_fromiobase(Repository *self, PyObject *py_file) { + git_writestream *stream; git_oid oid; PyObject *py_is_readable; int is_readable; @@ -915,8 +894,47 @@ Repository_create_blob_fromiobase(Repository *self, PyObject *py_file) return NULL; } - err = git_blob_create_fromchunks(&oid, self->repo, NULL, &read_chunk, - py_file); + err = git_blob_create_fromstream(&stream, self->repo, NULL); + if (err < 0) + return Error_set(err); + + for (;;) { + PyObject *py_bytes; + char *bytes; + Py_ssize_t size; + + py_bytes = PyObject_CallMethod(py_file, "read", "i", 4096); + if (!py_bytes) + return NULL; + + if (py_bytes == Py_None) { + Py_DECREF(py_bytes); + goto cleanup; + } + + if (PyBytes_AsStringAndSize(py_bytes, &bytes, &size)) { + Py_DECREF(py_bytes); + return NULL; + } + + if (size == 0) { + Py_DECREF(py_bytes); + break; + } + + err = stream->write(stream, bytes, size); + Py_DECREF(py_bytes); + if (err < 0) + goto cleanup; + } + +cleanup: + if (err < 0) { + stream->free(stream); + return Error_set(err); + } + + err = git_blob_create_fromstream_commit(&oid, stream); if (err < 0) return Error_set(err); diff --git a/src/types.h b/src/types.h index 44ae946..d739aa2 100644 --- a/src/types.h +++ b/src/types.h @@ -32,8 +32,8 @@ #include <Python.h> #include <git2.h> -#if !(LIBGIT2_VER_MAJOR == 0 && LIBGIT2_VER_MINOR == 24) -#error You need a compatible libgit2 version (v0.24.x) +#if !(LIBGIT2_VER_MAJOR == 0 && LIBGIT2_VER_MINOR == 25) +#error You need a compatible libgit2 version (v0.25.x) #endif /*