From f82b9d94732b5322309aaf15eeb759fd22ec9f06 Mon Sep 17 00:00:00 2001 From: tbranyen Date: Mon, 19 Dec 2011 23:12:22 -0500 Subject: [PATCH 01/63] updated release notes --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f0e0d639a..17cf4df92 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,9 @@ Release information __Can keep track of current method coverage at: [http://bit.ly/tb_methods](http://bit.ly/tb_methods)__ +### v0.0.6: ### + * Updated to work with Node ~0.6. + ### v0.0.5: ### * Added in fast Buffer support. * Blob raw write supported added, no convenience methods yet... From db937576bde4d31726e92955cbc3d5baf2254fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Ma=C5=82ecki?= Date: Tue, 20 Dec 2011 00:13:51 +0100 Subject: [PATCH 02/63] Use `npm` to install `nodeunit` and `rimraf` Remove submodules, change paths when requiring these modules and fix errors in `test/index.js`. --- .gitmodules | 6 ------ package.json | 4 ++++ test/convenience-repo.js | 2 +- test/index.js | 13 ++++++------- test/raw-blob.js | 2 +- test/raw-commit.js | 2 +- test/raw-error.js | 2 +- test/raw-object.js | 2 +- test/raw-oid.js | 2 +- test/raw-reference.js | 2 +- test/raw-repo.js | 2 +- test/raw-revwalk.js | 2 +- vendor/nodeunit | 1 - vendor/rimraf | 1 - 14 files changed, 19 insertions(+), 24 deletions(-) delete mode 160000 vendor/nodeunit delete mode 160000 vendor/rimraf diff --git a/.gitmodules b/.gitmodules index 007c6113b..f3a63f3f0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,3 @@ -[submodule "vendor/nodeunit"] - path = vendor/nodeunit - url = git://github.com/caolan/nodeunit.git -[submodule "vendor/rimraf"] - path = vendor/rimraf - url = git://github.com/isaacs/rimraf.git [submodule "vendor/libgit2"] path = vendor/libgit2 url = git://github.com/libgit2/libgit2.git diff --git a/package.json b/package.json index ba067563d..22c628de3 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,10 @@ "engines": { "node": "~0.6" }, + "devDependencies": { + "nodeunit": "0.6.x", + "rimraf": "1.0.x" + }, "scripts": { "preinstall": "./configure", "install": "make" diff --git a/test/convenience-repo.js b/test/convenience-repo.js index 782085adc..a7d44e2ff 100644 --- a/test/convenience-repo.js +++ b/test/convenience-repo.js @@ -1,5 +1,5 @@ var git = require( "../" ); -var rimraf = require( "../vendor/rimraf"); +var rimraf = require("rimraf"); var fs = require( "fs" ); // Helper functions diff --git a/test/index.js b/test/index.js index 7712e11f6..0b86fd259 100644 --- a/test/index.js +++ b/test/index.js @@ -1,27 +1,26 @@ try { - var reporter = require( '../vendor/nodeunit' ).reporters['default']; + var reporter = require('nodeunit').reporters['default']; } catch( e ) { var sys = require( 'util' ); sys.puts( 'Cannot find nodeunit module.' ); - sys.puts( 'You can download submodules for this project by doing:' ); + sys.puts( 'You can install it by running:'); sys.puts( '' ); - sys.puts( ' git submodule update --init' ); + sys.puts( ' npm install'); sys.puts( '' ); process.exit(); } try { - var rimraf = require( '../vendor/rimraf' ); + var rimraf = require('rimraf'); } catch(e) { var sys = require( 'util' ); sys.puts( 'Cannot find rimraf module.' ); - sys.puts( 'You can download submodules for this project by doing:' ); + sys.puts( 'You can install it by running:'); sys.puts( '' ); - sys.puts( ' git submodule init vendor/rimraf' ); - sys.puts( ' git submodule update vendor/rimraf' ); + sys.puts( ' npm install'); sys.puts( '' ); process.exit(); } diff --git a/test/raw-blob.js b/test/raw-blob.js index dd927bf9d..eab916974 100644 --- a/test/raw-blob.js +++ b/test/raw-blob.js @@ -1,6 +1,6 @@ var git = require( '../' ).raw , path = require( 'path' ) - , rimraf = require( '../vendor/rimraf' ); + , rimraf = require('rimraf'); var testRepo = new git.Repo(); diff --git a/test/raw-commit.js b/test/raw-commit.js index 60a3e1d9d..e1a3c23a6 100644 --- a/test/raw-commit.js +++ b/test/raw-commit.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ) || require( 'rimraf' ), + rimraf = require( 'rimraf' ), path = require( 'path' ); var testRepo = new git.Repo(); diff --git a/test/raw-error.js b/test/raw-error.js index ff57bec5c..6e6af594c 100644 --- a/test/raw-error.js +++ b/test/raw-error.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ) || require( 'rimraf' ); + rimraf = require('rimraf'); // Helper functions var helper = { diff --git a/test/raw-object.js b/test/raw-object.js index 5427334c6..1d0b045ff 100644 --- a/test/raw-object.js +++ b/test/raw-object.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ); + rimraf = require('rimraf'); // Helper functions var helper = { diff --git a/test/raw-oid.js b/test/raw-oid.js index 9e7074981..7cd7fac0b 100644 --- a/test/raw-oid.js +++ b/test/raw-oid.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ); + rimraf = require('rimraf'); // Helper functions var helper = { diff --git a/test/raw-reference.js b/test/raw-reference.js index 14a7f203c..08b003979 100644 --- a/test/raw-reference.js +++ b/test/raw-reference.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ); + rimraf = require('rimraf'); // Helper functions var helper = { diff --git a/test/raw-repo.js b/test/raw-repo.js index 9e6460f44..20fc927d3 100644 --- a/test/raw-repo.js +++ b/test/raw-repo.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ) || require( 'rimraf' ), + rimraf = require('rimraf'), path = require( 'path' ), fs = require( 'fs' ); diff --git a/test/raw-revwalk.js b/test/raw-revwalk.js index 702d7e4ba..4e7ef0f3b 100644 --- a/test/raw-revwalk.js +++ b/test/raw-revwalk.js @@ -1,5 +1,5 @@ var git = require( '../' ).raw, - rimraf = require( '../vendor/rimraf' ) || require( 'rimraf' ); + rimraf = require('rimraf'); var testRepo = new git.Repo(); diff --git a/vendor/nodeunit b/vendor/nodeunit deleted file mode 160000 index 1f2038189..000000000 --- a/vendor/nodeunit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1f203818990be48e327c95f067301a6b713eb812 diff --git a/vendor/rimraf b/vendor/rimraf deleted file mode 160000 index 7e9818fcc..000000000 --- a/vendor/rimraf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7e9818fcc9eb7a967731d8e84b062375c5221621 From 9b837768c7421d0af1ec63954a2ede37194269ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Ma=C5=82ecki?= Date: Tue, 20 Dec 2011 00:23:31 +0100 Subject: [PATCH 03/63] Use `npm test` for running tests --- Makefile | 3 --- package.json | 3 ++- test/index.js | 58 --------------------------------------------------- 3 files changed, 2 insertions(+), 62 deletions(-) delete mode 100644 test/index.js diff --git a/Makefile b/Makefile index 4207da976..048feaeaa 100644 --- a/Makefile +++ b/Makefile @@ -41,9 +41,6 @@ clean: @@rm -rf $(BASE)/build/ @@rm -rf $(BASE)/vendor/libgit2/build/ -test: - @@$(NODE_JS) $(BASE)/test/index.js test - lint: @@$(NODE_JS) $(BASE)/util/hint-check.js diff --git a/package.json b/package.json index 22c628de3..aab2939ee 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "scripts": { "preinstall": "./configure", - "install": "make" + "install": "make", + "test": "cd test && nodeunit *.js" } } diff --git a/test/index.js b/test/index.js deleted file mode 100644 index 0b86fd259..000000000 --- a/test/index.js +++ /dev/null @@ -1,58 +0,0 @@ - -try { - var reporter = require('nodeunit').reporters['default']; -} -catch( e ) { - var sys = require( 'util' ); - sys.puts( 'Cannot find nodeunit module.' ); - sys.puts( 'You can install it by running:'); - sys.puts( '' ); - sys.puts( ' npm install'); - sys.puts( '' ); - process.exit(); -} - -try { - var rimraf = require('rimraf'); -} -catch(e) { - var sys = require( 'util' ); - sys.puts( 'Cannot find rimraf module.' ); - sys.puts( 'You can install it by running:'); - sys.puts( '' ); - sys.puts( ' npm install'); - sys.puts( '' ); - process.exit(); -} - -process.chdir( './test' ); -reporter.run( - [ - // Raw API - 'raw-blob.js' - , 'raw-commit.js' - , 'raw-error.js' - , 'raw-object.js' - , 'raw-oid.js' - , 'raw-reference.js' - , 'raw-repo.js' - , 'raw-revwalk.js' - // Sig - // Tree - // Tree Entry - // Util - - // Convenience API - , 'convenience-repo.js' - // Blob - // Commit - // Error - // Obj - // Oid - // Ref - // RevWalk - // Sig - // Tree - // TreeEntry - ] -); From 9e53319831898ca7fe4f523021f8acc2979898d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Ma=C5=82ecki?= Date: Tue, 20 Dec 2011 00:24:20 +0100 Subject: [PATCH 04/63] Add `node_modules` to `.gitignore` --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c85f3e820..da0fdf8dd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build doc !doc/Theme.css example/stress/test +node_modules From 4f3402201c220df6a533734debc9f5e6b13c4724 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 19 Apr 2012 12:39:58 +0200 Subject: [PATCH 05/63] fixes #35: repo has no method 'branch' the example snippet (from readme.md) is not working anymore. It complains about a missing method 'branch'. According to aaberg this is due a wrong argument for git.util().asyncComplete(). In repo.js:14 the callback gets called with this instead of self. --- lib/repo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repo.js b/lib/repo.js index 89de31f60..4e05f3276 100644 --- a/lib/repo.js +++ b/lib/repo.js @@ -11,7 +11,7 @@ exports.repo = function(dir, async) { if (dir && async) { self.repo.open(dir, function() { - git.util().asyncComplete.call(this, arguments, async); + git.util().asyncComplete.call(self, arguments, async); }); } else if (dir) { From 5df9cc037eebe263f992e083e22cda845b69e897 Mon Sep 17 00:00:00 2001 From: Karl Skomski Date: Mon, 4 Jun 2012 17:54:42 +0300 Subject: [PATCH 06/63] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 17cf4df92..085d50038 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Currently under active development (and seeking contributors), `nodegit` provide Building and installing ----------------------- -### Dependancies ### +### Dependencies ### To run `nodegit` you need `Node.js` and to run unit tests you will need to have `git` installed and accessible from your `PATH` to fetch any `vendor/` addons. ### Easy install (Recommended) ### From 33fc9619b9d9aaf75c9bf71d94d6494a602c254a Mon Sep 17 00:00:00 2001 From: Kyle Robinson Young Date: Wed, 25 Jul 2012 22:43:31 -0700 Subject: [PATCH 07/63] Update documented commands needed to run tests --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 085d50038..6cb45ba5d 100644 --- a/README.md +++ b/README.md @@ -181,13 +181,9 @@ Running tests __`nodegit` library code is written adhering to a modified `JSHint`. Run these checks with `make lint` in the project root.__ -__To run unit tests ensure the submodules `nodeunit` and `rimraf` are located in the `vendor/` subdirectory.__ +__To run unit tests ensure to update the submodules with `git submodule update --init` and install the development dependencies nodeunit and rimraf with `npm install`.__ -If they are not, `cd` into the `nodegit` dir and run the following `git` commands to automatically fetch them: - $ cd nodegit - $ git submodule update --init - -Then simply run `make test` in the project root. +Then simply run `npm test` in the project root. Generating documentation ------------------------ From 059db8a9cc846b6240858db7a865aa40622f9757 Mon Sep 17 00:00:00 2001 From: Jeremy Archer Date: Thu, 25 Oct 2012 11:38:15 -0500 Subject: [PATCH 08/63] Fix Loading Issue in lib/tree.js This code fixes a bug whereby some tree elements will not yet have loaded when the 'end' event is signalled. --- lib/tree.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/tree.js b/lib/tree.js index 57ddb2630..47b8b8940 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -30,8 +30,18 @@ var _Tree = function( obj, tree ) { , i , len = self.length , repo = repo || self.repo - , event = new events.EventEmitter(); + , event = new events.EventEmitter() + , prerequisites = 0; + function complete() { + if( i Date: Thu, 25 Oct 2012 11:55:38 -0500 Subject: [PATCH 09/63] Fix Loading Issue in lib/tree.js [Take Two] ... drrr. --- lib/tree.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/tree.js b/lib/tree.js index 47b8b8940..86d5377dd 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -30,21 +30,21 @@ var _Tree = function( obj, tree ) { , i , len = self.length , repo = repo || self.repo - , event = new events.EventEmitter() - , prerequisites = 0; + , event = new events.EventEmitter(); - function complete() { - if( i Date: Thu, 1 Nov 2012 17:54:00 -0500 Subject: [PATCH 10/63] Fix file path order bug. --- lib/tree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tree.js b/lib/tree.js index 86d5377dd..aa3e40f82 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -58,7 +58,7 @@ var _Tree = function( obj, tree ) { prerequisites++; !tree.error && tree.walk( repo ).on( 'entry', function( i, entry ) { - entry.dir += dir + '/'; + entry.dir = dir + '/' + entry.dir; event.emit( 'entry', i, entry ); }).on( 'end' , function( ) { prerequisites--; From b42cc69290b39657145b89ef425171fb82e0c4e9 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Tue, 26 Feb 2013 22:57:24 +1300 Subject: [PATCH 11/63] Ignore .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index da0fdf8dd..91f748bb6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ doc !doc/Theme.css example/stress/test node_modules +.DS_Store From 1f5926fce1622ea0a1bdb238fefcb94ffa457f9d Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Tue, 26 Feb 2013 23:11:52 +1300 Subject: [PATCH 12/63] Convert from eio_custom to uv_queue_work --- include/blob.h | 13 ++++--------- include/commit.h | 8 ++++---- include/reference.h | 4 ++-- include/repo.h | 12 ++++++------ include/revwalk.h | 4 ++-- include/tree.h | 12 ++++++------ src/blob.cc | 19 +++++++++---------- src/commit.cc | 34 +++++++++++++++++----------------- src/reference.cc | 17 ++++++++--------- src/repo.cc | 40 +++++++++++++++++++--------------------- src/revwalk.cc | 19 +++++++++---------- src/tree.cc | 42 ++++++++++++++++++++---------------------- src/tree_entry.cc | 6 +++--- 13 files changed, 109 insertions(+), 121 deletions(-) diff --git a/include/blob.h b/include/blob.h index 34ed78b08..0426e8c88 100755 --- a/include/blob.h +++ b/include/blob.h @@ -132,22 +132,17 @@ class GitBlob : public ObjectWrap { * Function: EIO_Lookup * * Parameters: - * req - an eio_req pointer + * req - an uv_work_t pointer * - * Returns: - * completion code integer */ - static void EIO_Lookup(eio_req* req); + static void EIO_Lookup(uv_work_t* req); /** * Function: EIO_AfterLookup * * Parameters: - * req - an eio_req pointer - * - * Returns: - * completion code integer + * req - an uv_work_t pointer */ - static int EIO_AfterLookup(eio_req* req); + static void EIO_AfterLookup(uv_work_t* req); /** * Function: RawContent * diff --git a/include/commit.h b/include/commit.h index d3a4229a8..90147d9e7 100755 --- a/include/commit.h +++ b/include/commit.h @@ -58,8 +58,8 @@ class GitCommit : public ObjectWrap { static Handle New(const Arguments& args); static Handle Lookup(const Arguments& args); - static void EIO_Lookup(eio_req *req); - static int EIO_AfterLookup(eio_req *req); + static void EIO_Lookup(uv_work_t *req); + static void EIO_AfterLookup(uv_work_t *req); static Handle Close(const Arguments& args); static Handle Id(const Arguments& args); @@ -71,8 +71,8 @@ class GitCommit : public ObjectWrap { static Handle Author(const Arguments& args); static Handle Tree(const Arguments& args); - static int EIO_Tree(eio_req* req); - static int EIO_AfterTree(eio_req* req); + static void EIO_Tree(uv_work_t* req); + static void EIO_AfterTree(uv_work_t* req); static Handle ParentCount(const Arguments& args); static Handle Parent(const Arguments& args); diff --git a/include/reference.h b/include/reference.h index cbe3caf85..8037f2dad 100755 --- a/include/reference.h +++ b/include/reference.h @@ -32,8 +32,8 @@ class GitReference : public ObjectWrap { static Handle New(const Arguments& args); static Handle Lookup(const Arguments& args); - static void EIO_Lookup(eio_req* req); - static int EIO_AfterLookup(eio_req* req); + static void EIO_Lookup(uv_work_t* req); + static void EIO_AfterLookup(uv_work_t* req); static Handle Oid(const Arguments& args); diff --git a/include/repo.h b/include/repo.h index c840036f4..322f5b3b3 100755 --- a/include/repo.h +++ b/include/repo.h @@ -42,18 +42,18 @@ class GitRepo : public ObjectWrap { static Handle New(const Arguments& args); static Handle Open(const Arguments& args); - static void EIO_Open(eio_req* req); - static int EIO_AfterOpen(eio_req* req); + static void EIO_Open(uv_work_t* req); + static void EIO_AfterOpen(uv_work_t* req); static Handle Lookup(const Arguments& args); - static int EIO_Lookup(eio_req* req); - static int EIO_AfterLookup(eio_req* req); + static void EIO_Lookup(uv_work_t* req); + static void EIO_AfterLookup(uv_work_t* req); static Handle Free(const Arguments& args); static Handle Init(const Arguments& args); - static void EIO_Init(eio_req* req); - static int EIO_AfterInit(eio_req* req); + static void EIO_Init(uv_work_t* req); + static void EIO_AfterInit(uv_work_t* req); private: git_repository* repo; diff --git a/include/revwalk.h b/include/revwalk.h index 2e1db881e..203e2cf53 100755 --- a/include/revwalk.h +++ b/include/revwalk.h @@ -41,8 +41,8 @@ class GitRevWalk : public ObjectWrap { static Handle Hide(const Arguments& args); static Handle Next(const Arguments& args); - static void EIO_Next(eio_req* req); - static int EIO_AfterNext(eio_req* req); + static void EIO_Next(uv_work_t* req); + static void EIO_AfterNext(uv_work_t* req); static Handle Sorting(const Arguments& args); static Handle Free(const Arguments& args); diff --git a/include/tree.h b/include/tree.h index 74c748aab..2b8839032 100755 --- a/include/tree.h +++ b/include/tree.h @@ -93,15 +93,15 @@ class GitTree : public ObjectWrap { static Handle New(const Arguments& args); static Handle Lookup(const Arguments& args); - static int EIO_Lookup(eio_req *req); - static int EIO_AfterLookup(eio_req *req); + static void EIO_Lookup(uv_work_t *req); + static void EIO_AfterLookup(uv_work_t *req); static Handle EntryCount(const Arguments& args); static Handle EntryByIndex(const Arguments& args); - static void EIO_EntryByIndex(eio_req *req); - static int EIO_AfterEntryByIndex(eio_req *req); + static void EIO_EntryByIndex(uv_work_t *req); + static void EIO_AfterEntryByIndex(uv_work_t *req); static Handle EntryByName(const Arguments& args); - static void EIO_EntryByName(eio_req *req); - static int EIO_AfterEntryByName(eio_req *req); + static void EIO_EntryByName(uv_work_t *req); + static void EIO_AfterEntryByName(uv_work_t *req); static Handle SortEntries(const Arguments& args); static Handle ClearEntries(const Arguments& args); diff --git a/src/blob.cc b/src/blob.cc index 3ef5668a8..3d3069f5b 100755 --- a/src/blob.cc +++ b/src/blob.cc @@ -21,7 +21,7 @@ void GitBlob::Initialize (Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Blob")); @@ -105,13 +105,14 @@ Handle GitBlob::Lookup(const Arguments& args) { blob->Ref(); - eio_custom(EIO_Lookup, EIO_PRI_DEFAULT, EIO_AfterLookup, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Lookup, EIO_AfterLookup); return scope.Close( Undefined() ); } -void GitBlob::EIO_Lookup(eio_req* req) { +void GitBlob::EIO_Lookup(uv_work_t* req) { lookup_request* ar = static_cast(req->data); git_oid oid = ar->oid->GetValue(); @@ -119,9 +120,9 @@ void GitBlob::EIO_Lookup(eio_req* req) { } -int GitBlob::EIO_AfterLookup(eio_req* req) { +void GitBlob::EIO_AfterLookup(uv_work_t* req) { lookup_request* ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; ar->blob->Unref(); Local argv[1]; @@ -133,12 +134,10 @@ int GitBlob::EIO_AfterLookup(eio_req* req) { if(try_catch.HasCaught()) FatalException(try_catch); - + ar->callback.Dispose(); delete ar; - - return 0; } Handle GitBlob::RawContent(const Arguments& args) { @@ -151,7 +150,7 @@ Handle GitBlob::RawContent(const Arguments& args) { int bufferLength = rawSize; Buffer* buffer = Buffer::New(const_cast(contents.c_str()), bufferLength); - + Local fastBuffer; MAKE_FAST_BUFFER(buffer, fastBuffer); diff --git a/src/commit.cc b/src/commit.cc index d85a9b727..989360756 100755 --- a/src/commit.cc +++ b/src/commit.cc @@ -23,7 +23,7 @@ void GitCommit::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Commit")); @@ -140,13 +140,14 @@ Handle GitCommit::Lookup(const Arguments& args) { commit->Ref(); - eio_custom(EIO_Lookup, EIO_PRI_DEFAULT, EIO_AfterLookup, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Lookup, EIO_AfterLookup); return scope.Close( Undefined() ); } -void GitCommit::EIO_Lookup(eio_req *req) { +void GitCommit::EIO_Lookup(uv_work_t *req) { lookup_request *ar = static_cast(req->data); git_oid oid = ar->oid->GetValue(); @@ -154,11 +155,12 @@ void GitCommit::EIO_Lookup(eio_req *req) { } -int GitCommit::EIO_AfterLookup(eio_req *req) { +void GitCommit::EIO_AfterLookup(uv_work_t *req) { HandleScope scope; lookup_request *ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; + ar->commit->Unref(); Handle argv[1]; @@ -171,12 +173,10 @@ int GitCommit::EIO_AfterLookup(eio_req *req) { if(try_catch.HasCaught()) { FatalException(try_catch); } - + ar->callback.Dispose(); delete ar; - - return 0; } Handle GitCommit::Close(const Arguments& args) { @@ -184,7 +184,7 @@ Handle GitCommit::Close(const Arguments& args) { GitCommit *commit = ObjectWrap::Unwrap(args.This()); commit->Close(); - + return scope.Close( Undefined() ); } @@ -200,13 +200,13 @@ Handle GitCommit::Id(const Arguments& args) { GitOid *oid = ObjectWrap::Unwrap(args[0]->ToObject()); oid->SetValue(*const_cast(commit->Id())); - + return scope.Close( Undefined() ); } Handle GitCommit::MessageShort(const Arguments& args) { HandleScope scope; - + GitCommit *commit = ObjectWrap::Unwrap(args.This()); return scope.Close( String::New(commit->MessageShort()) ); @@ -214,7 +214,7 @@ Handle GitCommit::MessageShort(const Arguments& args) { Handle GitCommit::Message(const Arguments& args) { HandleScope scope; - + GitCommit *commit = ObjectWrap::Unwrap(args.This()); return scope.Close( String::New(commit->Message()) ); @@ -222,7 +222,7 @@ Handle GitCommit::Message(const Arguments& args) { Handle GitCommit::Time(const Arguments& args) { HandleScope scope; - + GitCommit *commit = ObjectWrap::Unwrap(args.This()); return scope.Close( Integer::New(commit->Time()) ); @@ -232,7 +232,7 @@ Handle GitCommit::TimeOffset(const Arguments& args) { HandleScope scope; GitCommit *commit = ObjectWrap::Unwrap(args.This()); - + return scope.Close( Integer::New(commit->TimeOffset()) ); } @@ -248,7 +248,7 @@ Handle GitCommit::Committer(const Arguments& args) { GitSig *sig = ObjectWrap::Unwrap(args[0]->ToObject()); sig->SetValue(const_cast(commit->Committer())); - + return scope.Close( Undefined() ); } @@ -264,7 +264,7 @@ Handle GitCommit::Author(const Arguments& args) { GitSig *sig = ObjectWrap::Unwrap(args[0]->ToObject()); sig->SetValue(const_cast(commit->Author())); - + return scope.Close( Undefined() ); } diff --git a/src/reference.cc b/src/reference.cc index 5a9f8e29b..ac824c3b4 100755 --- a/src/reference.cc +++ b/src/reference.cc @@ -19,7 +19,7 @@ void GitReference::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Ref")); @@ -87,13 +87,14 @@ Handle GitReference::Lookup(const Arguments& args) { ref->Ref(); - eio_custom(EIO_Lookup, EIO_PRI_DEFAULT, EIO_AfterLookup, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Lookup, EIO_AfterLookup); return scope.Close( Undefined() ); } -void GitReference::EIO_Lookup(eio_req *req) { +void GitReference::EIO_Lookup(uv_work_t *req) { lookup_request *ar = static_cast(req->data); git_repository* repo = ar->repo->GetValue(); @@ -102,11 +103,11 @@ void GitReference::EIO_Lookup(eio_req *req) { } -int GitReference::EIO_AfterLookup(eio_req *req) { +void GitReference::EIO_AfterLookup(uv_work_t *req) { HandleScope scope; lookup_request *ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; ar->ref->Unref(); Local argv[1]; @@ -118,12 +119,10 @@ int GitReference::EIO_AfterLookup(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + ar->callback.Dispose(); delete ar; - - return 0; } Handle GitReference::Oid(const Arguments& args) { diff --git a/src/repo.cc b/src/repo.cc index f44d41236..2a9b153f1 100755 --- a/src/repo.cc +++ b/src/repo.cc @@ -19,7 +19,7 @@ void GitRepo::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Repo")); @@ -94,24 +94,25 @@ Handle GitRepo::Open(const Arguments& args) { repo->Ref(); - eio_custom(EIO_Open, EIO_PRI_DEFAULT, EIO_AfterOpen, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Open, EIO_AfterOpen); return scope.Close( Undefined() ); } -void GitRepo::EIO_Open(eio_req *req) { +void GitRepo::EIO_Open(uv_work_t *req) { open_request *ar = static_cast(req->data); ar->err = ar->repo->Open(ar->path.c_str()); } -int GitRepo::EIO_AfterOpen(eio_req *req) { +void GitRepo::EIO_AfterOpen(uv_work_t *req) { HandleScope scope; open_request *ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; ar->repo->Unref(); Local argv[1]; @@ -123,12 +124,10 @@ int GitRepo::EIO_AfterOpen(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + ar->callback.Dispose(); delete ar; - - return 0; } Handle GitRepo::Lookup(const Arguments& args) { @@ -167,7 +166,7 @@ Handle GitRepo::Lookup(const Arguments& args) { return scope.Close( Undefined() ); } -int GitRepo::EIO_Lookup(eio_req *req) { +void GitRepo::EIO_Lookup(uv_work_t *req) { //lookup_request *ar = static_cast(req->data); // //String::Utf8Value name(ar->name); @@ -183,11 +182,11 @@ int GitRepo::EIO_Lookup(eio_req *req) { //return 0; } -int GitRepo::EIO_AfterLookup(eio_req *req) { +void GitRepo::EIO_AfterLookup(uv_work_t *req) { //HandleScope scope; //lookup_request *ar = static_cast(req->data); - //ev_unref(EV_DEFAULT_UC); + // delete req; //ar->repo->Unref(); //Local argv[1]; @@ -199,7 +198,7 @@ int GitRepo::EIO_AfterLookup(eio_req *req) { //if(try_catch.HasCaught()) // FatalException(try_catch); - // + // //ar->err.Dispose(); //ar->name.Dispose(); //ar->callback.Dispose(); @@ -250,24 +249,25 @@ Handle GitRepo::Init(const Arguments& args) { repo->Ref(); - eio_custom(EIO_Init, EIO_PRI_DEFAULT, EIO_AfterInit, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Init, EIO_AfterInit); return scope.Close( Undefined() ); } -void GitRepo::EIO_Init(eio_req *req) { +void GitRepo::EIO_Init(uv_work_t *req) { init_request *ar = static_cast(req->data); ar->err = ar->repo->Init(ar->path.c_str(), ar->is_bare); } -int GitRepo::EIO_AfterInit(eio_req *req) { +void GitRepo::EIO_AfterInit(uv_work_t *req) { HandleScope scope; init_request *ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; ar->repo->Unref(); Local argv[2]; @@ -279,11 +279,9 @@ int GitRepo::EIO_AfterInit(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + ar->callback.Dispose(); delete ar; - - return 0; } Persistent GitRepo::constructor_template; diff --git a/src/revwalk.cc b/src/revwalk.cc index 3715a601d..ec3f6163e 100755 --- a/src/revwalk.cc +++ b/src/revwalk.cc @@ -18,7 +18,7 @@ void GitRevWalk::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("RevWalk")); @@ -119,7 +119,7 @@ Handle GitRevWalk::Push(const Arguments& args) { } GitOid *oid = ObjectWrap::Unwrap(args[0]->ToObject()); - + git_oid tmp = oid->GetValue(); int err = revwalk->Push(&tmp); @@ -149,13 +149,14 @@ Handle GitRevWalk::Next(const Arguments& args) { revwalk->Ref(); - eio_custom(EIO_Next, EIO_PRI_DEFAULT, EIO_AfterNext, ar); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = ar; + uv_queue_work(uv_default_loop(), req, EIO_Next, EIO_AfterNext); return scope.Close( Undefined() ); } -void GitRevWalk::EIO_Next(eio_req *req) { +void GitRevWalk::EIO_Next(uv_work_t *req) { next_request *ar = static_cast(req->data); git_oid oid = ar->oid->GetValue(); @@ -164,11 +165,11 @@ void GitRevWalk::EIO_Next(eio_req *req) { } -int GitRevWalk::EIO_AfterNext(eio_req *req) { +void GitRevWalk::EIO_AfterNext(uv_work_t *req) { HandleScope scope; next_request *ar = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; ar->revwalk->Unref(); Local argv[1]; @@ -180,12 +181,10 @@ int GitRevWalk::EIO_AfterNext(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + ar->callback.Dispose(); delete ar; - - return 0; } Handle GitRevWalk::Free(const Arguments& args) { diff --git a/src/tree.cc b/src/tree.cc index fe3b1bdbf..6a985b967 100755 --- a/src/tree.cc +++ b/src/tree.cc @@ -19,7 +19,7 @@ void GitTree::Initialize (Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Tree")); @@ -113,7 +113,7 @@ Handle GitTree::Lookup(const Arguments& args) { // return scope.Close( Undefined() ); } -//int GitTree::EIO_Lookup(eio_req *req) { +//void GitTree::EIO_Lookup(uv_work_t *req) { // lookup_request *lr = static_cast(req->data); // // git_oid oid = lr->oid->GetValue(); @@ -122,7 +122,7 @@ Handle GitTree::Lookup(const Arguments& args) { // return 0; //} -//int GitTree::EIO_AfterLookup(eio_req *req) { +//void GitTree::EIO_AfterLookup(uv_work_t *req) { // lookup_request *lr = static_cast(req->data); // // ev_unref(EV_DEFAULT_UC); @@ -137,7 +137,7 @@ Handle GitTree::Lookup(const Arguments& args) { // // if(try_catch.HasCaught()) // FatalException(try_catch); -// +// // lr->callback.Dispose(); // // delete lr; @@ -151,7 +151,7 @@ Handle GitTree::EntryCount(const Arguments& args) { GitTree *tree = ObjectWrap::Unwrap(args.This()); int count = tree->EntryCount(); - + return scope.Close( Integer::New(count) ); } @@ -183,23 +183,24 @@ Handle GitTree::EntryByIndex(const Arguments& args) { tree->Ref(); - eio_custom(EIO_EntryByIndex, EIO_PRI_DEFAULT, EIO_AfterEntryByIndex, er); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = er; + uv_queue_work(uv_default_loop(), req, EIO_EntryByIndex, EIO_AfterEntryByIndex); return scope.Close( Undefined() ); } -void GitTree::EIO_EntryByIndex(eio_req *req) { +void GitTree::EIO_EntryByIndex(uv_work_t *req) { entryindex_request *er = static_cast(req->data); er->entry->SetValue(er->tree->EntryByIndex(er->idx)); } -int GitTree::EIO_AfterEntryByIndex(eio_req *req) { +void GitTree::EIO_AfterEntryByIndex(uv_work_t *req) { entryindex_request *er = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; er->tree->Unref(); Handle argv[0]; @@ -210,12 +211,10 @@ int GitTree::EIO_AfterEntryByIndex(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + er->callback.Dispose(); delete er; - - return 0; } Handle GitTree::EntryByName(const Arguments& args) { @@ -248,23 +247,24 @@ Handle GitTree::EntryByName(const Arguments& args) { tree->Ref(); - eio_custom(EIO_EntryByName, EIO_PRI_DEFAULT, EIO_AfterEntryByName, er); - ev_ref(EV_DEFAULT_UC); + uv_work_t *req = new uv_work_t; + req->data = er; + uv_queue_work(uv_default_loop(), req, EIO_EntryByName, EIO_AfterEntryByName); return scope.Close( Undefined() ); } -void GitTree::EIO_EntryByName(eio_req *req) { +void GitTree::EIO_EntryByName(uv_work_t *req) { entryname_request *er = static_cast(req->data); er->entry->SetValue(er->tree->EntryByName(er->name.c_str())); } -int GitTree::EIO_AfterEntryByName(eio_req *req) { +void GitTree::EIO_AfterEntryByName(uv_work_t *req) { entryname_request *er = static_cast(req->data); - ev_unref(EV_DEFAULT_UC); + delete req; er->tree->Unref(); Handle argv[1]; @@ -276,12 +276,10 @@ int GitTree::EIO_AfterEntryByName(eio_req *req) { if(try_catch.HasCaught()) FatalException(try_catch); - + er->callback.Dispose(); delete er; - - return 0; } Handle GitTree::SortEntries(const Arguments& args) { @@ -290,7 +288,7 @@ Handle GitTree::SortEntries(const Arguments& args) { GitTree *tree = ObjectWrap::Unwrap(args.This()); int err = tree->SortEntries(); - + return scope.Close( Integer::New(err) ); } diff --git a/src/tree_entry.cc b/src/tree_entry.cc index 088ae8b82..bc35a78eb 100755 --- a/src/tree_entry.cc +++ b/src/tree_entry.cc @@ -19,7 +19,7 @@ using namespace node; void GitTreeEntry::Initialize(Handle target) { Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("TreeEntry")); @@ -94,7 +94,7 @@ Handle GitTreeEntry::Id(const Arguments& args) { GitOid* oid = ObjectWrap::Unwrap(args[0]->ToObject()); oid->SetValue(*const_cast(entry->Id())); - + return scope.Close( Undefined() ); } @@ -118,7 +118,7 @@ Handle GitTreeEntry::ToObject(const Arguments& args) { entry->ToObject(repo->GetValue(), &out); object->SetValue(out); - + return scope.Close( Undefined() ); } Persistent GitTreeEntry::constructor_template; From 792da3c4fd008c738e14e5385a4f029e516409fe Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Tue, 26 Feb 2013 23:12:06 +1300 Subject: [PATCH 13/63] Updated contributors --- package.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package.json b/package.json index aab2939ee..d13b25d19 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,12 @@ "version": "0.0.6", "homepage": "https://github.com/tbranyen/nodegit", "author": "Tim Branyen (http://twitter.com/tbranyen)", + "contributors": [ + { + "name": "Michael Robinson", + "email": "mike@pagesofinterest.net" + } + ], "main": "./lib/index.js", "repository": { "type": "git", From 6a9cea62ed5a1e801d2c352fc3c75f4e72e9b918 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 02:04:31 +1300 Subject: [PATCH 14/63] Fixed convenience-commit.js --- example/convenience-commit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/convenience-commit.js b/example/convenience-commit.js index 7d72ed3e4..0c858d385 100644 --- a/example/convenience-commit.js +++ b/example/convenience-commit.js @@ -8,7 +8,7 @@ git.repo( '../.git', function( err, repo ) { var history = commit.history(); history.on( 'commit', function() { - //console.log(arguments); + console.log(arguments); }); history.on( 'end', function( commits ) { @@ -16,7 +16,7 @@ git.repo( '../.git', function( err, repo ) { var tree = commits[0].tree(); // Synchronous - tree.walk(function( i, entry ) { + tree.walk().on('entry', function( i, entry ) { console.log( entry.content ); return false; }); From 5716e9757886eaf38d51c86b192258c960d9cfea Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 09:33:28 +1300 Subject: [PATCH 15/63] Update example/convenience-commit.js --- example/convenience-commit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/convenience-commit.js b/example/convenience-commit.js index 0c858d385..235e39d04 100644 --- a/example/convenience-commit.js +++ b/example/convenience-commit.js @@ -8,7 +8,7 @@ git.repo( '../.git', function( err, repo ) { var history = commit.history(); history.on( 'commit', function() { - console.log(arguments); + // console.log(arguments); }); history.on( 'end', function( commits ) { From b2ef8c856842664daf50a45d6b818acabaf947db Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 21:51:18 +1300 Subject: [PATCH 16/63] Updated readme --- README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6cb45ba5d..a96edb711 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Node.js libgit2 bindings Created by Tim Branyen [@tbranyen](http://twitter.com/tbranyen) -Currently under active development (and seeking contributors), `nodegit` provides asynchronous native bindings to the `libgit2` C API. +Currently under active development (and seeking contributions), `nodegit` provides asynchronous native bindings to the `libgit2` C API. Building and installing ----------------------- @@ -22,7 +22,7 @@ $ npm install nodegit #### Install `nodegit` by cloning source from GitHub and running the `configure`, `make`, and `make install` commands: #### \*Note: `nodegit` assumes your library path exists at `~/.node_libraries` you can change this by specifying a new lib path\* - + ```` bash $ git clone git://github.com/tbranyen/nodegit.git $ cd nodegit @@ -70,7 +70,7 @@ git.repo(".git", function(err, repo) { // Iterate over the revision history var history = branch.history(); - + // Commit event emits commit object history.on("commit", function(commit) { // Print out `git log` emulation @@ -103,7 +103,7 @@ repo.open( '.git', function( err ) { // Create instance of Ref constructor with this repository var ref = new git.Ref( repo ); - + // Find the master branch repo.lookupRef( ref, '/refs/heads/master', function( err ) { if( err ) { @@ -185,9 +185,11 @@ __To run unit tests ensure to update the submodules with `git submodule update - Then simply run `npm test` in the project root. -Generating documentation +Documentation ------------------------ +Recent documentation may be found here: [`nodegit` documentation](http://tbranyen.github.com/nodegit/) + __`nodegit` native and library code is documented to be built with `Natural Docs`.__ To create the documentation, `cd` into the `nodegit` dir and run the following: @@ -201,6 +203,10 @@ Release information __Can keep track of current method coverage at: [http://bit.ly/tb_methods](http://bit.ly/tb_methods)__ +### v0.0.7: ### + * Updated to work with Node ~0.8. + * More unit tests + ### v0.0.6: ### * Updated to work with Node ~0.6. From 8c0cf7d01c7c8f5b59a68d520a69f3d13e92dde3 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:13:19 +1300 Subject: [PATCH 17/63] Removed libgit2 --- .gitmodules | 3 - vendor/libgit2/.HEADER | 24 - vendor/libgit2/.gitattributes | 2 - vendor/libgit2/CMakeLists.txt | 134 -- vendor/libgit2/CONVENTIONS | 107 - vendor/libgit2/COPYING | 356 ---- vendor/libgit2/Makefile.embed | 26 - vendor/libgit2/README.md | 113 - vendor/libgit2/api.docurium | 13 - vendor/libgit2/api.doxygen | 24 - vendor/libgit2/deps/zlib/adler32.c | 169 -- vendor/libgit2/deps/zlib/crc32.c | 442 ---- vendor/libgit2/deps/zlib/crc32.h | 441 ---- vendor/libgit2/deps/zlib/deflate.c | 1834 ----------------- vendor/libgit2/deps/zlib/deflate.h | 342 --- vendor/libgit2/deps/zlib/inffast.c | 340 --- vendor/libgit2/deps/zlib/inffast.h | 11 - vendor/libgit2/deps/zlib/inffixed.h | 94 - vendor/libgit2/deps/zlib/inflate.c | 1480 ------------- vendor/libgit2/deps/zlib/inflate.h | 122 -- vendor/libgit2/deps/zlib/inftrees.c | 330 --- vendor/libgit2/deps/zlib/inftrees.h | 62 - vendor/libgit2/deps/zlib/trees.c | 1244 ----------- vendor/libgit2/deps/zlib/trees.h | 128 -- vendor/libgit2/deps/zlib/zconf.h | 54 - vendor/libgit2/deps/zlib/zlib.h | 1613 --------------- vendor/libgit2/deps/zlib/zutil.c | 318 --- vendor/libgit2/deps/zlib/zutil.h | 274 --- vendor/libgit2/examples/.gitignore | 2 - vendor/libgit2/examples/Makefile | 10 - vendor/libgit2/examples/general.c | 447 ---- vendor/libgit2/examples/showindex.c | 43 - vendor/libgit2/git.git-authors | 66 - vendor/libgit2/include/git2.h | 65 - vendor/libgit2/include/git2/blob.h | 138 -- vendor/libgit2/include/git2/branch.h | 9 - vendor/libgit2/include/git2/commit.h | 281 --- vendor/libgit2/include/git2/common.h | 128 -- vendor/libgit2/include/git2/config.h | 284 --- vendor/libgit2/include/git2/errors.h | 162 -- vendor/libgit2/include/git2/index.h | 324 --- vendor/libgit2/include/git2/indexer.h | 70 - vendor/libgit2/include/git2/net.h | 71 - vendor/libgit2/include/git2/object.h | 191 -- vendor/libgit2/include/git2/odb.h | 351 ---- vendor/libgit2/include/git2/odb_backend.h | 118 -- vendor/libgit2/include/git2/oid.h | 226 -- vendor/libgit2/include/git2/reflog.h | 129 -- vendor/libgit2/include/git2/refs.h | 276 --- vendor/libgit2/include/git2/refspec.h | 78 - vendor/libgit2/include/git2/remote.h | 168 -- vendor/libgit2/include/git2/repository.h | 332 --- vendor/libgit2/include/git2/revwalk.h | 187 -- vendor/libgit2/include/git2/signature.h | 83 - vendor/libgit2/include/git2/status.h | 79 - vendor/libgit2/include/git2/tag.h | 297 --- vendor/libgit2/include/git2/thread-utils.h | 78 - vendor/libgit2/include/git2/transport.h | 50 - vendor/libgit2/include/git2/tree.h | 291 --- vendor/libgit2/include/git2/types.h | 193 -- vendor/libgit2/include/git2/zlib.h | 58 - vendor/libgit2/libgit2.pc.in | 9 - vendor/libgit2/src/backends/hiredis.c | 200 -- vendor/libgit2/src/backends/sqlite.c | 280 --- vendor/libgit2/src/blob.c | 140 -- vendor/libgit2/src/blob.h | 17 - vendor/libgit2/src/block-sha1/sha1.c | 281 --- vendor/libgit2/src/block-sha1/sha1.h | 22 - vendor/libgit2/src/bswap.h | 97 - vendor/libgit2/src/buffer.c | 95 - vendor/libgit2/src/buffer.h | 24 - vendor/libgit2/src/cache.c | 129 -- vendor/libgit2/src/cache.h | 58 - vendor/libgit2/src/cc-compat.h | 73 - vendor/libgit2/src/commit.c | 300 --- vendor/libgit2/src/commit.h | 27 - vendor/libgit2/src/common.h | 59 - vendor/libgit2/src/config.c | 354 ---- vendor/libgit2/src/config.h | 17 - vendor/libgit2/src/config_file.c | 1233 ----------- vendor/libgit2/src/delta-apply.c | 109 - vendor/libgit2/src/delta-apply.h | 27 - vendor/libgit2/src/dir.h | 41 - vendor/libgit2/src/errors.c | 116 -- vendor/libgit2/src/fetch.c | 136 -- vendor/libgit2/src/fetch.h | 7 - vendor/libgit2/src/filebuf.c | 396 ---- vendor/libgit2/src/filebuf.h | 51 - vendor/libgit2/src/fileops.c | 376 ---- vendor/libgit2/src/fileops.h | 155 -- vendor/libgit2/src/hash.c | 92 - vendor/libgit2/src/hash.h | 26 - vendor/libgit2/src/hashtable.c | 261 --- vendor/libgit2/src/hashtable.h | 74 - vendor/libgit2/src/index.c | 1060 ---------- vendor/libgit2/src/index.h | 36 - vendor/libgit2/src/indexer.c | 415 ---- vendor/libgit2/src/map.h | 31 - vendor/libgit2/src/mingw-compat.h | 13 - vendor/libgit2/src/msvc-compat.h | 42 - vendor/libgit2/src/mwindow.c | 275 --- vendor/libgit2/src/mwindow.h | 66 - vendor/libgit2/src/netops.c | 163 -- vendor/libgit2/src/netops.h | 29 - vendor/libgit2/src/object.c | 302 --- vendor/libgit2/src/odb.c | 684 ------ vendor/libgit2/src/odb.h | 33 - vendor/libgit2/src/odb_loose.c | 855 -------- vendor/libgit2/src/odb_pack.c | 500 ----- vendor/libgit2/src/oid.c | 386 ---- vendor/libgit2/src/pack.c | 804 -------- vendor/libgit2/src/pack.h | 115 -- vendor/libgit2/src/path.c | 264 --- vendor/libgit2/src/path.h | 81 - vendor/libgit2/src/pkt.c | 362 ---- vendor/libgit2/src/pkt.h | 84 - vendor/libgit2/src/posix.c | 74 - vendor/libgit2/src/posix.h | 56 - vendor/libgit2/src/ppc/sha1.c | 72 - vendor/libgit2/src/ppc/sha1.h | 25 - vendor/libgit2/src/ppc/sha1ppc.S | 224 -- vendor/libgit2/src/pqueue.c | 157 -- vendor/libgit2/src/pqueue.h | 97 - vendor/libgit2/src/reflog.c | 296 --- vendor/libgit2/src/reflog.h | 26 - vendor/libgit2/src/refs.c | 1753 ---------------- vendor/libgit2/src/refs.h | 46 - vendor/libgit2/src/refspec.c | 108 - vendor/libgit2/src/refspec.h | 14 - vendor/libgit2/src/remote.c | 283 --- vendor/libgit2/src/remote.h | 19 - vendor/libgit2/src/repository.c | 794 ------- vendor/libgit2/src/repository.h | 49 - vendor/libgit2/src/revwalk.c | 578 ------ vendor/libgit2/src/sha1.c | 281 --- vendor/libgit2/src/sha1.h | 22 - vendor/libgit2/src/sha1_lookup.c | 196 -- vendor/libgit2/src/sha1_lookup.h | 12 - vendor/libgit2/src/signature.c | 353 ---- vendor/libgit2/src/signature.h | 12 - vendor/libgit2/src/status.c | 361 ---- vendor/libgit2/src/t03-data.h | 344 ---- vendor/libgit2/src/tag.c | 435 ---- vendor/libgit2/src/tag.h | 22 - vendor/libgit2/src/thread-utils.c | 49 - vendor/libgit2/src/thread-utils.h | 102 - vendor/libgit2/src/transport.c | 71 - vendor/libgit2/src/transport.h | 106 - vendor/libgit2/src/transport_git.c | 606 ------ vendor/libgit2/src/transport_local.c | 234 --- vendor/libgit2/src/tree.c | 526 ----- vendor/libgit2/src/tree.h | 31 - vendor/libgit2/src/tsort.c | 359 ---- vendor/libgit2/src/unix/map.c | 64 - vendor/libgit2/src/unix/posix.h | 18 - vendor/libgit2/src/util.c | 357 ---- vendor/libgit2/src/util.h | 123 -- vendor/libgit2/src/vector.c | 192 -- vendor/libgit2/src/vector.h | 39 - vendor/libgit2/src/win32/dir.c | 98 - vendor/libgit2/src/win32/fileops.c | 41 - vendor/libgit2/src/win32/fnmatch.c | 205 -- vendor/libgit2/src/win32/fnmatch.h | 48 - vendor/libgit2/src/win32/map.c | 125 -- vendor/libgit2/src/win32/mingw-compat.h | 18 - vendor/libgit2/src/win32/msvc-compat.h | 52 - vendor/libgit2/src/win32/posix.c | 248 --- vendor/libgit2/src/win32/posix.h | 30 - vendor/libgit2/src/win32/pthread.c | 85 - vendor/libgit2/src/win32/pthread.h | 60 - vendor/libgit2/tests/.gitignore | 1 - vendor/libgit2/tests/NAMING | 52 - vendor/libgit2/tests/resources/.gitignore | 1 - vendor/libgit2/tests/resources/big.index | Bin 335272 -> 0 bytes .../libgit2/tests/resources/config/.gitconfig | 3 - vendor/libgit2/tests/resources/config/config0 | 7 - vendor/libgit2/tests/resources/config/config1 | 5 - .../libgit2/tests/resources/config/config10 | 1 - vendor/libgit2/tests/resources/config/config2 | 5 - vendor/libgit2/tests/resources/config/config3 | 3 - vendor/libgit2/tests/resources/config/config4 | 3 - vendor/libgit2/tests/resources/config/config5 | 9 - vendor/libgit2/tests/resources/config/config6 | 5 - vendor/libgit2/tests/resources/config/config7 | 5 - vendor/libgit2/tests/resources/config/config8 | 0 vendor/libgit2/tests/resources/config/config9 | 3 - .../tests/resources/empty_bare.git/HEAD | 1 - .../tests/resources/empty_bare.git/config | 7 - .../resources/empty_bare.git/description | 1 - .../resources/empty_bare.git/info/exclude | 6 - .../objects/info/dummy-marker.txt | 0 .../objects/pack/dummy-marker.txt | 0 .../refs/heads/dummy-marker.txt | 0 .../empty_bare.git/refs/tags/dummy-marker.txt | 0 .../empty_standard_repo/.gitted/HEAD | 1 - .../empty_standard_repo/.gitted/config | 8 - .../empty_standard_repo/.gitted/description | 1 - .../empty_standard_repo/.gitted/info/exclude | 6 - .../.gitted/objects/info/dummy-marker.txt | 0 .../.gitted/objects/pack/dummy-marker.txt | 0 .../.gitted/refs/heads/dummy-marker.txt | 0 .../.gitted/refs/tags/dummy-marker.txt | 0 vendor/libgit2/tests/resources/gitgit.index | Bin 134799 -> 0 bytes .../resources/status/.gitted/COMMIT_EDITMSG | 1 - .../tests/resources/status/.gitted/HEAD | 1 - .../tests/resources/status/.gitted/ORIG_HEAD | 1 - .../tests/resources/status/.gitted/config | 6 - .../resources/status/.gitted/description | 1 - .../tests/resources/status/.gitted/index | Bin 1080 -> 0 bytes .../resources/status/.gitted/info/exclude | 6 - .../tests/resources/status/.gitted/logs/HEAD | 2 - .../status/.gitted/logs/refs/heads/master | 2 - .../00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 | 2 - .../06/1d42a44cacde5726057b67558821d95db96f19 | Bin 44 -> 0 bytes .../18/88c805345ba265b0ee9449b8877b6064592058 | Bin 36 -> 0 bytes .../19/d9cc8584ac2c7dcf57d2680375e80f099dc481 | Bin 22 -> 0 bytes .../32/504b727382542f9f089e24fddac5e78533e96c | Bin 31 -> 0 bytes .../45/2e4244b5d083ddf0460acf1ecc74db9dcfa11a | Bin 30 -> 0 bytes .../52/9a16e8e762d4acb7b9636ff540a00831f9155a | Bin 32 -> 0 bytes .../53/ace0d1cc1145a5f4fe4f78a186a60263190733 | Bin 36 -> 0 bytes .../54/52d32f1dd538eb0405e8a83cc185f79e25e80f | Bin 29 -> 0 bytes .../55/d316c9ba708999f1918e9677d01dfcae69c6b9 | Bin 33 -> 0 bytes .../70/bd9443ada07063e7fbf0b3ff5c13f7494d89c2 | Bin 44 -> 0 bytes .../73/5b6a258cd196a8f7c9428419b02c1dca93fd75 | Bin 160 -> 0 bytes .../75/6e27627e67bfbc048d01ece5819c6de733d7ea | Bin 301 -> 0 bytes .../90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 | Bin 46 -> 0 bytes .../90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 | Bin 41 -> 0 bytes .../9c/2e02cdffa8d73e6c189074594477a6baf87960 | Bin 268 -> 0 bytes .../a0/de7e0ac200c489c41c59dfa910154a70264e6e | Bin 29 -> 0 bytes .../a6/191982709b746d5650e93c2acf34ef74e11504 | Bin 37 -> 0 bytes .../a6/be623522ce87a1d862128ac42672604f7b468b | Bin 46 -> 0 bytes .../aa/27a641456848200fdb7f7c99ba36f8a0952877 | Bin 120 -> 0 bytes .../da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 | Bin 42 -> 0 bytes .../e9/b9107f290627c04d097733a10055af941f6bca | Bin 37 -> 0 bytes .../ed/062903b8f6f3dccb2fa81117ba6590944ef9bd | Bin 42 -> 0 bytes .../status/.gitted/refs/heads/master | 1 - .../tests/resources/status/current_file | 1 - .../tests/resources/status/modified_file | 2 - .../libgit2/tests/resources/status/new_file | 1 - .../tests/resources/status/staged_changes | 2 - .../status/staged_changes_modified_file | 3 - .../status/staged_delete_modified_file | 1 - .../tests/resources/status/staged_new_file | 1 - .../status/staged_new_file_modified_file | 2 - .../resources/status/subdir/current_file | 1 - .../resources/status/subdir/modified_file | 2 - .../tests/resources/status/subdir/new_file | 1 - .../libgit2/tests/resources/testrepo.git/HEAD | 1 - .../tests/resources/testrepo.git/config | 8 - .../tests/resources/testrepo.git/head-tracker | 1 - .../tests/resources/testrepo.git/index | Bin 10041 -> 0 bytes .../13/85f264afb75a56a5bec74243be9b367ba4ca08 | Bin 19 -> 0 bytes .../18/1037049a54a1eb5fab404658a3a250b44335d7 | Bin 51 -> 0 bytes .../18/10dff58d8a660512d4832e740f692884338ccd | Bin 119 -> 0 bytes .../45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 | Bin 18 -> 0 bytes .../4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 | 2 - .../5b/5b025afb0b4c913b4c338a42934a3863bf3644 | 2 - .../75/057dd4114e74cca1d750d0aee1647c903cb60a | Bin 119 -> 0 bytes .../7b/4384978d2493e851f9cca7858815fac9b10980 | Bin 145 -> 0 bytes .../81/4889a078c031f61ed08ab5fa863aea9314344d | Bin 82 -> 0 bytes .../84/96071c1b46c854b31185ea97743be6a8774479 | Bin 126 -> 0 bytes .../9f/d738e8f7967c078dceed8190330fc8648ee56a | 3 - .../a4/a7dce85cf63874e984719f4fdd239f5145052f | 2 - .../a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd | Bin 28 -> 0 bytes .../a8/233120f6ad708f843d861ce2b7228ec4e3dec6 | Bin 26 -> 0 bytes .../b2/5fa35b38051e4ae45d4222e795f9df2e43f1d1 | 2 - .../be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 | 3 - .../c4/7800c7266a2be04c571c04d5a6614691ea99bd | 3 - .../e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 | Bin 15 -> 0 bytes .../f6/0079018b664e4e79329a7ef9559c8d9e0378d1 | Bin 82 -> 0 bytes .../fa/49b077972391ad58037050f2a75f74e3671e92 | Bin 24 -> 0 bytes .../fd/093bff70906175335656e6ce6ae05783708765 | Bin 82 -> 0 bytes ...1e489679b7d3418f9ab594bda8ceb37dd4c695.idx | Bin 46656 -> 0 bytes ...e489679b7d3418f9ab594bda8ceb37dd4c695.pack | Bin 386089 -> 0 bytes ...c6adf9f61318f041845b01440d09aa7a91e1b5.idx | Bin 1240 -> 0 bytes ...6adf9f61318f041845b01440d09aa7a91e1b5.pack | Bin 491 -> 0 bytes ...5f5d483273108c9d8dd0e4728ccf0b2982423a.idx | Bin 1240 -> 0 bytes ...f5d483273108c9d8dd0e4728ccf0b2982423a.pack | Bin 498 -> 0 bytes .../tests/resources/testrepo.git/packed-refs | 3 - .../resources/testrepo.git/refs/heads/br2 | 1 - .../resources/testrepo.git/refs/heads/master | 1 - .../testrepo.git/refs/heads/packed-test | 1 - .../resources/testrepo.git/refs/heads/test | 1 - .../resources/testrepo.git/refs/tags/e90810b | 1 - .../testrepo.git/refs/tags/point_to_blob | 1 - .../resources/testrepo.git/refs/tags/test | 1 - vendor/libgit2/tests/t00-core.c | 584 ------ vendor/libgit2/tests/t01-data.h | 322 --- vendor/libgit2/tests/t01-rawobj.c | 638 ------ vendor/libgit2/tests/t02-data.h | 515 ----- vendor/libgit2/tests/t02-objread.c | 269 --- vendor/libgit2/tests/t02-oids.h | 152 -- vendor/libgit2/tests/t03-data.h | 344 ---- vendor/libgit2/tests/t03-objwrite.c | 255 --- vendor/libgit2/tests/t04-commit.c | 775 ------- vendor/libgit2/tests/t05-revwalk.c | 140 -- vendor/libgit2/tests/t06-index.c | 219 -- vendor/libgit2/tests/t07-hashtable.c | 192 -- vendor/libgit2/tests/t08-tag.c | 316 --- vendor/libgit2/tests/t09-tree.c | 218 -- vendor/libgit2/tests/t10-refs.c | 1152 ----------- vendor/libgit2/tests/t11-sqlite.c | 126 -- vendor/libgit2/tests/t12-repo.c | 463 ----- vendor/libgit2/tests/t13-threads.c | 41 - vendor/libgit2/tests/t14-hiredis.c | 123 -- vendor/libgit2/tests/t15-config.c | 325 --- vendor/libgit2/tests/t16-remotes.c | 106 - vendor/libgit2/tests/t17-bufs.c | 61 - vendor/libgit2/tests/t18-status.c | 184 -- vendor/libgit2/tests/test_helpers.c | 263 --- vendor/libgit2/tests/test_helpers.h | 77 - vendor/libgit2/tests/test_lib.c | 198 -- vendor/libgit2/tests/test_lib.h | 53 - vendor/libgit2/tests/test_main.c | 91 - vendor/libgit2/tests/tests.supp | 6 - vendor/libgit2/waf | Bin 76176 -> 0 bytes vendor/libgit2/wscript | 284 --- 317 files changed, 46566 deletions(-) delete mode 100644 vendor/libgit2/.HEADER delete mode 100644 vendor/libgit2/.gitattributes delete mode 100644 vendor/libgit2/CMakeLists.txt delete mode 100644 vendor/libgit2/CONVENTIONS delete mode 100644 vendor/libgit2/COPYING delete mode 100644 vendor/libgit2/Makefile.embed delete mode 100644 vendor/libgit2/README.md delete mode 100644 vendor/libgit2/api.docurium delete mode 100644 vendor/libgit2/api.doxygen delete mode 100644 vendor/libgit2/deps/zlib/adler32.c delete mode 100644 vendor/libgit2/deps/zlib/crc32.c delete mode 100644 vendor/libgit2/deps/zlib/crc32.h delete mode 100644 vendor/libgit2/deps/zlib/deflate.c delete mode 100644 vendor/libgit2/deps/zlib/deflate.h delete mode 100644 vendor/libgit2/deps/zlib/inffast.c delete mode 100644 vendor/libgit2/deps/zlib/inffast.h delete mode 100644 vendor/libgit2/deps/zlib/inffixed.h delete mode 100644 vendor/libgit2/deps/zlib/inflate.c delete mode 100644 vendor/libgit2/deps/zlib/inflate.h delete mode 100644 vendor/libgit2/deps/zlib/inftrees.c delete mode 100644 vendor/libgit2/deps/zlib/inftrees.h delete mode 100644 vendor/libgit2/deps/zlib/trees.c delete mode 100644 vendor/libgit2/deps/zlib/trees.h delete mode 100644 vendor/libgit2/deps/zlib/zconf.h delete mode 100644 vendor/libgit2/deps/zlib/zlib.h delete mode 100644 vendor/libgit2/deps/zlib/zutil.c delete mode 100644 vendor/libgit2/deps/zlib/zutil.h delete mode 100644 vendor/libgit2/examples/.gitignore delete mode 100644 vendor/libgit2/examples/Makefile delete mode 100644 vendor/libgit2/examples/general.c delete mode 100644 vendor/libgit2/examples/showindex.c delete mode 100644 vendor/libgit2/git.git-authors delete mode 100644 vendor/libgit2/include/git2.h delete mode 100644 vendor/libgit2/include/git2/blob.h delete mode 100644 vendor/libgit2/include/git2/branch.h delete mode 100644 vendor/libgit2/include/git2/commit.h delete mode 100644 vendor/libgit2/include/git2/common.h delete mode 100644 vendor/libgit2/include/git2/config.h delete mode 100644 vendor/libgit2/include/git2/errors.h delete mode 100644 vendor/libgit2/include/git2/index.h delete mode 100644 vendor/libgit2/include/git2/indexer.h delete mode 100644 vendor/libgit2/include/git2/net.h delete mode 100644 vendor/libgit2/include/git2/object.h delete mode 100644 vendor/libgit2/include/git2/odb.h delete mode 100644 vendor/libgit2/include/git2/odb_backend.h delete mode 100644 vendor/libgit2/include/git2/oid.h delete mode 100644 vendor/libgit2/include/git2/reflog.h delete mode 100644 vendor/libgit2/include/git2/refs.h delete mode 100644 vendor/libgit2/include/git2/refspec.h delete mode 100644 vendor/libgit2/include/git2/remote.h delete mode 100644 vendor/libgit2/include/git2/repository.h delete mode 100644 vendor/libgit2/include/git2/revwalk.h delete mode 100644 vendor/libgit2/include/git2/signature.h delete mode 100644 vendor/libgit2/include/git2/status.h delete mode 100644 vendor/libgit2/include/git2/tag.h delete mode 100644 vendor/libgit2/include/git2/thread-utils.h delete mode 100644 vendor/libgit2/include/git2/transport.h delete mode 100644 vendor/libgit2/include/git2/tree.h delete mode 100644 vendor/libgit2/include/git2/types.h delete mode 100644 vendor/libgit2/include/git2/zlib.h delete mode 100644 vendor/libgit2/libgit2.pc.in delete mode 100644 vendor/libgit2/src/backends/hiredis.c delete mode 100644 vendor/libgit2/src/backends/sqlite.c delete mode 100644 vendor/libgit2/src/blob.c delete mode 100644 vendor/libgit2/src/blob.h delete mode 100644 vendor/libgit2/src/block-sha1/sha1.c delete mode 100644 vendor/libgit2/src/block-sha1/sha1.h delete mode 100644 vendor/libgit2/src/bswap.h delete mode 100644 vendor/libgit2/src/buffer.c delete mode 100644 vendor/libgit2/src/buffer.h delete mode 100644 vendor/libgit2/src/cache.c delete mode 100644 vendor/libgit2/src/cache.h delete mode 100644 vendor/libgit2/src/cc-compat.h delete mode 100644 vendor/libgit2/src/commit.c delete mode 100644 vendor/libgit2/src/commit.h delete mode 100644 vendor/libgit2/src/common.h delete mode 100644 vendor/libgit2/src/config.c delete mode 100644 vendor/libgit2/src/config.h delete mode 100644 vendor/libgit2/src/config_file.c delete mode 100644 vendor/libgit2/src/delta-apply.c delete mode 100644 vendor/libgit2/src/delta-apply.h delete mode 100644 vendor/libgit2/src/dir.h delete mode 100644 vendor/libgit2/src/errors.c delete mode 100644 vendor/libgit2/src/fetch.c delete mode 100644 vendor/libgit2/src/fetch.h delete mode 100644 vendor/libgit2/src/filebuf.c delete mode 100644 vendor/libgit2/src/filebuf.h delete mode 100644 vendor/libgit2/src/fileops.c delete mode 100644 vendor/libgit2/src/fileops.h delete mode 100644 vendor/libgit2/src/hash.c delete mode 100644 vendor/libgit2/src/hash.h delete mode 100644 vendor/libgit2/src/hashtable.c delete mode 100644 vendor/libgit2/src/hashtable.h delete mode 100644 vendor/libgit2/src/index.c delete mode 100644 vendor/libgit2/src/index.h delete mode 100644 vendor/libgit2/src/indexer.c delete mode 100644 vendor/libgit2/src/map.h delete mode 100644 vendor/libgit2/src/mingw-compat.h delete mode 100644 vendor/libgit2/src/msvc-compat.h delete mode 100644 vendor/libgit2/src/mwindow.c delete mode 100644 vendor/libgit2/src/mwindow.h delete mode 100644 vendor/libgit2/src/netops.c delete mode 100644 vendor/libgit2/src/netops.h delete mode 100644 vendor/libgit2/src/object.c delete mode 100644 vendor/libgit2/src/odb.c delete mode 100644 vendor/libgit2/src/odb.h delete mode 100644 vendor/libgit2/src/odb_loose.c delete mode 100644 vendor/libgit2/src/odb_pack.c delete mode 100644 vendor/libgit2/src/oid.c delete mode 100644 vendor/libgit2/src/pack.c delete mode 100644 vendor/libgit2/src/pack.h delete mode 100644 vendor/libgit2/src/path.c delete mode 100644 vendor/libgit2/src/path.h delete mode 100644 vendor/libgit2/src/pkt.c delete mode 100644 vendor/libgit2/src/pkt.h delete mode 100644 vendor/libgit2/src/posix.c delete mode 100644 vendor/libgit2/src/posix.h delete mode 100644 vendor/libgit2/src/ppc/sha1.c delete mode 100644 vendor/libgit2/src/ppc/sha1.h delete mode 100644 vendor/libgit2/src/ppc/sha1ppc.S delete mode 100644 vendor/libgit2/src/pqueue.c delete mode 100644 vendor/libgit2/src/pqueue.h delete mode 100644 vendor/libgit2/src/reflog.c delete mode 100644 vendor/libgit2/src/reflog.h delete mode 100644 vendor/libgit2/src/refs.c delete mode 100644 vendor/libgit2/src/refs.h delete mode 100644 vendor/libgit2/src/refspec.c delete mode 100644 vendor/libgit2/src/refspec.h delete mode 100644 vendor/libgit2/src/remote.c delete mode 100644 vendor/libgit2/src/remote.h delete mode 100644 vendor/libgit2/src/repository.c delete mode 100644 vendor/libgit2/src/repository.h delete mode 100644 vendor/libgit2/src/revwalk.c delete mode 100644 vendor/libgit2/src/sha1.c delete mode 100644 vendor/libgit2/src/sha1.h delete mode 100644 vendor/libgit2/src/sha1_lookup.c delete mode 100644 vendor/libgit2/src/sha1_lookup.h delete mode 100644 vendor/libgit2/src/signature.c delete mode 100644 vendor/libgit2/src/signature.h delete mode 100644 vendor/libgit2/src/status.c delete mode 100644 vendor/libgit2/src/t03-data.h delete mode 100644 vendor/libgit2/src/tag.c delete mode 100644 vendor/libgit2/src/tag.h delete mode 100644 vendor/libgit2/src/thread-utils.c delete mode 100644 vendor/libgit2/src/thread-utils.h delete mode 100644 vendor/libgit2/src/transport.c delete mode 100644 vendor/libgit2/src/transport.h delete mode 100644 vendor/libgit2/src/transport_git.c delete mode 100644 vendor/libgit2/src/transport_local.c delete mode 100644 vendor/libgit2/src/tree.c delete mode 100644 vendor/libgit2/src/tree.h delete mode 100644 vendor/libgit2/src/tsort.c delete mode 100644 vendor/libgit2/src/unix/map.c delete mode 100644 vendor/libgit2/src/unix/posix.h delete mode 100644 vendor/libgit2/src/util.c delete mode 100644 vendor/libgit2/src/util.h delete mode 100644 vendor/libgit2/src/vector.c delete mode 100644 vendor/libgit2/src/vector.h delete mode 100644 vendor/libgit2/src/win32/dir.c delete mode 100644 vendor/libgit2/src/win32/fileops.c delete mode 100644 vendor/libgit2/src/win32/fnmatch.c delete mode 100644 vendor/libgit2/src/win32/fnmatch.h delete mode 100644 vendor/libgit2/src/win32/map.c delete mode 100644 vendor/libgit2/src/win32/mingw-compat.h delete mode 100644 vendor/libgit2/src/win32/msvc-compat.h delete mode 100644 vendor/libgit2/src/win32/posix.c delete mode 100644 vendor/libgit2/src/win32/posix.h delete mode 100644 vendor/libgit2/src/win32/pthread.c delete mode 100644 vendor/libgit2/src/win32/pthread.h delete mode 100644 vendor/libgit2/tests/.gitignore delete mode 100644 vendor/libgit2/tests/NAMING delete mode 100644 vendor/libgit2/tests/resources/.gitignore delete mode 100644 vendor/libgit2/tests/resources/big.index delete mode 100644 vendor/libgit2/tests/resources/config/.gitconfig delete mode 100644 vendor/libgit2/tests/resources/config/config0 delete mode 100644 vendor/libgit2/tests/resources/config/config1 delete mode 100644 vendor/libgit2/tests/resources/config/config10 delete mode 100644 vendor/libgit2/tests/resources/config/config2 delete mode 100644 vendor/libgit2/tests/resources/config/config3 delete mode 100644 vendor/libgit2/tests/resources/config/config4 delete mode 100644 vendor/libgit2/tests/resources/config/config5 delete mode 100644 vendor/libgit2/tests/resources/config/config6 delete mode 100644 vendor/libgit2/tests/resources/config/config7 delete mode 100644 vendor/libgit2/tests/resources/config/config8 delete mode 100644 vendor/libgit2/tests/resources/config/config9 delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/HEAD delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/config delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/description delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/info/exclude delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/objects/info/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/objects/pack/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/refs/heads/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_bare.git/refs/tags/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/info/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/pack/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/heads/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/tags/dummy-marker.txt delete mode 100644 vendor/libgit2/tests/resources/gitgit.index delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/HEAD delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/config delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/description delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/index delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/info/exclude delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/logs/HEAD delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/18/88c805345ba265b0ee9449b8877b6064592058 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/32/504b727382542f9f089e24fddac5e78533e96c delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/45/2e4244b5d083ddf0460acf1ecc74db9dcfa11a delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/52/9a16e8e762d4acb7b9636ff540a00831f9155a delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/53/ace0d1cc1145a5f4fe4f78a186a60263190733 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/55/d316c9ba708999f1918e9677d01dfcae69c6b9 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/70/bd9443ada07063e7fbf0b3ff5c13f7494d89c2 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/73/5b6a258cd196a8f7c9428419b02c1dca93fd75 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/9c/2e02cdffa8d73e6c189074594477a6baf87960 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/a0/de7e0ac200c489c41c59dfa910154a70264e6e delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/aa/27a641456848200fdb7f7c99ba36f8a0952877 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd delete mode 100644 vendor/libgit2/tests/resources/status/.gitted/refs/heads/master delete mode 100644 vendor/libgit2/tests/resources/status/current_file delete mode 100644 vendor/libgit2/tests/resources/status/modified_file delete mode 100644 vendor/libgit2/tests/resources/status/new_file delete mode 100644 vendor/libgit2/tests/resources/status/staged_changes delete mode 100644 vendor/libgit2/tests/resources/status/staged_changes_modified_file delete mode 100644 vendor/libgit2/tests/resources/status/staged_delete_modified_file delete mode 100644 vendor/libgit2/tests/resources/status/staged_new_file delete mode 100644 vendor/libgit2/tests/resources/status/staged_new_file_modified_file delete mode 100644 vendor/libgit2/tests/resources/status/subdir/current_file delete mode 100644 vendor/libgit2/tests/resources/status/subdir/modified_file delete mode 100644 vendor/libgit2/tests/resources/status/subdir/new_file delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/HEAD delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/config delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/head-tracker delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/index delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/b2/5fa35b38051e4ae45d4222e795f9df2e43f1d1 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/f6/0079018b664e4e79329a7ef9559c8d9e0378d1 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/fd/093bff70906175335656e6ce6ae05783708765 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-a81e489679b7d3418f9ab594bda8ceb37dd4c695.idx delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-a81e489679b7d3418f9ab594bda8ceb37dd4c695.pack delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.idx delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.idx delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.pack delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/packed-refs delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/heads/br2 delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/heads/master delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/heads/packed-test delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/heads/test delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/tags/e90810b delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/tags/point_to_blob delete mode 100644 vendor/libgit2/tests/resources/testrepo.git/refs/tags/test delete mode 100644 vendor/libgit2/tests/t00-core.c delete mode 100644 vendor/libgit2/tests/t01-data.h delete mode 100644 vendor/libgit2/tests/t01-rawobj.c delete mode 100644 vendor/libgit2/tests/t02-data.h delete mode 100644 vendor/libgit2/tests/t02-objread.c delete mode 100644 vendor/libgit2/tests/t02-oids.h delete mode 100644 vendor/libgit2/tests/t03-data.h delete mode 100644 vendor/libgit2/tests/t03-objwrite.c delete mode 100644 vendor/libgit2/tests/t04-commit.c delete mode 100644 vendor/libgit2/tests/t05-revwalk.c delete mode 100644 vendor/libgit2/tests/t06-index.c delete mode 100644 vendor/libgit2/tests/t07-hashtable.c delete mode 100644 vendor/libgit2/tests/t08-tag.c delete mode 100644 vendor/libgit2/tests/t09-tree.c delete mode 100644 vendor/libgit2/tests/t10-refs.c delete mode 100644 vendor/libgit2/tests/t11-sqlite.c delete mode 100644 vendor/libgit2/tests/t12-repo.c delete mode 100644 vendor/libgit2/tests/t13-threads.c delete mode 100644 vendor/libgit2/tests/t14-hiredis.c delete mode 100644 vendor/libgit2/tests/t15-config.c delete mode 100644 vendor/libgit2/tests/t16-remotes.c delete mode 100644 vendor/libgit2/tests/t17-bufs.c delete mode 100644 vendor/libgit2/tests/t18-status.c delete mode 100644 vendor/libgit2/tests/test_helpers.c delete mode 100644 vendor/libgit2/tests/test_helpers.h delete mode 100755 vendor/libgit2/tests/test_lib.c delete mode 100755 vendor/libgit2/tests/test_lib.h delete mode 100644 vendor/libgit2/tests/test_main.c delete mode 100644 vendor/libgit2/tests/tests.supp delete mode 100755 vendor/libgit2/waf delete mode 100644 vendor/libgit2/wscript diff --git a/.gitmodules b/.gitmodules index f3a63f3f0..ca6a48f0b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "vendor/libgit2"] path = vendor/libgit2 url = git://github.com/libgit2/libgit2.git -[submodule "example/stress/jquery"] - path = example/stress/jquery - url = https://github.com/jquery/jquery.git diff --git a/vendor/libgit2/.HEADER b/vendor/libgit2/.HEADER deleted file mode 100644 index fd8430bc8..000000000 --- a/vendor/libgit2/.HEADER +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ diff --git a/vendor/libgit2/.gitattributes b/vendor/libgit2/.gitattributes deleted file mode 100644 index f90540b55..000000000 --- a/vendor/libgit2/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -*.c eol=lf -*.h eol=lf diff --git a/vendor/libgit2/CMakeLists.txt b/vendor/libgit2/CMakeLists.txt deleted file mode 100644 index e149cd27f..000000000 --- a/vendor/libgit2/CMakeLists.txt +++ /dev/null @@ -1,134 +0,0 @@ -# CMake build script for the libgit2 project -# -# Building (out of source build): -# > mkdir build && cd build -# > cmake .. [-DSETTINGS=VALUE] -# > cmake --build . -# -# Testing: -# > ctest -V -# -# Install: -# > cmake --build . --target install - -PROJECT(libgit2 C) -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) - -FILE(STRINGS "include/git2.h" GIT2_HEADER REGEX "^#define LIBGIT2_VERSION \"[^\"]*\"$") - -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"([0-9]+).*$" "\\1" LIBGIT2_VERSION_MAJOR "${GIT2_HEADER}") -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_MINOR "${GIT2_HEADER}") -STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_REV "${GIT2_HEADER}") -SET(LIBGIT2_VERSION_STRING "${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}.${LIBGIT2_VERSION_REV}") - -# Find required dependencies -INCLUDE_DIRECTORIES(src include) -IF (NOT WIN32) - FIND_PACKAGE(ZLIB) -ENDIF() - -IF (ZLIB_FOUND) - INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS}) - LINK_LIBRARIES(${ZLIB_LIBRARIES}) -ELSE (ZLIB_FOUND) - INCLUDE_DIRECTORIES(deps/zlib) - ADD_DEFINITIONS(-DNO_VIZ -DSTDC -DNO_GZIP) - FILE(GLOB SRC_ZLIB deps/zlib/*.c) -ENDIF() - -# Installation paths -SET(INSTALL_BIN bin CACHE PATH "Where to install binaries to.") -SET(INSTALL_LIB lib CACHE PATH "Where to install libraries to.") -SET(INSTALL_INC include CACHE PATH "Where to install headers to.") - -# Build options -OPTION (BUILD_SHARED_LIBS "Build Shared Library (OFF for Static)" ON) -OPTION (BUILD_TESTS "Build Tests" ON) -OPTION (THREADSAFE "Build libgit2 as threadsafe" OFF) -OPTION (STDCALL "Buildl libgit2 with the __stdcall convention (Windows)" ON) - -# Platform specific compilation flags -IF (MSVC) - SET(CMAKE_C_FLAGS "/W4 /WX /nologo /Zi") - IF (STDCALL) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gz") - ENDIF () - # TODO: bring back /RTC1 /RTCc - SET(CMAKE_C_FLAGS_DEBUG "/Od /DEBUG /MTd") - SET(CMAKE_C_FLAGS_RELEASE "/MT /O2") -ELSE () - SET(CMAKE_C_FLAGS "-O2 -g -Wall -Wextra") - IF (NOT MINGW) # MinGW always does PIC and complains if we tell it to - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") - ENDIF () -ENDIF() - -# Build Debug by default -IF (NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) -ENDIF () - -IF (THREADSAFE) - IF (NOT WIN32) - find_package(Threads REQUIRED) - ENDIF() - - ADD_DEFINITIONS(-DGIT_THREADS) -ENDIF() - -ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) - -# Collect sourcefiles -FILE(GLOB SRC_H include/git2/*.h) - -# On Windows use specific platform sources -IF (WIN32 AND NOT CYGWIN) - ADD_DEFINITIONS(-DWIN32 -D_DEBUG -D_LIB) - FILE(GLOB SRC src/*.c src/win32/*.c) -ELSE() - FILE(GLOB SRC src/*.c src/unix/*.c) -ENDIF () - -# Compile and link libgit2 -ADD_LIBRARY(git2 ${SRC} ${SRC_ZLIB}) - -IF (WIN32) - TARGET_LINK_LIBRARIES(git2 ws2_32) -ELSEIF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") - TARGET_LINK_LIBRARIES(git2 socket nsl) -ENDIF () - -TARGET_LINK_LIBRARIES(git2 ${CMAKE_THREAD_LIBS_INIT}) -SET_TARGET_PROPERTIES(git2 PROPERTIES VERSION ${LIBGIT2_VERSION_STRING}) -SET_TARGET_PROPERTIES(git2 PROPERTIES SOVERSION ${LIBGIT2_VERSION_MAJOR}) -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libgit2.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libgit2.pc @ONLY) - -# Install -INSTALL(TARGETS git2 - RUNTIME DESTINATION ${INSTALL_BIN} - LIBRARY DESTINATION ${INSTALL_LIB} - ARCHIVE DESTINATION ${INSTALL_LIB} -) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libgit2.pc DESTINATION ${INSTALL_LIB}/pkgconfig ) -INSTALL(DIRECTORY include/git2 DESTINATION ${INSTALL_INC} ) -INSTALL(FILES include/git2.h DESTINATION ${INSTALL_INC} ) - -# Tests -IF (BUILD_TESTS) - SET(TEST_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/tests/resources" CACHE PATH "Path to test resources.") - ADD_DEFINITIONS(-DTEST_RESOURCES=\"${TEST_RESOURCES}\") - - INCLUDE_DIRECTORIES(tests) - FILE(GLOB SRC_TEST tests/t??-*.c) - - ADD_EXECUTABLE(libgit2_test tests/test_main.c tests/test_lib.c tests/test_helpers.c ${SRC} ${SRC_TEST} ${SRC_ZLIB}) - TARGET_LINK_LIBRARIES(libgit2_test ${CMAKE_THREAD_LIBS_INIT}) - IF (WIN32) - TARGET_LINK_LIBRARIES(libgit2_test ws2_32) - ELSEIF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") - TARGET_LINK_LIBRARIES(libgit2_test socket nsl) - ENDIF () - - ENABLE_TESTING() - ADD_TEST(libgit2_test libgit2_test) -ENDIF () diff --git a/vendor/libgit2/CONVENTIONS b/vendor/libgit2/CONVENTIONS deleted file mode 100644 index 575cdc563..000000000 --- a/vendor/libgit2/CONVENTIONS +++ /dev/null @@ -1,107 +0,0 @@ -libgit2 conventions -=================== - -Namespace Prefixes ------------------- - -All types and functions start with 'git_'. - -All #define macros start with 'GIT_'. - - -Type Definitions ----------------- - -Most types should be opaque, e.g.: - ----- - typedef struct git_odb git_odb; ----- - -with allocation functions returning an "instance" created within -the library, and not within the application. This allows the type -to grow (or shrink) in size without rebuilding client code. - - -Public Exported Function Definitions ------------------------------------- - -All exported functions must be declared as: - ----- - GIT_EXTERN(result_type) git_modulename_functionname(arg_list); ----- - - -Semi-Private Exported Functions -------------------------------- - -Functions whose modulename is followed by two underscores, -for example 'git_odb__read_packed', are semi-private functions. -They are primarily intended for use within the library itself, -and may disappear or change their signature in a future release. - - -Calling Conventions -------------------- - -Functions should prefer to return a 'int' to indicate success or -failure and supply any output through the first argument (or first -few arguments if multiple outputs are supplied). - -int status codes are 0 for GIT_SUCCESS and < 0 for an error. -This permits common POSIX result testing: - ----- - if (git_odb_open(&odb, path)) - abort("odb open failed"); ----- - -Functions returning a pointer may return NULL instead of an int -if there is only one type of failure (ENOMEM). - -Functions returning a pointer may also return NULL if the common -case needed by the application is strictly success/failure and a -(possibly slower) function exists that the caller can use to get -more detailed information. Parsing common data structures from -on-disk formats is a good example of this pattern; in general a -"corrupt" entity can be treated as though it does not exist but -a more sophisticated "fsck" support function can report how the -entity is malformed. - - -Documentation Fomatting ------------------------ - -All comments should conform to Doxygen "javadoc" style conventions -for formatting the public API documentation. - - -Public Header Format --------------------- - -All public headers defining types, functions or macros must use -the following form, where ${filename} is the name of the file, -after replacing non-identifier characters with '_'. - ----- - #ifndef INCLUDE_git_${filename}_h__ - #define INCLUDE_git_${filename}_h__ - - #include "git/common.h" - - /** - * @file git/${filename}.h - * @brief Git some description - * @defgroup git_${filename} some description routines - * @ingroup Git - * @{ - */ - GIT_BEGIN_DECL - - ... definitions ... - - /** @} */ - GIT_END_DECL - #endif ----- diff --git a/vendor/libgit2/COPYING b/vendor/libgit2/COPYING deleted file mode 100644 index 75bc6a1fe..000000000 --- a/vendor/libgit2/COPYING +++ /dev/null @@ -1,356 +0,0 @@ - - Note that the only valid version of the GPL as far as this project - is concerned is _this_ particular version of the license (ie v2, not - v2.2 or v3.x or whatever), unless explicitly otherwise stated. - - In addition to the permissions in the GNU General Public License, - the authors give you unlimited permission to link the compiled - version of this file into combinations with other programs, - and to distribute those combinations without any restriction - coming from the use of this file. (The General Public License - restrictions do apply in other respects; for example, they cover - modification of the file, and distribution when not linked into - a combined executable.) - ----------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/vendor/libgit2/Makefile.embed b/vendor/libgit2/Makefile.embed deleted file mode 100644 index fec090fa7..000000000 --- a/vendor/libgit2/Makefile.embed +++ /dev/null @@ -1,26 +0,0 @@ -rm=rm -f -CC=cc -AR=ar cq -RANLIB=ranlib -LIBNAME=libgit2.a - -INCLUDES= -I. -Isrc -Iinclude -Ideps/zlib - -DEFINES= $(INCLUDES) -DNO_VIZ -DSTDC -DNO_GZIP -D_FILE_OFFSET_BITS=64 -CFLAGS= -g $(DEFINES) -Wall -Wextra -fPIC -O2 - -SRCS = $(wildcard src/*.c) $(wildcard src/unix/*.c) $(wildcard deps/zlib/*.c) -OBJS = $(patsubst %.c,%.o,$(SRCS)) - -%.c.o: - $(CC) $(CFLAGS) -c $*.c - -all: $(LIBNAME) - -$(LIBNAME): $(OBJS) - $(rm) $@ - $(AR) $@ $(OBJS) - $(RANLIB) $@ - -clean: - $(rm) $(OBJS) $(LIBNAME) diff --git a/vendor/libgit2/README.md b/vendor/libgit2/README.md deleted file mode 100644 index b5c76a6be..000000000 --- a/vendor/libgit2/README.md +++ /dev/null @@ -1,113 +0,0 @@ -libgit2 - the Git linkable library -====================== - -libgit2 is a portable, pure C implementation of the Git core methods provided as a -re-entrant linkable library with a solid API, allowing you to write native -speed custom Git applications in any language with bindings. - -libgit2 is licensed under a **very permissive license** (GPLv2 with a special Linking Exception). -This basically means that you can link it (unmodified) with any kind of software without having to -release its source code. - -* Mailing list: -* Website: -* API documentation: -* Usage guide: - -What It Can Do -================================== - -libgit2 is already very usable. - -* SHA conversions, formatting and shortening -* abstracked ODB backend system -* commit, tag, tree and blob parsing, editing, and write-back -* tree traversal -* revision walking -* index file (staging area) manipulation -* reference management (including packed references) -* config file management -* high level repository management -* thread safety and reentrancy -* descriptive and detailed error messages -* ...and more (over 175 different API calls) - -Building libgit2 - Using CMake -============================== - -libgit2 builds cleanly on most platforms without any external dependencies. -Under Unix-like systems, like Linux, * BSD and Mac OS X, libgit2 expects `pthreads` to be available; -they should be installed by default on all systems. Under Windows, libgit2 uses the native Windows API -for threading. - -The libgit2 library is built using CMake 2.6+ () on all platforms. - -On most systems you can build the library using the following commands - - $ mkdir build && cd build - $ cmake .. - $ cmake --build . - -Alternatively you can point the CMake GUI tool to the CMakeLists.txt file and generate platform specific build project or IDE workspace. - -To install the library you can specify the install prefix by setting: - - $ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix - $ cmake --build . --target install - -For more advanced use or questions about CMake please read . - -The following CMake variables are declared: - -- `INSTALL_BIN`: Where to install binaries to. -- `INSTALL_LIB`: Where to install libraries to. -- `INSTALL_INC`: Where to install headers to. -- `BUILD_SHARED_LIBS`: Build libgit2 as a Shared Library (defaults to ON) -- `BUILD_TESTS`: Build the libgit2 test suite (defaults to ON) -- `THREADSAFE`: Build libgit2 with threading support (defaults to OFF) - -Language Bindings -================================== - -Here are the bindings to libgit2 that are currently available: - -* Rugged (Ruby bindings) -* objective-git (Objective-C bindings) -* pygit2 (Python bindings) -* libgit2sharp (.NET bindings) -* php-git (PHP bindings) -* luagit2 (Lua bindings) -* GitForDelphi (Delphi bindings) -* node-gitteh (Node.js bindings) -* nodegit (Node.js bindings) -* go-git (Go bindings) -* libqgit2 (C++ QT bindings) -* libgit2-ocaml (ocaml bindings) -* Geef (Erlang bindings) -* libgit2net (.NET bindings, low level) -* parrot-libgit2 (Parrot Virtual Machine bindings) -* hgit2 (Haskell bindings) - -If you start another language binding to libgit2, please let us know so -we can add it to the list. - -How Can I Contribute -================================== - -Fork libgit2/libgit2 on GitHub, add your improvement, push it to a branch -in your fork named for the topic, send a pull request. - -You can also file bugs or feature requests under the libgit2 project on -GitHub, or join us on the mailing list by sending an email to: - -libgit2@librelist.com - - -License -================================== -libgit2 is under GPL2 **with linking exemption**. This means you -can link to the library with any program, commercial, open source or -other. However, you cannot modify libgit2 and distribute it without -supplying the source. - -See the COPYING file for the full license text. diff --git a/vendor/libgit2/api.docurium b/vendor/libgit2/api.docurium deleted file mode 100644 index 9e17817db..000000000 --- a/vendor/libgit2/api.docurium +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "libgit2", - "github": "libgit2/libgit2", - "input": "include/git2", - "prefix": "git_", - "output": "docs", - "branch": "gh-pages", - "examples": "examples", - "legacy": { - "input": {"src/git": ["v0.1.0"], - "src/git2": ["v0.2.0", "v0.3.0"]} - } -} diff --git a/vendor/libgit2/api.doxygen b/vendor/libgit2/api.doxygen deleted file mode 100644 index b812add85..000000000 --- a/vendor/libgit2/api.doxygen +++ /dev/null @@ -1,24 +0,0 @@ -PROJECT_NAME = libgit2 - -INPUT = include/git2 -QUIET = YES -RECURSIVE = YES -FILE_PATTERNS = *.h -OUTPUT_DIRECTORY = apidocs -GENERATE_TAGFILE = apidocs/libgit2.tag - -JAVADOC_AUTOBRIEF = YES -MACRO_EXPANSION = YES -EXPAND_ONLY_PREDEF = YES -OPTIMIZE_OUTPUT_FOR_C = YES -STRIP_CODE_COMMENTS = NO -FULL_PATH_NAMES = NO -CASE_SENSE_NAMES = NO - -PREDEFINED = \ - "GIT_EXTERN(x)=x" \ - "GIT_EXTERN_TLS(x)=x" \ - "GIT_INLINE(x)=x" \ - "GIT_BEGIN_DECL=" \ - "GIT_END_DECL=" \ - DOXYGEN= diff --git a/vendor/libgit2/deps/zlib/adler32.c b/vendor/libgit2/deps/zlib/adler32.c deleted file mode 100644 index 65ad6a5ad..000000000 --- a/vendor/libgit2/deps/zlib/adler32.c +++ /dev/null @@ -1,169 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2007 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#define local static - -local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware */ -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD4(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 >= BASE) sum1 -= BASE; - if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 >= BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} - -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} diff --git a/vendor/libgit2/deps/zlib/crc32.c b/vendor/libgit2/deps/zlib/crc32.c deleted file mode 100644 index 91be372d2..000000000 --- a/vendor/libgit2/deps/zlib/crc32.c +++ /dev/null @@ -1,442 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); - - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} diff --git a/vendor/libgit2/deps/zlib/crc32.h b/vendor/libgit2/deps/zlib/crc32.h deleted file mode 100644 index 8053b6117..000000000 --- a/vendor/libgit2/deps/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/vendor/libgit2/deps/zlib/deflate.c b/vendor/libgit2/deps/zlib/deflate.c deleted file mode 100644 index 5c4022f3d..000000000 --- a/vendor/libgit2/deps/zlib/deflate.c +++ /dev/null @@ -1,1834 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->high_water = 0; /* nothing written to s->window yet */ - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) - return Z_STREAM_ERROR; - - s = strm->state; - if (s->wrap) - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > s->w_size) { - length = s->w_size; - dictionary += dictLength - length; /* use the tail of the dictionary */ - } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); - } - if (hash_head) hash_head = 0; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if ((strategy != s->strategy || func != configuration_table[level].func) && - strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_BLOCK); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ - deflate_state *s; - uLong complen, wraplen; - Bytef *str; - - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - - /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (strm == Z_NULL || strm->state == Z_NULL) - return complen + 6; - - /* compute wrapper length */ - s = strm->state; - switch (s->wrap) { - case 0: /* raw deflate */ - wraplen = 0; - break; - case 1: /* zlib wrapper */ - wraplen = 6 + (s->strstart ? 4 : 0); - break; - case 2: /* gzip wrapper */ - wraplen = 18; - if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ - if (s->gzhead->extra != Z_NULL) - wraplen += 2 + s->gzhead->extra_len; - str = s->gzhead->name; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - str = s->gzhead->comment; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - if (s->gzhead->hcrc) - wraplen += 2; - } - break; - default: /* for compiler happiness */ - wraplen = 6; - } - - /* if not default parameters, return conservative bound */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; - - /* default settings: return tight bound for that case */ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13 - 6 + wraplen; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_BLOCK || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - (s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush)); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - if (s->lookahead == 0) { - s->strstart = 0; - s->block_start = 0L; - } - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy(dest, source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); - } -#endif - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ - -#else /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for FASTEST only - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#endif /* FASTEST */ - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, last) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (last)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, last) { \ - FLUSH_BLOCK_ONLY(s, last); \ - if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif /* FASTEST */ - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt prev; /* byte at distance one to match */ - Bytef *scan, *strend; /* scan goes up to strend for length of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. - */ - if (s->lookahead < MAX_MATCH) { - fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s->match_length = 0; - if (s->lookahead >= MIN_MATCH && s->strstart > 0) { - scan = s->window + s->strstart - 1; - prev = *scan; - if (prev == *++scan && prev == *++scan && prev == *++scan) { - strend = s->window + s->strstart + MAX_MATCH; - do { - } while (prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - scan < strend); - s->match_length = MAX_MATCH - (int)(strend - scan); - if (s->match_length > s->lookahead) - s->match_length = s->lookahead; - } - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, s->match_length); - - _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - s->strstart += s->match_length; - s->match_length = 0; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s->lookahead == 0) { - fill_window(s); - if (s->lookahead == 0) { - if (flush == Z_NO_FLUSH) - return need_more; - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s->match_length = 0; - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} diff --git a/vendor/libgit2/deps/zlib/deflate.h b/vendor/libgit2/deps/zlib/deflate.h deleted file mode 100644 index d7d26f8a9..000000000 --- a/vendor/libgit2/deps/zlib/deflate.h +++ /dev/null @@ -1,342 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2010 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - ulg high_water; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - -#define WIN_INIT MAX_MATCH -/* Number of bytes after end of data in window to initialize in order to avoid - memory checker errors from longest match routines */ - - /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch ZLIB_INTERNAL _length_code[]; - extern uch ZLIB_INTERNAL _dist_code[]; -#else - extern const uch ZLIB_INTERNAL _length_code[]; - extern const uch ZLIB_INTERNAL _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (uch)(c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (uch)(length); \ - ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/vendor/libgit2/deps/zlib/inffast.c b/vendor/libgit2/deps/zlib/inffast.c deleted file mode 100644 index 2f1d60b43..000000000 --- a/vendor/libgit2/deps/zlib/inffast.c +++ /dev/null @@ -1,340 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - wnext = state->wnext; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - PUP(out) = (unsigned char)(here.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state->sane) { - strm->msg = - (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - if (len <= op - whave) { - do { - PUP(out) = 0; - } while (--len); - continue; - } - len -= op - whave; - do { - PUP(out) = 0; - } while (--op > whave); - if (op == 0) { - from = out - dist; - do { - PUP(out) = PUP(from); - } while (--len); - continue; - } -#endif - } - from = window - OFF; - if (wnext == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and wnext == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/vendor/libgit2/deps/zlib/inffast.h b/vendor/libgit2/deps/zlib/inffast.h deleted file mode 100644 index e5c1aa4ca..000000000 --- a/vendor/libgit2/deps/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/vendor/libgit2/deps/zlib/inffixed.h b/vendor/libgit2/deps/zlib/inffixed.h deleted file mode 100644 index 75ed4b597..000000000 --- a/vendor/libgit2/deps/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/vendor/libgit2/deps/zlib/inflate.c b/vendor/libgit2/deps/zlib/inflate.c deleted file mode 100644 index a8431abea..000000000 --- a/vendor/libgit2/deps/zlib/inflate.c +++ /dev/null @@ -1,1480 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common wnext == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->wnext = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ - int wrap; - struct inflate_state FAR *state; - - /* get the state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) - windowBits &= 15; -#endif - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) - return Z_STREAM_ERROR; - if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { - ZFREE(strm, state->window); - state->window = Z_NULL; - } - - /* update state and reset the rest of it */ - state->wrap = wrap; - state->wbits = (unsigned)windowBits; - return inflateReset(strm); -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - int ret; - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->window = Z_NULL; - ret = inflateReset2(strm, windowBits); - if (ret != Z_OK) { - ZFREE(strm, state); - strm->state = Z_NULL; - } - return ret; -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits < 0) { - state->hold = 0; - state->bits = 0; - return Z_OK; - } - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, out) -z_streamp strm; -unsigned out; -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->wnext = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->wnext = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->wnext; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->wnext = copy; - state->whave = state->wsize; - } - else { - state->wnext += dist; - if (state->wnext == state->wsize) state->wnext = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (state->wbits == 0) - state->wbits = len; - else if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN_; /* decode codes */ - if (flush == Z_TREES) { - DROPBITS(2); - goto inf_leave; - } - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY_; - if (flush == Z_TREES) goto inf_leave; - case COPY_: - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - NEEDBITS(here.bits); - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN_; - if (flush == Z_TREES) goto inf_leave; - case LEN_: - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - if (state->mode == TYPE) - state->back = -1; - break; - } - state->back = 0; - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - state->length = (unsigned)here.val; - if ((int)(here.op) == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - state->mode = LIT; - break; - } - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->back = -1; - state->mode = TYPE; - break; - } - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(here.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->was = state->length; - state->mode = DIST; - case DIST: - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - state->extra = (unsigned)(here.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->whave) { - if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - Trace((stderr, "inflate.c too far\n")); - copy -= state->whave; - if (copy > state->length) copy = state->length; - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = 0; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; -#endif - } - if (copy > state->wnext) { - copy -= state->wnext; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->wnext - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0) + - (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long id; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} - -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->sane = !subvert; -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - return Z_OK; -#else - state->sane = 1; - return Z_DATA_ERROR; -#endif -} - -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; - state = (struct inflate_state FAR *)strm->state; - return ((long)(state->back) << 16) + - (state->mode == COPY ? state->length : - (state->mode == MATCH ? state->was - state->length : 0)); -} diff --git a/vendor/libgit2/deps/zlib/inflate.h b/vendor/libgit2/deps/zlib/inflate.h deleted file mode 100644 index 95f4986d4..000000000 --- a/vendor/libgit2/deps/zlib/inflate.h +++ /dev/null @@ -1,122 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2009 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY_, /* i/o: same as COPY below, but only first time in */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN_, /* i: same as LEN below, but only first time in */ - LEN, /* i: waiting for length/lit/eob code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to BAD or MEM on error -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) or (raw) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> - HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - (raw) -> TYPEDO - Read deflate blocks: - TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK - STORED -> COPY_ -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN_ - LEN_ -> LEN - Read deflate codes in fixed or dynamic block: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 10K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ - int sane; /* if false, allow invalid distance too far */ - int back; /* bits back of last unprocessed length/lit */ - unsigned was; /* initial length of match */ -}; diff --git a/vendor/libgit2/deps/zlib/inftrees.c b/vendor/libgit2/deps/zlib/inftrees.c deleted file mode 100644 index 11e9c52ac..000000000 --- a/vendor/libgit2/deps/zlib/inftrees.c +++ /dev/null @@ -1,330 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code here; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)1; - here.val = (unsigned short)0; - *(*table)++ = here; /* make a table to force an error */ - *(*table)++ = here; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - here.op = (unsigned char)0; - here.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - here.op = (unsigned char)(extra[work[sym]]); - here.val = base[work[sym]]; - } - else { - here.op = (unsigned char)(32 + 64); /* end of block */ - here.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = here; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - here.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = here; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/vendor/libgit2/deps/zlib/inftrees.h b/vendor/libgit2/deps/zlib/inftrees.h deleted file mode 100644 index baa53a0b1..000000000 --- a/vendor/libgit2/deps/zlib/inftrees.h +++ /dev/null @@ -1,62 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance - codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that - program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the - inflate_table() calls in inflate.c and infback.c. If the root table size is - changed, then these maximum sizes would be need to be recalculated and - updated. */ -#define ENOUGH_LENS 852 -#define ENOUGH_DISTS 592 -#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) - -/* Type of code to build for inflate_table() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/vendor/libgit2/deps/zlib/trees.c b/vendor/libgit2/deps/zlib/trees.c deleted file mode 100644 index 3e9a138c7..000000000 --- a/vendor/libgit2/deps/zlib/trees.c +++ /dev/null @@ -1,1244 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2010 Jean-loup Gailly - * detect_data_type() function provided freely by Cosmin Truta, 2006 - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (ush)value << s->bi_valid; - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= (ush)value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (ush)val << s->bi_valid;\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (ush)(value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, - "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += (ush)count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. - */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (s->strm->data_type == Z_UNKNOWN) - s->strm->data_type = detect_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/vendor/libgit2/deps/zlib/trees.h b/vendor/libgit2/deps/zlib/trees.h deleted file mode 100644 index d35639d82..000000000 --- a/vendor/libgit2/deps/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/vendor/libgit2/deps/zlib/zconf.h b/vendor/libgit2/deps/zlib/zconf.h deleted file mode 100644 index 150814361..000000000 --- a/vendor/libgit2/deps/zlib/zconf.h +++ /dev/null @@ -1,54 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -#include "../../src/common.h" - -/* Jeez, don't complain about non-prototype - * forms, we didn't write zlib */ -#if defined(_MSC_VER) -# pragma warning( disable : 4131 ) -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#define MAX_MEM_LEVEL 9 - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#define MAX_WBITS 15 /* 32K LZ77 window */ - -#define ZEXTERN extern -#define ZEXPORT -#define ZEXPORTVA -#ifndef FAR -# define FAR -#endif -#define OF(args) args - -typedef unsigned char Byte; /* 8 bits */ -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -typedef Byte FAR Bytef; -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -typedef void const *voidpc; -typedef void FAR *voidpf; -typedef void *voidp; - -#define z_off_t git_off_t -#define z_off64_t z_off_t - -#endif /* ZCONF_H */ diff --git a/vendor/libgit2/deps/zlib/zlib.h b/vendor/libgit2/deps/zlib/zlib.h deleted file mode 100644 index bfbba83e8..000000000 --- a/vendor/libgit2/deps/zlib/zlib.h +++ /dev/null @@ -1,1613 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.5, April 19th, 2010 - - Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.5" -#define ZLIB_VERNUM 0x1250 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 5 -#define ZLIB_VER_SUBREVISION 0 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never crash - even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In - particular avail_in is zero after the call if enough output space has been - provided before the call.) Flushing may degrade compression for some - compression algorithms and so it should be used only when necessary. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets to the next deflate block boundary. When decoding - the zlib or gzip format, this will cause inflate() to return immediately - after the header and before the first block. When doing a raw inflate, - inflate() will go ahead and process the first block, and will return when it - gets to the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is never required, but can be - used to inform inflate that a faster approach may be used for the single - inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK or Z_TREES is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any call - of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been - found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the - success case, the application may save the current current value of total_in - which indicates where valid compressed data was found. In the error case, - the application may repeatedly call inflateSync, providing more input each - time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above or -1 << 16 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - - /* gzip file access functions */ - -/* - This library supports reading and writing files in gzip (.gz) format with - an interface similar to that of stdio, using the functions that start with - "gz". The gzip format is different from the zlib format. gzip is a gzip - wrapper, documented in RFC 1952, wrapped around a deflate stream. -*/ - -typedef voidp gzFile; /* opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) Also "a" - can be used instead of "w" to request that the gzip stream that will be - written be appended to the file. "+" will result in an error, since reading - and writing to the same gzip file is not supported. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file was not in gzip format, gzread copies the given number of - bytes into the buffer. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream, or failing that, reading the rest - of the input file directly without decompression. The entire input file - will be read if gzread is called until it returns less than the requested - len. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. This state can change from - false to true while reading the input file if the end of a gzip stream is - reached, but is followed by data that is not another gzip stream. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# ifdef _LARGEFILE64_SOURCE - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -/* hack for buggy compilers */ -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; -#endif - -/* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/vendor/libgit2/deps/zlib/zutil.c b/vendor/libgit2/deps/zlib/zutil.c deleted file mode 100644 index 898ed345b..000000000 --- a/vendor/libgit2/deps/zlib/zutil.c +++ /dev/null @@ -1,318 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch ((int)(sizeof(uInt))) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch ((int)(sizeof(uLong))) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch ((int)(sizeof(voidpf))) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch ((int)(sizeof(z_off_t))) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#ifdef STDC -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int ZLIB_INTERNAL z_verbose = verbose; - -void ZLIB_INTERNAL z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void ZLIB_INTERNAL zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/vendor/libgit2/deps/zlib/zutil.h b/vendor/libgit2/deps/zlib/zutil.h deleted file mode 100644 index 258fa8879..000000000 --- a/vendor/libgit2/deps/zlib/zutil.h +++ /dev/null @@ -1,274 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2010 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif - -#include "zlib.h" - -#ifdef STDC -# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) -# include -# endif -# include -# include -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# ifdef M_I86 -# include -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - -#if defined(__BORLANDC__) - #pragma warn -8004 - #pragma warn -8008 - #pragma warn -8066 -#endif - -/* provide prototypes for these when building zlib without LFS */ -#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# define vsnprintf _vsnprintf -# endif -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); -void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */ diff --git a/vendor/libgit2/examples/.gitignore b/vendor/libgit2/examples/.gitignore deleted file mode 100644 index 4c34e4ab5..000000000 --- a/vendor/libgit2/examples/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -general -showindex diff --git a/vendor/libgit2/examples/Makefile b/vendor/libgit2/examples/Makefile deleted file mode 100644 index f7bf469a5..000000000 --- a/vendor/libgit2/examples/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -all: general showindex - -general : general.c - gcc -lgit2 -o general general.c - -showindex : showindex.c - gcc -lgit2 -o showindex showindex.c - -clean: - rm general showindex diff --git a/vendor/libgit2/examples/general.c b/vendor/libgit2/examples/general.c deleted file mode 100644 index 91b6ee859..000000000 --- a/vendor/libgit2/examples/general.c +++ /dev/null @@ -1,447 +0,0 @@ -// [**libgit2**][lg] is a portable, pure C implementation of the Git core methods -// provided as a re-entrant linkable library with a solid API, allowing you -// to write native speed custom Git applications in any language which -// supports C bindings. -// -// This file is an example of using that API in a real, compilable C file. -// As the API is updated, this file will be updated to demonstrate the -// new functionality. -// -// If you're trying to write something in C using [libgit2][lg], you will also want -// to check out the generated [API documentation][ap] and the [Usage Guide][ug]. We've -// tried to link to the relevant sections of the API docs in each section in this file. -// -// **libgit2** only implements the core plumbing functions, not really the higher -// level porcelain stuff. For a primer on Git Internals that you will need to know -// to work with Git at this level, check out [Chapter 9][pg] of the Pro Git book. -// -// [lg]: http://libgit2.github.com -// [ap]: http://libgit2.github.com/libgit2 -// [ug]: http://libgit2.github.com/api.html -// [pg]: http://progit.org/book/ch9-0.html - -// ### Includes - -// Including the `git2.h` header will include all the other libgit2 headers that you need. -// It should be the only thing you need to include in order to compile properly and get -// all the libgit2 API. -#include -#include - -int main (int argc, char** argv) -{ - // ### Opening the Repository - - // There are a couple of methods for opening a repository, this being the simplest. - // There are also [methods][me] for specifying the index file and work tree locations, here - // we are assuming they are in the normal places. - // - // [me]: http://libgit2.github.com/libgit2/#HEAD/group/repository - git_repository *repo; - git_repository_open(&repo, "/opt/libgit2-test/.git"); - - // ### SHA-1 Value Conversions - - // For our first example, we will convert a 40 character hex value to the 20 byte raw SHA1 value. - printf("*Hex to Raw*\n"); - char hex[] = "fd6e612585290339ea8bf39c692a7ff6a29cb7c3"; - - // The `git_oid` is the structure that keeps the SHA value. We will use this throughout the example - // for storing the value of the current SHA key we're working with. - git_oid oid; - git_oid_fromstr(&oid, hex); - - // Once we've converted the string into the oid value, we can get the raw value of the SHA. - printf("Raw 20 bytes: [%s]\n", (&oid)->id); - - // Next we will convert the 20 byte raw SHA1 value to a human readable 40 char hex value. - printf("\n*Raw to Hex*\n"); - char out[41]; - out[40] = '\0'; - - // If you have a oid, you can easily get the hex value of the SHA as well. - git_oid_fmt(out, &oid); - printf("SHA hex string: %s\n", out); - - // ### Working with the Object Database - // **libgit2** provides [direct access][odb] to the object database. - // The object database is where the actual objects are stored in Git. For - // working with raw objects, we'll need to get this structure from the - // repository. - // [odb]: http://libgit2.github.com/libgit2/#HEAD/group/odb - git_odb *odb; - odb = git_repository_database(repo); - - // #### Raw Object Reading - - printf("\n*Raw Object Read*\n"); - git_odb_object *obj; - git_otype otype; - const unsigned char *data; - const char *str_type; - int error; - - // We can read raw objects directly from the object database if we have the oid (SHA) - // of the object. This allows us to access objects without knowing thier type and inspect - // the raw bytes unparsed. - error = git_odb_read(&obj, odb, &oid); - - // A raw object only has three properties - the type (commit, blob, tree or tag), the size - // of the raw data and the raw, unparsed data itself. For a commit or tag, that raw data - // is human readable plain ASCII text. For a blob it is just file contents, so it could be - // text or binary data. For a tree it is a special binary format, so it's unlikely to be - // hugely helpful as a raw object. - data = (const unsigned char *)git_odb_object_data(obj); - otype = git_odb_object_type(obj); - - // We provide methods to convert from the object type which is an enum, to a string - // representation of that value (and vice-versa). - str_type = git_object_type2string(otype); - printf("object length and type: %d, %s\n", - (int)git_odb_object_size(obj), - str_type); - - // For proper memory management, close the object when you are done with it or it will leak - // memory. - git_odb_object_close(obj); - - // #### Raw Object Writing - - printf("\n*Raw Object Write*\n"); - - // You can also write raw object data to Git. This is pretty cool because it gives you - // direct access to the key/value properties of Git. Here we'll write a new blob object - // that just contains a simple string. Notice that we have to specify the object type as - // the `git_otype` enum. - git_odb_write(&oid, odb, "test data", sizeof("test data") - 1, GIT_OBJ_BLOB); - - // Now that we've written the object, we can check out what SHA1 was generated when the - // object was written to our database. - git_oid_fmt(out, &oid); - printf("Written Object: %s\n", out); - - // ### Object Parsing - // libgit2 has methods to parse every object type in Git so you don't have to work directly - // with the raw data. This is much faster and simpler than trying to deal with the raw data - // yourself. - - // #### Commit Parsing - // [Parsing commit objects][pco] is simple and gives you access to all the data in the commit - // - the // author (name, email, datetime), committer (same), tree, message, encoding and parent(s). - // [pco]: http://libgit2.github.com/libgit2/#HEAD/group/commit - - printf("\n*Commit Parsing*\n"); - - git_commit *commit; - git_oid_fromstr(&oid, "f0877d0b841d75172ec404fc9370173dfffc20d1"); - - error = git_commit_lookup(&commit, repo, &oid); - - const git_signature *author, *cmtter; - const char *message, *message_short; - time_t ctime; - unsigned int parents, p; - - // Each of the properties of the commit object are accessible via methods, including commonly - // needed variations, such as `git_commit_time` which returns the author time and `_message_short` - // which gives you just the first line of the commit message. - message = git_commit_message(commit); - message_short = git_commit_message_short(commit); - author = git_commit_author(commit); - cmtter = git_commit_committer(commit); - ctime = git_commit_time(commit); - - // The author and committer methods return [git_signature] structures, which give you name, email - // and `when`, which is a `git_time` structure, giving you a timestamp and timezone offset. - printf("Author: %s (%s)\n", author->name, author->email); - - // Commits can have zero or more parents. The first (root) commit will have no parents, most commits - // will have one, which is the commit it was based on, and merge commits will have two or more. - // Commits can technically have any number, though it's pretty rare to have more than two. - parents = git_commit_parentcount(commit); - for (p = 0;p < parents;p++) { - git_commit *parent; - git_commit_parent(&parent, commit, p); - git_oid_fmt(out, git_commit_id(parent)); - printf("Parent: %s\n", out); - git_commit_close(parent); - } - - // Don't forget to close the object to prevent memory leaks. You will have to do this for - // all the objects you open and parse. - git_commit_close(commit); - - // #### Writing Commits - // - // libgit2 provides a couple of methods to create commit objects easily as well. There are four - // different create signatures, we'll just show one of them here. You can read about the other - // ones in the [commit API docs][cd]. - // [cd]: http://libgit2.github.com/libgit2/#HEAD/group/commit - - printf("\n*Commit Writing*\n"); - git_oid tree_id, parent_id, commit_id; - git_tree *tree; - git_commit *parent; - - // Creating signatures for an authoring identity and time is pretty simple - you will need to have - // this to create a commit in order to specify who created it and when. Default values for the name - // and email should be found in the `user.name` and `user.email` configuration options. See the `config` - // section of this example file to see how to access config values. - author = git_signature_new("Scott Chacon", "schacon@gmail.com", - 123456789, 60); - cmtter = git_signature_new("Scott A Chacon", "scott@github.com", - 987654321, 90); - - // Commit objects need a tree to point to and optionally one or more parents. Here we're creating oid - // objects to create the commit with, but you can also use - git_oid_fromstr(&tree_id, "28873d96b4e8f4e33ea30f4c682fd325f7ba56ac"); - git_tree_lookup(&tree, repo, &tree_id); - git_oid_fromstr(&parent_id, "f0877d0b841d75172ec404fc9370173dfffc20d1"); - git_commit_lookup(&parent, repo, &parent_id); - - // Here we actually create the commit object with a single call with all the values we need to create - // the commit. The SHA key is written to the `commit_id` variable here. - git_commit_create_v( - &commit_id, /* out id */ - repo, - NULL, /* do not update the HEAD */ - author, - cmtter, - "example commit", - tree, - 1, parent); - - // Now we can take a look at the commit SHA we've generated. - git_oid_fmt(out, &commit_id); - printf("New Commit: %s\n", out); - - // #### Tag Parsing - // You can parse and create tags with the [tag management API][tm], which functions very similarly - // to the commit lookup, parsing and creation methods, since the objects themselves are very similar. - // [tm]: http://libgit2.github.com/libgit2/#HEAD/group/tag - printf("\n*Tag Parsing*\n"); - git_tag *tag; - const char *tmessage, *tname; - git_otype ttype; - - // We create an oid for the tag object if we know the SHA and look it up in the repository the same - // way that we would a commit (or any other) object. - git_oid_fromstr(&oid, "bc422d45275aca289c51d79830b45cecebff7c3a"); - - error = git_tag_lookup(&tag, repo, &oid); - - // Now that we have the tag object, we can extract the information it generally contains: the target - // (usually a commit object), the type of the target object (usually 'commit'), the name ('v1.0'), - // the tagger (a git_signature - name, email, timestamp), and the tag message. - git_tag_target((git_object **)&commit, tag); - tname = git_tag_name(tag); // "test" - ttype = git_tag_type(tag); // GIT_OBJ_COMMIT (otype enum) - tmessage = git_tag_message(tag); // "tag message\n" - printf("Tag Message: %s\n", tmessage); - - git_commit_close(commit); - - // #### Tree Parsing - // [Tree parsing][tp] is a bit different than the other objects, in that we have a subtype which is the - // tree entry. This is not an actual object type in Git, but a useful structure for parsing and - // traversing tree entries. - // - // [tp]: http://libgit2.github.com/libgit2/#HEAD/group/tree - printf("\n*Tree Parsing*\n"); - - const git_tree_entry *entry; - git_object *objt; - - // Create the oid and lookup the tree object just like the other objects. - git_oid_fromstr(&oid, "2a741c18ac5ff082a7caaec6e74db3075a1906b5"); - git_tree_lookup(&tree, repo, &oid); - - // Getting the count of entries in the tree so you can iterate over them if you want to. - int cnt = git_tree_entrycount(tree); // 3 - printf("tree entries: %d\n", cnt); - - entry = git_tree_entry_byindex(tree, 0); - printf("Entry name: %s\n", git_tree_entry_name(entry)); // "hello.c" - - // You can also access tree entries by name if you know the name of the entry you're looking for. - entry = git_tree_entry_byname(tree, "hello.c"); - git_tree_entry_name(entry); // "hello.c" - - // Once you have the entry object, you can access the content or subtree (or commit, in the case - // of submodules) that it points to. You can also get the mode if you want. - git_tree_entry_2object(&objt, repo, entry); // blob - - // Remember to close the looked-up object once you are done using it - git_object_close(objt); - - // #### Blob Parsing - // - // The last object type is the simplest and requires the least parsing help. Blobs are just file - // contents and can contain anything, there is no structure to it. The main advantage to using the - // [simple blob api][ba] is that when you're creating blobs you don't have to calculate the size - // of the content. There is also a helper for reading a file from disk and writing it to the db and - // getting the oid back so you don't have to do all those steps yourself. - // - // [ba]: http://libgit2.github.com/libgit2/#HEAD/group/blob - - printf("\n*Blob Parsing*\n"); - git_blob *blob; - - git_oid_fromstr(&oid, "af7574ea73f7b166f869ef1a39be126d9a186ae0"); - git_blob_lookup(&blob, repo, &oid); - - // You can access a buffer with the raw contents of the blob directly. - // Note that this buffer may not be contain ASCII data for certain blobs (e.g. binary files): - // do not consider the buffer a NULL-terminated string, and use the `git_blob_rawsize` attribute to - // find out its exact size in bytes - printf("Blob Size: %d\n", git_blob_rawsize(blob)); // 8 - git_blob_rawcontent(blob); // "content" - - // ### Revwalking - // - // The libgit2 [revision walking api][rw] provides methods to traverse the directed graph created - // by the parent pointers of the commit objects. Since all commits point back to the commit that - // came directly before them, you can walk this parentage as a graph and find all the commits that - // were ancestors of (reachable from) a given starting point. This can allow you to create `git log` - // type functionality. - // - // [rw]: http://libgit2.github.com/libgit2/#HEAD/group/revwalk - - printf("\n*Revwalking*\n"); - git_revwalk *walk; - git_commit *wcommit; - - git_oid_fromstr(&oid, "f0877d0b841d75172ec404fc9370173dfffc20d1"); - - // To use the revwalker, create a new walker, tell it how you want to sort the output and then push - // one or more starting points onto the walker. If you want to emulate the output of `git log` you - // would push the SHA of the commit that HEAD points to into the walker and then start traversing them. - // You can also 'hide' commits that you want to stop at or not see any of their ancestors. So if you - // want to emulate `git log branch1..branch2`, you would push the oid of `branch2` and hide the oid - // of `branch1`. - git_revwalk_new(&walk, repo); - git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE); - git_revwalk_push(walk, &oid); - - const git_signature *cauth; - const char *cmsg; - - // Now that we have the starting point pushed onto the walker, we can start asking for ancestors. It - // will return them in the sorting order we asked for as commit oids. - // We can then lookup and parse the commited pointed at by the returned OID; - // note that this operation is specially fast since the raw contents of the commit object will - // be cached in memory - while ((git_revwalk_next(&oid, walk)) == GIT_SUCCESS) { - error = git_commit_lookup(&wcommit, repo, &oid); - cmsg = git_commit_message_short(wcommit); - cauth = git_commit_author(wcommit); - printf("%s (%s)\n", cmsg, cauth->email); - git_commit_close(wcommit); - } - - // Like the other objects, be sure to free the revwalker when you're done to prevent memory leaks. - // Also, make sure that the repository being walked it not deallocated while the walk is in - // progress, or it will result in undefined behavior - git_revwalk_free(walk); - - // ### Index File Manipulation - // - // The [index file API][gi] allows you to read, traverse, update and write the Git index file - // (sometimes thought of as the staging area). - // - // [gi]: http://libgit2.github.com/libgit2/#HEAD/group/index - - printf("\n*Index Walking*\n"); - - git_index *index; - unsigned int i, ecount; - - // You can either open the index from the standard location in an open repository, as we're doing - // here, or you can open and manipulate any index file with `git_index_open_bare()`. The index - // for the repository will be located and loaded from disk. - git_repository_index(&index, repo); - - // For each entry in the index, you can get a bunch of information including the SHA (oid), path - // and mode which map to the tree objects that are written out. It also has filesystem properties - // to help determine what to inspect for changes (ctime, mtime, dev, ino, uid, gid, file_size and flags) - // All these properties are exported publicly in the `git_index_entry` struct - ecount = git_index_entrycount(index); - for (i = 0; i < ecount; ++i) { - git_index_entry *e = git_index_get(index, i); - - printf("path: %s\n", e->path); - printf("mtime: %d\n", (int)e->mtime.seconds); - printf("fs: %d\n", (int)e->file_size); - } - - git_index_free(index); - - // ### References - // - // The [reference API][ref] allows you to list, resolve, create and update references such as - // branches, tags and remote references (everything in the .git/refs directory). - // - // [ref]: http://libgit2.github.com/libgit2/#HEAD/group/reference - - printf("\n*Reference Listing*\n"); - - // Here we will implement something like `git for-each-ref` simply listing out all available - // references and the object SHA they resolve to. - git_strarray ref_list; - git_reference_listall(&ref_list, repo, GIT_REF_LISTALL); - - const char *refname; - git_reference *ref; - - // Now that we have the list of reference names, we can lookup each ref one at a time and - // resolve them to the SHA, then print both values out. - for (i = 0; i < ref_list.count; ++i) { - refname = ref_list.strings[i]; - git_reference_lookup(&ref, repo, refname); - - switch (git_reference_type(ref)) { - case GIT_REF_OID: - git_oid_fmt(out, git_reference_oid(ref)); - printf("%s [%s]\n", refname, out); - break; - - case GIT_REF_SYMBOLIC: - printf("%s => %s\n", refname, git_reference_target(ref)); - break; - default: - fprintf(stderr, "Unexpected reference type\n"); - exit(1); - } - } - - git_strarray_free(&ref_list); - - // ### Config Files - // - // The [config API][config] allows you to list and updatee config values in - // any of the accessible config file locations (system, global, local). - // - // [config]: http://libgit2.github.com/libgit2/#HEAD/group/config - - printf("\n*Config Listing*\n"); - - const char *email; - int j; - - git_config *cfg; - - // Open a config object so we can read global values from it. - git_config_open_ondisk(&cfg, "~/.gitconfig"); - - git_config_get_int(cfg, "help.autocorrect", &j); - printf("Autocorrect: %d\n", j); - - git_config_get_string(cfg, "user.email", &email); - printf("Email: %s\n", email); - - // Finally, when you're done with the repository, you can free it as well. - git_repository_free(repo); - - return 0; -} - diff --git a/vendor/libgit2/examples/showindex.c b/vendor/libgit2/examples/showindex.c deleted file mode 100644 index 7f2130b90..000000000 --- a/vendor/libgit2/examples/showindex.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -int main (int argc, char** argv) -{ - git_repository *repo; - git_index *index; - unsigned int i, e, ecount; - git_index_entry **entries; - git_oid oid; - - char out[41]; - out[40] = '\0'; - - git_repository_open(&repo, "/opt/libgit2-test/.git"); - - git_repository_index(&index, repo); - git_index_read(index); - - ecount = git_index_entrycount(index); - for (i = 0; i < ecount; ++i) { - git_index_entry *e = git_index_get(index, i); - - oid = e->oid; - git_oid_fmt(out, &oid); - - printf("File Path: %s\n", e->path); - printf(" Blob SHA: %s\n", out); - printf("File Size: %d\n", (int)e->file_size); - printf(" Device: %d\n", (int)e->dev); - printf(" Inode: %d\n", (int)e->ino); - printf(" UID: %d\n", (int)e->uid); - printf(" GID: %d\n", (int)e->gid); - printf(" ctime: %d\n", (int)e->ctime.seconds); - printf(" mtime: %d\n", (int)e->mtime.seconds); - printf("\n"); - } - - git_index_free(index); - - git_repository_free(repo); -} - diff --git a/vendor/libgit2/git.git-authors b/vendor/libgit2/git.git-authors deleted file mode 100644 index 086ab3e18..000000000 --- a/vendor/libgit2/git.git-authors +++ /dev/null @@ -1,66 +0,0 @@ -# This document lists the authors that have given voice to -# their decision regarding relicensing the GPL'd code from -# git.git to the GPL + gcc-exception license used by libgit2. -# -# Note that the permission is given for libgit2 use only. For -# other uses, you must ask each of the contributors yourself. -# -# To show the owners of a file in git.git, one can run the -# following command: -# -# git blame -C -C -M -- file | \ -# sed -e 's/[^(]*(\([^0-9]*\).*/\1/' -e 's/[\t ]*$//' | \ -# sort | uniq -c | sort -nr -# -# If everyone on the list that produces are on the list in -# the recently added file "git.git-authors", it *should* be -# safe to include that code in libgit2, but make sure to -# read the file to ensure the code doesn't originate from -# somewhere else. -# -# The format of this list is -# "ok/no/ask/???""Author""" -# -# "ok" means the author consents to relicensing all their -# contributed code (possibly with some exceptions) -# "no" means the author does not consent -# "ask" means that the contributor wants to give/withhold -# his/her consent on a patch-by-patch basis. -# "???" means the person is a prominent contributor who has -# not yet made his/her standpoint clear. -# "ign" means the authors consent is ignored for the purpose -# of libification. This is because the author has contributed -# to areas that aren't interesting for the library. -# -# Please try to keep the list alphabetically ordered. It will -# help in case we get all 600-ish git.git authors on it. -# -# (Paul Kocher is the author of the mozilla-sha1 implementation -# but has otherwise not contributed to git.) -# -ok Adam Simpkins (http transport) -ok Andreas Ericsson -ok Boyd Lynn Gerber -ok Brian Gernhardt -ok Christian Couder -ok Daniel Barkalow -ok Jeff King -ok Johannes Schindelin -ok Johannes Sixt -ok Junio C Hamano -ok Kristian Høgsberg -ok Linus Torvalds -ok Lukas Sandström -ok Matthieu Moy -ign Mike McCormack (imap-send) -ok Nicolas Pitre -ok Paolo Bonzini -ok Paul Kocher -ok Peter Hagervall -ok Pierre Habouzit -ok Pieter de Bie -ok René Scharfe -ign Robert Shearman (imap-send) -ok Shawn O. Pearce -ok Steffen Prohaska -ok Sven Verdoolaege diff --git a/vendor/libgit2/include/git2.h b/vendor/libgit2/include/git2.h deleted file mode 100644 index 96de524e7..000000000 --- a/vendor/libgit2/include/git2.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDE_git_git_h__ -#define INCLUDE_git_git_h__ - -#define LIBGIT2_VERSION "0.14.0" -#define LIBGIT2_VER_MAJOR 0 -#define LIBGIT2_VER_MINOR 14 -#define LIBGIT2_VER_REVISION 0 - -#include "git2/common.h" -#include "git2/errors.h" -#include "git2/zlib.h" - -#include "git2/types.h" - -#include "git2/oid.h" -#include "git2/signature.h" -#include "git2/odb.h" - -#include "git2/repository.h" -#include "git2/revwalk.h" -#include "git2/refs.h" -#include "git2/reflog.h" - -#include "git2/object.h" -#include "git2/blob.h" -#include "git2/commit.h" -#include "git2/tag.h" -#include "git2/tree.h" - -#include "git2/index.h" -#include "git2/config.h" -#include "git2/remote.h" - -#include "git2/refspec.h" -#include "git2/net.h" -#include "git2/transport.h" -#include "git2/status.h" -#include "git2/indexer.h" - -#endif diff --git a/vendor/libgit2/include/git2/blob.h b/vendor/libgit2/include/git2/blob.h deleted file mode 100644 index e366ce880..000000000 --- a/vendor/libgit2/include/git2/blob.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_blob_h__ -#define INCLUDE_git_blob_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/blob.h - * @brief Git blob load and write routines - * @defgroup git_blob Git blob load and write routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a blob object from a repository. - * - * @param blob pointer to the looked up blob - * @param repo the repo to use when locating the blob. - * @param id identity of the blob to locate. - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_blob_lookup(git_blob **blob, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)blob, repo, id, GIT_OBJ_BLOB); -} - -/** - * Lookup a blob object from a repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param blob pointer to the looked up blob - * @param repo the repo to use when locating the blob. - * @param id identity of the blob to locate. - * @param len the length of the short identifier - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_blob_lookup_prefix(git_blob **blob, git_repository *repo, const git_oid *id, unsigned int len) -{ - return git_object_lookup_prefix((git_object **)blob, repo, id, len, GIT_OBJ_BLOB); -} - -/** - * Close an open blob - * - * This is a wrapper around git_object_close() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a blob. Failure to do so will cause a memory leak. - * - * @param blob the blob to close - */ - -GIT_INLINE(void) git_blob_close(git_blob *blob) -{ - git_object_close((git_object *) blob); -} - - -/** - * Get a read-only buffer with the raw content of a blob. - * - * A pointer to the raw content of a blob is returned; - * this pointer is owned internally by the object and shall - * not be free'd. The pointer may be invalidated at a later - * time. - * - * @param blob pointer to the blob - * @return the pointer; NULL if the blob has no contents - */ -GIT_EXTERN(const void *) git_blob_rawcontent(git_blob *blob); - -/** - * Get the size in bytes of the contents of a blob - * - * @param blob pointer to the blob - * @return size on bytes - */ -GIT_EXTERN(int) git_blob_rawsize(git_blob *blob); - -/** - * Read a file from the working folder of a repository - * and write it to the Object Database as a loose blob - * - * @param oid return the id of the written blob - * @param repo repository where the blob will be written. - * this repository cannot be bare - * @param path file from which the blob will be created, - * relative to the repository's working dir - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_blob_create_fromfile(git_oid *oid, git_repository *repo, const char *path); - - -/** - * Write an in-memory buffer to the ODB as a blob - * - * @param oid return the oid of the written blob - * @param repo repository where to blob will be written - * @param buffer data to be written into the blob - * @param len length of the data - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_blob_create_frombuffer(git_oid *oid, git_repository *repo, const void *buffer, size_t len); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/branch.h b/vendor/libgit2/include/git2/branch.h deleted file mode 100644 index 456b7d1ac..000000000 --- a/vendor/libgit2/include/git2/branch.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef INCLUDE_branch_h__ -#define INCLUDE_branch_h__ - -struct git_branch { - char *remote; /* TODO: Make this a git_remote */ - char *merge; -}; - -#endif diff --git a/vendor/libgit2/include/git2/commit.h b/vendor/libgit2/include/git2/commit.h deleted file mode 100644 index 12646cf58..000000000 --- a/vendor/libgit2/include/git2/commit.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_commit_h__ -#define INCLUDE_git_commit_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/commit.h - * @brief Git commit parsing, formatting routines - * @defgroup git_commit Git commit parsing, formatting routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a commit object from a repository. - * - * @param commit pointer to the looked up commit - * @param repo the repo to use when locating the commit. - * @param id identity of the commit to locate. If the object is - * an annotated tag it will be peeled back to the commit. - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_commit_lookup(git_commit **commit, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)commit, repo, id, GIT_OBJ_COMMIT); -} - -/** - * Lookup a commit object from a repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param commit pointer to the looked up commit - * @param repo the repo to use when locating the commit. - * @param id identity of the commit to locate. If the object is - * an annotated tag it will be peeled back to the commit. - * @param len the length of the short identifier - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_commit_lookup_prefix(git_commit **commit, git_repository *repo, const git_oid *id, unsigned len) -{ - return git_object_lookup_prefix((git_object **)commit, repo, id, len, GIT_OBJ_COMMIT); -} - -/** - * Close an open commit - * - * This is a wrapper around git_object_close() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a commit. Failure to do so will cause a memory leak. - * - * @param commit the commit to close - */ - -GIT_INLINE(void) git_commit_close(git_commit *commit) -{ - git_object_close((git_object *) commit); -} - -/** - * Get the id of a commit. - * - * @param commit a previously loaded commit. - * @return object identity for the commit. - */ -GIT_EXTERN(const git_oid *) git_commit_id(git_commit *commit); - -/** - * Get the encoding for the message of a commit, - * as a string representing a standard encoding name. - * - * The encoding may be NULL if the `encoding` header - * in the commit is missing; in that case UTF-8 is assumed. - * - * @param commit a previously loaded commit. - * @return NULL, or the encoding - */ -GIT_EXTERN(const char *) git_commit_message_encoding(git_commit *commit); - -/** - * Get the full message of a commit. - * - * @param commit a previously loaded commit. - * @return the message of a commit - */ -GIT_EXTERN(const char *) git_commit_message(git_commit *commit); - -/** - * Get the commit time (i.e. committer time) of a commit. - * - * @param commit a previously loaded commit. - * @return the time of a commit - */ -GIT_EXTERN(git_time_t) git_commit_time(git_commit *commit); - -/** - * Get the commit timezone offset (i.e. committer's preferred timezone) of a commit. - * - * @param commit a previously loaded commit. - * @return positive or negative timezone offset, in minutes from UTC - */ -GIT_EXTERN(int) git_commit_time_offset(git_commit *commit); - -/** - * Get the committer of a commit. - * - * @param commit a previously loaded commit. - * @return the committer of a commit - */ -GIT_EXTERN(const git_signature *) git_commit_committer(git_commit *commit); - -/** - * Get the author of a commit. - * - * @param commit a previously loaded commit. - * @return the author of a commit - */ -GIT_EXTERN(const git_signature *) git_commit_author(git_commit *commit); - -/** - * Get the tree pointed to by a commit. - * - * @param tree_out pointer where to store the tree object - * @param commit a previously loaded commit. - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_commit_tree(git_tree **tree_out, git_commit *commit); - -/** - * Get the id of the tree pointed to by a commit. This differs from - * `git_commit_tree` in that no attempts are made to fetch an object - * from the ODB. - * - * @param commit a previously loaded commit. - * @return the id of tree pointed to by commit. - */ -GIT_EXTERN(const git_oid *) git_commit_tree_oid(git_commit *commit); - -/** - * Get the number of parents of this commit - * - * @param commit a previously loaded commit. - * @return integer of count of parents - */ -GIT_EXTERN(unsigned int) git_commit_parentcount(git_commit *commit); - -/** - * Get the specified parent of the commit. - * - * @param parent Pointer where to store the parent commit - * @param commit a previously loaded commit. - * @param n the position of the parent (from 0 to `parentcount`) - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_commit_parent(git_commit **parent, git_commit *commit, unsigned int n); - -/** - * Get the oid of a specified parent for a commit. This is different from - * `git_commit_parent`, which will attempt to load the parent commit from - * the ODB. - * - * @param commit a previously loaded commit. - * @param n the position of the parent (from 0 to `parentcount`) - * @return the id of the parent, NULL on error. - */ -GIT_EXTERN(const git_oid *) git_commit_parent_oid(git_commit *commit, unsigned int n); - -/** - * Create a new commit in the repository using `git_object` - * instances as parameters. - * - * @param oid Pointer where to store the OID of the - * newly created commit - * - * @param repo Repository where to store the commit - * - * @param update_ref If not NULL, name of the reference that - * will be updated to point to this commit. If the reference - * is not direct, it will be resolved to a direct reference. - * Use "HEAD" to update the HEAD of the current branch and - * make it point to this commit - * - * @param author Signature representing the author and the authory - * time of this commit - * - * @param committer Signature representing the committer and the - * commit time of this commit - * - * @param message_encoding The encoding for the message in the - * commit, represented with a standard encoding name. - * E.g. "UTF-8". If NULL, no encoding header is written and - * UTF-8 is assumed. - * - * @param message Full message for this commit - * - * @param tree An instance of a `git_tree` object that will - * be used as the tree for the commit. This tree object must - * also be owned by the given `repo`. - * - * @param parent_count Number of parents for this commit - * - * @param parents[] Array of `parent_count` pointers to `git_commit` - * objects that will be used as the parents for this commit. This - * array may be NULL if `parent_count` is 0 (root commit). All the - * given commits must be owned by the `repo`. - * - * @return 0 on success; error code otherwise - * The created commit will be written to the Object Database and - * the given reference will be updated to point to it - */ -GIT_EXTERN(int) git_commit_create( - git_oid *oid, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - const git_commit *parents[]); - -/** - * Create a new commit in the repository using a variable - * argument list. - * - * The parents for the commit are specified as a variable - * list of pointers to `const git_commit *`. Note that this - * is a convenience method which may not be safe to export - * for certain languages or compilers - * - * All other parameters remain the same - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_create_v( - git_oid *oid, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - ...); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/common.h b/vendor/libgit2/include/git2/common.h deleted file mode 100644 index 58cb1f200..000000000 --- a/vendor/libgit2/include/git2/common.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_common_h__ -#define INCLUDE_git_common_h__ - -#include "thread-utils.h" -#include -#include - -#ifdef __cplusplus -# define GIT_BEGIN_DECL extern "C" { -# define GIT_END_DECL } -#else - /** Start declarations in C mode */ -# define GIT_BEGIN_DECL /* empty */ - /** End declarations in C mode */ -# define GIT_END_DECL /* empty */ -#endif - -/** Declare a public function exported for application use. */ -#ifdef __GNUC__ -# define GIT_EXTERN(type) extern \ - __attribute__((visibility("default"))) \ - type -#elif defined(_MSC_VER) -# define GIT_EXTERN(type) __declspec(dllexport) type -#else -# define GIT_EXTERN(type) extern type -#endif - -/** Declare a public TLS symbol exported for application use. */ -#ifdef __GNUC__ -# define GIT_EXTERN_TLS(type) extern \ - __attribute__((visibility("default"))) \ - GIT_TLS \ - type -#elif defined(_MSC_VER) -# define GIT_EXTERN_TLS(type) __declspec(dllexport) GIT_TLS type -#else -# define GIT_EXTERN_TLS(type) extern GIT_TLS type -#endif - -/** Declare a function as always inlined. */ -#if defined(_MSC_VER) -# define GIT_INLINE(type) static __inline type -#else -# define GIT_INLINE(type) static inline type -#endif - -/** Declare a function's takes printf style arguments. */ -#ifdef __GNUC__ -# define GIT_FORMAT_PRINTF(a,b) __attribute__((format (printf, a, b))) -#else -# define GIT_FORMAT_PRINTF(a,b) /* empty */ -#endif - -#if defined(_WIN32) && !defined(__CYGWIN__) -#define GIT_WIN32 1 -#endif - -/** - * @file git2/common.h - * @brief Git common platform definitions - * @defgroup git_common Git common platform definitions - * @ingroup Git - * @{ - */ - -GIT_BEGIN_DECL - -/** - * The separator used in path list strings (ie like in the PATH - * environment variable). A semi-colon ";" is used on Windows, and - * a colon ":" for all other systems. - */ -#ifdef GIT_WIN32 -#define GIT_PATH_LIST_SEPARATOR ';' -#else -#define GIT_PATH_LIST_SEPARATOR ':' -#endif - -/** - * The maximum length of a git valid git path. - */ -#define GIT_PATH_MAX 4096 - -typedef struct { - char **strings; - size_t count; -} git_strarray; - -GIT_EXTERN(void) git_strarray_free(git_strarray *array); - -/** - * Return the version of the libgit2 library - * being currently used. - * - * @param major Store the major version number - * @param minor Store the minor version number - * @param rev Store the revision (patch) number - */ -GIT_EXTERN(void) git_libgit2_version(int *major, int *minor, int *rev); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/config.h b/vendor/libgit2/include/git2/config.h deleted file mode 100644 index e05d23694..000000000 --- a/vendor/libgit2/include/git2/config.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_config_h__ -#define INCLUDE_git_config_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/config.h - * @brief Git config management routines - * @defgroup git_config Git config management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Generic backend that implements the interface to - * access a configuration file - */ -struct git_config_file { - struct git_config *cfg; - - /* Open means open the file/database and parse if necessary */ - int (*open)(struct git_config_file *); - int (*get)(struct git_config_file *, const char *key, const char **value); - int (*set)(struct git_config_file *, const char *key, const char *value); - int (*foreach)(struct git_config_file *, int (*fn)(const char *, const char *, void *), void *data); - void (*free)(struct git_config_file *); -}; - -/** - * Locate the path to the global configuration file - * - * The user or global configuration file is usually - * located in `$HOME/.gitconfig`. - * - * This method will try to guess the full path to that - * file, if the file exists. The returned path - * may be used on any `git_config` call to load the - * global configuration file. - * - * @param global_config_path Buffer of GIT_PATH_MAX length to store the path - * @return GIT_SUCCESS if a global configuration file has been - * found. Its path will be stored in `buffer`. - */ -GIT_EXTERN(int) git_config_find_global(char *global_config_path); - -/** - * Open the global configuration file - * - * Utility wrapper that calls `git_config_find_global` - * and opens the located file, if it exists. - * - * @param out Pointer to store the config instance - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_open_global(git_config **out); - -/** - * Create a configuration file backend for ondisk files - * - * These are the normal `.gitconfig` files that Core Git - * processes. Note that you first have to add this file to a - * configuration object before you can query it for configuration - * variables. - * - * @param out the new backend - * @param path where the config file is located - */ -GIT_EXTERN(int) git_config_file__ondisk(struct git_config_file **out, const char *path); - -/** - * Allocate a new configuration object - * - * This object is empty, so you have to add a file to it before you - * can do anything with it. - * - * @param out pointer to the new configuration - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_new(git_config **out); - -/** - * Add a generic config file instance to an existing config - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority will be accessed first). - * - * @param cfg the configuration to add the file to - * @param file the configuration file (backend) to add - * @param priority the priority the backend should have - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_add_file(git_config *cfg, git_config_file *file, int priority); - -/** - * Add an on-disk config file instance to an existing config - * - * The on-disk file pointed at by `path` will be opened and - * parsed; it's expected to be a native Git config file following - * the default Git config syntax (see man git-config). - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority will be accessed first). - * - * @param cfg the configuration to add the file to - * @param path path to the configuration file (backend) to add - * @param priority the priority the backend should have - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_add_file_ondisk(git_config *cfg, const char *path, int priority); - - -/** - * Create a new config instance containing a single on-disk file - * - * This method is a simple utility wrapper for the following sequence - * of calls: - * - git_config_new - * - git_config_add_file_ondisk - * - * @param cfg The configuration instance to create - * @param path Path to the on-disk file to open - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_open_ondisk(git_config **cfg, const char *path); - -/** - * Free the configuration and its associated memory and files - * - * @param cfg the configuration to free - */ -GIT_EXTERN(void) git_config_free(git_config *cfg); - -/** - * Get the value of an integer config variable. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param out pointer to the variable where the value should be stored - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_get_int(git_config *cfg, const char *name, int *out); - -/** - * Get the value of a long integer config variable. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param out pointer to the variable where the value should be stored - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_get_long(git_config *cfg, const char *name, long int *out); - -/** - * Get the value of a boolean config variable. - * - * This function uses the usual C convention of 0 being false and - * anything else true. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param out pointer to the variable where the value should be stored - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_get_bool(git_config *cfg, const char *name, int *out); - -/** - * Get the value of a string config variable. - * - * The string is owned by the variable and should not be freed by the - * user. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param out pointer to the variable's value - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_get_string(git_config *cfg, const char *name, const char **out); - -/** - * Set the value of an integer config variable. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Integer value for the variable - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_set_int(git_config *cfg, const char *name, int value); - -/** - * Set the value of a long integer config variable. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Long integer value for the variable - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_set_long(git_config *cfg, const char *name, long int value); - -/** - * Set the value of a boolean config variable. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the value to store - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value); - -/** - * Set the value of a string config variable. - * - * A copy of the string is made and the user is free to use it - * afterwards. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the string to store. - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value); - -/** - * Delete a config variable - * - * @param cfg the configuration - * @param name the variable to delete - */ -GIT_EXTERN(int) git_config_delete(git_config *cfg, const char *name); - -/** - * Perform an operation on each config variable. - * - * The callback receives the normalized name and value of each variable - * in the config backend, and the data pointer passed to this function. - * As soon as one of the callback functions returns something other than 0, - * this function returns that value. - * - * @param cfg where to get the variables from - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - * @return GIT_SUCCESS or the return value of the callback which didn't return 0 - */ -GIT_EXTERN(int) git_config_foreach( - git_config *cfg, - int (*callback)(const char *var_name, const char *value, void *payload), - void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/errors.h b/vendor/libgit2/include/git2/errors.h deleted file mode 100644 index 710ac244b..000000000 --- a/vendor/libgit2/include/git2/errors.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_errors_h__ -#define INCLUDE_git_errors_h__ - -#include "common.h" - -/** - * @file git2/errors.h - * @brief Git error handling routines and variables - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -typedef enum { - GIT_SUCCESS = 0, - GIT_ERROR = -1, - - /** Input was not a properly formatted Git object id. */ - GIT_ENOTOID = -2, - - /** Input does not exist in the scope searched. */ - GIT_ENOTFOUND = -3, - - /** Not enough space available. */ - GIT_ENOMEM = -4, - - /** Consult the OS error information. */ - GIT_EOSERR = -5, - - /** The specified object is of invalid type */ - GIT_EOBJTYPE = -6, - - /** The specified repository is invalid */ - GIT_ENOTAREPO = -7, - - /** The object type is invalid or doesn't match */ - GIT_EINVALIDTYPE = -8, - - /** The object cannot be written because it's missing internal data */ - GIT_EMISSINGOBJDATA = -9, - - /** The packfile for the ODB is corrupted */ - GIT_EPACKCORRUPTED = -10, - - /** Failed to acquire or release a file lock */ - GIT_EFLOCKFAIL = -11, - - /** The Z library failed to inflate/deflate an object's data */ - GIT_EZLIB = -12, - - /** The queried object is currently busy */ - GIT_EBUSY = -13, - - /** The index file is not backed up by an existing repository */ - GIT_EBAREINDEX = -14, - - /** The name of the reference is not valid */ - GIT_EINVALIDREFNAME = -15, - - /** The specified reference has its data corrupted */ - GIT_EREFCORRUPTED = -16, - - /** The specified symbolic reference is too deeply nested */ - GIT_ETOONESTEDSYMREF = -17, - - /** The pack-refs file is either corrupted or its format is not currently supported */ - GIT_EPACKEDREFSCORRUPTED = -18, - - /** The path is invalid */ - GIT_EINVALIDPATH = -19, - - /** The revision walker is empty; there are no more commits left to iterate */ - GIT_EREVWALKOVER = -20, - - /** The state of the reference is not valid */ - GIT_EINVALIDREFSTATE = -21, - - /** This feature has not been implemented yet */ - GIT_ENOTIMPLEMENTED = -22, - - /** A reference with this name already exists */ - GIT_EEXISTS = -23, - - /** The given integer literal is too large to be parsed */ - GIT_EOVERFLOW = -24, - - /** The given literal is not a valid number */ - GIT_ENOTNUM = -25, - - /** Streaming error */ - GIT_ESTREAM = -26, - - /** invalid arguments to function */ - GIT_EINVALIDARGS = -27, - - /** The specified object has its data corrupted */ - GIT_EOBJCORRUPTED = -28, - - /** The given short oid is ambiguous */ - GIT_EAMBIGUOUSOIDPREFIX = -29, - - /** Skip and passthrough the given ODB backend */ - GIT_EPASSTHROUGH = -30, - - /** The path pattern and string did not match */ - GIT_ENOMATCH = -31, - - /** The buffer is too short to satisfy the request */ - GIT_ESHORTBUFFER = -32, -} git_error; - -/** - * Return a detailed error string with the latest error - * that occurred in the library. - * @return a string explaining the error - */ -GIT_EXTERN(const char *) git_lasterror(void); - -/** - * strerror() for the Git library - * - * Get a string description for a given error code. - * NOTE: This method will be eventually deprecated in favor - * of the new `git_lasterror`. - * - * @param num The error code to explain - * @return a string explaining the error code - */ -GIT_EXTERN(const char *) git_strerror(int num); - -/** - * Clear the latest library error - */ -GIT_EXTERN(void) git_clearerror(void); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/index.h b/vendor/libgit2/include/git2/index.h deleted file mode 100644 index 18ab9b858..000000000 --- a/vendor/libgit2/include/git2/index.h +++ /dev/null @@ -1,324 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_index_h__ -#define INCLUDE_git_index_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/index.h - * @brief Git index parsing and manipulation routines - * @defgroup git_index Git index parsing and manipulation routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_IDXENTRY_NAMEMASK (0x0fff) -#define GIT_IDXENTRY_STAGEMASK (0x3000) -#define GIT_IDXENTRY_EXTENDED (0x4000) -#define GIT_IDXENTRY_VALID (0x8000) -#define GIT_IDXENTRY_STAGESHIFT 12 - -/* - * Flags are divided into two parts: in-memory flags and - * on-disk ones. Flags in GIT_IDXENTRY_EXTENDED_FLAGS - * will get saved on-disk. - * - * In-memory only flags: - */ -#define GIT_IDXENTRY_UPDATE (1 << 0) -#define GIT_IDXENTRY_REMOVE (1 << 1) -#define GIT_IDXENTRY_UPTODATE (1 << 2) -#define GIT_IDXENTRY_ADDED (1 << 3) - -#define GIT_IDXENTRY_HASHED (1 << 4) -#define GIT_IDXENTRY_UNHASHED (1 << 5) -#define GIT_IDXENTRY_WT_REMOVE (1 << 6) /* remove in work directory */ -#define GIT_IDXENTRY_CONFLICTED (1 << 7) - -#define GIT_IDXENTRY_UNPACKED (1 << 8) -#define GIT_IDXENTRY_NEW_SKIP_WORKTREE (1 << 9) - -/* - * Extended on-disk flags: - */ -#define GIT_IDXENTRY_INTENT_TO_ADD (1 << 13) -#define GIT_IDXENTRY_SKIP_WORKTREE (1 << 14) -/* GIT_IDXENTRY_EXTENDED2 is for future extension */ -#define GIT_IDXENTRY_EXTENDED2 (1 << 15) - -#define GIT_IDXENTRY_EXTENDED_FLAGS (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE) - -/** Time used in a git index entry */ -typedef struct { - git_time_t seconds; - /* nsec should not be stored as time_t compatible */ - unsigned int nanoseconds; -} git_index_time; - -/** Memory representation of a file entry in the index. */ -typedef struct git_index_entry { - git_index_time ctime; - git_index_time mtime; - - unsigned int dev; - unsigned int ino; - unsigned int mode; - unsigned int uid; - unsigned int gid; - git_off_t file_size; - - git_oid oid; - - unsigned short flags; - unsigned short flags_extended; - - char *path; -} git_index_entry; - -/** Representation of an unmerged file entry in the index. */ -typedef struct git_index_entry_unmerged { - unsigned int mode[3]; - git_oid oid[3]; - char *path; -} git_index_entry_unmerged; - -/** - * Create a new bare Git index object as a memory representation - * of the Git index file in 'index_path', without a repository - * to back it. - * - * Since there is no ODB or working directory behind this index, - * any Index methods which rely on these (e.g. index_add) will - * fail with the GIT_EBAREINDEX error code. - * - * If you need to access the index of an actual repository, - * use the `git_repository_index` wrapper. - * - * The index must be freed once it's no longer in use. - * - * @param index the pointer for the new index - * @param index_path the path to the index file in disk - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_index_open(git_index **index, const char *index_path); - -/** - * Clear the contents (all the entries) of an index object. - * This clears the index object in memory; changes must be manually - * written to disk for them to take effect. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_clear(git_index *index); - -/** - * Free an existing index object. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_free(git_index *index); - -/** - * Update the contents of an existing index object in memory - * by reading from the hard disk. - * - * @param index an existing index object - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_read(git_index *index); - -/** - * Write an existing index object from memory back to disk - * using an atomic file lock. - * - * @param index an existing index object - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_write(git_index *index); - -/** - * Find the first index of any entries which point to given - * path in the Git index. - * - * @param index an existing index object - * @param path path to search - * @return an index >= 0 if found, -1 otherwise - */ -GIT_EXTERN(int) git_index_find(git_index *index, const char *path); - -/** - * Remove all entries with equal path except last added - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_uniq(git_index *index); - -/** - * Add or update an index entry from a file in disk - * - * The file `path` must be relative to the repository's - * working folder and must be readable. - * - * This method will fail in bare index instances. - * - * @param index an existing index object - * @param path filename to add - * @param stage stage for the entry - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_add(git_index *index, const char *path, int stage); - -/** - * Add or update an index entry from an in-memory struct - * - * A full copy (including the 'path' string) of the given - * 'source_entry' will be inserted on the index. - * - * @param index an existing index object - * @param source_entry new entry object - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_add2(git_index *index, const git_index_entry *source_entry); - -/** - * Add (append) an index entry from a file in disk - * - * A new entry will always be inserted into the index; - * if the index already contains an entry for such - * path, the old entry will **not** be replaced. - * - * The file `path` must be relative to the repository's - * working folder and must be readable. - * - * This method will fail in bare index instances. - * - * @param index an existing index object - * @param path filename to add - * @param stage stage for the entry - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_append(git_index *index, const char *path, int stage); - -/** - * Add (append) an index entry from an in-memory struct - * - * A new entry will always be inserted into the index; - * if the index already contains an entry for the path - * in the `entry` struct, the old entry will **not** be - * replaced. - * - * A full copy (including the 'path' string) of the given - * 'source_entry' will be inserted on the index. - * - * @param index an existing index object - * @param source_entry new entry object - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_append2(git_index *index, const git_index_entry *source_entry); - -/** - * Remove an entry from the index - * - * @param index an existing index object - * @param position position of the entry to remove - * @return 0 on success, otherwise an error code - */ -GIT_EXTERN(int) git_index_remove(git_index *index, int position); - - -/** - * Get a pointer to one of the entries in the index - * - * This entry can be modified, and the changes will be written - * back to disk on the next write() call. - * - * The entry should not be freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the entry; NULL if out of bounds - */ -GIT_EXTERN(git_index_entry *) git_index_get(git_index *index, unsigned int n); - -/** - * Get the count of entries currently in the index - * - * @param index an existing index object - * @return integer of count of current entries - */ -GIT_EXTERN(unsigned int) git_index_entrycount(git_index *index); - -/** - * Get the count of unmerged entries currently in the index - * - * @param index an existing index object - * @return integer of count of current unmerged entries - */ -GIT_EXTERN(unsigned int) git_index_entrycount_unmerged(git_index *index); - -/** - * Get an unmerged entry from the index. - * - * The returned entry is read-only and should not be modified - * of freed by the caller. - * - * @param index an existing index object - * @param path path to search - * @return the unmerged entry; NULL if not found - */ -GIT_EXTERN(const git_index_entry_unmerged *) git_index_get_unmerged_bypath(git_index *index, const char *path); - -/** - * Get an unmerged entry from the index. - * - * The returned entry is read-only and should not be modified - * of freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the unmerged entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_entry_unmerged *) git_index_get_unmerged_byindex(git_index *index, unsigned int n); - -/** - * Return the stage number from a git index entry - * - * This entry is calculated from the entrie's flag - * attribute like this: - * - * (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT - * - * @param entry The entry - * @returns the stage number - */ -GIT_EXTERN(int) git_index_entry_stage(const git_index_entry *entry); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/indexer.h b/vendor/libgit2/include/git2/indexer.h deleted file mode 100644 index 2852d7e6f..000000000 --- a/vendor/libgit2/include/git2/indexer.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _INCLUDE_git_indexer_h__ -#define _INCLUDE_git_indexer_h__ - -#include "git2/common.h" -#include "git2/oid.h" - -GIT_BEGIN_DECL - -/** - * This is passed as the first argument to the callback to allow the - * user to see the progress. - */ -typedef struct git_indexer_stats { - unsigned int total; - unsigned int processed; -} git_indexer_stats; - - -typedef struct git_indexer git_indexer; - -/** - * Create a new indexer instance - * - * @param out where to store the indexer instance - * @param packname the absolute filename of the packfile to index - */ -GIT_EXTERN(int) git_indexer_new(git_indexer **out, const char *packname); - -/** - * Iterate over the objects in the packfile and extract the information - * - * Indexing a packfile can be very expensive so this function is - * expected to be run in a worker thread and the stats used to provide - * feedback the user. - * - * @param idx the indexer instance - * @param stats storage for the running state - */ -GIT_EXTERN(int) git_indexer_run(git_indexer *idx, git_indexer_stats *stats); - -/** - * Write the index file to disk. - * - * The file will be stored as pack-$hash.idx in the same directory as - * the packfile. - * - * @param idx the indexer instance - */ -GIT_EXTERN(int) git_indexer_write(git_indexer *idx); - -/** - * Get the packfile's hash - * - * A packfile's name is derived from the sorted hashing of all object - * names. This is only correct after the index has been written to disk. - * - * @param idx the indexer instance - */ -GIT_EXTERN(const git_oid *) git_indexer_hash(git_indexer *idx); - -/** - * Free the indexer and its resources - * - * @param idx the indexer to free - */ -GIT_EXTERN(void) git_indexer_free(git_indexer *idx); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/net.h b/vendor/libgit2/include/git2/net.h deleted file mode 100644 index d4f475527..000000000 --- a/vendor/libgit2/include/git2/net.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_net_h__ -#define INCLUDE_net_h__ - -#include "common.h" -#include "oid.h" -#include "types.h" - -/** - * @file git2/net.h - * @brief Git networking declarations - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_DEFAULT_PORT "9418" - -/* - * We need this because we need to know whether we should call - * git-upload-pack or git-receive-pack on the remote end when get_refs - * gets called. - */ - -#define GIT_DIR_FETCH 0 -#define GIT_DIR_PUSH 1 - -/** - * Remote head description, given out on `ls` calls. - */ -struct git_remote_head { - int local:1; /* available locally */ - git_oid oid; - git_oid loid; - char *name; -}; - -/** - * Array of remote heads - */ -struct git_headarray { - unsigned int len; - struct git_remote_head **heads; -}; - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/object.h b/vendor/libgit2/include/git2/object.h deleted file mode 100644 index 07ba1a1c7..000000000 --- a/vendor/libgit2/include/git2/object.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_object_h__ -#define INCLUDE_git_object_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/object.h - * @brief Git revision object management routines - * @defgroup git_object Git revision object management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference to one of the objects in a repostory. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_close` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object pointer to the looked-up object - * @param repo the repository to look up the object - * @param id the unique identifier for the object - * @param type the type of the object - * @return a reference to the object - */ -GIT_EXTERN(int) git_object_lookup( - git_object **object, - git_repository *repo, - const git_oid *id, - git_otype type); - -/** - * Lookup a reference to one of the objects in a repostory, - * given a prefix of its identifier (short id). - * - * The object obtained will be so that its identifier - * matches the first 'len' hexadecimal characters - * (packets of 4 bits) of the given 'id'. - * 'len' must be at least GIT_OID_MINPREFIXLEN, and - * long enough to identify a unique object matching - * the prefix; otherwise the method will fail. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_close` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object_out pointer where to store the looked-up object - * @param repo the repository to look up the object - * @param id a short identifier for the object - * @param len the length of the short identifier - * @param type the type of the object - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_object_lookup_prefix( - git_object **object_out, - git_repository *repo, - const git_oid *id, - unsigned int len, - git_otype type); - -/** - * Get the id (SHA1) of a repository object - * - * @param obj the repository object - * @return the SHA1 id - */ -GIT_EXTERN(const git_oid *) git_object_id(const git_object *obj); - -/** - * Get the object type of an object - * - * @param obj the repository object - * @return the object's type - */ -GIT_EXTERN(git_otype) git_object_type(const git_object *obj); - -/** - * Get the repository that owns this object - * - * Freeing or calling `git_repository_close` on the - * returned pointer will invalidate the actual object. - * - * Any other operation may be run on the repository without - * affecting the object. - * - * @param obj the object - * @return the repository who owns this object - */ -GIT_EXTERN(git_repository *) git_object_owner(const git_object *obj); - -/** - * Close an open object - * - * This method instructs the library to close an existing - * object; note that git_objects are owned and cached by the repository - * so the object may or may not be freed after this library call, - * depending on how agressive is the caching mechanism used - * by the repository. - * - * IMPORTANT: - * It *is* necessary to call this method when you stop using - * an object. Failure to do so will cause a memory leak. - * - * @param object the object to close - */ -GIT_EXTERN(void) git_object_close(git_object *object); - -/** - * Convert an object type to it's string representation. - * - * The result is a pointer to a string in static memory and - * should not be free()'ed. - * - * @param type object type to convert. - * @return the corresponding string representation. - */ -GIT_EXTERN(const char *) git_object_type2string(git_otype type); - -/** - * Convert a string object type representation to it's git_otype. - * - * @param str the string to convert. - * @return the corresponding git_otype. - */ -GIT_EXTERN(git_otype) git_object_string2type(const char *str); - -/** - * Determine if the given git_otype is a valid loose object type. - * - * @param type object type to test. - * @return true if the type represents a valid loose object type, - * false otherwise. - */ -GIT_EXTERN(int) git_object_typeisloose(git_otype type); - -/** - * Get the size in bytes for the structure which - * acts as an in-memory representation of any given - * object type. - * - * For all the core types, this would the equivalent - * of calling `sizeof(git_commit)` if the core types - * were not opaque on the external API. - * - * @param type object type to get its size - * @return size in bytes of the object - */ -GIT_EXTERN(size_t) git_object__size(git_otype type); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/odb.h b/vendor/libgit2/include/git2/odb.h deleted file mode 100644 index d0c369055..000000000 --- a/vendor/libgit2/include/git2/odb.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_odb_h__ -#define INCLUDE_git_odb_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "odb_backend.h" - -/** - * @file git2/odb.h - * @brief Git object database routines - * @defgroup git_odb Git object database routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new object database with no backends. - * - * Before the ODB can be used for read/writing, a custom database - * backend must be manually added using `git_odb_add_backend()` - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @return GIT_SUCCESS if the database was created; otherwise an error - * code describing why the open was not possible. - */ -GIT_EXTERN(int) git_odb_new(git_odb **out); - -/** - * Create a new object database and automatically add - * the two default backends: - * - * - git_odb_backend_loose: read and write loose object files - * from disk, assuming `objects_dir` as the Objects folder - * - * - git_odb_backend_pack: read objects from packfiles, - * assuming `objects_dir` as the Objects folder which - * contains a 'pack/' folder with the corresponding data - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @param objects_dir path of the backends' "objects" directory. - * @return GIT_SUCCESS if the database opened; otherwise an error - * code describing why the open was not possible. - */ -GIT_EXTERN(int) git_odb_open(git_odb **out, const char *objects_dir); - -/** - * Add a custom backend to an existing Object DB - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on sucess; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Add a custom backend to an existing Object DB; this - * backend will work as an alternate. - * - * Alternate backends are always checked for objects *after* - * all the main backends have been exhausted. - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Writing is disabled on alternate backends. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on sucess; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Close an open object database. - * - * @param db database pointer to close. If NULL no action is taken. - */ -GIT_EXTERN(void) git_odb_close(git_odb *db); - -/** - * Read an object from the database. - * - * This method queries all available ODB backends - * trying to read the given OID. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - GIT_SUCCESS if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id); - -/** - * Read an object from the database, given a prefix - * of its identifier. - * - * This method queries all available ODB backends - * trying to match the 'len' first hexadecimal - * characters of the 'short_id'. - * The remaining (GIT_OID_HEXSZ-len)*4 bits of - * 'short_id' must be 0s. - * 'len' must be at least GIT_OID_MINPREFIXLEN, - * and the prefix must be long enough to identify - * a unique object in all the backends; the - * method will fail otherwise. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param short_id a prefix of the id of the object to read. - * @param len the length of the prefix - * @return GIT_SUCCESS if the object was read; - * GIT_ENOTFOUND if the object is not in the database. - * GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix) - */ -GIT_EXTERN(int) git_odb_read_prefix(git_odb_object **out, git_odb *db, const git_oid *short_id, unsigned int len); - -/** - * Read the header of an object from the database, without - * reading its full contents. - * - * The header includes the length and the type of an object. - * - * Note that most backends do not support reading only the header - * of an object, so the whole object will be read and then the - * header will be returned. - * - * @param len_p pointer where to store the length - * @param type_p pointer where to store the type - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - GIT_SUCCESS if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read_header(size_t *len_p, git_otype *type_p, git_odb *db, const git_oid *id); - -/** - * Determine if the given object can be found in the object database. - * - * @param db database to be searched for the given object. - * @param id the object to search for. - * @return - * - 1, if the object was found - * - 0, otherwise - */ -GIT_EXTERN(int) git_odb_exists(git_odb *db, const git_oid *id); - -/** - * Write an object directly into the ODB - * - * This method writes a full object straight into the ODB. - * For most cases, it is preferred to write objects through a write - * stream, which is both faster and less memory intensive, specially - * for big objects. - * - * This method is provided for compatibility with custom backends - * which are not able to support streaming writes - * - * @param oid pointer to store the OID result of the write - * @param odb object database where to store the object - * @param data buffer with the data to storr - * @param len size of the buffer - * @param type type of the data to store - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_write(git_oid *oid, git_odb *odb, const void *data, size_t len, git_otype type); - -/** - * Open a stream to write an object into the ODB - * - * The type and final length of the object must be specified - * when opening the stream. - * - * The returned stream will be of type `GIT_STREAM_WRONLY` and - * will have the following methods: - * - * - stream->write: write `n` bytes into the stream - * - stream->finalize_write: close the stream and store the object in - * the odb - * - stream->free: free the stream - * - * The streaming write won't be effective until `stream->finalize_write` - * is called and returns without an error - * - * The stream must always be free'd or will leak memory. - * - * @see git_odb_stream - * - * @param stream pointer where to store the stream - * @param db object database where the stream will write - * @param size final size of the object that will be written - * @param type type of the object that will be written - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **stream, git_odb *db, size_t size, git_otype type); - -/** - * Open a stream to read an object from the ODB - * - * Note that most backends do *not* support streaming reads - * because they store their objects as compressed/delta'ed blobs. - * - * It's recommended to use `git_odb_read` instead, which is - * assured to work on all backends. - * - * The returned stream will be of type `GIT_STREAM_RDONLY` and - * will have the following methods: - * - * - stream->read: read `n` bytes from the stream - * - stream->free: free the stream - * - * The stream must always be free'd or will leak memory. - * - * @see git_odb_stream - * - * @param stream pointer where to store the stream - * @param db object database where the stream will read from - * @param oid oid of the object the stream will read from - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oid); - -/** - * Determine the object-ID (sha1 hash) of a data buffer - * - * The resulting SHA-1 OID will the itentifier for the data - * buffer as if the data buffer it were to written to the ODB. - * - * @param id the resulting object-ID. - * @param data data to hash - * @param len size of the data - * @param type of the data to hash - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_hash(git_oid *id, const void *data, size_t len, git_otype type); - -/** - * Read a file from disk and fill a git_oid with the object id - * that the file would have if it were written to the Object - * Database as an object of the given type. Similar functionality - * to git.git's `git hash-object` without the `-w` flag. - * - * @param out oid structure the result is written into. - * @param path file to read and determine object id for - * @param type the type of the object that will be hashed - * @return GIT_SUCCESS if valid; error code otherwise - */ -GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_otype type); - -/** - * Close an ODB object - * - * This method must always be called once a `git_odb_object` is no - * longer needed, otherwise memory will leak. - * - * @param object object to close - */ -GIT_EXTERN(void) git_odb_object_close(git_odb_object *object); - -/** - * Return the OID of an ODB object - * - * This is the OID from which the object was read from - * - * @param object the object - * @return a pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_odb_object_id(git_odb_object *object); - -/** - * Return the data of an ODB object - * - * This is the uncompressed, raw data as read from the ODB, - * without the leading header. - * - * This pointer is owned by the object and shall not be free'd. - * - * @param object the object - * @return a pointer to the data - */ -GIT_EXTERN(const void *) git_odb_object_data(git_odb_object *object); - -/** - * Return the size of an ODB object - * - * This is the real size of the `data` buffer, not the - * actual size of the object. - * - * @param object the object - * @return the size - */ -GIT_EXTERN(size_t) git_odb_object_size(git_odb_object *object); - -/** - * Return the type of an ODB object - * - * @param object the object - * @return the type - */ -GIT_EXTERN(git_otype) git_odb_object_type(git_odb_object *object); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/odb_backend.h b/vendor/libgit2/include/git2/odb_backend.h deleted file mode 100644 index 43a1c2d21..000000000 --- a/vendor/libgit2/include/git2/odb_backend.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_odb_backend_h__ -#define INCLUDE_git_odb_backend_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/backend.h - * @brief Git custom backend functions - * @defgroup git_backend Git custom backend API - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -struct git_odb_stream; - -/** An instance for a custom backend */ -struct git_odb_backend { - git_odb *odb; - - int (* read)( - void **, size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *); - - /* To find a unique object given a prefix - * of its oid. - * The oid given must be so that the - * remaining (GIT_OID_HEXSZ - len)*4 bits - * are 0s. - */ - int (* read_prefix)( - git_oid *, - void **, size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *, - unsigned int); - - int (* read_header)( - size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *); - - int (* write)( - git_oid *, - struct git_odb_backend *, - const void *, - size_t, - git_otype); - - int (* writestream)( - struct git_odb_stream **, - struct git_odb_backend *, - size_t, - git_otype); - - int (* readstream)( - struct git_odb_stream **, - struct git_odb_backend *, - const git_oid *); - - int (* exists)( - struct git_odb_backend *, - const git_oid *); - - void (* free)(struct git_odb_backend *); -}; - -/** A stream to read/write from a backend */ -struct git_odb_stream { - struct git_odb_backend *backend; - int mode; - - int (*read)(struct git_odb_stream *stream, char *buffer, size_t len); - int (*write)(struct git_odb_stream *stream, const char *buffer, size_t len); - int (*finalize_write)(git_oid *oid_p, struct git_odb_stream *stream); - void (*free)(struct git_odb_stream *stream); -}; - -/** Streaming mode */ -typedef enum { - GIT_STREAM_RDONLY = (1 << 1), - GIT_STREAM_WRONLY = (1 << 2), - GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY), -} git_odb_streammode; - -GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir); -GIT_EXTERN(int) git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/oid.h b/vendor/libgit2/include/git2/oid.h deleted file mode 100644 index 8a0f134b9..000000000 --- a/vendor/libgit2/include/git2/oid.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_oid_h__ -#define INCLUDE_git_oid_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/oid.h - * @brief Git object id routines - * @defgroup git_oid Git object id routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Size (in bytes) of a raw/binary oid */ -#define GIT_OID_RAWSZ 20 - -/** Size (in bytes) of a hex formatted oid */ -#define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2) - -/** Minimum length (in number of hex characters, - * i.e. packets of 4 bits) of an oid prefix */ -#define GIT_OID_MINPREFIXLEN 4 - -/** Unique identity of any object (commit, tree, blob, tag). */ -typedef struct _git_oid git_oid; -struct _git_oid { - /** raw binary formatted id */ - unsigned char id[GIT_OID_RAWSZ]; -}; - -/** - * Parse a hex formatted object id into a git_oid. - * - * @param out oid structure the result is written into. - * @param str input hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). - * @return GIT_SUCCESS if valid; GIT_ENOTOID on failure. - */ -GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str); - -/** - * Parse N characters of a hex formatted object id into a git_oid - * - * If N is odd, N-1 characters will be parsed instead. - * The remaining space in the git_oid will be set to zero. - * - * @param out oid structure the result is written into. - * @param str input hex string of at least size `length` - * @param length length of the input string - * @return GIT_SUCCESS if valid; GIT_ENOTOID on failure. - */ -GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length); - -/** - * Copy an already raw oid into a git_oid structure. - * - * @param out oid structure the result is written into. - * @param raw the raw input bytes to be copied. - */ -GIT_EXTERN(void) git_oid_fromraw(git_oid *out, const unsigned char *raw); - -/** - * Format a git_oid into a hex string. - * - * @param str output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param oid oid structure to format. - */ -GIT_EXTERN(void) git_oid_fmt(char *str, const git_oid *oid); - -/** - * Format a git_oid into a loose-object path string. - * - * The resulting string is "aa/...", where "aa" is the first two - * hex digitis of the oid and "..." is the remaining 38 digits. - * - * @param str output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (41 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param oid oid structure to format. - */ -GIT_EXTERN(void) git_oid_pathfmt(char *str, const git_oid *oid); - -/** - * Format a git_oid into a newly allocated c-string. - * - * @param oid the oid structure to format - * @return the c-string; NULL if memory is exhausted. Caller must - * deallocate the string with free(). - */ -GIT_EXTERN(char *) git_oid_allocfmt(const git_oid *oid); - -/** - * Format a git_oid into a buffer as a hex format c-string. - * - * If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting - * oid c-string will be truncated to n-1 characters. If there are - * any input parameter errors (out == NULL, n == 0, oid == NULL), - * then a pointer to an empty string is returned, so that the return - * value can always be printed. - * - * @param out the buffer into which the oid string is output. - * @param n the size of the out buffer. - * @param oid the oid structure to format. - * @return the out buffer pointer, assuming no input parameter - * errors, otherwise a pointer to an empty string. - */ -GIT_EXTERN(char *) git_oid_to_string(char *out, size_t n, const git_oid *oid); - -/** - * Copy an oid from one structure to another. - * - * @param out oid structure the result is written into. - * @param src oid structure to copy from. - */ -GIT_EXTERN(void) git_oid_cpy(git_oid *out, const git_oid *src); - -/** - * Compare two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @return <0, 0, >0 if a < b, a == b, a > b. - */ -GIT_EXTERN(int) git_oid_cmp(const git_oid *a, const git_oid *b); - -/** - * Compare the first 'len' hexadecimal characters (packets of 4 bits) - * of two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @param len the number of hex chars to compare - * @return 0 in case of a match - */ -GIT_EXTERN(int) git_oid_ncmp(const git_oid *a, const git_oid *b, unsigned int len); - -/** - * OID Shortener object - */ -typedef struct git_oid_shorten git_oid_shorten; - -/** - * Create a new OID shortener. - * - * The OID shortener is used to process a list of OIDs - * in text form and return the shortest length that would - * uniquely identify all of them. - * - * E.g. look at the result of `git log --abbrev`. - * - * @param min_length The minimal length for all identifiers, - * which will be used even if shorter OIDs would still - * be unique. - * @return a `git_oid_shorten` instance, NULL if OOM - */ -git_oid_shorten *git_oid_shorten_new(size_t min_length); - -/** - * Add a new OID to set of shortened OIDs and calculate - * the minimal length to uniquely identify all the OIDs in - * the set. - * - * The OID is expected to be a 40-char hexadecimal string. - * The OID is owned by the user and will not be modified - * or freed. - * - * For performance reasons, there is a hard-limit of how many - * OIDs can be added to a single set (around ~22000, assuming - * a mostly randomized distribution), which should be enough - * for any kind of program, and keeps the algorithm fast and - * memory-efficient. - * - * Attempting to add more than those OIDs will result in a - * GIT_ENOMEM error - * - * @param os a `git_oid_shorten` instance - * @param text_oid an OID in text form - * @return the minimal length to uniquely identify all OIDs - * added so far to the set; or an error code (<0) if an - * error occurs. - */ -int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid); - -/** - * Free an OID shortener instance - * - * @param os a `git_oid_shorten` instance - */ -void git_oid_shorten_free(git_oid_shorten *os); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/reflog.h b/vendor/libgit2/include/git2/reflog.h deleted file mode 100644 index 53b344733..000000000 --- a/vendor/libgit2/include/git2/reflog.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_reflog_h__ -#define INCLUDE_git_reflog_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/reflog.h - * @brief Git reflog management routines - * @defgroup git_reflog Git reflog management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Read the reflog for the given reference - * - * The reflog must be freed manually by using - * git_reflog_free(). - * - * @param reflog pointer to reflog - * @param ref reference to read the reflog for - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_reflog_read(git_reflog **reflog, git_reference *ref); - -/** - * Write a new reflog for the given reference - * - * If there is no reflog file for the given - * reference yet, it will be created. - * - * `oid_old` may be NULL in case it's a new reference. - * - * `msg` is optional and can be NULL. - * - * @param ref the changed reference - * @param oid_old the OID the reference was pointing to - * @param committer the signature of the committer - * @param msg the reflog message - * @return GIT_SUCCESS on success; error code otherwise - */ -GIT_EXTERN(int) git_reflog_write(git_reference *ref, const git_oid *oid_old, const git_signature *committer, const char *msg); - -/** - * Get the number of log entries in a reflog - * - * @param reflog the previously loaded reflog - * @return the number of log entries - */ -GIT_EXTERN(unsigned int) git_reflog_entrycount(git_reflog *reflog); - -/** - * Lookup an entry by its index - * - * @param reflog a previously loaded reflog - * @param idx the position to lookup - * @return the entry; NULL if not found - */ -GIT_EXTERN(const git_reflog_entry *) git_reflog_entry_byindex(git_reflog *reflog, unsigned int idx); - -/** - * Get the old oid - * - * @param entry a reflog entry - * @return the old oid - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_oidold(const git_reflog_entry *entry); - -/** - * Get the new oid - * - * @param entry a reflog entry - * @return the new oid at this time - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_oidnew(const git_reflog_entry *entry); - -/** - * Get the committer of this entry - * - * @param entry a reflog entry - * @return the committer - */ -GIT_EXTERN(git_signature *) git_reflog_entry_committer(const git_reflog_entry *entry); - -/** - * Get the log msg - * - * @param entry a reflog entry - * @return the log msg - */ -GIT_EXTERN(char *) git_reflog_entry_msg(const git_reflog_entry *entry); - -/** - * Free the reflog - * - * @param reflog reflog to free - */ -GIT_EXTERN(void) git_reflog_free(git_reflog *reflog); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/refs.h b/vendor/libgit2/include/git2/refs.h deleted file mode 100644 index ff2bc9d87..000000000 --- a/vendor/libgit2/include/git2/refs.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_refs_h__ -#define INCLUDE_git_refs_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/refs.h - * @brief Git reference management routines - * @defgroup git_reference Git reference management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference by its name in a repository. - * - * The generated reference is owned by the repository and - * should not be freed by the user. - * - * @param reference_out pointer to the looked-up reference - * @param repo the repository to look up the reference - * @param name the long name for the reference (e.g. HEAD, ref/heads/master, refs/tags/v0.1.0, ...) - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_lookup(git_reference **reference_out, git_repository *repo, const char *name); - -/** - * Create a new symbolic reference. - * - * The reference will be created in the repository and written - * to the disk. - * - * This reference is owned by the repository and shall not - * be free'd by the user. - * - * If `force` is true and there already exists a reference - * with the same name, it will be overwritten. - * - * @param ref_out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param target The target of the reference - * @param force Overwrite existing references - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_create_symbolic(git_reference **ref_out, git_repository *repo, const char *name, const char *target, int force); - -/** - * Create a new object id reference. - * - * The reference will be created in the repository and written - * to the disk. - * - * This reference is owned by the repository and shall not - * be free'd by the user. - * - * If `force` is true and there already exists a reference - * with the same name, it will be overwritten. - * - * @param ref_out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param id The object id pointed to by the reference. - * @param force Overwrite existing references - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_create_oid(git_reference **ref_out, git_repository *repo, const char *name, const git_oid *id, int force); - -/** - * Get the OID pointed to by a reference. - * - * Only available if the reference is direct (i.e. not symbolic) - * - * @param ref The reference - * @return a pointer to the oid if available, NULL otherwise - */ -GIT_EXTERN(const git_oid *) git_reference_oid(git_reference *ref); - -/** - * Get full name to the reference pointed by this reference - * - * Only available if the reference is symbolic - * - * @param ref The reference - * @return a pointer to the name if available, NULL otherwise - */ -GIT_EXTERN(const char *) git_reference_target(git_reference *ref); - -/** - * Get the type of a reference - * - * Either direct (GIT_REF_OID) or symbolic (GIT_REF_SYMBOLIC) - * - * @param ref The reference - * @return the type - */ -GIT_EXTERN(git_rtype) git_reference_type(git_reference *ref); - -/** - * Get the full name of a reference - * - * @param ref The reference - * @return the full name for the ref - */ -GIT_EXTERN(const char *) git_reference_name(git_reference *ref); - -/** - * Resolve a symbolic reference - * - * Thie method iteratively peels a symbolic reference - * until it resolves to a direct reference to an OID. - * - * If a direct reference is passed as an argument, - * that reference is returned immediately - * - * @param resolved_ref Pointer to the peeled reference - * @param ref The reference - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_resolve(git_reference **resolved_ref, git_reference *ref); - -/** - * Get the repository where a reference resides - * - * @param ref The reference - * @return a pointer to the repo - */ -GIT_EXTERN(git_repository *) git_reference_owner(git_reference *ref); - -/** - * Set the symbolic target of a reference. - * - * The reference must be a symbolic reference, otherwise - * this method will fail. - * - * The reference will be automatically updated in - * memory and on disk. - * - * @param ref The reference - * @param target The new target for the reference - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_set_target(git_reference *ref, const char *target); - -/** - * Set the OID target of a reference. - * - * The reference must be a direct reference, otherwise - * this method will fail. - * - * The reference will be automatically updated in - * memory and on disk. - * - * @param ref The reference - * @param id The new target OID for the reference - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_set_oid(git_reference *ref, const git_oid *id); - -/** - * Rename an existing reference - * - * This method works for both direct and symbolic references. - * The new name will be checked for validity and may be - * modified into a normalized form. - * - * The refernece will be immediately renamed in-memory - * and on disk. - * - */ -GIT_EXTERN(int) git_reference_rename(git_reference *ref, const char *new_name, int force); - -/** - * Delete an existing reference - * - * This method works for both direct and symbolic references. - * - * The reference will be immediately removed on disk and from - * memory. The given reference pointer will no longer be valid. - * - */ -GIT_EXTERN(int) git_reference_delete(git_reference *ref); - -/** - * Pack all the loose references in the repository - * - * This method will load into the cache all the loose - * references on the repository and update the - * `packed-refs` file with them. - * - * Once the `packed-refs` file has been written properly, - * the loose references will be removed from disk. - * - * WARNING: calling this method may invalidate any existing - * references previously loaded on the cache. - * - * @param repo Repository where the loose refs will be packed - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_packall(git_repository *repo); - -/** - * Fill a list with all the references that can be found - * in a repository. - * - * The listed references may be filtered by type, or using - * a bitwise OR of several types. Use the magic value - * `GIT_REF_LISTALL` to obtain all references, including - * packed ones. - * - * The string array will be filled with the names of all - * references; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param array Pointer to a git_strarray structure where - * the reference names will be stored - * @param repo Repository where to find the refs - * @param list_flags Filtering flags for the reference - * listing. - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_listall(git_strarray *array, git_repository *repo, unsigned int list_flags); - - -/** - * Perform an operation on each reference in the repository - * - * The processed references may be filtered by type, or using - * a bitwise OR of several types. Use the magic value - * `GIT_REF_LISTALL` to obtain all references, including - * packed ones. - * - * The `callback` function will be called for each of the references - * in the repository, and will receive the name of the reference and - * the `payload` value passed to this method. - * - * @param repo Repository where to find the refs - * @param list_flags Filtering flags for the reference - * listing. - * @param callback Function which will be called for every listed ref - * @param payload Additional data to pass to the callback - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_reference_foreach(git_repository *repo, unsigned int list_flags, int (*callback)(const char *, void *), void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/refspec.h b/vendor/libgit2/include/git2/refspec.h deleted file mode 100644 index dd0dc5873..000000000 --- a/vendor/libgit2/include/git2/refspec.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_refspec_h__ -#define INCLUDE_git_refspec_h__ - -#include "git2/types.h" - -/** - * @file git2/refspec.h - * @brief Git refspec attributes - * @defgroup git_refspec Git refspec attributes - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Get the source specifier - * - * @param refspec the refspec - * @return the refspec's source specifier - */ -const char *git_refspec_src(const git_refspec *refspec); - -/** - * Get the destination specifier - * - * @param refspec the refspec - * @return the refspec's destination specifier - */ -const char *git_refspec_dst(const git_refspec *refspec); - -/** - * Match a refspec's source descriptor with a reference name - * - * @param refspec the refspec - * @param refname the name of the reference to check - * @return GIT_SUCCESS on successful match; GIT_ENOMACH on match - * failure or an error code on other failure - */ -int git_refspec_src_match(const git_refspec *refspec, const char *refname); - -/** - * Transform a reference to its target following the refspec's rules - * - * @param out where to store the target name - * @param outlen the size ouf the `out` buffer - * @param spec the refspec - * @param name the name of the reference to transform - * @preturn GIT_SUCCESS, GIT_ESHORTBUFFER or another error - */ -int git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, const char *name); - -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/remote.h b/vendor/libgit2/include/git2/remote.h deleted file mode 100644 index 5ce876e07..000000000 --- a/vendor/libgit2/include/git2/remote.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_remote_h__ -#define INCLUDE_git_remote_h__ - -#include "git2/common.h" -#include "git2/repository.h" -#include "refspec.h" -/** - * @file git2/remote.h - * @brief Git remote management functions - * @defgroup git_remote remote management functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/* - * TODO: This functions still need to be implemented: - * - _listcb/_foreach - * - _add - * - _rename - * - _del (needs support from config) - */ - -/** - * Create a new unnamed remote - * - * Useful when you don't want to store the remote - * - * @param out pointer to the new remote object - * @param repo the associtated repository - * @param url the remote repository's URL - * @return GIT_SUCCESS or an error message - */ -int git_remote_new(git_remote **out, git_repository *repo, const char *url); - -/** - * Get the information for a particular remote - * - * @param out pointer to the new remote object - * @param cfg the repository's configuration - * @param name the remote's name - * @return 0 on success; error value otherwise - */ -GIT_EXTERN(int) git_remote_get(struct git_remote **out, struct git_config *cfg, const char *name); - -/** - * Get the remote's name - * - * @param remote the remote - * @return a pointer to the name - */ -GIT_EXTERN(const char *) git_remote_name(struct git_remote *remote); - -/** - * Get the remote's url - * - * @param remote the remote - * @return a pointer to the url - */ -GIT_EXTERN(const char *) git_remote_url(struct git_remote *remote); - -/** - * Get the fetch refspec - * - * @param remote the remote - * @return a pointer to the fetch refspec or NULL if it doesn't exist - */ -GIT_EXTERN(const git_refspec *) git_remote_fetchspec(struct git_remote *remote); - -/** - * Get the push refspec - * - * @param remote the remote - * @return a pointer to the push refspec or NULL if it doesn't exist - */ - -GIT_EXTERN(const git_refspec *) git_remote_pushspec(struct git_remote *remote); - -/** - * Open a connection to a remote - * - * The transport is selected based on the URL. The direction argument - * is due to a limitation of the git protocol (over TCP or SSH) which - * starts up a specific binary which can only do the one or the other. - * - * @param remote the remote to connect to - * @param direction whether you want to receive or send data - * @return GIT_SUCCESS or an error code - */ -GIT_EXTERN(int) git_remote_connect(struct git_remote *remote, int direction); - -/** - * Get a list of refs at the remote - * - * The remote (or more exactly its transport) must be connected. - * - * @param refs where to store the refs - * @param remote the remote - * @return GIT_SUCCESS or an error code - */ -GIT_EXTERN(int) git_remote_ls(git_remote *remote, git_headarray *refs); - -/** - * Negotiate what data needs to be exchanged to synchroize the remtoe - * and local references - * - * @param remote the remote you want to negotiate with - */ -GIT_EXTERN(int) git_remote_negotiate(git_remote *remote); - -/** - * Download the packfile - * - * The packfile is downloaded with a temporary filename, as it's final - * name is not known yet. If there was no packfile needed (all the - * objects were available locally), filename will be NULL and the - * function will return success. - * - * @param remote the remote to download from - * @param filename where to store the temproray filename - * @return GIT_SUCCESS or an error code - */ -GIT_EXTERN(int) git_remote_download(char **filename, git_remote *remote); - -/** - * Free the memory associated with a remote - * - * @param remote the remote to free - */ -GIT_EXTERN(void) git_remote_free(struct git_remote *remote); - -/** - * Update the tips to the new state - * - * Make sure that you only call this once you've successfully indexed - * or expanded the packfile. - * - * @param remote the remote to update - */ -GIT_EXTERN(int) git_remote_update_tips(struct git_remote *remote); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/repository.h b/vendor/libgit2/include/git2/repository.h deleted file mode 100644 index 4088ff7f9..000000000 --- a/vendor/libgit2/include/git2/repository.h +++ /dev/null @@ -1,332 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_repository_h__ -#define INCLUDE_git_repository_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/repository.h - * @brief Git repository management routines - * @defgroup git_repository Git repository management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Open a git repository. - * - * The 'path' argument must point to an existing git repository - * folder, e.g. - * - * /path/to/my_repo/.git/ (normal repository) - * objects/ - * index - * HEAD - * - * /path/to/bare_repo/ (bare repository) - * objects/ - * index - * HEAD - * - * The method will automatically detect if 'path' is a normal - * or bare repository or fail is 'path' is neither. - * - * @param repository pointer to the repo which will be opened - * @param path the path to the repository - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_repository_open(git_repository **repository, const char *path); - - -/** - * Open a git repository by manually specifying all its paths - * - * @param repository pointer to the repo which will be opened - * - * @param git_dir The full path to the repository folder - * e.g. a '.git' folder for live repos, any folder for bare - * Equivalent to $GIT_DIR. - * Cannot be NULL. - * - * @param git_object_directory The full path to the ODB folder. - * the folder where all the loose and packed objects are stored - * Equivalent to $GIT_OBJECT_DIRECTORY. - * If NULL, "$GIT_DIR/objects/" is assumed. - * - * @param git_index_file The full path to the index (dircache) file - * Equivalent to $GIT_INDEX_FILE. - * If NULL, "$GIT_DIR/index" is assumed. - * - * @param git_work_tree The full path to the working tree of the repository, - * if the repository is not bare. - * Equivalent to $GIT_WORK_TREE. - * If NULL, the repository is assumed to be bare. - * - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_repository_open2(git_repository **repository, - const char *git_dir, - const char *git_object_directory, - const char *git_index_file, - const char *git_work_tree); - - -/** - * Open a git repository by manually specifying its paths and - * the object database it will use. - * - * @param repository pointer to the repo which will be opened - * - * @param git_dir The full path to the repository folder - * e.g. a '.git' folder for live repos, any folder for bare - * Equivalent to $GIT_DIR. - * Cannot be NULL. - * - * @param object_database A pointer to a git_odb created & initialized - * by the user (e.g. with custom backends). This object database - * will be owned by the repository and will be automatically free'd. - * It should not be manually free'd by the user, or this - * git_repository object will become invalid. - * - * @param git_index_file The full path to the index (dircache) file - * Equivalent to $GIT_INDEX_FILE. - * If NULL, "$GIT_DIR/index" is assumed. - * - * @param git_work_tree The full path to the working tree of the repository, - * if the repository is not bare. - * Equivalent to $GIT_WORK_TREE. - * If NULL, the repository is assumed to be bare. - * - * @return 0 on success; error code otherwise - */ - -GIT_EXTERN(int) git_repository_open3(git_repository **repository, - const char *git_dir, - git_odb *object_database, - const char *git_index_file, - const char *git_work_tree); - -/** - * Look for a git repository and copy its path in the given buffer. The lookup start - * from base_path and walk across parent directories if nothing has been found. The - * lookup ends when the first repository is found, or when reaching a directory - * referenced in ceiling_dirs or when the filesystem changes (in case across_fs - * is true). - * - * The method will automatically detect if the repository is bare (if there is - * a repository). - * - * @param repository_path The user allocated buffer which will contain the found path. - * - * @param size repository_path size - * - * @param start_path The base path where the lookup starts. - * - * @param across_fs If true, then the lookup will not stop when a filesystem device change - * is detected while exploring parent directories. - * - * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR separated list of absolute symbolic link - * free paths. The lookup will stop when any of this paths is reached. Note that the - * lookup always performs on start_path no matter start_path appears in ceiling_dirs - * ceiling_dirs might be NULL (which is equivalent to an empty string) - * - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_repository_discover(char *repository_path, size_t size, const char *start_path, int across_fs, const char *ceiling_dirs); - -/** - * Get the object database behind a Git repository - * - * @param repo a repository object - * @return a pointer to the object db - */ -GIT_EXTERN(git_odb *) git_repository_database(git_repository *repo); - -/** - * Open the Index file of a Git repository - * - * This returns a new and unique `git_index` object representing the - * active index for the repository. - * - * This method may be called more than once (e.g. on different threads). - * - * Each returned `git_index` object is independent and suffers no race - * conditions: synchronization is done at the FS level. - * - * Each returned `git_index` object must be manually freed by the user, - * using `git_index_free`. - * - * @param index Pointer where to store the index - * @param repo a repository object - * @return 0 on success; error code if the index could not be opened - */ -GIT_EXTERN(int) git_repository_index(git_index **index, git_repository *repo); - -/** - * Free a previously allocated repository - * - * Note that after a repository is free'd, all the objects it has spawned - * will still exist until they are manually closed by the user - * with `git_object_close`, but accessing any of the attributes of - * an object without a backing repository will result in undefined - * behavior - * - * @param repo repository handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_repository_free(git_repository *repo); - -/** - * Creates a new Git repository in the given folder. - * - * TODO: - * - Reinit the repository - * - Create config files - * - * @param repo_out pointer to the repo which will be created or reinitialized - * @param path the path to the repository - * @param is_bare if true, a Git repository without a working directory is created - * at the pointed path. If false, provided path will be considered as the working - * directory into which the .git directory will be created. - * - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare); - -/** - * Check if a repository's HEAD is detached - * - * A repository's HEAD is detached when it points directly to a commit - * instead of a branch. - * - * @param repo Repo to test - * @return 1 if HEAD is detached, 0 if i'ts not; error code if there - * was an error. - */ -GIT_EXTERN(int) git_repository_head_detached(git_repository *repo); - -/** - * Check if the current branch is an orphan - * - * An orphan branch is one named from HEAD but which doesn't exist in - * the refs namespace, because it doesn't have any commit to point to. - * - * @param repo Repo to test - * @return 1 if the current branch is an orphan, 0 if it's not; error - * code if therewas an error - */ -GIT_EXTERN(int) git_repository_head_orphan(git_repository *repo); - -/** - * Check if a repository is empty - * - * An empty repository has just been initialized and contains - * no commits. - * - * @param repo Repo to test - * @return 1 if the repository is empty, 0 if it isn't, error code - * if the repository is corrupted - */ -GIT_EXTERN(int) git_repository_is_empty(git_repository *repo); - -/** - * Internal path identifiers for a repository - */ -typedef enum { - GIT_REPO_PATH, - GIT_REPO_PATH_INDEX, - GIT_REPO_PATH_ODB, - GIT_REPO_PATH_WORKDIR -} git_repository_pathid; - -/** - * Get one of the paths to the repository - * - * Possible values for `id`: - * - * GIT_REPO_PATH: return the path to the repository - * GIT_REPO_PATH_INDEX: return the path to the index - * GIT_REPO_PATH_ODB: return the path to the ODB - * GIT_REPO_PATH_WORKDIR: return the path to the working - * directory - * - * @param repo a repository object - * @param id The ID of the path to return - * @return absolute path of the requested id - */ -GIT_EXTERN(const char *) git_repository_path(git_repository *repo, git_repository_pathid id); - -/** - * Check if a repository is bare - * - * @param repo Repo to test - * @return 1 if the repository is empty, 0 otherwise. - */ -GIT_EXTERN(int) git_repository_is_bare(git_repository *repo); - -/** - * Retrieve the relevant configuration for a repository - * - * By default he returned `git_config` instance contains a single - * configuration file, the `.gitconfig' file that may be found - * inside the repository. - * - * If the `user_config_path` variable is not NULL, the given config - * file will be also included in the configuration set. On most UNIX - * systems, this file may be found on `$HOME/.gitconfig`. - * - * If the `system_config_path` variable is not NULL, the given config - * file will be also included in the configuration set. On most UNIX - * systems, this file may be found on `$PREFIX/etc/gitconfig`. - * - * The resulting `git_config` instance will query the files in the following - * order: - * - * - Repository configuration file - * - User configuration file - * - System configuration file - * - * The method will fail if any of the passed config files cannot be - * found or accessed. - * - * The returned `git_config` instance is owned by the caller and must - * be manually free'd once it's no longer on use. - * - * @param out the repository's configuration - * @param repo the repository for which to get the config - * @param user_config_path Path to the user config file - * @param system_config_path Path to the system-wide config file - */ -GIT_EXTERN(int) git_repository_config(git_config **out, - git_repository *repo, - const char *user_config_path, - const char *system_config_path); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/revwalk.h b/vendor/libgit2/include/git2/revwalk.h deleted file mode 100644 index b37a16c83..000000000 --- a/vendor/libgit2/include/git2/revwalk.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_revwalk_h__ -#define INCLUDE_git_revwalk_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/revwalk.h - * @brief Git revision traversal routines - * @defgroup git_revwalk Git revision traversal routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Sort the repository contents in no particular ordering; - * this sorting is arbitrary, implementation-specific - * and subject to change at any time. - * This is the default sorting for new walkers. - */ -#define GIT_SORT_NONE (0) - -/** - * Sort the repository contents in topological order - * (parents before children); this sorting mode - * can be combined with time sorting. - */ -#define GIT_SORT_TOPOLOGICAL (1 << 0) - -/** - * Sort the repository contents by commit time; - * this sorting mode can be combined with - * topological sorting. - */ -#define GIT_SORT_TIME (1 << 1) - -/** - * Iterate through the repository contents in reverse - * order; this sorting mode can be combined with - * any of the above. - */ -#define GIT_SORT_REVERSE (1 << 2) - -/** - * Allocate a new revision walker to iterate through a repo. - * - * This revision walker uses a custom memory pool and an internal - * commit cache, so it is relatively expensive to allocate. - * - * For maximum performance, this revision walker should be - * reused for different walks. - * - * This revision walker is *not* thread safe: it may only be - * used to walk a repository on a single thread; however, - * it is possible to have several revision walkers in - * several different threads walking the same repository. - * - * @param walker pointer to the new revision walker - * @param repo the repo to walk through - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_revwalk_new(git_revwalk **walker, git_repository *repo); - -/** - * Reset the revision walker for reuse. - * - * This will clear all the pushed and hidden commits, and - * leave the walker in a blank state (just like at - * creation) ready to receive new commit pushes and - * start a new walk. - * - * The revision walk is automatically reset when a walk - * is over. - * - * @param walker handle to reset. - */ -GIT_EXTERN(void) git_revwalk_reset(git_revwalk *walker); - -/** - * Mark a commit to start traversal from. - * - * The given OID must belong to a commit on the walked - * repository. - * - * The given commit will be used as one of the roots - * when starting the revision walk. At least one commit - * must be pushed the repository before a walk can - * be started. - * - * @param walk the walker being used for the traversal. - * @param oid the oid of the commit to start from. - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_revwalk_push(git_revwalk *walk, const git_oid *oid); - - -/** - * Mark a commit (and its ancestors) uninteresting for the output. - * - * The given OID must belong to a commit on the walked - * repository. - * - * The resolved commit and all its parents will be hidden from the - * output on the revision walk. - * - * @param walk the walker being used for the traversal. - * @param oid the oid of commit that will be ignored during the traversal - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_revwalk_hide(git_revwalk *walk, const git_oid *oid); - -/** - * Get the next commit from the revision walk. - * - * The initial call to this method is *not* blocking when - * iterating through a repo with a time-sorting mode. - * - * Iterating with Topological or inverted modes makes the initial - * call blocking to preprocess the commit list, but this block should be - * mostly unnoticeable on most repositories (topological preprocessing - * times at 0.3s on the git.git repo). - * - * The revision walker is reset when the walk is over. - * - * @param oid Pointer where to store the oid of the next commit - * @param walk the walker to pop the commit from. - * @return GIT_SUCCESS if the next commit was found; - * GIT_EREVWALKOVER if there are no commits left to iterate - */ -GIT_EXTERN(int) git_revwalk_next(git_oid *oid, git_revwalk *walk); - -/** - * Change the sorting mode when iterating through the - * repository's contents. - * - * Changing the sorting mode resets the walker. - * - * @param walk the walker being used for the traversal. - * @param sort_mode combination of GIT_SORT_XXX flags - */ -GIT_EXTERN(void) git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode); - -/** - * Free a revision walker previously allocated. - * - * @param walk traversal handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_revwalk_free(git_revwalk *walk); - -/** - * Return the repository on which this walker - * is operating. - * - * @param walk the revision walker - * @return the repository being walked - */ -GIT_EXTERN(git_repository *) git_revwalk_repository(git_revwalk *walk); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/signature.h b/vendor/libgit2/include/git2/signature.h deleted file mode 100644 index f5d03ac77..000000000 --- a/vendor/libgit2/include/git2/signature.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_signature_h__ -#define INCLUDE_git_signature_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/signature.h - * @brief Git signature creation - * @defgroup git_signature Git signature creation - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new action signature. The signature must be freed - * manually or using git_signature_free - * - * @param sig_out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @param time time when the action happened - * @param offset timezone offset in minutes for the time - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_signature_new(git_signature **sig_out, const char *name, const char *email, git_time_t time, int offset); - -/** - * Create a new action signature with a timestamp of 'now'. The - * signature must be freed manually or using git_signature_free - * - * @param sig_out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_signature_now(git_signature **sig_out, const char *name, const char *email); - - -/** - * Create a copy of an existing signature. - * - * All internal strings are also duplicated. - * @param sig signature to duplicated - * @return a copy of sig, NULL on out of memory - */ -GIT_EXTERN(git_signature *) git_signature_dup(const git_signature *sig); - -/** - * Free an existing signature - * - * @param sig signature to free - */ -GIT_EXTERN(void) git_signature_free(git_signature *sig); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/status.h b/vendor/libgit2/include/git2/status.h deleted file mode 100644 index 7946cc1f3..000000000 --- a/vendor/libgit2/include/git2/status.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_status_h__ -#define INCLUDE_git_status_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/status.h - * @brief Git file status routines - * @defgroup git_status Git file status routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_STATUS_CURRENT 0 -/** Flags for index status */ -#define GIT_STATUS_INDEX_NEW (1 << 0) -#define GIT_STATUS_INDEX_MODIFIED (1 << 1) -#define GIT_STATUS_INDEX_DELETED (1 << 2) - -/** Flags for worktree status */ -#define GIT_STATUS_WT_NEW (1 << 3) -#define GIT_STATUS_WT_MODIFIED (1 << 4) -#define GIT_STATUS_WT_DELETED (1 << 5) - -// TODO Ignored files not handled yet -#define GIT_STATUS_IGNORED (1 << 6) - -/** - * Gather file statuses and run a callback for each one. - * - * The callback is passed the path of the file, the status and the data pointer - * passed to this function. If the callback returns something other than - * GIT_SUCCESS, this function will return that value. - * - * @param repo a repository object - * @param callback the function to call on each file - * @return GIT_SUCCESS or the return value of the callback which did not return 0; - */ -GIT_EXTERN(int) git_status_foreach(git_repository *repo, int (*callback)(const char *, unsigned int, void *), void *payload); - -/** - * Get file status for a single file - * - * @param status_flags the status value - * @param repo a repository object - * @param path the file to retrieve status for, rooted at the repo's workdir - * @return GIT_SUCCESS - */ -GIT_EXTERN(int) git_status_file(unsigned int *status_flags, git_repository *repo, const char *path); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/tag.h b/vendor/libgit2/include/git2/tag.h deleted file mode 100644 index 2b10d4525..000000000 --- a/vendor/libgit2/include/git2/tag.h +++ /dev/null @@ -1,297 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_tag_h__ -#define INCLUDE_git_tag_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/tag.h - * @brief Git tag parsing routines - * @defgroup git_tag Git tag management - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tag object from the repository. - * - * @param tag pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_tag_lookup(git_tag **tag, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)tag, repo, id, (git_otype)GIT_OBJ_TAG); -} - -/** - * Lookup a tag object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param tag pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @param len the length of the short identifier - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_tag_lookup_prefix(git_tag **tag, git_repository *repo, const git_oid *id, unsigned int len) -{ - return git_object_lookup_prefix((git_object **)tag, repo, id, len, (git_otype)GIT_OBJ_TAG); -} - -/** - * Close an open tag - * - * This is a wrapper around git_object_close() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a tag. Failure to do so will cause a memory leak. - * - * @param tag the tag to close - */ - -GIT_INLINE(void) git_tag_close(git_tag *tag) -{ - git_object_close((git_object *) tag); -} - - -/** - * Get the id of a tag. - * - * @param tag a previously loaded tag. - * @return object identity for the tag. - */ -GIT_EXTERN(const git_oid *) git_tag_id(git_tag *tag); - -/** - * Get the tagged object of a tag - * - * This method performs a repository lookup for the - * given object and returns it - * - * @param target pointer where to store the target - * @param tag a previously loaded tag. - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tag_target(git_object **target, git_tag *tag); - -/** - * Get the OID of the tagged object of a tag - * - * @param tag a previously loaded tag. - * @return pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_tag_target_oid(git_tag *tag); - -/** - * Get the type of a tag's tagged object - * - * @param tag a previously loaded tag. - * @return type of the tagged object - */ -GIT_EXTERN(git_otype) git_tag_type(git_tag *tag); - -/** - * Get the name of a tag - * - * @param tag a previously loaded tag. - * @return name of the tag - */ -GIT_EXTERN(const char *) git_tag_name(git_tag *tag); - -/** - * Get the tagger (author) of a tag - * - * @param tag a previously loaded tag. - * @return reference to the tag's author - */ -GIT_EXTERN(const git_signature *) git_tag_tagger(git_tag *tag); - -/** - * Get the message of a tag - * - * @param tag a previously loaded tag. - * @return message of the tag - */ -GIT_EXTERN(const char *) git_tag_message(git_tag *tag); - - -/** - * Create a new tag in the repository from an object - * - * A new reference will also be created pointing to - * this tag object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * @param oid Pointer where to store the OID of the - * newly created tag. If the tag already exists, this parameter - * will be the oid of the existing tag, and the function will - * return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param tagger Signature of the tagger for this tag, and - * of the tagging time - * - * @param message Full message for this tag - * - * @param force Overwrite existing references - * - * @return 0 on success; error code otherwise. - * A tag object is written to the ODB, and a proper reference - * is written in the /refs/tags folder, pointing to it - */ -GIT_EXTERN(int) git_tag_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int force); - -/** - * Create a new tag in the repository from a buffer - * - * @param oid Pointer where to store the OID of the newly created tag - * @param repo Repository where to store the tag - * @param buffer Raw tag data - * @param force Overwrite existing tags - * @return 0 on sucess; error code otherwise - */ -GIT_EXTERN(int) git_tag_create_frombuffer( - git_oid *oid, - git_repository *repo, - const char *buffer, - int force); - -/** - * Create a new lightweight tag pointing at a target object - * - * A new direct reference will be created pointing to - * this target object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * @param oid Pointer where to store the OID of the provided - * target object. If the tag already exists, this parameter - * will be filled with the oid of the existing pointed object - * and the function will return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the lightweight tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param force Overwrite existing references - * - * @return 0 on success; error code otherwise. - * A proper reference is written in the /refs/tags folder, - * pointing to the provided target object - */ -GIT_EXTERN(int) git_tag_create_lightweight( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - int force); - -/** - * Delete an existing tag reference. - * - * @param repo Repository where lives the tag - * - * @param tag_name Name of the tag to be deleted; - * this name is validated for consistency. - * - * @return 0 on success; error code otherwise. - */ -GIT_EXTERN(int) git_tag_delete( - git_repository *repo, - const char *tag_name); - -/** - * Fill a list with all the tags in the Repository - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param repo Repository where to find the tags - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tag_list( - git_strarray *tag_names, - git_repository *repo); - -/** - * Fill a list with all the tags in the Repository - * which name match a defined pattern - * - * If an empty pattern is provided, all the tags - * will be returned. - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param pattern Standard fnmatch pattern - * @param repo Repository where to find the tags - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tag_list_match( - git_strarray *tag_names, - const char *pattern, - git_repository *repo); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/thread-utils.h b/vendor/libgit2/include/git2/thread-utils.h deleted file mode 100644 index 62e6199a4..000000000 --- a/vendor/libgit2/include/git2/thread-utils.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_thread_utils_h__ -#define INCLUDE_git_thread_utils_h__ - -/* - * How TLS works is compiler+platform dependant - * Sources: http://en.wikipedia.org/wiki/Thread-Specific_Storage - * http://predef.sourceforge.net/precomp.html - */ - -#ifdef GIT_THREADS -# define GIT_HAS_TLS 1 - -/* No TLS in Cygwin */ -# if defined(__CHECKER__) || defined(__CYGWIN__) -# undef GIT_HAS_TLS -# define GIT_TLS - -/* No TLS in Mach binaries for Mac OS X */ -# elif defined(__APPLE__) && defined(__MACH__) -# undef GIT_TLS -# define GIT_TLS - -/* Normal TLS for GCC */ -# elif defined(__GNUC__) || \ - defined(__SUNPRO_C) || \ - defined(__SUNPRO_CC) || \ - defined(__xlc__) || \ - defined(__xlC__) -# define GIT_TLS __thread - -/* ICC may run on Windows or Linux */ -# elif defined(__INTEL_COMPILER) -# if defined(_WIN32) || defined(_WIN32_CE) -# define GIT_TLS __declspec(thread) -# else -# define GIT_TLS __thread -# endif - -/* Declspec for MSVC in Win32 */ -# elif defined(_WIN32) || \ - defined(_WIN32_CE) || \ - defined(__BORLANDC__) -# define GIT_TLS __declspec(thread) - -/* Other platform; no TLS */ -# else -# undef GIT_HAS_TLS -# define GIT_TLS /* nothing: tls vars are thread-global */ -# endif -#else /* Disable TLS if libgit2 is not threadsafe */ -# define GIT_TLS -#endif /* GIT_THREADS */ - -#endif /* INCLUDE_git_thread_utils_h__ */ diff --git a/vendor/libgit2/include/git2/transport.h b/vendor/libgit2/include/git2/transport.h deleted file mode 100644 index d19eb8a88..000000000 --- a/vendor/libgit2/include/git2/transport.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_transport_h__ -#define INCLUDE_git_transport_h__ - -#include "common.h" -#include "types.h" -#include "net.h" - -/** - * @file git2/transport.h - * @brief Git protocol transport abstraction - * @defgroup git_transport Git protocol transport abstraction - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Get the appropriate transport for an URL. - * @param tranport the transport for the url - * @param url the url of the repo - */ -GIT_EXTERN(int) git_transport_new(git_transport **transport, const char *url); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/tree.h b/vendor/libgit2/include/git2/tree.h deleted file mode 100644 index 5656f48f3..000000000 --- a/vendor/libgit2/include/git2/tree.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_tree_h__ -#define INCLUDE_git_tree_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/tree.h - * @brief Git tree parsing, loading routines - * @defgroup git_tree Git tree parsing, loading routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tree object from the repository. - * - * @param tree pointer to the looked up tree - * @param repo the repo to use when locating the tree. - * @param id identity of the tree to locate. - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_tree_lookup(git_tree **tree, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)tree, repo, id, GIT_OBJ_TREE); -} - -/** - * Lookup a tree object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param tree pointer to the looked up tree - * @param repo the repo to use when locating the tree. - * @param id identity of the tree to locate. - * @param len the length of the short identifier - * @return 0 on success; error code otherwise - */ -GIT_INLINE(int) git_tree_lookup_prefix(git_tree **tree, git_repository *repo, const git_oid *id, unsigned int len) -{ - return git_object_lookup_prefix((git_object **)tree, repo, id, len, GIT_OBJ_TREE); -} - -/** - * Close an open tree - * - * This is a wrapper around git_object_close() - * - * IMPORTANT: - * It *is* necessary to call this method when you stop - * using a tree. Failure to do so will cause a memory leak. - * - * @param tree the tree to close - */ - -GIT_INLINE(void) git_tree_close(git_tree *tree) -{ - git_object_close((git_object *) tree); -} - - -/** - * Get the id of a tree. - * - * @param tree a previously loaded tree. - * @return object identity for the tree. - */ -GIT_EXTERN(const git_oid *) git_tree_id(git_tree *tree); - -/** - * Get the number of entries listed in a tree - * - * @param tree a previously loaded tree. - * @return the number of entries in the tree - */ -GIT_EXTERN(unsigned int) git_tree_entrycount(git_tree *tree); - -/** - * Lookup a tree entry by its filename - * - * @param tree a previously loaded tree. - * @param filename the filename of the desired entry - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byname(git_tree *tree, const char *filename); - -/** - * Lookup a tree entry by its position in the tree - * - * @param tree a previously loaded tree. - * @param idx the position in the entry list - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byindex(git_tree *tree, unsigned int idx); - -/** - * Get the UNIX file attributes of a tree entry - * - * @param entry a tree entry - * @return attributes as an integer - */ -GIT_EXTERN(unsigned int) git_tree_entry_attributes(const git_tree_entry *entry); - -/** - * Get the filename of a tree entry - * - * @param entry a tree entry - * @return the name of the file - */ -GIT_EXTERN(const char *) git_tree_entry_name(const git_tree_entry *entry); - -/** - * Get the id of the object pointed by the entry - * - * @param entry a tree entry - * @return the oid of the object - */ -GIT_EXTERN(const git_oid *) git_tree_entry_id(const git_tree_entry *entry); - -/** - * Get the type of the object pointed by the entry - * - * @param entry a tree entry - * @return the type of the pointed object - */ -GIT_EXTERN(git_otype) git_tree_entry_type(const git_tree_entry *entry); - -/** - * Convert a tree entry to the git_object it points too. - * - * @param object pointer to the converted object - * @param repo repository where to lookup the pointed object - * @param entry a tree entry - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tree_entry_2object(git_object **object_out, git_repository *repo, const git_tree_entry *entry); - -/** - * Write a tree to the ODB from the index file - * - * This method will scan the index and write a representation - * of its current state back to disk; it recursively creates - * tree objects for each of the subtrees stored in the index, - * but only returns the OID of the root tree. This is the OID - * that can be used e.g. to create a commit. - * - * The index instance cannot be bare, and needs to be associated - * to an existing repository. - * - * @param oid Pointer where to store the written tree - * @param index Index to write - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tree_create_fromindex(git_oid *oid, git_index *index); - -/** - * Create a new tree builder. - * - * The tree builder can be used to create or modify - * trees in memory and write them as tree objects to the - * database. - * - * If the `source` parameter is not NULL, the tree builder - * will be initialized with the entries of the given tree. - * - * If the `source` parameter is NULL, the tree builder will - * have no entries and will have to be filled manually. - * - * @param builder_p Pointer where to store the tree builder - * @param source Source tree to initialize the builder (optional) - * @return 0 on sucess; error code otherwise - */ -GIT_EXTERN(int) git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source); - -/** - * Clear all the entires in the builder - * - * @param bld Builder to clear - */ -GIT_EXTERN(void) git_treebuilder_clear(git_treebuilder *bld); - -/** - * Free a tree builder - * - * This will clear all the entries and free to builder. - * Failing to free the builder after you're done using it - * will result in a memory leak - * - * @param bld Builder to free - */ -GIT_EXTERN(void) git_treebuilder_free(git_treebuilder *bld); - -/** - * Get an entry from the builder from its filename - * - * The returned entry is owned by the builder and should - * not be freed manually. - * - * @param bld Tree builder - * @param filename Name of the entry - * @return pointer to the entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_treebuilder_get(git_treebuilder *bld, const char *filename); - -/** - * Add or update an entry to the builder - * - * Insert a new entry for `filename` in the builder with the - * given attributes. - * - * if an entry named `filename` already exists, its attributes - * will be updated with the given ones. - * - * The optional pointer `entry_out` can be used to retrieve a - * pointer to the newly created/updated entry. - * - * @param entry_out Pointer to store the entry (optional) - * @param bld Tree builder - * @param filename Filename of the entry - * @param id SHA1 oid of the entry - * @param attributes Folder attributes of the entry - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld, const char *filename, const git_oid *id, unsigned int attributes); - -/** - * Remove an entry from the builder by its filename - * - * @param bld Tree builder - * @param filename Filename of the entry to remove - */ -GIT_EXTERN(int) git_treebuilder_remove(git_treebuilder *bld, const char *filename); - -/** - * Filter the entries in the tree - * - * The `filter` callback will be called for each entry - * in the tree with a pointer to the entry and the - * provided `payload`: if the callback returns 1, the - * entry will be filtered (removed from the builder). - * - * @param bld Tree builder - * @param filter Callback to filter entries - */ -GIT_EXTERN(void) git_treebuilder_filter(git_treebuilder *bld, int (*filter)(const git_tree_entry *, void *), void *payload); - -/** - * Write the contents of the tree builder as a tree object - * - * The tree builder will be written to the given `repo`, and - * it's identifying SHA1 hash will be stored in the `oid` - * pointer. - * - * @param oid Pointer where to store the written OID - * @param repo Repository where to store the object - * @param bld Tree builder to write - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *bld); - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/include/git2/types.h b/vendor/libgit2/include/git2/types.h deleted file mode 100644 index b9db4e529..000000000 --- a/vendor/libgit2/include/git2/types.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_types_h__ -#define INCLUDE_git_types_h__ - -#include "common.h" - -/** - * @file git2/types.h - * @brief libgit2 base & compatibility types - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Cross-platform compatibility types for off_t / time_t - * - * NOTE: This needs to be in a public header so that both the library - * implementation and client applications both agree on the same types. - * Otherwise we get undefined behavior. - * - * Use the "best" types that each platform provides. Currently we truncate - * these intermediate representations for compatibility with the git ABI, but - * if and when it changes to support 64 bit types, our code will naturally - * adapt. - * NOTE: These types should match those that are returned by our internal - * stat() functions, for all platforms. - */ -#include - -#if defined(_MSC_VER) - -typedef __int64 git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__MINGW32__) - -typedef off64_t git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__HAIKU__) - -typedef __haiku_std_int64 git_off_t; -typedef __haiku_std_int64 git_time_t; - -#else /* POSIX */ - -/* - * Note: Can't use off_t since if a client program includes - * before us (directly or indirectly), they'll get 32 bit off_t in their client - * app, even though /we/ define _FILE_OFFSET_BITS=64. - */ -typedef int64_t git_off_t; -typedef int64_t git_time_t; - -#endif - -/** Basic type (loose or packed) of any Git object. */ -typedef enum { - GIT_OBJ_ANY = -2, /**< Object can be any of the following */ - GIT_OBJ_BAD = -1, /**< Object is invalid. */ - GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */ - GIT_OBJ_COMMIT = 1, /**< A commit object. */ - GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */ - GIT_OBJ_BLOB = 3, /**< A file revision object. */ - GIT_OBJ_TAG = 4, /**< An annotated tag object. */ - GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */ - GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */ - GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */ -} git_otype; - -/** An open object database handle. */ -typedef struct git_odb git_odb; - -/** A custom backend in an ODB */ -typedef struct git_odb_backend git_odb_backend; - -/** An object read from the ODB */ -typedef struct git_odb_object git_odb_object; - -/** A stream to read/write from the ODB */ -typedef struct git_odb_stream git_odb_stream; - -/** - * Representation of an existing git repository, - * including all its object contents - */ -typedef struct git_repository git_repository; - -/** Representation of a generic object in a repository */ -typedef struct git_object git_object; - -/** Representation of an in-progress walk through the commits in a repo */ -typedef struct git_revwalk git_revwalk; - -/** Parsed representation of a tag object. */ -typedef struct git_tag git_tag; - -/** In-memory representation of a blob object. */ -typedef struct git_blob git_blob; - -/** Parsed representation of a commit object. */ -typedef struct git_commit git_commit; - -/** Representation of each one of the entries in a tree object. */ -typedef struct git_tree_entry git_tree_entry; - -/** Representation of a tree object. */ -typedef struct git_tree git_tree; - -/** Constructor for in-memory trees */ -typedef struct git_treebuilder git_treebuilder; - -/** Memory representation of an index file. */ -typedef struct git_index git_index; - -/** Memory representation of a set of config files */ -typedef struct git_config git_config; - -/** Interface to access a configuration file */ -typedef struct git_config_file git_config_file; - -/** Representation of a reference log entry */ -typedef struct git_reflog_entry git_reflog_entry; - -/** Representation of a reference log */ -typedef struct git_reflog git_reflog; - -/** Time in a signature */ -typedef struct git_time { - git_time_t time; /** time in seconds from epoch */ - int offset; /** timezone offset, in minutes */ -} git_time; - -/** An action signature (e.g. for committers, taggers, etc) */ -typedef struct git_signature { - char *name; /** full name of the author */ - char *email; /** email of the author */ - git_time when; /** time when the action happened */ -} git_signature; - -/** In-memory representation of a reference. */ -typedef struct git_reference git_reference; - -/** Basic type of any Git reference. */ -typedef enum { - GIT_REF_INVALID = 0, /** Invalid reference */ - GIT_REF_OID = 1, /** A reference which points at an object id */ - GIT_REF_SYMBOLIC = 2, /** A reference which points at another reference */ - GIT_REF_PACKED = 4, - GIT_REF_HAS_PEEL = 8, - GIT_REF_LISTALL = GIT_REF_OID|GIT_REF_SYMBOLIC|GIT_REF_PACKED, -} git_rtype; - - -typedef struct git_refspec git_refspec; -typedef struct git_remote git_remote; - -/** A transport to use */ -typedef struct git_transport git_transport; - -typedef int (*git_transport_cb)(git_transport **transport); - -typedef struct git_remote_head git_remote_head; -typedef struct git_headarray git_headarray; - -/** @} */ -GIT_END_DECL - -#endif diff --git a/vendor/libgit2/include/git2/zlib.h b/vendor/libgit2/include/git2/zlib.h deleted file mode 100644 index 493566340..000000000 --- a/vendor/libgit2/include/git2/zlib.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDE_git_zlib_h__ -#define INCLUDE_git_zlib_h__ - -#include - -/** - * @file git2/zlib.h - * @brief Git data compression routines - * @defgroup git_zlib Git data compression routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200 -/** - * deflateBound returns an upper bound on the compressed size. - * - * This is a stub function used when zlib does not supply the - * deflateBound() implementation itself. - * - * @param stream the stream pointer. - * @param s total length of the source data (in bytes). - * @return maximum length of the compressed data. - */ -GIT_INLINE(size_t) deflateBound(z_streamp stream, size_t s) -{ - return (s + ((s + 7) >> 3) + ((s + 63) >> 6) + 11); -} -#endif - -/** @} */ -GIT_END_DECL -#endif diff --git a/vendor/libgit2/libgit2.pc.in b/vendor/libgit2/libgit2.pc.in deleted file mode 100644 index 6165ad678..000000000 --- a/vendor/libgit2/libgit2.pc.in +++ /dev/null @@ -1,9 +0,0 @@ -libdir=@CMAKE_INSTALL_PREFIX@/@INSTALL_LIB@ -includedir=@CMAKE_INSTALL_PREFIX@/@INSTALL_INC@ - -Name: libgit2 -Description: The git library, take 2 -Version: @LIBGIT2_VERSION_STRING@ -Requires: libcrypto -Libs: -L${libdir} -lgit2 -lz -lcrypto -Cflags: -I${includedir} diff --git a/vendor/libgit2/src/backends/hiredis.c b/vendor/libgit2/src/backends/hiredis.c deleted file mode 100644 index 707412bf6..000000000 --- a/vendor/libgit2/src/backends/hiredis.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/object.h" -#include "hash.h" -#include "odb.h" - -#include "git2/odb_backend.h" - -#ifdef GIT2_HIREDIS_BACKEND - -#include - -typedef struct { - git_odb_backend parent; - - redisContext *db; -} hiredis_backend; - -int hiredis_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *_backend, const git_oid *oid) { - hiredis_backend *backend; - int error; - redisReply *reply; - - assert(len_p && type_p && _backend && oid); - - backend = (hiredis_backend *) _backend; - error = GIT_ERROR; - - reply = redisCommand(backend->db, "HMGET %b %s %s", oid->id, GIT_OID_RAWSZ, - "type", "size"); - - if (reply->type == REDIS_REPLY_ARRAY) { - if (reply->element[0]->type != REDIS_REPLY_NIL && - reply->element[0]->type != REDIS_REPLY_NIL) { - *type_p = (git_otype) atoi(reply->element[0]->str); - *len_p = (size_t) atoi(reply->element[1]->str); - error = GIT_SUCCESS; - } else { - error = GIT_ENOTFOUND; - } - } else { - error = GIT_ERROR; - } - - freeReplyObject(reply); - return error; -} - -int hiredis_backend__read(void **data_p, size_t *len_p, git_otype *type_p, git_odb_backend *_backend, const git_oid *oid) { - hiredis_backend *backend; - int error; - redisReply *reply; - - assert(data_p && len_p && type_p && _backend && oid); - - backend = (hiredis_backend *) _backend; - error = GIT_ERROR; - - reply = redisCommand(backend->db, "HMGET %b %s %s %s", oid->id, GIT_OID_RAWSZ, - "type", "size", "data"); - - if (reply->type == REDIS_REPLY_ARRAY) { - if (reply->element[0]->type != REDIS_REPLY_NIL && - reply->element[1]->type != REDIS_REPLY_NIL && - reply->element[2]->type != REDIS_REPLY_NIL) { - *type_p = (git_otype) atoi(reply->element[0]->str); - *len_p = (size_t) atoi(reply->element[1]->str); - *data_p = git__malloc(*len_p); - if (*data_p == NULL) { - error = GIT_ENOMEM; - } else { - memcpy(*data_p, reply->element[2]->str, *len_p); - error = GIT_SUCCESS; - } - } else { - error = GIT_ENOTFOUND; - } - } else { - error = GIT_ERROR; - } - - freeReplyObject(reply); - return error; -} - -int hiredis_backend__exists(git_odb_backend *_backend, const git_oid *oid) { - hiredis_backend *backend; - int found; - redisReply *reply; - - assert(_backend && oid); - - backend = (hiredis_backend *) _backend; - found = 0; - - reply = redisCommand(backend->db, "exists %b", oid->id, GIT_OID_RAWSZ); - if (reply->type != REDIS_REPLY_NIL && reply->type != REDIS_REPLY_ERROR) - found = 1; - - - freeReplyObject(reply); - return found; -} - -int hiredis_backend__write(git_oid *id, git_odb_backend *_backend, const void *data, size_t len, git_otype type) { - hiredis_backend *backend; - int error; - redisReply *reply; - - assert(id && _backend && data); - - backend = (hiredis_backend *) _backend; - error = GIT_ERROR; - - if ((error = git_odb_hash(id, data, len, type)) < 0) - return error; - - reply = redisCommand(backend->db, "HMSET %b " - "type %d " - "size %d " - "data %b ", id->id, GIT_OID_RAWSZ, - (int) type, len, data, len); - error = reply->type == REDIS_REPLY_ERROR ? GIT_ERROR : GIT_SUCCESS; - - freeReplyObject(reply); - return error; -} - -void hiredis_backend__free(git_odb_backend *_backend) { - hiredis_backend *backend; - assert(_backend); - backend = (hiredis_backend *) _backend; - - redisFree(backend->db); - - free(backend); -} - -int git_odb_backend_hiredis(git_odb_backend **backend_out, const char *host, int port) { - hiredis_backend *backend; - - backend = git__calloc(1, sizeof (hiredis_backend)); - if (backend == NULL) - return GIT_ENOMEM; - - - backend->db = redisConnect(host, port); - if (backend->db->err) - goto cleanup; - - backend->parent.read = &hiredis_backend__read; - backend->parent.read_header = &hiredis_backend__read_header; - backend->parent.write = &hiredis_backend__write; - backend->parent.exists = &hiredis_backend__exists; - backend->parent.free = &hiredis_backend__free; - - *backend_out = (git_odb_backend *) backend; - - return GIT_SUCCESS; -cleanup: - free(backend); - return GIT_ERROR; -} - -#else - -int git_odb_backend_hiredis(git_odb_backend ** GIT_UNUSED(backend_out), - const char *GIT_UNUSED(host), int GIT_UNUSED(port)) { - GIT_UNUSED_ARG(backend_out); - GIT_UNUSED_ARG(host); - GIT_UNUSED_ARG(port); - return GIT_ENOTIMPLEMENTED; -} - - -#endif /* HAVE_HIREDIS */ diff --git a/vendor/libgit2/src/backends/sqlite.c b/vendor/libgit2/src/backends/sqlite.c deleted file mode 100644 index a4c6d4825..000000000 --- a/vendor/libgit2/src/backends/sqlite.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/object.h" -#include "hash.h" -#include "odb.h" - -#include "git2/odb_backend.h" - -#ifdef GIT2_SQLITE_BACKEND - -#include - -#define GIT2_TABLE_NAME "git2_odb" - -typedef struct { - git_odb_backend parent; - sqlite3 *db; - sqlite3_stmt *st_read; - sqlite3_stmt *st_write; - sqlite3_stmt *st_read_header; -} sqlite_backend; - -int sqlite_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *_backend, const git_oid *oid) -{ - sqlite_backend *backend; - int error; - - assert(len_p && type_p && _backend && oid); - - backend = (sqlite_backend *)_backend; - error = GIT_ERROR; - - if (sqlite3_bind_text(backend->st_read_header, 1, (char *)oid->id, 20, SQLITE_TRANSIENT) == SQLITE_OK) { - if (sqlite3_step(backend->st_read_header) == SQLITE_ROW) { - *type_p = (git_otype)sqlite3_column_int(backend->st_read_header, 0); - *len_p = (size_t)sqlite3_column_int(backend->st_read_header, 1); - assert(sqlite3_step(backend->st_read_header) == SQLITE_DONE); - error = GIT_SUCCESS; - } else { - error = GIT_ENOTFOUND; - } - } - - sqlite3_reset(backend->st_read_header); - return error; -} - - -int sqlite_backend__read(void **data_p, size_t *len_p, git_otype *type_p, git_odb_backend *_backend, const git_oid *oid) -{ - sqlite_backend *backend; - int error; - - assert(data_p && len_p && type_p && _backend && oid); - - backend = (sqlite_backend *)_backend; - error = GIT_ERROR; - - if (sqlite3_bind_text(backend->st_read, 1, (char *)oid->id, 20, SQLITE_TRANSIENT) == SQLITE_OK) { - if (sqlite3_step(backend->st_read) == SQLITE_ROW) { - *type_p = (git_otype)sqlite3_column_int(backend->st_read, 0); - *len_p = (size_t)sqlite3_column_int(backend->st_read, 1); - *data_p = git__malloc(*len_p); - - if (*data_p == NULL) { - error = GIT_ENOMEM; - } else { - memcpy(*data_p, sqlite3_column_blob(backend->st_read, 2), *len_p); - error = GIT_SUCCESS; - } - - assert(sqlite3_step(backend->st_read) == SQLITE_DONE); - } else { - error = GIT_ENOTFOUND; - } - } - - sqlite3_reset(backend->st_read); - return error; -} - -int sqlite_backend__exists(git_odb_backend *_backend, const git_oid *oid) -{ - sqlite_backend *backend; - int found; - - assert(_backend && oid); - - backend = (sqlite_backend *)_backend; - found = 0; - - if (sqlite3_bind_text(backend->st_read_header, 1, (char *)oid->id, 20, SQLITE_TRANSIENT) == SQLITE_OK) { - if (sqlite3_step(backend->st_read_header) == SQLITE_ROW) { - found = 1; - assert(sqlite3_step(backend->st_read_header) == SQLITE_DONE); - } - } - - sqlite3_reset(backend->st_read_header); - return found; -} - - -int sqlite_backend__write(git_oid *id, git_odb_backend *_backend, const void *data, size_t len, git_otype type) -{ - int error; - sqlite_backend *backend; - - assert(id && _backend && data); - - backend = (sqlite_backend *)_backend; - - if ((error = git_odb_hash(id, data, len, type)) < 0) - return error; - - error = SQLITE_ERROR; - - if (sqlite3_bind_text(backend->st_write, 1, (char *)id->id, 20, SQLITE_TRANSIENT) == SQLITE_OK && - sqlite3_bind_int(backend->st_write, 2, (int)type) == SQLITE_OK && - sqlite3_bind_int(backend->st_write, 3, len) == SQLITE_OK && - sqlite3_bind_blob(backend->st_write, 4, data, len, SQLITE_TRANSIENT) == SQLITE_OK) { - error = sqlite3_step(backend->st_write); - } - - sqlite3_reset(backend->st_write); - return (error == SQLITE_DONE) ? GIT_SUCCESS : GIT_ERROR; -} - - -void sqlite_backend__free(git_odb_backend *_backend) -{ - sqlite_backend *backend; - assert(_backend); - backend = (sqlite_backend *)_backend; - - sqlite3_finalize(backend->st_read); - sqlite3_finalize(backend->st_read_header); - sqlite3_finalize(backend->st_write); - sqlite3_close(backend->db); - - free(backend); -} - -static int create_table(sqlite3 *db) -{ - static const char *sql_creat = - "CREATE TABLE '" GIT2_TABLE_NAME "' (" - "'oid' CHARACTER(20) PRIMARY KEY NOT NULL," - "'type' INTEGER NOT NULL," - "'size' INTEGER NOT NULL," - "'data' BLOB);"; - - if (sqlite3_exec(db, sql_creat, NULL, NULL, NULL) != SQLITE_OK) - return GIT_ERROR; - - return GIT_SUCCESS; -} - -static int init_db(sqlite3 *db) -{ - static const char *sql_check = - "SELECT name FROM sqlite_master WHERE type='table' AND name='" GIT2_TABLE_NAME "';"; - - sqlite3_stmt *st_check; - int error; - - if (sqlite3_prepare_v2(db, sql_check, -1, &st_check, NULL) != SQLITE_OK) - return GIT_ERROR; - - switch (sqlite3_step(st_check)) { - case SQLITE_DONE: - /* the table was not found */ - error = create_table(db); - break; - - case SQLITE_ROW: - /* the table was found */ - error = GIT_SUCCESS; - break; - - default: - error = GIT_ERROR; - break; - } - - sqlite3_finalize(st_check); - return error; -} - -static int init_statements(sqlite_backend *backend) -{ - static const char *sql_read = - "SELECT type, size, data FROM '" GIT2_TABLE_NAME "' WHERE oid = ?;"; - - static const char *sql_read_header = - "SELECT type, size FROM '" GIT2_TABLE_NAME "' WHERE oid = ?;"; - - static const char *sql_write = - "INSERT OR IGNORE INTO '" GIT2_TABLE_NAME "' VALUES (?, ?, ?, ?);"; - - if (sqlite3_prepare_v2(backend->db, sql_read, -1, &backend->st_read, NULL) != SQLITE_OK) - return GIT_ERROR; - - if (sqlite3_prepare_v2(backend->db, sql_read_header, -1, &backend->st_read_header, NULL) != SQLITE_OK) - return GIT_ERROR; - - if (sqlite3_prepare_v2(backend->db, sql_write, -1, &backend->st_write, NULL) != SQLITE_OK) - return GIT_ERROR; - - return GIT_SUCCESS; -} - -int git_odb_backend_sqlite(git_odb_backend **backend_out, const char *sqlite_db) -{ - sqlite_backend *backend; - int error; - - backend = git__calloc(1, sizeof(sqlite_backend)); - if (backend == NULL) - return GIT_ENOMEM; - - if (sqlite3_open(sqlite_db, &backend->db) != SQLITE_OK) - goto cleanup; - - error = init_db(backend->db); - if (error < 0) - goto cleanup; - - error = init_statements(backend); - if (error < 0) - goto cleanup; - - backend->parent.read = &sqlite_backend__read; - backend->parent.read_header = &sqlite_backend__read_header; - backend->parent.write = &sqlite_backend__write; - backend->parent.exists = &sqlite_backend__exists; - backend->parent.free = &sqlite_backend__free; - - *backend_out = (git_odb_backend *)backend; - return GIT_SUCCESS; - -cleanup: - sqlite_backend__free((git_odb_backend *)backend); - return GIT_ERROR; -} - -#else - -int git_odb_backend_sqlite(git_odb_backend **GIT_UNUSED(backend_out), const char *GIT_UNUSED(sqlite_db)) -{ - GIT_UNUSED_ARG(backend_out); - GIT_UNUSED_ARG(sqlite_db); - return GIT_ENOTIMPLEMENTED; -} - -#endif /* HAVE_SQLITE3 */ diff --git a/vendor/libgit2/src/blob.c b/vendor/libgit2/src/blob.c deleted file mode 100644 index b8282e505..000000000 --- a/vendor/libgit2/src/blob.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/common.h" -#include "git2/object.h" -#include "git2/repository.h" - -#include "common.h" -#include "blob.h" - -const void *git_blob_rawcontent(git_blob *blob) -{ - assert(blob); - return blob->odb_object->raw.data; -} - -int git_blob_rawsize(git_blob *blob) -{ - assert(blob); - return blob->odb_object->raw.len; -} - -void git_blob__free(git_blob *blob) -{ - git_odb_object_close(blob->odb_object); - free(blob); -} - -int git_blob__parse(git_blob *blob, git_odb_object *odb_obj) -{ - assert(blob); - git_cached_obj_incref((git_cached_obj *)odb_obj); - blob->odb_object = odb_obj; - return GIT_SUCCESS; -} - -int git_blob_create_frombuffer(git_oid *oid, git_repository *repo, const void *buffer, size_t len) -{ - int error; - git_odb_stream *stream; - - if ((error = git_odb_open_wstream(&stream, repo->db, len, GIT_OBJ_BLOB)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to create blob"); - - if ((error = stream->write(stream, buffer, len)) < GIT_SUCCESS) { - stream->free(stream); - return error; - } - - error = stream->finalize_write(oid, stream); - stream->free(stream); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create blob"); - - return GIT_SUCCESS; -} - -int git_blob_create_fromfile(git_oid *oid, git_repository *repo, const char *path) -{ - int error, islnk; - int fd = 0; - char full_path[GIT_PATH_MAX]; - char buffer[2048]; - git_off_t size; - git_odb_stream *stream; - struct stat st; - - if (repo->path_workdir == NULL) - return git__throw(GIT_ENOTFOUND, "Failed to create blob. (No working directory found)"); - - git_path_join(full_path, repo->path_workdir, path); - - error = p_lstat(full_path, &st); - if (error < 0) { - return git__throw(GIT_EOSERR, "Failed to stat blob. %s", strerror(errno)); - } - - islnk = S_ISLNK(st.st_mode); - size = st.st_size; - - if (!islnk) - if ((fd = p_open(full_path, O_RDONLY)) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to create blob. Could not open '%s'", full_path); - - if ((error = git_odb_open_wstream(&stream, repo->db, (size_t)size, GIT_OBJ_BLOB)) < GIT_SUCCESS) { - if (!islnk) - p_close(fd); - return git__rethrow(error, "Failed to create blob"); - } - - while (size > 0) { - ssize_t read_len; - - if (!islnk) - read_len = p_read(fd, buffer, sizeof(buffer)); - else - read_len = p_readlink(full_path, buffer, sizeof(buffer)); - - if (read_len < 0) { - if (!islnk) - p_close(fd); - stream->free(stream); - return git__throw(GIT_EOSERR, "Failed to create blob. Can't read full file"); - } - - stream->write(stream, buffer, read_len); - size -= read_len; - } - - error = stream->finalize_write(oid, stream); - stream->free(stream); - if (!islnk) - p_close(fd); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create blob"); -} - diff --git a/vendor/libgit2/src/blob.h b/vendor/libgit2/src/blob.h deleted file mode 100644 index 4300d7e54..000000000 --- a/vendor/libgit2/src/blob.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef INCLUDE_blob_h__ -#define INCLUDE_blob_h__ - -#include "git2/blob.h" -#include "repository.h" -#include "odb.h" -#include "fileops.h" - -struct git_blob { - git_object object; - git_odb_object *odb_object; -}; - -void git_blob__free(git_blob *blob); -int git_blob__parse(git_blob *blob, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/block-sha1/sha1.c b/vendor/libgit2/src/block-sha1/sha1.c deleted file mode 100644 index 8c1460102..000000000 --- a/vendor/libgit2/src/block-sha1/sha1.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * SHA1 routine optimized to do word accesses rather than byte accesses, - * and to avoid unnecessary copies into the context array. - * - * This was initially based on the Mozilla SHA1 implementation, although - * none of the original Mozilla code remains. - */ - -#include "common.h" -#include "sha1.h" - -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -/* - * Force usage of rol or ror by selecting the one with the smaller constant. - * It _can_ generate slightly smaller code (a constant of 1 is special), but - * perhaps more importantly it's possibly faster on any uarch that does a - * rotate with a loop. - */ - -#define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; }) -#define SHA_ROL(x,n) SHA_ASM("rol", x, n) -#define SHA_ROR(x,n) SHA_ASM("ror", x, n) - -#else - -#define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r))) -#define SHA_ROL(X,n) SHA_ROT(X,n,32-(n)) -#define SHA_ROR(X,n) SHA_ROT(X,32-(n),n) - -#endif - -/* - * If you have 32 registers or more, the compiler can (and should) - * try to change the array[] accesses into registers. However, on - * machines with less than ~25 registers, that won't really work, - * and at least gcc will make an unholy mess of it. - * - * So to avoid that mess which just slows things down, we force - * the stores to memory to actually happen (we might be better off - * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as - * suggested by Artur Skawina - that will also make gcc unable to - * try to do the silly "optimize away loads" part because it won't - * see what the value will be). - * - * Ben Herrenschmidt reports that on PPC, the C version comes close - * to the optimized asm with this (ie on PPC you don't want that - * 'volatile', since there are lots of registers). - * - * On ARM we get the best code generation by forcing a full memory barrier - * between each SHA_ROUND, otherwise gcc happily get wild with spilling and - * the stack frame size simply explode and performance goes down the drain. - */ - -#if defined(__i386__) || defined(__x86_64__) - #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val)) -#elif defined(__GNUC__) && defined(__arm__) - #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) -#else - #define setW(x, val) (W(x) = (val)) -#endif - -/* - * Performance might be improved if the CPU architecture is OK with - * unaligned 32-bit loads and a fast ntohl() is available. - * Otherwise fall back to byte loads and shifts which is portable, - * and is faster on architectures with memory alignment issues. - */ - -#if defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) || \ - defined(__ppc__) || defined(__ppc64__) || \ - defined(__powerpc__) || defined(__powerpc64__) || \ - defined(__s390__) || defined(__s390x__) - -#define get_be32(p) ntohl(*(unsigned int *)(p)) -#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) - -#else - -#define get_be32(p) ( \ - (*((unsigned char *)(p) + 0) << 24) | \ - (*((unsigned char *)(p) + 1) << 16) | \ - (*((unsigned char *)(p) + 2) << 8) | \ - (*((unsigned char *)(p) + 3) << 0) ) -#define put_be32(p, v) do { \ - unsigned int __v = (v); \ - *((unsigned char *)(p) + 0) = __v >> 24; \ - *((unsigned char *)(p) + 1) = __v >> 16; \ - *((unsigned char *)(p) + 2) = __v >> 8; \ - *((unsigned char *)(p) + 3) = __v >> 0; } while (0) - -#endif - -/* This "rolls" over the 512-bit array */ -#define W(x) (array[(x)&15]) - -/* - * Where do we get the source from? The first 16 iterations get it from - * the input data, the next mix it from the 512-bit array. - */ -#define SHA_SRC(t) get_be32(data + t) -#define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) - -#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ - unsigned int TEMP = input(t); setW(t, TEMP); \ - E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \ - B = SHA_ROR(B, 2); } while (0) - -#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) -#define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) -#define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) - -static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data) -{ - unsigned int A,B,C,D,E; - unsigned int array[16]; - - A = ctx->H[0]; - B = ctx->H[1]; - C = ctx->H[2]; - D = ctx->H[3]; - E = ctx->H[4]; - - /* Round 1 - iterations 0-16 take their input from 'data' */ - T_0_15( 0, A, B, C, D, E); - T_0_15( 1, E, A, B, C, D); - T_0_15( 2, D, E, A, B, C); - T_0_15( 3, C, D, E, A, B); - T_0_15( 4, B, C, D, E, A); - T_0_15( 5, A, B, C, D, E); - T_0_15( 6, E, A, B, C, D); - T_0_15( 7, D, E, A, B, C); - T_0_15( 8, C, D, E, A, B); - T_0_15( 9, B, C, D, E, A); - T_0_15(10, A, B, C, D, E); - T_0_15(11, E, A, B, C, D); - T_0_15(12, D, E, A, B, C); - T_0_15(13, C, D, E, A, B); - T_0_15(14, B, C, D, E, A); - T_0_15(15, A, B, C, D, E); - - /* Round 1 - tail. Input from 512-bit mixing array */ - T_16_19(16, E, A, B, C, D); - T_16_19(17, D, E, A, B, C); - T_16_19(18, C, D, E, A, B); - T_16_19(19, B, C, D, E, A); - - /* Round 2 */ - T_20_39(20, A, B, C, D, E); - T_20_39(21, E, A, B, C, D); - T_20_39(22, D, E, A, B, C); - T_20_39(23, C, D, E, A, B); - T_20_39(24, B, C, D, E, A); - T_20_39(25, A, B, C, D, E); - T_20_39(26, E, A, B, C, D); - T_20_39(27, D, E, A, B, C); - T_20_39(28, C, D, E, A, B); - T_20_39(29, B, C, D, E, A); - T_20_39(30, A, B, C, D, E); - T_20_39(31, E, A, B, C, D); - T_20_39(32, D, E, A, B, C); - T_20_39(33, C, D, E, A, B); - T_20_39(34, B, C, D, E, A); - T_20_39(35, A, B, C, D, E); - T_20_39(36, E, A, B, C, D); - T_20_39(37, D, E, A, B, C); - T_20_39(38, C, D, E, A, B); - T_20_39(39, B, C, D, E, A); - - /* Round 3 */ - T_40_59(40, A, B, C, D, E); - T_40_59(41, E, A, B, C, D); - T_40_59(42, D, E, A, B, C); - T_40_59(43, C, D, E, A, B); - T_40_59(44, B, C, D, E, A); - T_40_59(45, A, B, C, D, E); - T_40_59(46, E, A, B, C, D); - T_40_59(47, D, E, A, B, C); - T_40_59(48, C, D, E, A, B); - T_40_59(49, B, C, D, E, A); - T_40_59(50, A, B, C, D, E); - T_40_59(51, E, A, B, C, D); - T_40_59(52, D, E, A, B, C); - T_40_59(53, C, D, E, A, B); - T_40_59(54, B, C, D, E, A); - T_40_59(55, A, B, C, D, E); - T_40_59(56, E, A, B, C, D); - T_40_59(57, D, E, A, B, C); - T_40_59(58, C, D, E, A, B); - T_40_59(59, B, C, D, E, A); - - /* Round 4 */ - T_60_79(60, A, B, C, D, E); - T_60_79(61, E, A, B, C, D); - T_60_79(62, D, E, A, B, C); - T_60_79(63, C, D, E, A, B); - T_60_79(64, B, C, D, E, A); - T_60_79(65, A, B, C, D, E); - T_60_79(66, E, A, B, C, D); - T_60_79(67, D, E, A, B, C); - T_60_79(68, C, D, E, A, B); - T_60_79(69, B, C, D, E, A); - T_60_79(70, A, B, C, D, E); - T_60_79(71, E, A, B, C, D); - T_60_79(72, D, E, A, B, C); - T_60_79(73, C, D, E, A, B); - T_60_79(74, B, C, D, E, A); - T_60_79(75, A, B, C, D, E); - T_60_79(76, E, A, B, C, D); - T_60_79(77, D, E, A, B, C); - T_60_79(78, C, D, E, A, B); - T_60_79(79, B, C, D, E, A); - - ctx->H[0] += A; - ctx->H[1] += B; - ctx->H[2] += C; - ctx->H[3] += D; - ctx->H[4] += E; -} - -void git__blk_SHA1_Init(blk_SHA_CTX *ctx) -{ - ctx->size = 0; - - /* Initialize H with the magic constants (see FIPS180 for constants) */ - ctx->H[0] = 0x67452301; - ctx->H[1] = 0xefcdab89; - ctx->H[2] = 0x98badcfe; - ctx->H[3] = 0x10325476; - ctx->H[4] = 0xc3d2e1f0; -} - -void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len) -{ - unsigned int lenW = ctx->size & 63; - - ctx->size += len; - - /* Read the data into W and process blocks as they get full */ - if (lenW) { - unsigned int left = 64 - lenW; - if (len < left) - left = len; - memcpy(lenW + (char *)ctx->W, data, left); - lenW = (lenW + left) & 63; - len -= left; - data = ((const char *)data + left); - if (lenW) - return; - blk_SHA1_Block(ctx, ctx->W); - } - while (len >= 64) { - blk_SHA1_Block(ctx, data); - data = ((const char *)data + 64); - len -= 64; - } - if (len) - memcpy(ctx->W, data, len); -} - -void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx) -{ - static const unsigned char pad[64] = { 0x80 }; - unsigned int padlen[2]; - int i; - - /* Pad with a binary 1 (ie 0x80), then zeroes, then length */ - padlen[0] = htonl((uint32_t)(ctx->size >> 29)); - padlen[1] = htonl((uint32_t)(ctx->size << 3)); - - i = ctx->size & 63; - git__blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i))); - git__blk_SHA1_Update(ctx, padlen, 8); - - /* Output hash */ - for (i = 0; i < 5; i++) - put_be32(hashout + i*4, ctx->H[i]); -} diff --git a/vendor/libgit2/src/block-sha1/sha1.h b/vendor/libgit2/src/block-sha1/sha1.h deleted file mode 100644 index 558d6aece..000000000 --- a/vendor/libgit2/src/block-sha1/sha1.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SHA1 routine optimized to do word accesses rather than byte accesses, - * and to avoid unnecessary copies into the context array. - * - * This was initially based on the Mozilla SHA1 implementation, although - * none of the original Mozilla code remains. - */ - -typedef struct { - unsigned long long size; - unsigned int H[5]; - unsigned int W[16]; -} blk_SHA_CTX; - -void git__blk_SHA1_Init(blk_SHA_CTX *ctx); -void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len); -void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx); - -#define SHA_CTX blk_SHA_CTX -#define SHA1_Init git__blk_SHA1_Init -#define SHA1_Update git__blk_SHA1_Update -#define SHA1_Final git__blk_SHA1_Final diff --git a/vendor/libgit2/src/bswap.h b/vendor/libgit2/src/bswap.h deleted file mode 100644 index b9211c3c8..000000000 --- a/vendor/libgit2/src/bswap.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Let's make sure we always have a sane definition for ntohl()/htonl(). - * Some libraries define those as a function call, just to perform byte - * shifting, bringing significant overhead to what should be a simple - * operation. - */ - -#include "common.h" - -/* - * Default version that the compiler ought to optimize properly with - * constant values. - */ -GIT_INLINE(uint32_t) default_swab32(uint32_t val) -{ - return (((val & 0xff000000) >> 24) | - ((val & 0x00ff0000) >> 8) | - ((val & 0x0000ff00) << 8) | - ((val & 0x000000ff) << 24)); -} - -#undef bswap32 - -GIT_INLINE(uint16_t) default_swab16(uint16_t val) -{ - return (((val & 0xff00) >> 8) | - ((val & 0x00ff) << 8)); -} - -#undef bswap16 - -#if defined(__GNUC__) && defined(__i386__) - -#define bswap32(x) ({ \ - uint32_t __res; \ - if (__builtin_constant_p(x)) { \ - __res = default_swab32(x); \ - } else { \ - __asm__("bswap %0" : "=r" (__res) : "0" ((uint32_t)(x))); \ - } \ - __res; }) - -#define bswap16(x) ({ \ - uint16_t __res; \ - if (__builtin_constant_p(x)) { \ - __res = default_swab16(x); \ - } else { \ - __asm__("xchgb %b0,%h0" : "=q" (__res) : "0" ((uint16_t)(x))); \ - } \ - __res; }) - -#elif defined(__GNUC__) && defined(__x86_64__) - -#define bswap32(x) ({ \ - uint32_t __res; \ - if (__builtin_constant_p(x)) { \ - __res = default_swab32(x); \ - } else { \ - __asm__("bswapl %0" : "=r" (__res) : "0" ((uint32_t)(x))); \ - } \ - __res; }) - -#define bswap16(x) ({ \ - uint16_t __res; \ - if (__builtin_constant_p(x)) { \ - __res = default_swab16(x); \ - } else { \ - __asm__("xchgb %b0,%h0" : "=Q" (__res) : "0" ((uint16_t)(x))); \ - } \ - __res; }) - -#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) - -#include - -#define bswap32(x) _byteswap_ulong(x) -#define bswap16(x) _byteswap_ushort(x) - -#endif - -#ifdef bswap32 - -#undef ntohl -#undef htonl -#define ntohl(x) bswap32(x) -#define htonl(x) bswap32(x) - -#endif - -#ifdef bswap16 - -#undef ntohs -#undef htons -#define ntohs(x) bswap16(x) -#define htons(x) bswap16(x) - -#endif diff --git a/vendor/libgit2/src/buffer.c b/vendor/libgit2/src/buffer.c deleted file mode 100644 index 6af4c9195..000000000 --- a/vendor/libgit2/src/buffer.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "buffer.h" -#include "posix.h" -#include - -#define ENSURE_SIZE(b, d) \ - if ((ssize_t)(d) >= buf->asize && git_buf_grow(b, (d)) < GIT_SUCCESS)\ - return; - -int git_buf_grow(git_buf *buf, size_t target_size) -{ - char *new_ptr; - - if (buf->asize < 0) - return GIT_ENOMEM; - - if (buf->asize == 0) - buf->asize = target_size; - - /* grow the buffer size by 1.5, until it's big enough - * to fit our target size */ - while (buf->asize < (int)target_size) - buf->asize = (buf->asize << 1) - (buf->asize >> 1); - - new_ptr = git__realloc(buf->ptr, buf->asize); - if (!new_ptr) { - buf->asize = -1; - return GIT_ENOMEM; - } - - buf->ptr = new_ptr; - return GIT_SUCCESS; -} - -int git_buf_oom(const git_buf *buf) -{ - return (buf->asize < 0); -} - -void git_buf_putc(git_buf *buf, char c) -{ - ENSURE_SIZE(buf, buf->size + 1); - buf->ptr[buf->size++] = c; -} - -void git_buf_put(git_buf *buf, const char *data, size_t len) -{ - ENSURE_SIZE(buf, buf->size + len); - memcpy(buf->ptr + buf->size, data, len); - buf->size += len; -} - -void git_buf_puts(git_buf *buf, const char *string) -{ - git_buf_put(buf, string, strlen(string)); -} - -void git_buf_printf(git_buf *buf, const char *format, ...) -{ - int len; - va_list arglist; - - ENSURE_SIZE(buf, buf->size + 1); - - while (1) { - va_start(arglist, format); - len = p_vsnprintf(buf->ptr + buf->size, buf->asize - buf->size, format, arglist); - va_end(arglist); - - if (len < 0) { - buf->asize = -1; - return; - } - - if (len + 1 <= buf->asize - buf->size) { - buf->size += len; - return; - } - - ENSURE_SIZE(buf, buf->size + len + 1); - } -} - -const char *git_buf_cstr(git_buf *buf) -{ - if (buf->size + 1 >= buf->asize && git_buf_grow(buf, buf->size + 1) < GIT_SUCCESS) - return NULL; - - buf->ptr[buf->size] = '\0'; - return buf->ptr; -} - -void git_buf_free(git_buf *buf) -{ - free(buf->ptr); -} diff --git a/vendor/libgit2/src/buffer.h b/vendor/libgit2/src/buffer.h deleted file mode 100644 index 1209340a1..000000000 --- a/vendor/libgit2/src/buffer.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef INCLUDE_buffer_h__ -#define INCLUDE_buffer_h__ - -#include "common.h" - -typedef struct { - char *ptr; - ssize_t asize, size; -} git_buf; - -#define GIT_BUF_INIT {NULL, 0, 0} - -int git_buf_grow(git_buf *buf, size_t target_size); -int git_buf_oom(const git_buf *buf); -void git_buf_putc(git_buf *buf, char c); -void git_buf_put(git_buf *buf, const char *data, size_t len); -void git_buf_puts(git_buf *buf, const char *string); -void git_buf_printf(git_buf *buf, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); -const char *git_buf_cstr(git_buf *buf); -void git_buf_free(git_buf *buf); - -#define git_buf_PUTS(buf, str) git_buf_put(buf, str, sizeof(str) - 1) - -#endif diff --git a/vendor/libgit2/src/cache.c b/vendor/libgit2/src/cache.c deleted file mode 100644 index 433fc3d9c..000000000 --- a/vendor/libgit2/src/cache.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "repository.h" -#include "commit.h" -#include "thread-utils.h" -#include "cache.h" - -int git_cache_init(git_cache *cache, size_t size, git_cached_obj_freeptr free_ptr) -{ - size_t i; - - if (size < 8) - size = 8; - - /* round up size to closest power of 2 */ - size--; - size |= size >> 1; - size |= size >> 2; - size |= size >> 4; - size |= size >> 8; - size |= size >> 16; - - cache->size_mask = size; - cache->lru_count = 0; - cache->free_obj = free_ptr; - - cache->nodes = git__malloc((size + 1) * sizeof(cache_node)); - if (cache->nodes == NULL) - return GIT_ENOMEM; - - for (i = 0; i < (size + 1); ++i) { - git_mutex_init(&cache->nodes[i].lock); - cache->nodes[i].ptr = NULL; - } - - return GIT_SUCCESS; -} - -void git_cache_free(git_cache *cache) -{ - size_t i; - - for (i = 0; i < (cache->size_mask + 1); ++i) { - if (cache->nodes[i].ptr) - git_cached_obj_decref(cache->nodes[i].ptr, cache->free_obj); - - git_mutex_free(&cache->nodes[i].lock); - } - - free(cache->nodes); -} - -void *git_cache_get(git_cache *cache, const git_oid *oid) -{ - const uint32_t *hash; - cache_node *node = NULL; - void *result = NULL; - - hash = (const uint32_t *)oid->id; - node = &cache->nodes[hash[0] & cache->size_mask]; - - git_mutex_lock(&node->lock); - { - if (node->ptr && git_cached_obj_compare(node->ptr, oid) == 0) { - git_cached_obj_incref(node->ptr); - result = node->ptr; - } - } - git_mutex_unlock(&node->lock); - - return result; -} - -void *git_cache_try_store(git_cache *cache, void *entry) -{ - const uint32_t *hash; - const git_oid *oid; - cache_node *node = NULL; - - oid = &((git_cached_obj*)entry)->oid; - hash = (const uint32_t *)oid->id; - node = &cache->nodes[hash[0] & cache->size_mask]; - - /* increase the refcount on this object, because - * the cache now owns it */ - git_cached_obj_incref(entry); - git_mutex_lock(&node->lock); - - if (node->ptr == NULL) { - node->ptr = entry; - } else if (git_cached_obj_compare(node->ptr, oid) == 0) { - git_cached_obj_decref(entry, cache->free_obj); - entry = node->ptr; - } else { - git_cached_obj_decref(node->ptr, cache->free_obj); - node->ptr = entry; - } - - /* increase the refcount again, because we are - * returning it to the user */ - git_cached_obj_incref(entry); - git_mutex_unlock(&node->lock); - - return entry; -} diff --git a/vendor/libgit2/src/cache.h b/vendor/libgit2/src/cache.h deleted file mode 100644 index 4794dea3a..000000000 --- a/vendor/libgit2/src/cache.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef INCLUDE_cache_h__ -#define INCLUDE_cache_h__ - -#include "git2/common.h" -#include "git2/oid.h" -#include "git2/odb.h" - -#include "thread-utils.h" - -#define GIT_DEFAULT_CACHE_SIZE 128 - -typedef void (*git_cached_obj_freeptr)(void *); - -typedef struct { - git_oid oid; - git_atomic refcount; -} git_cached_obj; - -typedef struct { - git_cached_obj *ptr; - git_mutex lock; -} cache_node; - -typedef struct { - cache_node *nodes; - - unsigned int lru_count; - size_t size_mask; - git_cached_obj_freeptr free_obj; -} git_cache; - - -int git_cache_init(git_cache *cache, size_t size, git_cached_obj_freeptr free_ptr); -void git_cache_free(git_cache *cache); - -void *git_cache_try_store(git_cache *cache, void *entry); -void *git_cache_get(git_cache *cache, const git_oid *oid); - - -GIT_INLINE(int) git_cached_obj_compare(git_cached_obj *obj, const git_oid *oid) -{ - return git_oid_cmp(&obj->oid, oid); -} - -GIT_INLINE(void) git_cached_obj_incref(git_cached_obj *obj) -{ - git_atomic_inc(&obj->refcount); -} - -GIT_INLINE(void) git_cached_obj_decref(git_cached_obj *obj, git_cached_obj_freeptr free_obj) -{ - if (git_atomic_dec(&obj->refcount) == 0) - free_obj(obj); -} - - - -#endif diff --git a/vendor/libgit2/src/cc-compat.h b/vendor/libgit2/src/cc-compat.h deleted file mode 100644 index cf6cccf12..000000000 --- a/vendor/libgit2/src/cc-compat.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * cc-compat.h - C compiler compat macros for internal use - */ -#ifndef INCLUDE_compat_h__ -#define INCLUDE_compat_h__ - -/* - * See if our compiler is known to support flexible array members. - */ -#ifndef GIT_FLEX_ARRAY -# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -# define GIT_FLEX_ARRAY /* empty */ -# elif defined(__GNUC__) -# if (__GNUC__ >= 3) -# define GIT_FLEX_ARRAY /* empty */ -# else -# define GIT_FLEX_ARRAY 0 /* older GNU extension */ -# endif -# endif - -/* Default to safer but a bit wasteful traditional style */ -# ifndef GIT_FLEX_ARRAY -# define GIT_FLEX_ARRAY 1 -# endif -#endif - -#ifdef __GNUC__ -# define GIT_TYPEOF(x) (__typeof__(x)) -#else -# define GIT_TYPEOF(x) -#endif - -#ifdef __cplusplus -# define GIT_UNUSED(x) -#else -# ifdef __GNUC__ -# define GIT_UNUSED(x) x __attribute__ ((__unused__)) -# else -# define GIT_UNUSED(x) x -# endif -#endif - -#if defined(_MSC_VER) -#define GIT_UNUSED_ARG(x) ((void)(x)); /* note trailing ; */ -#else -#define GIT_UNUSED_ARG(x) -#endif - -/* - * Does our compiler/platform support the C99 and - * header files. (C99 requires that - * includes ). - */ -#if !defined(_MSC_VER) -# define GIT_HAVE_INTTYPES_H 1 -#endif - -/* Define the printf format specifer to use for size_t output */ -#if defined(_MSC_VER) || defined(__MINGW32__) -# define PRIuZ "Iu" -#else -# define PRIuZ "zu" -#endif - -/* Micosoft Visual C/C++ */ -#if defined(_MSC_VER) -/* disable "deprecated function" warnings */ -# pragma warning ( disable : 4996 ) -/* disable "conditional expression is constant" level 4 warnings */ -# pragma warning ( disable : 4127 ) -#endif - -#endif /* INCLUDE_compat_h__ */ diff --git a/vendor/libgit2/src/commit.c b/vendor/libgit2/src/commit.c deleted file mode 100644 index dc9e5362a..000000000 --- a/vendor/libgit2/src/commit.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/common.h" -#include "git2/object.h" -#include "git2/repository.h" -#include "git2/signature.h" - -#include "common.h" -#include "odb.h" -#include "commit.h" -#include "signature.h" - -#include - -#define COMMIT_BASIC_PARSE 0x0 -#define COMMIT_FULL_PARSE 0x1 - -#define COMMIT_PRINT(commit) {\ - char oid[41]; oid[40] = 0;\ - git_oid_fmt(oid, &commit->object.id);\ - printf("Oid: %s | In degree: %d | Time: %u\n", oid, commit->in_degree, commit->commit_time);\ -} - -static void clear_parents(git_commit *commit) -{ - unsigned int i; - - for (i = 0; i < commit->parent_oids.length; ++i) { - git_oid *parent = git_vector_get(&commit->parent_oids, i); - free(parent); - } - - git_vector_clear(&commit->parent_oids); -} - -void git_commit__free(git_commit *commit) -{ - clear_parents(commit); - git_vector_free(&commit->parent_oids); - - git_signature_free(commit->author); - git_signature_free(commit->committer); - - free(commit->message); - free(commit->message_encoding); - free(commit); -} - -const git_oid *git_commit_id(git_commit *c) -{ - return git_object_id((git_object *)c); -} - -int git_commit_create_v( - git_oid *oid, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - ...) -{ - va_list ap; - int i, error; - const git_commit **parents; - - parents = git__malloc(parent_count * sizeof(git_commit *)); - - va_start(ap, parent_count); - for (i = 0; i < parent_count; ++i) - parents[i] = va_arg(ap, const git_commit *); - va_end(ap); - - error = git_commit_create( - oid, repo, update_ref, author, committer, - message_encoding, message, - tree, parent_count, parents); - - free((void *)parents); - - return error; -} - -int git_commit_create( - git_oid *oid, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - const git_commit *parents[]) -{ - git_buf commit = GIT_BUF_INIT; - int error, i; - - if (git_object_owner((const git_object *)tree) != repo) - return git__throw(GIT_EINVALIDARGS, "The given tree does not belong to this repository"); - - git_oid__writebuf(&commit, "tree ", git_object_id((const git_object *)tree)); - - for (i = 0; i < parent_count; ++i) { - if (git_object_owner((const git_object *)parents[i]) != repo) { - error = git__throw(GIT_EINVALIDARGS, "The given parent does not belong to this repository"); - goto cleanup; - } - - git_oid__writebuf(&commit, "parent ", git_object_id((const git_object *)parents[i])); - } - - git_signature__writebuf(&commit, "author ", author); - git_signature__writebuf(&commit, "committer ", committer); - - if (message_encoding != NULL) - git_buf_printf(&commit, "encoding %s\n", message_encoding); - - git_buf_putc(&commit, '\n'); - git_buf_puts(&commit, message); - - if (git_buf_oom(&commit)) { - error = git__throw(GIT_ENOMEM, "Not enough memory to build the commit data"); - goto cleanup; - } - - error = git_odb_write(oid, git_repository_database(repo), commit.ptr, commit.size, GIT_OBJ_COMMIT); - git_buf_free(&commit); - - if (error == GIT_SUCCESS && update_ref != NULL) { - git_reference *head; - - error = git_reference_lookup(&head, repo, update_ref); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create commit"); - - error = git_reference_resolve(&head, head); - if (error < GIT_SUCCESS) { - if (error != GIT_ENOTFOUND) - return git__rethrow(error, "Failed to create commit"); - /* - * The target of the reference was not found. This can happen - * just after a repository has been initialized (the master - * branch doesn't exist yet, as it doesn't have anything to - * point to) or after an orphan checkout, so if the target - * branch doesn't exist yet, create it and return. - */ - return git_reference_create_oid(&head, repo, git_reference_target(head), oid, 1); - } - - error = git_reference_set_oid(head, oid); - } - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create commit"); - - return GIT_SUCCESS; - -cleanup: - git_buf_free(&commit); - return error; -} - -int commit_parse_buffer(git_commit *commit, const void *data, size_t len) -{ - const char *buffer = data; - const char *buffer_end = (const char *)data + len; - - git_oid parent_oid; - int error; - - git_vector_init(&commit->parent_oids, 4, NULL); - - if ((error = git_oid__parse(&commit->tree_oid, &buffer, buffer_end, "tree ")) < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse buffer"); - - /* - * TODO: commit grafts! - */ - - while (git_oid__parse(&parent_oid, &buffer, buffer_end, "parent ") == GIT_SUCCESS) { - git_oid *new_oid; - - new_oid = git__malloc(sizeof(git_oid)); - git_oid_cpy(new_oid, &parent_oid); - - if (git_vector_insert(&commit->parent_oids, new_oid) < GIT_SUCCESS) - return GIT_ENOMEM; - } - - commit->author = git__malloc(sizeof(git_signature)); - if ((error = git_signature__parse(commit->author, &buffer, buffer_end, "author ", '\n')) < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse commit"); - - /* Always parse the committer; we need the commit time */ - commit->committer = git__malloc(sizeof(git_signature)); - if ((error = git_signature__parse(commit->committer, &buffer, buffer_end, "committer ", '\n')) < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse commit"); - - if (git__prefixcmp(buffer, "encoding ") == 0) { - const char *encoding_end; - buffer += strlen("encoding "); - - encoding_end = buffer; - while (encoding_end < buffer_end && *encoding_end != '\n') - encoding_end++; - - commit->message_encoding = git__strndup(buffer, encoding_end - buffer); - if (!commit->message_encoding) - return GIT_ENOMEM; - - buffer = encoding_end; - } - - /* parse commit message */ - while (buffer < buffer_end && *buffer == '\n') - buffer++; - - if (buffer < buffer_end) { - commit->message = git__strndup(buffer, buffer_end - buffer); - if (!commit->message) - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -int git_commit__parse(git_commit *commit, git_odb_object *obj) -{ - assert(commit); - return commit_parse_buffer(commit, obj->raw.data, obj->raw.len); -} - -#define GIT_COMMIT_GETTER(_rvalue, _name, _return) \ - _rvalue git_commit_##_name(git_commit *commit) \ - {\ - assert(commit); \ - return _return; \ - } - -GIT_COMMIT_GETTER(const git_signature *, author, commit->author) -GIT_COMMIT_GETTER(const git_signature *, committer, commit->committer) -GIT_COMMIT_GETTER(const char *, message, commit->message) -GIT_COMMIT_GETTER(const char *, message_encoding, commit->message_encoding) -GIT_COMMIT_GETTER(git_time_t, time, commit->committer->when.time) -GIT_COMMIT_GETTER(int, time_offset, commit->committer->when.offset) -GIT_COMMIT_GETTER(unsigned int, parentcount, commit->parent_oids.length) -GIT_COMMIT_GETTER(const git_oid *, tree_oid, &commit->tree_oid); - - -int git_commit_tree(git_tree **tree_out, git_commit *commit) -{ - assert(commit); - return git_tree_lookup(tree_out, commit->object.repo, &commit->tree_oid); -} - -int git_commit_parent(git_commit **parent, git_commit *commit, unsigned int n) -{ - git_oid *parent_oid; - assert(commit); - - parent_oid = git_vector_get(&commit->parent_oids, n); - if (parent_oid == NULL) - return git__throw(GIT_ENOTFOUND, "Parent %u does not exist", n); - - return git_commit_lookup(parent, commit->object.repo, parent_oid); -} - -const git_oid *git_commit_parent_oid(git_commit *commit, unsigned int n) -{ - assert(commit); - - return git_vector_get(&commit->parent_oids, n); -} diff --git a/vendor/libgit2/src/commit.h b/vendor/libgit2/src/commit.h deleted file mode 100644 index ff2f28248..000000000 --- a/vendor/libgit2/src/commit.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INCLUDE_commit_h__ -#define INCLUDE_commit_h__ - -#include "git2/commit.h" -#include "tree.h" -#include "repository.h" -#include "vector.h" - -#include - -struct git_commit { - git_object object; - - git_vector parent_oids; - git_oid tree_oid; - - git_signature *author; - git_signature *committer; - - char *message_encoding; - char *message; -}; - -void git_commit__free(git_commit *c); -int git_commit__parse(git_commit *commit, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/common.h b/vendor/libgit2/src/common.h deleted file mode 100644 index 5986a6568..000000000 --- a/vendor/libgit2/src/common.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef INCLUDE_common_h__ -#define INCLUDE_common_h__ - -#include "git2/common.h" -#include "git2/thread-utils.h" -#include "cc-compat.h" - -#ifdef GIT_HAVE_INTTYPES_H -# include -#endif -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef GIT_WIN32 - -# include -# include -# include -# include "win32/msvc-compat.h" -# include "win32/mingw-compat.h" -# ifdef GIT_THREADS -# include "win32/pthread.h" -#endif - -# define snprintf _snprintf - -typedef SSIZE_T ssize_t; - -#else -# include - -# ifdef GIT_THREADS -# include -# endif -#endif - -#include "git2/types.h" -#include "git2/errors.h" -#include "thread-utils.h" -#include "bswap.h" - -extern void git___throw(const char *, ...) GIT_FORMAT_PRINTF(1, 2); -#define git__throw(error, ...) \ - (git___throw(__VA_ARGS__), error) - -extern void git___rethrow(const char *, ...) GIT_FORMAT_PRINTF(1, 2); -#define git__rethrow(error, ...) \ - (git___rethrow(__VA_ARGS__), error) - -#include "util.h" - -#endif /* INCLUDE_common_h__ */ diff --git a/vendor/libgit2/src/config.c b/vendor/libgit2/src/config.c deleted file mode 100644 index 771250731..000000000 --- a/vendor/libgit2/src/config.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "fileops.h" -#include "hashtable.h" -#include "config.h" -#include "git2/config.h" -#include "vector.h" - -#include - -typedef struct { - git_config_file *file; - int priority; -} file_internal; - -void git_config_free(git_config *cfg) -{ - unsigned int i; - git_config_file *file; - file_internal *internal; - - for(i = 0; i < cfg->files.length; ++i){ - internal = git_vector_get(&cfg->files, i); - file = internal->file; - file->free(file); - free(internal); - } - - git_vector_free(&cfg->files); - free(cfg); -} - -static int config_backend_cmp(const void *a, const void *b) -{ - const file_internal *bk_a = (const file_internal *)(a); - const file_internal *bk_b = (const file_internal *)(b); - - return bk_b->priority - bk_a->priority; -} - -int git_config_new(git_config **out) -{ - git_config *cfg; - - cfg = git__malloc(sizeof(git_config)); - if (cfg == NULL) - return GIT_ENOMEM; - - memset(cfg, 0x0, sizeof(git_config)); - - if (git_vector_init(&cfg->files, 3, config_backend_cmp) < 0) { - free(cfg); - return GIT_ENOMEM; - } - - *out = cfg; - - return GIT_SUCCESS; -} - -int git_config_add_file_ondisk(git_config *cfg, const char *path, int priority) -{ - git_config_file *file = NULL; - int error; - - error = git_config_file__ondisk(&file, path); - if (error < GIT_SUCCESS) - return error; - - error = git_config_add_file(cfg, file, priority); - if (error < GIT_SUCCESS) { - /* - * free manually; the file is not owned by the config - * instance yet and will not be freed on cleanup - */ - file->free(file); - return error; - } - - return GIT_SUCCESS; -} - -int git_config_open_ondisk(git_config **cfg, const char *path) -{ - int error; - - error = git_config_new(cfg); - if (error < GIT_SUCCESS) - return error; - - error = git_config_add_file_ondisk(*cfg, path, 1); - if (error < GIT_SUCCESS) - git_config_free(*cfg); - - return error; -} - -int git_config_add_file(git_config *cfg, git_config_file *file, int priority) -{ - file_internal *internal; - int error; - - assert(cfg && file); - - if ((error = file->open(file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to open config file"); - - internal = git__malloc(sizeof(file_internal)); - if (internal == NULL) - return GIT_ENOMEM; - - internal->file = file; - internal->priority = priority; - - if (git_vector_insert(&cfg->files, internal) < 0) { - free(internal); - return GIT_ENOMEM; - } - - git_vector_sort(&cfg->files); - internal->file->cfg = cfg; - - return GIT_SUCCESS; -} - -/* - * Loop over all the variables - */ - -int git_config_foreach(git_config *cfg, int (*fn)(const char *, const char *, void *), void *data) -{ - int ret = GIT_SUCCESS; - unsigned int i; - file_internal *internal; - git_config_file *file; - - for(i = 0; i < cfg->files.length && ret == 0; ++i) { - internal = git_vector_get(&cfg->files, i); - file = internal->file; - ret = file->foreach(file, fn, data); - } - - return ret; -} - -int git_config_delete(git_config *cfg, const char *name) -{ - return git_config_set_string(cfg, name, NULL); -} - -/************** - * Setters - **************/ - -int git_config_set_long(git_config *cfg, const char *name, long int value) -{ - char str_value[32]; /* All numbers should fit in here */ - p_snprintf(str_value, sizeof(str_value), "%ld", value); - return git_config_set_string(cfg, name, str_value); -} - -int git_config_set_int(git_config *cfg, const char *name, int value) -{ - return git_config_set_long(cfg, name, value); -} - -int git_config_set_bool(git_config *cfg, const char *name, int value) -{ - return git_config_set_string(cfg, name, value ? "true" : "false"); -} - -int git_config_set_string(git_config *cfg, const char *name, const char *value) -{ - file_internal *internal; - git_config_file *file; - - if (cfg->files.length == 0) - return git__throw(GIT_EINVALIDARGS, "Cannot set variable value; no files open in the `git_config` instance"); - - internal = git_vector_get(&cfg->files, 0); - file = internal->file; - - return file->set(file, name, value); -} - -/*********** - * Getters - ***********/ - -int git_config_get_long(git_config *cfg, const char *name, long int *out) -{ - const char *value, *num_end; - int ret; - long int num; - - ret = git_config_get_string(cfg, name, &value); - if (ret < GIT_SUCCESS) - return git__rethrow(ret, "Failed to get value for %s", name); - - ret = git__strtol32(&num, value, &num_end, 0); - if (ret < GIT_SUCCESS) - return git__rethrow(ret, "Failed to get value for %s", name); - - switch (*num_end) { - case '\0': - break; - case 'k': - case 'K': - num *= 1024; - break; - case 'm': - case 'M': - num *= 1024 * 1024; - break; - case 'g': - case 'G': - num *= 1024 * 1024 * 1024; - break; - default: - return git__throw(GIT_EINVALIDTYPE, "Failed to get value for %s. Value is of invalid type", name); - } - - *out = num; - - return GIT_SUCCESS; -} - -int git_config_get_int(git_config *cfg, const char *name, int *out) -{ - long int tmp; - int ret; - - ret = git_config_get_long(cfg, name, &tmp); - - *out = (int) tmp; - - return ret; -} - -int git_config_get_bool(git_config *cfg, const char *name, int *out) -{ - const char *value; - int error = GIT_SUCCESS; - - error = git_config_get_string(cfg, name, &value); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to get value for %s", name); - - /* A missing value means true */ - if (value == NULL) { - *out = 1; - return GIT_SUCCESS; - } - - if (!strcasecmp(value, "true") || - !strcasecmp(value, "yes") || - !strcasecmp(value, "on")) { - *out = 1; - return GIT_SUCCESS; - } - if (!strcasecmp(value, "false") || - !strcasecmp(value, "no") || - !strcasecmp(value, "off")) { - *out = 0; - return GIT_SUCCESS; - } - - /* Try to parse it as an integer */ - error = git_config_get_int(cfg, name, out); - if (error == GIT_SUCCESS) - *out = !!(*out); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to get value for %s", name); - return error; -} - -int git_config_get_string(git_config *cfg, const char *name, const char **out) -{ - file_internal *internal; - git_config_file *file; - int error = GIT_ENOTFOUND; - unsigned int i; - - if (cfg->files.length == 0) - return git__throw(GIT_EINVALIDARGS, "Cannot get variable value; no files open in the `git_config` instance"); - - for (i = 0; i < cfg->files.length; ++i) { - internal = git_vector_get(&cfg->files, i); - file = internal->file; - if ((error = file->get(file, name, out)) == GIT_SUCCESS) - return GIT_SUCCESS; - } - - return git__throw(error, "Config value '%s' not found", name); -} - -int git_config_find_global(char *global_config_path) -{ - const char *home; - - home = getenv("HOME"); - -#ifdef GIT_WIN32 - if (home == NULL) - home = getenv("USERPROFILE"); -#endif - - if (home == NULL) - return git__throw(GIT_EOSERR, "Failed to open global config file. Cannot locate the user's home directory"); - - git_path_join(global_config_path, home, GIT_CONFIG_FILENAME); - - if (git_futils_exists(global_config_path) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to open global config file. The file does not exist"); - - return GIT_SUCCESS; -} - -int git_config_open_global(git_config **out) -{ - int error; - char global_path[GIT_PATH_MAX]; - - if ((error = git_config_find_global(global_path)) < GIT_SUCCESS) - return error; - - return git_config_open_ondisk(out, global_path); -} - diff --git a/vendor/libgit2/src/config.h b/vendor/libgit2/src/config.h deleted file mode 100644 index e2f301bf1..000000000 --- a/vendor/libgit2/src/config.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef INCLUDE_config_h__ -#define INCLUDE_config_h__ - -#include "git2.h" -#include "git2/config.h" -#include "vector.h" -#include "repository.h" - -#define GIT_CONFIG_FILENAME ".gitconfig" -#define GIT_CONFIG_FILENAME_INREPO "config" - -struct git_config { - git_vector files; - git_repository *repo; -}; - -#endif diff --git a/vendor/libgit2/src/config_file.c b/vendor/libgit2/src/config_file.c deleted file mode 100644 index 520a806b5..000000000 --- a/vendor/libgit2/src/config_file.c +++ /dev/null @@ -1,1233 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "config.h" -#include "fileops.h" -#include "filebuf.h" -#include "git2/config.h" -#include "git2/types.h" - - -#include - -typedef struct cvar_t { - struct cvar_t *next; - char *section; - char *name; - char *value; -} cvar_t; - -typedef struct { - struct cvar_t *head; - struct cvar_t *tail; -} cvar_t_list; - -#define CVAR_LIST_HEAD(list) ((list)->head) - -#define CVAR_LIST_TAIL(list) ((list)->tail) - -#define CVAR_LIST_NEXT(var) ((var)->next) - -#define CVAR_LIST_EMPTY(list) ((list)->head == NULL) - -#define CVAR_LIST_APPEND(list, var) do {\ - if (CVAR_LIST_EMPTY(list)) {\ - CVAR_LIST_HEAD(list) = CVAR_LIST_TAIL(list) = var;\ - } else {\ - CVAR_LIST_NEXT(CVAR_LIST_TAIL(list)) = var;\ - CVAR_LIST_TAIL(list) = var;\ - }\ -} while(0) - -#define CVAR_LIST_REMOVE_HEAD(list) do {\ - CVAR_LIST_HEAD(list) = CVAR_LIST_NEXT(CVAR_LIST_HEAD(list));\ -} while(0) - -#define CVAR_LIST_REMOVE_AFTER(var) do {\ - CVAR_LIST_NEXT(var) = CVAR_LIST_NEXT(CVAR_LIST_NEXT(var));\ -} while(0) - -#define CVAR_LIST_FOREACH(list, iter)\ - for ((iter) = CVAR_LIST_HEAD(list);\ - (iter) != NULL;\ - (iter) = CVAR_LIST_NEXT(iter)) - -/* - * Inspired by the FreeBSD functions - */ -#define CVAR_LIST_FOREACH_SAFE(start, iter, tmp)\ - for ((iter) = CVAR_LIST_HEAD(vars);\ - (iter) && (((tmp) = CVAR_LIST_NEXT(iter) || 1));\ - (iter) = (tmp)) - -typedef struct { - git_config_file parent; - - cvar_t_list var_list; - - struct { - git_fbuffer buffer; - char *read_ptr; - int line_number; - int eof; - } reader; - - char *file_path; -} diskfile_backend; - -static int config_parse(diskfile_backend *cfg_file); -static int parse_variable(diskfile_backend *cfg, char **var_name, char **var_value); -static int config_write(diskfile_backend *cfg, cvar_t *var); - -static void cvar_free(cvar_t *var) -{ - if (var == NULL) - return; - - free(var->section); - free(var->name); - free(var->value); - free(var); -} - -static void cvar_list_free(cvar_t_list *list) -{ - cvar_t *cur; - - while (!CVAR_LIST_EMPTY(list)) { - cur = CVAR_LIST_HEAD(list); - CVAR_LIST_REMOVE_HEAD(list); - cvar_free(cur); - } -} - -/* - * Compare two strings according to the git section-subsection - * rules. The order of the strings is important because local is - * assumed to have the internal format (only the section name and with - * case information) and input the normalized one (only dots, no case - * information). - */ -static int cvar_match_section(const char *local, const char *input) -{ - char *first_dot; - char *local_sp = strchr(local, ' '); - int comparison_len; - - /* - * If the local section name doesn't contain a space, then we can - * just do a case-insensitive compare. - */ - if (local_sp == NULL) - return !strncasecmp(local, input, strlen(local)); - - /* - * From here onwards, there is a space diving the section and the - * subsection. Anything before the space in local is - * case-insensitive. - */ - if (strncasecmp(local, input, local_sp - local)) - return 0; - - /* - * We compare starting from the first character after the - * quotation marks, which is two characters beyond the space. For - * the input, we start one character beyond the dot. If the names - * have different lengths, then we can fail early, as we know they - * can't be the same. - * The length is given by the length between the quotation marks. - */ - - first_dot = strchr(input, '.'); - comparison_len = strlen(local_sp + 2) - 1; - - return !strncmp(local_sp + 2, first_dot + 1, comparison_len); -} - -static int cvar_match_name(const cvar_t *var, const char *str) -{ - const char *name_start; - - if (!cvar_match_section(var->section, str)) { - return 0; - } - /* Early exit if the lengths are different */ - name_start = strrchr(str, '.') + 1; - if (strlen(var->name) != strlen(name_start)) - return 0; - - return !strcasecmp(var->name, name_start); -} - -static cvar_t *cvar_list_find(cvar_t_list *list, const char *name) -{ - cvar_t *iter; - - CVAR_LIST_FOREACH (list, iter) { - if (cvar_match_name(iter, name)) - return iter; - } - - return NULL; -} - -static int cvar_normalize_name(cvar_t *var, char **output) -{ - char *section_sp = strchr(var->section, ' '); - char *quote, *name; - int len, ret; - - /* - * The final string is going to be at most one char longer than - * the input - */ - len = strlen(var->section) + strlen(var->name) + 1; - name = git__malloc(len + 1); - if (name == NULL) - return GIT_ENOMEM; - - /* If there aren't any spaces in the section, it's easy */ - if (section_sp == NULL) { - ret = p_snprintf(name, len + 1, "%s.%s", var->section, var->name); - if (ret < 0) { - free(name); - return git__throw(GIT_EOSERR, "Failed to normalize name. OS err: %s", strerror(errno)); - } - - *output = name; - return GIT_SUCCESS; - } - - /* - * If there are spaces, we replace the space by a dot, move - * section name so it overwrites the first quotation mark and - * replace the last quotation mark by a dot. We then append the - * variable name. - */ - strcpy(name, var->section); - section_sp = strchr(name, ' '); - *section_sp = '.'; - /* Remove first quote */ - quote = strchr(name, '"'); - memmove(quote, quote+1, strlen(quote+1)); - /* Remove second quote */ - quote = strchr(name, '"'); - *quote = '.'; - strcpy(quote+1, var->name); - - *output = name; - return GIT_SUCCESS; -} - -static char *interiorize_section(const char *orig) -{ - char *dot, *last_dot, *section, *ret; - int len; - - dot = strchr(orig, '.'); - last_dot = strrchr(orig, '.'); - len = last_dot - orig; - - /* No subsection, this is easy */ - if (last_dot == dot) - return git__strndup(orig, dot - orig); - - section = git__malloc(len + 4); - if (section == NULL) - return NULL; - - memset(section, 0x0, len + 4); - ret = section; - len = dot - orig; - memcpy(section, orig, len); - section += len; - len = strlen(" \""); - memcpy(section, " \"", len); - section += len; - len = last_dot - dot - 1; - memcpy(section, dot + 1, len); - section += len; - *section = '"'; - - return ret; -} - -static int config_open(git_config_file *cfg) -{ - int error; - diskfile_backend *b = (diskfile_backend *)cfg; - - error = git_futils_readbuffer(&b->reader.buffer, b->file_path); - if(error < GIT_SUCCESS) - goto cleanup; - - error = config_parse(b); - if (error < GIT_SUCCESS) - goto cleanup; - - git_futils_freebuffer(&b->reader.buffer); - - return error; - - cleanup: - cvar_list_free(&b->var_list); - git_futils_freebuffer(&b->reader.buffer); - - return git__rethrow(error, "Failed to open config"); -} - -static void backend_free(git_config_file *_backend) -{ - diskfile_backend *backend = (diskfile_backend *)_backend; - - if (backend == NULL) - return; - - free(backend->file_path); - cvar_list_free(&backend->var_list); - - free(backend); -} - -static int file_foreach(git_config_file *backend, int (*fn)(const char *, const char *, void *), void *data) -{ - int ret = GIT_SUCCESS; - cvar_t *var; - diskfile_backend *b = (diskfile_backend *)backend; - - CVAR_LIST_FOREACH(&b->var_list, var) { - char *normalized = NULL; - - ret = cvar_normalize_name(var, &normalized); - if (ret < GIT_SUCCESS) - return ret; - - ret = fn(normalized, var->value, data); - free(normalized); - if (ret) - break; - } - - return ret; -} - -static int config_set(git_config_file *cfg, const char *name, const char *value) -{ - cvar_t *var = NULL; - cvar_t *existing = NULL; - int error = GIT_SUCCESS; - const char *last_dot; - diskfile_backend *b = (diskfile_backend *)cfg; - - /* - * If it already exists, we just need to update its value. - */ - existing = cvar_list_find(&b->var_list, name); - if (existing != NULL) { - char *tmp = value ? git__strdup(value) : NULL; - if (tmp == NULL && value != NULL) - return GIT_ENOMEM; - - free(existing->value); - existing->value = tmp; - - return config_write(b, existing); - } - - /* - * Otherwise, create it and stick it at the end of the queue. If - * value is NULL, we return an error, because you can't delete a - * variable that doesn't exist. - */ - - if (value == NULL) - return git__throw(GIT_ENOTFOUND, "Can't delete non-exitent variable"); - - last_dot = strrchr(name, '.'); - if (last_dot == NULL) { - return git__throw(GIT_EINVALIDTYPE, "Variables without section aren't allowed"); - } - - var = git__malloc(sizeof(cvar_t)); - if (var == NULL) - return GIT_ENOMEM; - - memset(var, 0x0, sizeof(cvar_t)); - - var->section = interiorize_section(name); - if (var->section == NULL) { - error = GIT_ENOMEM; - goto out; - } - - var->name = git__strdup(last_dot + 1); - if (var->name == NULL) { - error = GIT_ENOMEM; - goto out; - } - - var->value = value ? git__strdup(value) : NULL; - if (var->value == NULL && value != NULL) { - error = GIT_ENOMEM; - goto out; - } - - CVAR_LIST_APPEND(&b->var_list, var); - error = config_write(b, var); - - out: - if (error < GIT_SUCCESS) - cvar_free(var); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to set config value"); -} - -/* - * Internal function that actually gets the value in string form - */ -static int config_get(git_config_file *cfg, const char *name, const char **out) -{ - cvar_t *var; - int error = GIT_SUCCESS; - diskfile_backend *b = (diskfile_backend *)cfg; - - var = cvar_list_find(&b->var_list, name); - - if (var == NULL) - return git__throw(GIT_ENOTFOUND, "Variable '%s' not found", name); - - *out = var->value; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to get config value for %s", name); -} - -int git_config_file__ondisk(git_config_file **out, const char *path) -{ - diskfile_backend *backend; - - backend = git__malloc(sizeof(diskfile_backend)); - if (backend == NULL) - return GIT_ENOMEM; - - memset(backend, 0x0, sizeof(diskfile_backend)); - - backend->file_path = git__strdup(path); - if (backend->file_path == NULL) { - free(backend); - return GIT_ENOMEM; - } - - backend->parent.open = config_open; - backend->parent.get = config_get; - backend->parent.set = config_set; - backend->parent.foreach = file_foreach; - backend->parent.free = backend_free; - - *out = (git_config_file *)backend; - - return GIT_SUCCESS; -} - -static int cfg_getchar_raw(diskfile_backend *cfg) -{ - int c; - - c = *cfg->reader.read_ptr++; - - /* - Win 32 line breaks: if we find a \r\n sequence, - return only the \n as a newline - */ - if (c == '\r' && *cfg->reader.read_ptr == '\n') { - cfg->reader.read_ptr++; - c = '\n'; - } - - if (c == '\n') - cfg->reader.line_number++; - - if (c == 0) { - cfg->reader.eof = 1; - c = '\n'; - } - - return c; -} - -#define SKIP_WHITESPACE (1 << 1) -#define SKIP_COMMENTS (1 << 2) - -static int cfg_getchar(diskfile_backend *cfg_file, int flags) -{ - const int skip_whitespace = (flags & SKIP_WHITESPACE); - const int skip_comments = (flags & SKIP_COMMENTS); - int c; - - assert(cfg_file->reader.read_ptr); - - do c = cfg_getchar_raw(cfg_file); - while (skip_whitespace && isspace(c)); - - if (skip_comments && (c == '#' || c == ';')) { - do c = cfg_getchar_raw(cfg_file); - while (c != '\n'); - } - - return c; -} - -/* - * Read the next char, but don't move the reading pointer. - */ -static int cfg_peek(diskfile_backend *cfg, int flags) -{ - void *old_read_ptr; - int old_lineno, old_eof; - int ret; - - assert(cfg->reader.read_ptr); - - old_read_ptr = cfg->reader.read_ptr; - old_lineno = cfg->reader.line_number; - old_eof = cfg->reader.eof; - - ret = cfg_getchar(cfg, flags); - - cfg->reader.read_ptr = old_read_ptr; - cfg->reader.line_number = old_lineno; - cfg->reader.eof = old_eof; - - return ret; -} - -/* - * Read and consume a line, returning it in newly-allocated memory. - */ -static char *cfg_readline(diskfile_backend *cfg) -{ - char *line = NULL; - char *line_src, *line_end; - int line_len; - - line_src = cfg->reader.read_ptr; - - /* Skip empty empty lines */ - while (isspace(*line_src)) - ++line_src; - - line_end = strchr(line_src, '\n'); - - /* no newline at EOF */ - if (line_end == NULL) - line_end = strchr(line_src, 0); - - line_len = line_end - line_src; - - line = git__malloc(line_len + 1); - if (line == NULL) - return NULL; - - memcpy(line, line_src, line_len); - - line[line_len] = '\0'; - - while (--line_len >= 0 && isspace(line[line_len])) - line[line_len] = '\0'; - - if (*line_end == '\n') - line_end++; - - if (*line_end == '\0') - cfg->reader.eof = 1; - - cfg->reader.line_number++; - cfg->reader.read_ptr = line_end; - - return line; -} - -/* - * Consume a line, without storing it anywhere - */ -void cfg_consume_line(diskfile_backend *cfg) -{ - char *line_start, *line_end; - - line_start = cfg->reader.read_ptr; - line_end = strchr(line_start, '\n'); - /* No newline at EOF */ - if(line_end == NULL){ - line_end = strchr(line_start, '\0'); - } - - if (*line_end == '\n') - line_end++; - - if (*line_end == '\0') - cfg->reader.eof = 1; - - cfg->reader.line_number++; - cfg->reader.read_ptr = line_end; -} - -GIT_INLINE(int) config_keychar(int c) -{ - return isalnum(c) || c == '-'; -} - -static int parse_section_header_ext(const char *line, const char *base_name, char **section_name) -{ - int buf_len, total_len, pos, rpos; - int c, ret; - char *subsection, *first_quote, *last_quote; - int error = GIT_SUCCESS; - int quote_marks; - /* - * base_name is what came before the space. We should be at the - * first quotation mark, except for now, line isn't being kept in - * sync so we only really use it to calculate the length. - */ - - first_quote = strchr(line, '"'); - last_quote = strrchr(line, '"'); - - if (last_quote - first_quote == 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse ext header. There is no final quotation mark"); - - buf_len = last_quote - first_quote + 2; - - subsection = git__malloc(buf_len + 2); - if (subsection == NULL) - return GIT_ENOMEM; - - pos = 0; - rpos = 0; - quote_marks = 0; - - line = first_quote; - c = line[rpos++]; - - /* - * At the end of each iteration, whatever is stored in c will be - * added to the string. In case of error, jump to out - */ - do { - if (quote_marks == 2) { - error = git__throw(GIT_EOBJCORRUPTED, "Falied to parse ext header. Text after closing quote"); - goto out; - - } - - switch (c) { - case '"': - ++quote_marks; - break; - case '\\': - c = line[rpos++]; - switch (c) { - case '"': - case '\\': - break; - default: - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse ext header. Unsupported escape char \\%c", c); - goto out; - } - break; - default: - break; - } - - subsection[pos++] = (char) c; - } while ((c = line[rpos++]) != ']'); - - subsection[pos] = '\0'; - - total_len = strlen(base_name) + strlen(subsection) + 2; - *section_name = git__malloc(total_len); - if (*section_name == NULL) { - error = GIT_ENOMEM; - goto out; - } - - ret = p_snprintf(*section_name, total_len, "%s %s", base_name, subsection); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to parse ext header. OS error: %s", strerror(errno)); - goto out; - } - - git__strntolower(*section_name, strchr(*section_name, ' ') - *section_name); - - out: - free(subsection); - - return error; -} - -static int parse_section_header(diskfile_backend *cfg, char **section_out) -{ - char *name, *name_end; - int name_length, c, pos; - int error = GIT_SUCCESS; - char *line; - - line = cfg_readline(cfg); - if (line == NULL) - return GIT_ENOMEM; - - /* find the end of the variable's name */ - name_end = strchr(line, ']'); - if (name_end == NULL) { - free(line); - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Can't find header name end"); - } - - name = (char *)git__malloc((size_t)(name_end - line) + 1); - if (name == NULL) { - free(line); - return GIT_ENOMEM; - } - - name_length = 0; - pos = 0; - - /* Make sure we were given a section header */ - c = line[pos++]; - if (c != '[') { - error = git__throw(GIT_ERROR, "Failed to parse header. Didn't get section header. This is a bug"); - goto error; - } - - c = line[pos++]; - - do { - if (isspace(c)){ - name[name_length] = '\0'; - error = parse_section_header_ext(line, name, section_out); - free(line); - free(name); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse header"); - } - - if (!config_keychar(c) && c != '.') { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Wrong format on header"); - goto error; - } - - name[name_length++] = (char) tolower(c); - - } while ((c = line[pos++]) != ']'); - - if (line[pos - 1] != ']') { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Config file ended unexpectedly"); - goto error; - } - - name[name_length] = 0; - free(line); - git__strtolower(name); - *section_out = name; - return GIT_SUCCESS; - -error: - free(line); - free(name); - return error; -} - -static int skip_bom(diskfile_backend *cfg) -{ - static const char *utf8_bom = "\xef\xbb\xbf"; - - if (memcmp(cfg->reader.read_ptr, utf8_bom, sizeof(utf8_bom)) == 0) - cfg->reader.read_ptr += sizeof(utf8_bom); - - /* TODO: the reference implementation does pretty stupid - shit with the BoM - */ - - return GIT_SUCCESS; -} - -/* - (* basic types *) - digit = "0".."9" - integer = digit { digit } - alphabet = "a".."z" + "A" .. "Z" - - section_char = alphabet | "." | "-" - extension_char = (* any character except newline *) - any_char = (* any character *) - variable_char = "alphabet" | "-" - - - (* actual grammar *) - config = { section } - - section = header { definition } - - header = "[" section [subsection | subsection_ext] "]" - - subsection = "." section - subsection_ext = "\"" extension "\"" - - section = section_char { section_char } - extension = extension_char { extension_char } - - definition = variable_name ["=" variable_value] "\n" - - variable_name = variable_char { variable_char } - variable_value = string | boolean | integer - - string = quoted_string | plain_string - quoted_string = "\"" plain_string "\"" - plain_string = { any_char } - - boolean = boolean_true | boolean_false - boolean_true = "yes" | "1" | "true" | "on" - boolean_false = "no" | "0" | "false" | "off" -*/ - -static void strip_comments(char *line) -{ - int quote_count = 0; - char *ptr; - - for (ptr = line; *ptr; ++ptr) { - if (ptr[0] == '"' && ptr > line && ptr[-1] != '\\') - quote_count++; - - if ((ptr[0] == ';' || ptr[0] == '#') && (quote_count % 2) == 0) { - ptr[0] = '\0'; - break; - } - } - - if (isspace(ptr[-1])) { - /* TODO skip whitespace */ - } -} - -static int config_parse(diskfile_backend *cfg_file) -{ - int error = GIT_SUCCESS, c; - char *current_section = NULL; - char *var_name; - char *var_value; - cvar_t *var; - - /* Initialize the reading position */ - cfg_file->reader.read_ptr = cfg_file->reader.buffer.data; - cfg_file->reader.eof = 0; - - /* If the file is empty, there's nothing for us to do */ - if (*cfg_file->reader.read_ptr == '\0') - return GIT_SUCCESS; - - skip_bom(cfg_file); - - while (error == GIT_SUCCESS && !cfg_file->reader.eof) { - - c = cfg_peek(cfg_file, SKIP_WHITESPACE); - - switch (c) { - case '\0': /* We've arrived at the end of the file */ - break; - - case '[': /* section header, new section begins */ - free(current_section); - current_section = NULL; - error = parse_section_header(cfg_file, ¤t_section); - break; - - case ';': - case '#': - cfg_consume_line(cfg_file); - break; - - default: /* assume variable declaration */ - error = parse_variable(cfg_file, &var_name, &var_value); - - if (error < GIT_SUCCESS) - break; - - var = malloc(sizeof(cvar_t)); - if (var == NULL) { - error = GIT_ENOMEM; - break; - } - - memset(var, 0x0, sizeof(cvar_t)); - - var->section = git__strdup(current_section); - if (var->section == NULL) { - error = GIT_ENOMEM; - free(var); - break; - } - - var->name = var_name; - var->value = var_value; - git__strtolower(var->name); - - CVAR_LIST_APPEND(&cfg_file->var_list, var); - - break; - } - } - - free(current_section); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse config"); -} - -static int write_section(git_filebuf *file, cvar_t *var) -{ - int error; - - error = git_filebuf_printf(file, "[%s]\n", var->section); - if (error < GIT_SUCCESS) - return error; - - error = git_filebuf_printf(file, " %s = %s\n", var->name, var->value); - return error; -} - -/* - * This is pretty much the parsing, except we write out anything we don't have - */ -static int config_write(diskfile_backend *cfg, cvar_t *var) -{ - int error = GIT_SUCCESS, c; - int section_matches = 0, last_section_matched = 0; - char *current_section = NULL; - char *var_name, *var_value, *data_start; - git_filebuf file; - const char *pre_end = NULL, *post_start = NULL; - - /* We need to read in our own config file */ - error = git_futils_readbuffer(&cfg->reader.buffer, cfg->file_path); - if (error < GIT_SUCCESS) { - return git__rethrow(error, "Failed to read existing config file %s", cfg->file_path); - } - - /* Initialise the reading position */ - cfg->reader.read_ptr = cfg->reader.buffer.data; - cfg->reader.eof = 0; - data_start = cfg->reader.read_ptr; - - /* Lock the file */ - error = git_filebuf_open(&file, cfg->file_path, 0); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to lock config file"); - - skip_bom(cfg); - - while (error == GIT_SUCCESS && !cfg->reader.eof) { - c = cfg_peek(cfg, SKIP_WHITESPACE); - - switch (c) { - case '\0': /* We've arrived at the end of the file */ - break; - - case '[': /* section header, new section begins */ - /* - * We set both positions to the current one in case we - * need to add a variable to the end of a section. In that - * case, we want both variables to point just before the - * new section. If we actually want to replace it, the - * default case will take care of updating them. - */ - pre_end = post_start = cfg->reader.read_ptr; - if (current_section) - free(current_section); - error = parse_section_header(cfg, ¤t_section); - if (error < GIT_SUCCESS) - break; - - /* Keep track of when it stops matching */ - last_section_matched = section_matches; - section_matches = !strcmp(current_section, var->section); - break; - - case ';': - case '#': - cfg_consume_line(cfg); - break; - - default: - /* - * If the section doesn't match, but the last section did, - * it means we need to add a variable (so skip the line - * otherwise). If both the section and name match, we need - * to overwrite the variable (so skip the line - * otherwise). pre_end needs to be updated each time so we - * don't loose that information, but we only need to - * update post_start if we're going to use it in this - * iteration. - */ - if (!section_matches) { - if (!last_section_matched) { - cfg_consume_line(cfg); - break; - } - } else { - int cmp = -1; - - pre_end = cfg->reader.read_ptr; - if ((error = parse_variable(cfg, &var_name, &var_value)) == GIT_SUCCESS) - cmp = strcasecmp(var->name, var_name); - - free(var_name); - free(var_value); - - if (cmp != 0) - break; - - post_start = cfg->reader.read_ptr; - } - - /* - * We've found the variable we wanted to change, so - * write anything up to it - */ - error = git_filebuf_write(&file, data_start, pre_end - data_start); - if (error < GIT_SUCCESS) { - git__rethrow(error, "Failed to write the first part of the file"); - break; - } - - /* - * Then replace the variable. If the value is NULL, it - * means we want to delete it, so pretend everything went - * fine - */ - if (var->value == NULL) - error = GIT_SUCCESS; - else - error = git_filebuf_printf(&file, "\t%s = %s\n", var->name, var->value); - if (error < GIT_SUCCESS) { - git__rethrow(error, "Failed to overwrite the variable"); - break; - } - - /* And then the write out rest of the file */ - error = git_filebuf_write(&file, post_start, - cfg->reader.buffer.len - (post_start - data_start)); - - if (error < GIT_SUCCESS) { - git__rethrow(error, "Failed to write the rest of the file"); - break; - } - - goto cleanup; - } - } - - /* - * Being here can mean that - * - * 1) our section is the last one in the file and we're - * adding a variable - * - * 2) we didn't find a section for us so we need to create it - * ourselves. - * - * Either way we need to write out the whole file. - */ - - error = git_filebuf_write(&file, cfg->reader.buffer.data, cfg->reader.buffer.len); - if (error < GIT_SUCCESS) { - git__rethrow(error, "Failed to write original config content"); - goto cleanup; - } - - /* And now if we just need to add a variable */ - if (section_matches) { - error = git_filebuf_printf(&file, "\t%s = %s\n", var->name, var->value); - goto cleanup; - } - - /* Or maybe we need to write out a whole section */ - error = write_section(&file, var); - if (error < GIT_SUCCESS) - git__rethrow(error, "Failed to write new section"); - - cleanup: - free(current_section); - - if (error < GIT_SUCCESS) - git_filebuf_cleanup(&file); - else - error = git_filebuf_commit(&file); - - git_futils_freebuffer(&cfg->reader.buffer); - return error; -} - -static int is_multiline_var(const char *str) -{ - char *end = strrchr(str, '\0') - 1; - - while (isspace(*end)) - --end; - - return *end == '\\'; -} - -static int parse_multiline_variable(diskfile_backend *cfg, const char *first, char **out) -{ - char *line = NULL, *end; - int error = GIT_SUCCESS, len, ret; - char *buf; - - /* Check that the next line exists */ - line = cfg_readline(cfg); - if (line == NULL) - return GIT_ENOMEM; - - /* We've reached the end of the file, there is input missing */ - if (line[0] == '\0') { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse multiline var. File ended unexpectedly"); - goto out; - } - - strip_comments(line); - - /* If it was just a comment, pretend it didn't exist */ - if (line[0] == '\0') { - error = parse_multiline_variable(cfg, first, out); - goto out; - } - - /* Find the continuation character '\' and strip the whitespace */ - end = strrchr(first, '\\'); - while (isspace(end[-1])) - --end; - - *end = '\0'; /* Terminate the string here */ - - len = strlen(first) + strlen(line) + 2; - buf = git__malloc(len); - if (buf == NULL) { - error = GIT_ENOMEM; - goto out; - } - - ret = p_snprintf(buf, len, "%s %s", first, line); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to parse multiline var. Failed to put together two lines. OS err: %s", strerror(errno)); - free(buf); - goto out; - } - - /* - * If we need to continue reading the next line, pretend - * everything we've read up to now was in one line and call - * ourselves. - */ - if (is_multiline_var(buf)) { - char *final_val; - error = parse_multiline_variable(cfg, buf, &final_val); - free(buf); - buf = final_val; - } - - *out = buf; - - out: - free(line); - return error; -} - -static int parse_variable(diskfile_backend *cfg, char **var_name, char **var_value) -{ - char *tmp; - int error = GIT_SUCCESS; - const char *var_end = NULL; - const char *value_start = NULL; - char *line; - - line = cfg_readline(cfg); - if (line == NULL) - return GIT_ENOMEM; - - strip_comments(line); - - var_end = strchr(line, '='); - - if (var_end == NULL) - var_end = strchr(line, '\0'); - else - value_start = var_end + 1; - - if (isspace(var_end[-1])) { - do var_end--; - while (isspace(var_end[0])); - } - - tmp = git__strndup(line, var_end - line + 1); - if (tmp == NULL) { - error = GIT_ENOMEM; - goto out; - } - - *var_name = tmp; - - /* - * Now, let's try to parse the value - */ - if (value_start != NULL) { - - while (isspace(value_start[0])) - value_start++; - - if (value_start[0] == '\0') - goto out; - - if (is_multiline_var(value_start)) { - error = parse_multiline_variable(cfg, value_start, var_value); - if (error < GIT_SUCCESS) - free(*var_name); - goto out; - } - - tmp = strdup(value_start); - if (tmp == NULL) { - free(*var_name); - error = GIT_ENOMEM; - goto out; - } - - *var_value = tmp; - } else { - /* If there is no value, boolean true is assumed */ - *var_value = NULL; - } - - out: - free(line); - return error; -} diff --git a/vendor/libgit2/src/delta-apply.c b/vendor/libgit2/src/delta-apply.c deleted file mode 100644 index a6b711436..000000000 --- a/vendor/libgit2/src/delta-apply.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "common.h" -#include "git2/odb.h" -#include "delta-apply.h" - -/* - * This file was heavily cribbed from BinaryDelta.java in JGit, which - * itself was heavily cribbed from patch-delta.c in the - * GIT project. The original delta patching code was written by - * Nicolas Pitre . - */ - -static int hdr_sz( - size_t *size, - const unsigned char **delta, - const unsigned char *end) -{ - const unsigned char *d = *delta; - size_t r = 0; - unsigned int c, shift = 0; - - do { - if (d == end) - return -1; - c = *d++; - r |= (c & 0x7f) << shift; - shift += 7; - } while (c & 0x80); - *delta = d; - *size = r; - return 0; -} - -int git__delta_apply( - git_rawobj *out, - const unsigned char *base, - size_t base_len, - const unsigned char *delta, - size_t delta_len) -{ - const unsigned char *delta_end = delta + delta_len; - size_t base_sz, res_sz; - unsigned char *res_dp; - - /* Check that the base size matches the data we were given; - * if not we would underflow while accessing data from the - * base object, resulting in data corruption or segfault. - */ - if ((hdr_sz(&base_sz, &delta, delta_end) < 0) || (base_sz != base_len)) - return git__throw(GIT_ERROR, "Failed to apply delta. Base size does not match given data"); - - if (hdr_sz(&res_sz, &delta, delta_end) < 0) - return git__throw(GIT_ERROR, "Failed to apply delta. Base size does not match given data"); - - if ((res_dp = git__malloc(res_sz + 1)) == NULL) - return GIT_ENOMEM; - res_dp[res_sz] = '\0'; - out->data = res_dp; - out->len = res_sz; - - while (delta < delta_end) { - unsigned char cmd = *delta++; - if (cmd & 0x80) { - /* cmd is a copy instruction; copy from the base. - */ - size_t off = 0, len = 0; - - if (cmd & 0x01) off = *delta++; - if (cmd & 0x02) off |= *delta++ << 8; - if (cmd & 0x04) off |= *delta++ << 16; - if (cmd & 0x08) off |= *delta++ << 24; - - if (cmd & 0x10) len = *delta++; - if (cmd & 0x20) len |= *delta++ << 8; - if (cmd & 0x40) len |= *delta++ << 16; - if (!len) len = 0x10000; - - if (base_len < off + len || res_sz < len) - goto fail; - memcpy(res_dp, base + off, len); - res_dp += len; - res_sz -= len; - - } else if (cmd) { - /* cmd is a literal insert instruction; copy from - * the delta stream itself. - */ - if (delta_end - delta < cmd || res_sz < cmd) - goto fail; - memcpy(res_dp, delta, cmd); - delta += cmd; - res_dp += cmd; - res_sz -= cmd; - - } else { - /* cmd == 0 is reserved for future encodings. - */ - goto fail; - } - } - - if (delta != delta_end || res_sz) - goto fail; - return GIT_SUCCESS; - -fail: - free(out->data); - out->data = NULL; - return git__throw(GIT_ERROR, "Failed to apply delta"); -} diff --git a/vendor/libgit2/src/delta-apply.h b/vendor/libgit2/src/delta-apply.h deleted file mode 100644 index 36c5cc60d..000000000 --- a/vendor/libgit2/src/delta-apply.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INCLUDE_delta_apply_h__ -#define INCLUDE_delta_apply_h__ - -#include "odb.h" - -/** - * Apply a git binary delta to recover the original content. - * - * @param out the output buffer to receive the original data. - * Only out->data and out->len are populated, as this is - * the only information available in the delta. - * @param base the base to copy from during copy instructions. - * @param base_len number of bytes available at base. - * @param delta the delta to execute copy/insert instructions from. - * @param delta_len total number of bytes in the delta. - * @return - * - GIT_SUCCESS on a successful delta unpack. - * - GIT_ERROR if the delta is corrupt or doesn't match the base. - */ -extern int git__delta_apply( - git_rawobj *out, - const unsigned char *base, - size_t base_len, - const unsigned char *delta, - size_t delta_len); - -#endif diff --git a/vendor/libgit2/src/dir.h b/vendor/libgit2/src/dir.h deleted file mode 100644 index c01c3fae7..000000000 --- a/vendor/libgit2/src/dir.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef INCLUDE_dir_h__ -#define INCLUDE_dir_h__ - -#include "common.h" - -#ifndef GIT_WIN32 -# include -#endif - -#ifdef GIT_WIN32 - -struct git__dirent { - int d_ino; - char d_name[261]; -}; - -typedef struct { - HANDLE h; - WIN32_FIND_DATA f; - struct git__dirent entry; - char *dir; - int first; -} git__DIR; - -extern git__DIR *git__opendir(const char *); -extern struct git__dirent *git__readdir(git__DIR *); -extern void git__rewinddir(git__DIR *); -extern int git__closedir(git__DIR *); - -# ifndef GIT__WIN32_NO_WRAP_DIR -# define dirent git__dirent -# define DIR git__DIR -# define opendir git__opendir -# define readdir git__readdir -# define rewinddir git__rewinddir -# define closedir git__closedir -# endif - -#endif - -#endif /* INCLUDE_dir_h__ */ diff --git a/vendor/libgit2/src/errors.c b/vendor/libgit2/src/errors.c deleted file mode 100644 index 5031245de..000000000 --- a/vendor/libgit2/src/errors.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "common.h" -#include "git2/thread-utils.h" /* for GIT_TLS */ -#include "thread-utils.h" /* for GIT_TLS */ - -#include - -static GIT_TLS char g_last_error[1024]; - -static struct { - int num; - const char *str; -} error_codes[] = { - {GIT_ERROR, "Unspecified error"}, - {GIT_ENOTOID, "Input was not a properly formatted Git object id."}, - {GIT_ENOTFOUND, "Object does not exist in the scope searched."}, - {GIT_ENOMEM, "Not enough space available."}, - {GIT_EOSERR, "Consult the OS error information."}, - {GIT_EOBJTYPE, "The specified object is of invalid type"}, - {GIT_EOBJCORRUPTED, "The specified object has its data corrupted"}, - {GIT_ENOTAREPO, "The specified repository is invalid"}, - {GIT_EINVALIDTYPE, "The object or config variable type is invalid or doesn't match"}, - {GIT_EMISSINGOBJDATA, "The object cannot be written that because it's missing internal data"}, - {GIT_EPACKCORRUPTED, "The packfile for the ODB is corrupted"}, - {GIT_EFLOCKFAIL, "Failed to adquire or release a file lock"}, - {GIT_EZLIB, "The Z library failed to inflate/deflate an object's data"}, - {GIT_EBUSY, "The queried object is currently busy"}, - {GIT_EINVALIDPATH, "The path is invalid"}, - {GIT_EBAREINDEX, "The index file is not backed up by an existing repository"}, - {GIT_EINVALIDREFNAME, "The name of the reference is not valid"}, - {GIT_EREFCORRUPTED, "The specified reference has its data corrupted"}, - {GIT_ETOONESTEDSYMREF, "The specified symbolic reference is too deeply nested"}, - {GIT_EPACKEDREFSCORRUPTED, "The pack-refs file is either corrupted of its format is not currently supported"}, - {GIT_EINVALIDPATH, "The path is invalid" }, - {GIT_EREVWALKOVER, "The revision walker is empty; there are no more commits left to iterate"}, - {GIT_EINVALIDREFSTATE, "The state of the reference is not valid"}, - {GIT_ENOTIMPLEMENTED, "This feature has not been implemented yet"}, - {GIT_EEXISTS, "A reference with this name already exists"}, - {GIT_EOVERFLOW, "The given integer literal is too large to be parsed"}, - {GIT_ENOTNUM, "The given literal is not a valid number"}, - {GIT_EAMBIGUOUSOIDPREFIX, "The given oid prefix is ambiguous"}, -}; - -const char *git_strerror(int num) -{ - size_t i; - - if (num == GIT_EOSERR) - return strerror(errno); - for (i = 0; i < ARRAY_SIZE(error_codes); i++) - if (num == error_codes[i].num) - return error_codes[i].str; - - return "Unknown error"; -} - -void git___rethrow(const char *msg, ...) -{ - char new_error[1024]; - char *old_error = NULL; - - va_list va; - - va_start(va, msg); - vsnprintf(new_error, sizeof(new_error), msg, va); - va_end(va); - - old_error = strdup(g_last_error); - snprintf(g_last_error, sizeof(g_last_error), "%s \n - %s", new_error, old_error); - free(old_error); -} - -void git___throw(const char *msg, ...) -{ - va_list va; - - va_start(va, msg); - vsnprintf(g_last_error, sizeof(g_last_error), msg, va); - va_end(va); -} - -const char *git_lasterror(void) -{ - if (!g_last_error[0]) - return NULL; - - return g_last_error; -} - -void git_clearerror(void) -{ - g_last_error[0] = '\0'; -} diff --git a/vendor/libgit2/src/fetch.c b/vendor/libgit2/src/fetch.c deleted file mode 100644 index 74c93da8d..000000000 --- a/vendor/libgit2/src/fetch.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/remote.h" -#include "git2/oid.h" -#include "git2/refs.h" -#include "git2/revwalk.h" - -#include "common.h" -#include "transport.h" -#include "remote.h" -#include "refspec.h" -#include "fetch.h" - -static int filter_wants(git_remote *remote) -{ - git_vector list; - git_headarray refs; - git_transport *t = remote->transport; - git_repository *repo = remote->repo; - const git_refspec *spec; - int error; - unsigned int i; - - error = git_vector_init(&list, 16, NULL); - if (error < GIT_SUCCESS) - return error; - - error = t->ls(t, &refs); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to get remote ref list"); - goto cleanup; - } - - spec = git_remote_fetchspec(remote); - if (spec == NULL) { - error = git__throw(GIT_ERROR, "The remote has no fetchspec"); - goto cleanup; - } - - for (i = 0; i < refs.len; ++i) { - git_remote_head *head = refs.heads[i]; - - /* If it doesn't match the refpec, we don't want it */ - error = git_refspec_src_match(spec, head->name); - if (error == GIT_ENOMATCH) - continue; - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Error matching remote ref name"); - goto cleanup; - } - - /* If we have the object, mark it so we don't ask for it */ - if (git_odb_exists(repo->db, &head->oid)) - head->local = 1; - else - remote->need_pack = 1; - - error = git_vector_insert(&list, head); - if (error < GIT_SUCCESS) - goto cleanup; - } - - remote->refs.len = list.length; - remote->refs.heads = (git_remote_head **) list.contents; - - return GIT_SUCCESS; - -cleanup: - git_vector_free(&list); - return error; -} - -/* - * In this first version, we push all our refs in and start sending - * them out. When we get an ACK we hide that commit and continue - * traversing until we're done - */ -int git_fetch_negotiate(git_remote *remote) -{ - int error; - git_headarray *list = &remote->refs; - git_transport *t = remote->transport; - - error = filter_wants(remote); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to filter the reference list for wants"); - - /* Don't try to negotiate when we don't want anything */ - if (list->len == 0) - return GIT_SUCCESS; - if (!remote->need_pack) - return GIT_SUCCESS; - - /* - * Now we have everything set up so we can start tell the server - * what we want and what we have. - */ - error = t->send_wants(t, list); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to send want list"); - - return t->negotiate_fetch(t, remote->repo, &remote->refs); -} - -int git_fetch_download_pack(char **out, git_remote *remote) -{ - if(!remote->need_pack) { - *out = NULL; - return GIT_SUCCESS; - } - - return remote->transport->download_pack(out, remote->transport, remote->repo); -} diff --git a/vendor/libgit2/src/fetch.h b/vendor/libgit2/src/fetch.h deleted file mode 100644 index ad4451ffe..000000000 --- a/vendor/libgit2/src/fetch.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef INCLUDE_fetch_h__ -#define INCLUDE_fetch_h__ - -int git_fetch_negotiate(git_remote *remote); -int git_fetch_download_pack(char **out, git_remote *remote); - -#endif diff --git a/vendor/libgit2/src/filebuf.c b/vendor/libgit2/src/filebuf.c deleted file mode 100644 index 6d398a7db..000000000 --- a/vendor/libgit2/src/filebuf.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include - -#include "common.h" -#include "filebuf.h" -#include "fileops.h" - -static const size_t WRITE_BUFFER_SIZE = (4096 * 2); - -static int lock_file(git_filebuf *file, int flags) -{ - if (git_futils_exists(file->path_lock) == 0) { - if (flags & GIT_FILEBUF_FORCE) - p_unlink(file->path_lock); - else - return git__throw(GIT_EOSERR, "Failed to lock file"); - } - - /* create path to the file buffer is required */ - if (flags & GIT_FILEBUF_FORCE) { - file->fd = git_futils_creat_locked_withpath(file->path_lock, 0644); - } else { - file->fd = git_futils_creat_locked(file->path_lock, 0644); - } - - if (file->fd < 0) - return git__throw(GIT_EOSERR, "Failed to create lock"); - - if ((flags & GIT_FILEBUF_APPEND) && git_futils_exists(file->path_original) == 0) { - git_file source; - char buffer[2048]; - size_t read_bytes; - - source = p_open(file->path_original, O_RDONLY); - if (source < 0) - return git__throw(GIT_EOSERR, "Failed to lock file. Could not open %s", file->path_original); - - while ((read_bytes = p_read(source, buffer, 2048)) > 0) { - p_write(file->fd, buffer, read_bytes); - if (file->digest) - git_hash_update(file->digest, buffer, read_bytes); - } - - p_close(source); - } - - return GIT_SUCCESS; -} - -void git_filebuf_cleanup(git_filebuf *file) -{ - if (file->fd >= 0) - p_close(file->fd); - - if (file->fd >= 0 && file->path_lock && git_futils_exists(file->path_lock) == GIT_SUCCESS) - p_unlink(file->path_lock); - - if (file->digest) - git_hash_free_ctx(file->digest); - - free(file->buffer); - free(file->z_buf); - - deflateEnd(&file->zs); - - free(file->path_original); - free(file->path_lock); -} - -GIT_INLINE(int) flush_buffer(git_filebuf *file) -{ - int result = file->write(file, file->buffer, file->buf_pos); - file->buf_pos = 0; - return result; -} - -static int write_normal(git_filebuf *file, void *source, size_t len) -{ - int result = 0; - - if (len > 0) { - result = p_write(file->fd, (void *)source, len); - if (file->digest) - git_hash_update(file->digest, source, len); - } - - return result; -} - -static int write_deflate(git_filebuf *file, void *source, size_t len) -{ - int result = Z_OK; - z_stream *zs = &file->zs; - - if (len > 0 || file->flush_mode == Z_FINISH) { - zs->next_in = (void *)source; - zs->avail_in = len; - - do { - int have; - - zs->next_out = file->z_buf; - zs->avail_out = file->buf_size; - - result = deflate(zs, file->flush_mode); - assert(result != Z_STREAM_ERROR); - - have = file->buf_size - zs->avail_out; - - if (p_write(file->fd, file->z_buf, have) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to write to file"); - - } while (zs->avail_out == 0); - - assert(zs->avail_in == 0); - - if (file->digest) - git_hash_update(file->digest, source, len); - } - - return GIT_SUCCESS; -} - -int git_filebuf_open(git_filebuf *file, const char *path, int flags) -{ - int error; - size_t path_len; - - assert(file && path); - - memset(file, 0x0, sizeof(git_filebuf)); - - file->buf_size = WRITE_BUFFER_SIZE; - file->buf_pos = 0; - file->fd = -1; - - /* Allocate the main cache buffer */ - file->buffer = git__malloc(file->buf_size); - if (file->buffer == NULL){ - error = GIT_ENOMEM; - goto cleanup; - } - - /* If we are hashing on-write, allocate a new hash context */ - if (flags & GIT_FILEBUF_HASH_CONTENTS) { - if ((file->digest = git_hash_new_ctx()) == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - } - - /* If we are deflating on-write, */ - if (flags & GIT_FILEBUF_DEFLATE_CONTENTS) { - - /* Initialize the ZLib stream */ - if (deflateInit(&file->zs, Z_BEST_SPEED) != Z_OK) { - error = git__throw(GIT_EZLIB, "Failed to initialize zlib"); - goto cleanup; - } - - /* Allocate the Zlib cache buffer */ - file->z_buf = git__malloc(file->buf_size); - if (file->z_buf == NULL){ - error = GIT_ENOMEM; - goto cleanup; - } - - /* Never flush */ - file->flush_mode = Z_NO_FLUSH; - file->write = &write_deflate; - } else { - file->write = &write_normal; - } - - /* If we are writing to a temp file */ - if (flags & GIT_FILEBUF_TEMPORARY) { - char tmp_path[GIT_PATH_MAX]; - - /* Open the file as temporary for locking */ - file->fd = git_futils_mktmp(tmp_path, path); - if (file->fd < 0) { - error = GIT_EOSERR; - goto cleanup; - } - - /* No original path */ - file->path_original = NULL; - file->path_lock = git__strdup(tmp_path); - - if (file->path_lock == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - } else { - path_len = strlen(path); - - /* Save the original path of the file */ - file->path_original = git__strdup(path); - if (file->path_original == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - /* create the locking path by appending ".lock" to the original */ - file->path_lock = git__malloc(path_len + GIT_FILELOCK_EXTLENGTH); - if (file->path_lock == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - memcpy(file->path_lock, file->path_original, path_len); - memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH); - - /* open the file for locking */ - if ((error = lock_file(file, flags)) < GIT_SUCCESS) - goto cleanup; - } - - return GIT_SUCCESS; - -cleanup: - git_filebuf_cleanup(file); - return git__rethrow(error, "Failed to open file buffer for '%s'", path); -} - -int git_filebuf_hash(git_oid *oid, git_filebuf *file) -{ - int error; - - assert(oid && file && file->digest); - - if ((error = flush_buffer(file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to get hash for file"); - - git_hash_final(oid, file->digest); - git_hash_free_ctx(file->digest); - file->digest = NULL; - - return GIT_SUCCESS; -} - -int git_filebuf_commit_at(git_filebuf *file, const char *path) -{ - free(file->path_original); - file->path_original = git__strdup(path); - if (file->path_original == NULL) - return GIT_ENOMEM; - - return git_filebuf_commit(file); -} - -int git_filebuf_commit(git_filebuf *file) -{ - int error; - - /* temporary files cannot be committed */ - assert(file && file->path_original); - - file->flush_mode = Z_FINISH; - if ((error = flush_buffer(file)) < GIT_SUCCESS) - goto cleanup; - - p_close(file->fd); - file->fd = -1; - - error = git_futils_mv_atomic(file->path_lock, file->path_original); - -cleanup: - git_filebuf_cleanup(file); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to commit locked file from buffer"); - return GIT_SUCCESS; -} - -GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len) -{ - memcpy(file->buffer + file->buf_pos, buf, len); - file->buf_pos += len; -} - -int git_filebuf_write(git_filebuf *file, const void *buff, size_t len) -{ - int error; - const unsigned char *buf = buff; - - for (;;) { - size_t space_left = file->buf_size - file->buf_pos; - - /* cache if it's small */ - if (space_left > len) { - add_to_cache(file, buf, len); - return GIT_SUCCESS; - } - - add_to_cache(file, buf, space_left); - - if ((error = flush_buffer(file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write to buffer"); - - len -= space_left; - buf += space_left; - } -} - -int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len) -{ - int error; - size_t space_left = file->buf_size - file->buf_pos; - - *buffer = NULL; - - if (len > file->buf_size) - return GIT_ENOMEM; - - if (space_left <= len) { - if ((error = flush_buffer(file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to reserve buffer"); - } - - *buffer = (file->buffer + file->buf_pos); - file->buf_pos += len; - - return GIT_SUCCESS; -} - -int git_filebuf_printf(git_filebuf *file, const char *format, ...) -{ - va_list arglist; - size_t space_left; - int len, error; - char *tmp_buffer; - - space_left = file->buf_size - file->buf_pos; - - do { - va_start(arglist, format); - len = p_vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist); - va_end(arglist); - - if (len < 0) - return git__throw(GIT_EOSERR, "Failed to format string"); - - if ((size_t)len + 1 <= space_left) { - file->buf_pos += len; - return GIT_SUCCESS; - } - - if ((error = flush_buffer(file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to output to buffer"); - - space_left = file->buf_size - file->buf_pos; - - } while ((size_t)len + 1 <= space_left); - - tmp_buffer = git__malloc(len + 1); - if (!tmp_buffer) - return GIT_ENOMEM; - - va_start(arglist, format); - len = p_vsnprintf(tmp_buffer, len + 1, format, arglist); - va_end(arglist); - - if (len < 0) { - free(tmp_buffer); - return git__throw(GIT_EOSERR, "Failed to format string"); - } - - error = git_filebuf_write(file, tmp_buffer, len); - free(tmp_buffer); - - return error; -} - diff --git a/vendor/libgit2/src/filebuf.h b/vendor/libgit2/src/filebuf.h deleted file mode 100644 index 9154cabcd..000000000 --- a/vendor/libgit2/src/filebuf.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef INCLUDE_filebuf_h__ -#define INCLUDE_filebuf_h__ - -#include "fileops.h" -#include "hash.h" -#include "git2/zlib.h" - -#ifdef GIT_THREADS -# define GIT_FILEBUF_THREADS -#endif - -#define GIT_FILEBUF_HASH_CONTENTS (1 << 0) -#define GIT_FILEBUF_APPEND (1 << 2) -#define GIT_FILEBUF_FORCE (1 << 3) -#define GIT_FILEBUF_TEMPORARY (1 << 4) -#define GIT_FILEBUF_DEFLATE_CONTENTS (1 << 5) - -#define GIT_FILELOCK_EXTENSION ".lock\0" -#define GIT_FILELOCK_EXTLENGTH 6 - -struct git_filebuf { - char *path_original; - char *path_lock; - - int (*write)(struct git_filebuf *file, void *source, size_t len); - - git_hash_ctx *digest; - - unsigned char *buffer; - unsigned char *z_buf; - - z_stream zs; - int flush_mode; - - size_t buf_size, buf_pos; - git_file fd; -}; - -typedef struct git_filebuf git_filebuf; - -int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len); -int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len); -int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); - -int git_filebuf_open(git_filebuf *lock, const char *path, int flags); -int git_filebuf_commit(git_filebuf *lock); -int git_filebuf_commit_at(git_filebuf *lock, const char *path); -void git_filebuf_cleanup(git_filebuf *lock); -int git_filebuf_hash(git_oid *oid, git_filebuf *file); - -#endif diff --git a/vendor/libgit2/src/fileops.c b/vendor/libgit2/src/fileops.c deleted file mode 100644 index d7413a138..000000000 --- a/vendor/libgit2/src/fileops.c +++ /dev/null @@ -1,376 +0,0 @@ -#include "common.h" -#include "fileops.h" -#include - -int git_futils_mv_atomic(const char *from, const char *to) -{ -#ifdef GIT_WIN32 - /* - * Win32 POSIX compilance my ass. If the destination - * file exists, the `rename` call fails. This is as - * close as it gets with the Win32 API. - */ - return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) ? GIT_SUCCESS : GIT_EOSERR; -#else - /* Don't even try this on Win32 */ - if (!link(from, to)) { - p_unlink(from); - return GIT_SUCCESS; - } - - if (!rename(from, to)) - return GIT_SUCCESS; - - return GIT_ERROR; -#endif -} - -int git_futils_mkpath2file(const char *file_path) -{ - const int mode = 0755; /* or 0777 ? */ - int error = GIT_SUCCESS; - char target_folder_path[GIT_PATH_MAX]; - - error = git_path_dirname_r(target_folder_path, sizeof(target_folder_path), file_path); - if (error < GIT_SUCCESS) - return git__throw(GIT_EINVALIDPATH, "Failed to recursively build `%s` tree structure. Unable to parse parent folder name", file_path); - - /* Does the containing folder exist? */ - if (git_futils_isdir(target_folder_path)) { - git_path_join(target_folder_path, target_folder_path, ""); /* Ensure there's a trailing slash */ - - /* Let's create the tree structure */ - error = git_futils_mkdir_r(target_folder_path, mode); - if (error < GIT_SUCCESS) - return error; /* The callee already takes care of setting the correct error message. */ - } - - return GIT_SUCCESS; -} - -int git_futils_mktmp(char *path_out, const char *filename) -{ - int fd; - - strcpy(path_out, filename); - strcat(path_out, "_git2_XXXXXX"); - - if ((fd = p_mkstemp(path_out)) < 0) - return git__throw(GIT_EOSERR, "Failed to create temporary file %s", path_out); - - return fd; -} - -int git_futils_creat_withpath(const char *path, int mode) -{ - if (git_futils_mkpath2file(path) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to create file %s", path); - - return p_creat(path, mode); -} - -int git_futils_creat_locked(const char *path, int mode) -{ - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_EXCL, mode); - return fd >= 0 ? fd : git__throw(GIT_EOSERR, "Failed to create locked file. Could not open %s", path); -} - -int git_futils_creat_locked_withpath(const char *path, int mode) -{ - if (git_futils_mkpath2file(path) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to create locked file %s", path); - - return git_futils_creat_locked(path, mode); -} - -int git_futils_isdir(const char *path) -{ -#ifdef GIT_WIN32 - DWORD attr = GetFileAttributes(path); - if (attr == INVALID_FILE_ATTRIBUTES) - return GIT_ERROR; - - return (attr & FILE_ATTRIBUTE_DIRECTORY) ? GIT_SUCCESS : GIT_ERROR; - -#else - struct stat st; - if (p_stat(path, &st) < GIT_SUCCESS) - return GIT_ERROR; - - return S_ISDIR(st.st_mode) ? GIT_SUCCESS : GIT_ERROR; -#endif -} - -int git_futils_isfile(const char *path) -{ - struct stat st; - int stat_error; - - assert(path); - stat_error = p_stat(path, &st); - - if (stat_error < GIT_SUCCESS) - return -1; - - if (!S_ISREG(st.st_mode)) - return -1; - - return 0; -} - -int git_futils_exists(const char *path) -{ - assert(path); - return access(path, F_OK); -} - -git_off_t git_futils_filesize(git_file fd) -{ - struct stat sb; - if (p_fstat(fd, &sb)) - return GIT_ERROR; - - return sb.st_size; -} - -int git_futils_readbuffer_updated(git_fbuffer *obj, const char *path, time_t *mtime, int *updated) -{ - git_file fd; - size_t len; - struct stat st; - unsigned char *buff; - - assert(obj && path && *path); - - if (updated != NULL) - *updated = 0; - - if (p_stat(path, &st) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to stat file %s", path); - - if (S_ISDIR(st.st_mode)) - return git__throw(GIT_ERROR, "Can't read a dir into a buffer"); - - /* - * If we were given a time, we only want to read the file if it - * has been modified. - */ - if (mtime != NULL && *mtime >= st.st_mtime) - return GIT_SUCCESS; - - if (mtime != NULL) - *mtime = st.st_mtime; - if (!git__is_sizet(st.st_size+1)) - return git__throw(GIT_ERROR, "Failed to read file `%s`. An error occured while calculating its size", path); - - len = (size_t) st.st_size; - - if ((fd = p_open(path, O_RDONLY)) < 0) - return git__throw(GIT_EOSERR, "Failed to open %s for reading", path); - - if ((buff = git__malloc(len + 1)) == NULL) { - p_close(fd); - return GIT_ENOMEM; - } - - if (p_read(fd, buff, len) < 0) { - p_close(fd); - free(buff); - return git__throw(GIT_ERROR, "Failed to read file `%s`", path); - } - buff[len] = '\0'; - - p_close(fd); - - if (mtime != NULL) - *mtime = st.st_mtime; - if (updated != NULL) - *updated = 1; - - obj->data = buff; - obj->len = len; - - return GIT_SUCCESS; -} - -int git_futils_readbuffer(git_fbuffer *obj, const char *path) -{ - return git_futils_readbuffer_updated(obj, path, NULL, NULL); -} - -void git_futils_freebuffer(git_fbuffer *obj) -{ - assert(obj); - free(obj->data); - obj->data = NULL; -} - - -int git_futils_mv_withpath(const char *from, const char *to) -{ - if (git_futils_mkpath2file(to) < GIT_SUCCESS) - return GIT_EOSERR; /* The callee already takes care of setting the correct error message. */ - - return git_futils_mv_atomic(from, to); /* The callee already takes care of setting the correct error message. */ -} - -int git_futils_mmap_ro(git_map *out, git_file fd, git_off_t begin, size_t len) -{ - return p_mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin); -} - -void git_futils_mmap_free(git_map *out) -{ - p_munmap(out); -} - -/* Taken from git.git */ -GIT_INLINE(int) is_dot_or_dotdot(const char *name) -{ - return (name[0] == '.' && - (name[1] == '\0' || - (name[1] == '.' && name[2] == '\0'))); -} - -int git_futils_direach( - char *path, - size_t path_sz, - int (*fn)(void *, char *), - void *arg) -{ - size_t wd_len = strlen(path); - DIR *dir; - struct dirent *de; - - if (!wd_len || path_sz < wd_len + 2) - return git__throw(GIT_EINVALIDARGS, "Failed to process `%s` tree structure. Path is either empty or buffer size is too short", path); - - while (path[wd_len - 1] == '/') - wd_len--; - path[wd_len++] = '/'; - path[wd_len] = '\0'; - - dir = opendir(path); - if (!dir) - return git__throw(GIT_EOSERR, "Failed to process `%s` tree structure. An error occured while opening the directory", path); - - while ((de = readdir(dir)) != NULL) { - size_t de_len; - int result; - - if (is_dot_or_dotdot(de->d_name)) - continue; - - de_len = strlen(de->d_name); - if (path_sz < wd_len + de_len + 1) { - closedir(dir); - return git__throw(GIT_ERROR, "Failed to process `%s` tree structure. Buffer size is too short", path); - } - - strcpy(path + wd_len, de->d_name); - result = fn(arg, path); - if (result < GIT_SUCCESS) { - closedir(dir); - return result; /* The callee is reponsible for setting the correct error message */ - } - if (result > 0) { - closedir(dir); - return result; - } - } - - closedir(dir); - return GIT_SUCCESS; -} - -int git_futils_mkdir_r(const char *path, int mode) -{ - int error, root_path_offset; - char *pp, *sp; - char *path_copy = git__strdup(path); - - if (path_copy == NULL) - return GIT_ENOMEM; - - error = GIT_SUCCESS; - pp = path_copy; - - root_path_offset = git_path_root(pp); - if (root_path_offset > 0) - pp += root_path_offset; /* On Windows, will skip the drive name (eg. C: or D:) */ - - while (error == GIT_SUCCESS && (sp = strchr(pp, '/')) != NULL) { - if (sp != pp && git_futils_isdir(path_copy) < GIT_SUCCESS) { - *sp = 0; - error = p_mkdir(path_copy, mode); - - /* Do not choke while trying to recreate an existing directory */ - if (errno == EEXIST) - error = GIT_SUCCESS; - - *sp = '/'; - } - - pp = sp + 1; - } - - if (*pp != '\0' && error == GIT_SUCCESS) { - error = p_mkdir(path, mode); - if (errno == EEXIST) - error = GIT_SUCCESS; - } - - free(path_copy); - - if (error < GIT_SUCCESS) - return git__throw(error, "Failed to recursively create `%s` tree structure", path); - - return GIT_SUCCESS; -} - -static int _rmdir_recurs_foreach(void *opaque, char *path) -{ - int error = GIT_SUCCESS; - int force = *(int *)opaque; - - if (git_futils_isdir(path) == GIT_SUCCESS) { - size_t root_size = strlen(path); - - if ((error = git_futils_direach(path, GIT_PATH_MAX, _rmdir_recurs_foreach, opaque)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to remove directory `%s`", path); - - path[root_size] = '\0'; - return p_rmdir(path); - - } else if (force) { - return p_unlink(path); - } - - return git__rethrow(error, "Failed to remove directory. `%s` is not empty", path); -} - -int git_futils_rmdir_r(const char *path, int force) -{ - char p[GIT_PATH_MAX]; - strncpy(p, path, GIT_PATH_MAX); - return _rmdir_recurs_foreach(&force, p); -} - -int git_futils_cmp_path(const char *name1, int len1, int isdir1, - const char *name2, int len2, int isdir2) -{ - int len = len1 < len2 ? len1 : len2; - int cmp; - - cmp = memcmp(name1, name2, len); - if (cmp) - return cmp; - if (len1 < len2) - return ((!isdir1 && !isdir2) ? -1 : - (isdir1 ? '/' - name2[len1] : name2[len1] - '/')); - if (len1 > len2) - return ((!isdir1 && !isdir2) ? 1 : - (isdir2 ? name1[len2] - '/' : '/' - name1[len2])); - return 0; -} - diff --git a/vendor/libgit2/src/fileops.h b/vendor/libgit2/src/fileops.h deleted file mode 100644 index 84c35e41b..000000000 --- a/vendor/libgit2/src/fileops.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * fileops.h - OS agnostic disk io operations - * - * This header describes the strictly internal part of the api - */ -#ifndef INCLUDE_fileops_h__ -#define INCLUDE_fileops_h__ - -#include "common.h" -#include "map.h" -#include "dir.h" -#include "posix.h" -#include "path.h" - -/** - * Filebuffer methods - * - * Read whole files into an in-memory buffer for processing - */ -#define GIT_FBUFFER_INIT {NULL, 0} - -typedef struct { /* file io buffer */ - void *data; /* data bytes */ - size_t len; /* data length */ -} git_fbuffer; - -extern int git_futils_readbuffer(git_fbuffer *obj, const char *path); -extern int git_futils_readbuffer_updated(git_fbuffer *obj, const char *path, time_t *mtime, int *updated); -extern void git_futils_freebuffer(git_fbuffer *obj); - -/** - * File utils - * - * These are custom filesystem-related helper methods. They are - * rather high level, and wrap the underlying POSIX methods - * - * All these methods return GIT_SUCCESS on success, - * or an error code on failure and an error message is set. - */ - -/** - * Check if a file exists and can be accessed. - */ -extern int git_futils_exists(const char *path); - -/** - * Create and open a file, while also - * creating all the folders in its path - */ -extern int git_futils_creat_withpath(const char *path, int mode); - -/** - * Create an open a process-locked file - */ -extern int git_futils_creat_locked(const char *path, int mode); - -/** - * Create an open a process-locked file, while - * also creating all the folders in its path - */ -extern int git_futils_creat_locked_withpath(const char *path, int mode); - -/** - * Check if the given path points to a directory - */ -extern int git_futils_isdir(const char *path); - -/** - * Check if the given path points to a regular file - */ -extern int git_futils_isfile(const char *path); - -/** - * Create a path recursively - */ -extern int git_futils_mkdir_r(const char *path, int mode); - -/** - * Create all the folders required to contain - * the full path of a file - */ -extern int git_futils_mkpath2file(const char *path); - -extern int git_futils_rmdir_r(const char *path, int force); - -/** - * Create and open a temporary file with a `_git2_` suffix - */ -extern int git_futils_mktmp(char *path_out, const char *filename); - -/** - * Atomically rename a file on the filesystem - */ -extern int git_futils_mv_atomic(const char *from, const char *to); - -/** - * Move a file on the filesystem, create the - * destination path if it doesn't exist - */ -extern int git_futils_mv_withpath(const char *from, const char *to); - - -/** - * Get the filesize in bytes of a file - */ -extern git_off_t git_futils_filesize(git_file fd); - -/** - * Read-only map all or part of a file into memory. - * When possible this function should favor a virtual memory - * style mapping over some form of malloc()+read(), as the - * data access will be random and is not likely to touch the - * majority of the region requested. - * - * @param out buffer to populate with the mapping information. - * @param fd open descriptor to configure the mapping from. - * @param begin first byte to map, this should be page aligned. - * @param end number of bytes to map. - * @return - * - GIT_SUCCESS on success; - * - GIT_EOSERR on an unspecified OS related error. - */ -extern int git_futils_mmap_ro( - git_map *out, - git_file fd, - git_off_t begin, - size_t len); - -/** - * Release the memory associated with a previous memory mapping. - * @param map the mapping description previously configured. - */ -extern void git_futils_mmap_free(git_map *map); - -/** - * Walk each directory entry, except '.' and '..', calling fn(state). - * - * @param pathbuf buffer the function reads the initial directory - * path from, and updates with each successive entry's name. - * @param pathmax maximum allocation of pathbuf. - * @param fn function to invoke with each entry. The first arg is - * the input state and the second arg is pathbuf. The function - * may modify the pathbuf, but only by appending new text. - * @param state to pass to fn as the first arg. - */ -extern int git_futils_direach( - char *pathbuf, - size_t pathmax, - int (*fn)(void *, char *), - void *state); - -extern int git_futils_cmp_path(const char *name1, int len1, int isdir1, - const char *name2, int len2, int isdir2); - -#endif /* INCLUDE_fileops_h__ */ diff --git a/vendor/libgit2/src/hash.c b/vendor/libgit2/src/hash.c deleted file mode 100644 index b8b311bcb..000000000 --- a/vendor/libgit2/src/hash.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "hash.h" - -#if defined(PPC_SHA1) -# include "ppc/sha1.h" -#else -# include "sha1.h" -#endif - -struct git_hash_ctx { - SHA_CTX c; -}; - -git_hash_ctx *git_hash_new_ctx(void) -{ - git_hash_ctx *ctx = git__malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - - SHA1_Init(&ctx->c); - - return ctx; -} - -void git_hash_free_ctx(git_hash_ctx *ctx) -{ - free(ctx); -} - -void git_hash_init(git_hash_ctx *ctx) -{ - assert(ctx); - SHA1_Init(&ctx->c); -} - -void git_hash_update(git_hash_ctx *ctx, const void *data, size_t len) -{ - assert(ctx); - SHA1_Update(&ctx->c, data, len); -} - -void git_hash_final(git_oid *out, git_hash_ctx *ctx) -{ - assert(ctx); - SHA1_Final(out->id, &ctx->c); -} - -void git_hash_buf(git_oid *out, const void *data, size_t len) -{ - SHA_CTX c; - - SHA1_Init(&c); - SHA1_Update(&c, data, len); - SHA1_Final(out->id, &c); -} - -void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n) -{ - SHA_CTX c; - size_t i; - - SHA1_Init(&c); - for (i = 0; i < n; i++) - SHA1_Update(&c, vec[i].data, vec[i].len); - SHA1_Final(out->id, &c); -} diff --git a/vendor/libgit2/src/hash.h b/vendor/libgit2/src/hash.h deleted file mode 100644 index 2b769a4c9..000000000 --- a/vendor/libgit2/src/hash.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * hash.h - */ -#ifndef INCLUDE_hash_h__ -#define INCLUDE_hash_h__ - -#include "git2/oid.h" - -typedef struct git_hash_ctx git_hash_ctx; - -typedef struct { - void *data; - size_t len; -} git_buf_vec; - -git_hash_ctx *git_hash_new_ctx(void); -void git_hash_free_ctx(git_hash_ctx *ctx); - -void git_hash_init(git_hash_ctx *c); -void git_hash_update(git_hash_ctx *c, const void *data, size_t len); -void git_hash_final(git_oid *out, git_hash_ctx *c); - -void git_hash_buf(git_oid *out, const void *data, size_t len); -void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n); - -#endif /* INCLUDE_hash_h__ */ diff --git a/vendor/libgit2/src/hashtable.c b/vendor/libgit2/src/hashtable.c deleted file mode 100644 index 86e5a113a..000000000 --- a/vendor/libgit2/src/hashtable.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "repository.h" -#include "commit.h" - -#define MAX_LOOPS 5 -static const double max_load_factor = 0.65; - -static int resize_to(git_hashtable *self, size_t new_size); -static int set_size(git_hashtable *self, size_t new_size); -static git_hashtable_node *node_with_hash(git_hashtable *self, const void *key, int hash_id); -static void node_swap_with(git_hashtable_node *self, git_hashtable_node *other); -static int node_insert(git_hashtable *self, git_hashtable_node *new_node); -static int insert_nodes(git_hashtable *self, git_hashtable_node *old_nodes, size_t old_size); - -static int resize_to(git_hashtable *self, size_t new_size) -{ - git_hashtable_node *old_nodes = self->nodes; - size_t old_size = self->size; - - self->is_resizing = 1; - - do { - self->size = new_size; - self->size_mask = new_size - 1; - self->key_count = 0; - self->nodes = git__calloc(1, sizeof(git_hashtable_node) * self->size); - - if (self->nodes == NULL) - return GIT_ENOMEM; - - if (insert_nodes(self, old_nodes, old_size) == 0) - self->is_resizing = 0; - else { - new_size *= 2; - free(self->nodes); - } - } while(self->is_resizing); - - free(old_nodes); - return GIT_SUCCESS; -} - -static int set_size(git_hashtable *self, size_t new_size) -{ - self->nodes = realloc(self->nodes, new_size * sizeof(git_hashtable_node)); - if (self->nodes == NULL) - return GIT_ENOMEM; - - if (new_size > self->size) { - memset(&self->nodes[self->size], 0x0, (new_size - self->size) * sizeof(git_hashtable_node)); - } - - self->size = new_size; - self->size_mask = new_size - 1; - return GIT_SUCCESS; -} - -static git_hashtable_node *node_with_hash(git_hashtable *self, const void *key, int hash_id) -{ - size_t pos = self->hash(key, hash_id) & self->size_mask; - return git_hashtable_node_at(self->nodes, pos); -} - -static void node_swap_with(git_hashtable_node *self, git_hashtable_node *other) -{ - git_hashtable_node tmp = *self; - *self = *other; - *other = tmp; -} - -static int node_insert(git_hashtable *self, git_hashtable_node *new_node) -{ - int iteration, hash_id; - - for (iteration = 0; iteration < MAX_LOOPS; iteration++) { - for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) { - git_hashtable_node *node; - node = node_with_hash(self, new_node->key, hash_id); - node_swap_with(new_node, node); - if(new_node->key == 0x0){ - self->key_count++; - return GIT_SUCCESS; - } - } - } - - if (self->is_resizing) - return git__throw(GIT_EBUSY, "Failed to insert node. Hashtable is currently resizing"); - - resize_to(self, self->size * 2); - git_hashtable_insert(self, new_node->key, new_node->value); - return GIT_SUCCESS; -} - -static int insert_nodes(git_hashtable *self, git_hashtable_node *old_nodes, size_t old_size) -{ - size_t i; - - for (i = 0; i < old_size; ++i) { - git_hashtable_node *node = git_hashtable_node_at(old_nodes, i); - if (node->key && git_hashtable_insert(self, node->key, node->value) < GIT_SUCCESS) - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -git_hashtable *git_hashtable_alloc(size_t min_size, - git_hash_ptr hash, - git_hash_keyeq_ptr key_eq) -{ - git_hashtable *table; - - assert(hash && key_eq); - - if ((table = git__malloc(sizeof(git_hashtable))) == NULL) - return NULL; - - memset(table, 0x0, sizeof(git_hashtable)); - - if (min_size < 8) - min_size = 8; - - /* round up size to closest power of 2 */ - min_size--; - min_size |= min_size >> 1; - min_size |= min_size >> 2; - min_size |= min_size >> 4; - min_size |= min_size >> 8; - min_size |= min_size >> 16; - - table->hash = hash; - table->key_equal = key_eq; - - set_size(table, min_size + 1); - - return table; -} - -void git_hashtable_clear(git_hashtable *self) -{ - assert(self); - - memset(self->nodes, 0x0, sizeof(git_hashtable_node) * self->size); - self->key_count = 0; -} - -void git_hashtable_free(git_hashtable *self) -{ - assert(self); - - free(self->nodes); - free(self); -} - - -int git_hashtable_insert2(git_hashtable *self, const void *key, void *value, void **old_value) -{ - int hash_id; - git_hashtable_node *node; - - assert(self && self->nodes); - - *old_value = NULL; - - for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) { - node = node_with_hash(self, key, hash_id); - - if (!node->key) { - node->key = key; - node->value = value; - self->key_count++; - return GIT_SUCCESS; - } - - if (key == node->key || self->key_equal(key, node->key) == 0) { - *old_value = node->value; - node->key = key; - node->value = value; - return GIT_SUCCESS; - } - } - - /* no space in table; must do cuckoo dance */ - { - git_hashtable_node x; - x.key = key; - x.value = value; - return node_insert(self, &x); - } -} - -void *git_hashtable_lookup(git_hashtable *self, const void *key) -{ - int hash_id; - git_hashtable_node *node; - - assert(self && self->nodes); - - for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) { - node = node_with_hash(self, key, hash_id); - if (node->key && self->key_equal(key, node->key) == 0) - return node->value; - } - - return NULL; -} - -int git_hashtable_remove(git_hashtable *self, const void *key) -{ - int hash_id; - git_hashtable_node *node; - - assert(self && self->nodes); - - for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) { - node = node_with_hash(self, key, hash_id); - if (node->key && self->key_equal(key, node->key) == 0) { - node->key = NULL; - node->value = NULL; - self->key_count--; - return GIT_SUCCESS; - } - } - - return git__throw(GIT_ENOTFOUND, "Entry not found in hash table"); -} - -int git_hashtable_merge(git_hashtable *self, git_hashtable *other) -{ - if (resize_to(self, (self->size + other->size) * 2) < GIT_SUCCESS) - return GIT_ENOMEM; - - return insert_nodes(self, other->nodes, other->key_count); -} - diff --git a/vendor/libgit2/src/hashtable.h b/vendor/libgit2/src/hashtable.h deleted file mode 100644 index be21be2b1..000000000 --- a/vendor/libgit2/src/hashtable.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef INCLUDE_hashtable_h__ -#define INCLUDE_hashtable_h__ - -#include "git2/common.h" -#include "git2/oid.h" -#include "git2/odb.h" -#include "common.h" - -#define GIT_HASHTABLE_HASHES 3 - -typedef uint32_t (*git_hash_ptr)(const void *, int hash_id); -typedef int (*git_hash_keyeq_ptr)(const void *key_a, const void *key_b); - -struct git_hashtable_node { - const void *key; - void *value; -}; - -struct git_hashtable { - struct git_hashtable_node *nodes; - - size_t size_mask; - size_t size; - size_t key_count; - - int is_resizing; - - git_hash_ptr hash; - git_hash_keyeq_ptr key_equal; -}; - -typedef struct git_hashtable_node git_hashtable_node; -typedef struct git_hashtable git_hashtable; - -git_hashtable *git_hashtable_alloc(size_t min_size, - git_hash_ptr hash, - git_hash_keyeq_ptr key_eq); -void *git_hashtable_lookup(git_hashtable *h, const void *key); -int git_hashtable_remove(git_hashtable *table, const void *key); -void git_hashtable_free(git_hashtable *h); -void git_hashtable_clear(git_hashtable *h); -int git_hashtable_merge(git_hashtable *self, git_hashtable *other); - -int git_hashtable_insert2(git_hashtable *h, const void *key, void *value, void **old_value); - -GIT_INLINE(int) git_hashtable_insert(git_hashtable *h, const void *key, void *value) -{ - void *_unused; - return git_hashtable_insert2(h, key, value, &_unused); -} - -#define git_hashtable_node_at(nodes, pos) ((git_hashtable_node *)(&nodes[pos])) - -#define GIT_HASHTABLE_FOREACH(self, pkey, pvalue, code) {\ - git_hashtable *_self = (self);\ - git_hashtable_node *_nodes = _self->nodes;\ - unsigned int _i, _size = _self->size;\ - for (_i = 0; _i < _size; _i ++) {\ - git_hashtable_node *_node = git_hashtable_node_at(_nodes, _i);\ - if (_node->key)\ - {\ - pkey = _node->key;\ - pvalue = _node->value;\ - code;\ - }\ - }\ -} - -#define GIT_HASHTABLE_FOREACH_DELETE() {\ - _node->key = NULL; _node->value = NULL; _self->key_count--;\ -} - - -#endif diff --git a/vendor/libgit2/src/index.c b/vendor/libgit2/src/index.c deleted file mode 100644 index bbe9efa49..000000000 --- a/vendor/libgit2/src/index.c +++ /dev/null @@ -1,1060 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include - -#include "common.h" -#include "repository.h" -#include "index.h" -#include "hash.h" -#include "git2/odb.h" -#include "git2/blob.h" - -#define entry_size(type,len) ((offsetof(type, path) + (len) + 8) & ~7) -#define short_entry_size(len) entry_size(struct entry_short, len) -#define long_entry_size(len) entry_size(struct entry_long, len) - -#define minimal_entry_size (offsetof(struct entry_short, path)) - -static const size_t INDEX_FOOTER_SIZE = GIT_OID_RAWSZ; -static const size_t INDEX_HEADER_SIZE = 12; - -static const unsigned int INDEX_VERSION_NUMBER = 2; -static const unsigned int INDEX_VERSION_NUMBER_EXT = 3; - -static const unsigned int INDEX_HEADER_SIG = 0x44495243; -static const char INDEX_EXT_TREECACHE_SIG[] = {'T', 'R', 'E', 'E'}; -static const char INDEX_EXT_UNMERGED_SIG[] = {'R', 'E', 'U', 'C'}; - -struct index_header { - uint32_t signature; - uint32_t version; - uint32_t entry_count; -}; - -struct index_extension { - char signature[4]; - uint32_t extension_size; -}; - -struct entry_time { - uint32_t seconds; - uint32_t nanoseconds; -}; - -struct entry_short { - struct entry_time ctime; - struct entry_time mtime; - uint32_t dev; - uint32_t ino; - uint32_t mode; - uint32_t uid; - uint32_t gid; - uint32_t file_size; - git_oid oid; - uint16_t flags; - char path[1]; /* arbitrary length */ -}; - -struct entry_long { - struct entry_time ctime; - struct entry_time mtime; - uint32_t dev; - uint32_t ino; - uint32_t mode; - uint32_t uid; - uint32_t gid; - uint32_t file_size; - git_oid oid; - uint16_t flags; - uint16_t flags_extended; - char path[1]; /* arbitrary length */ -}; - -/* local declarations */ -static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size); -static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffer_size); -static int read_header(struct index_header *dest, const void *buffer); - -static int read_tree(git_index *index, const char *buffer, size_t buffer_size); -static int read_tree_internal(git_index_tree **, const char **, const char *, git_index_tree *); - -static int parse_index(git_index *index, const char *buffer, size_t buffer_size); -static int is_index_extended(git_index *index); -static int write_index(git_index *index, git_filebuf *file); - -static int index_srch(const void *key, const void *array_member) -{ - const git_index_entry *entry = array_member; - - return strcmp(key, entry->path); -} - -static int index_cmp(const void *a, const void *b) -{ - const git_index_entry *entry_a = a; - const git_index_entry *entry_b = b; - - return strcmp(entry_a->path, entry_b->path); -} - -static int unmerged_srch(const void *key, const void *array_member) -{ - const git_index_entry_unmerged *entry = array_member; - - return strcmp(key, entry->path); -} - -static int unmerged_cmp(const void *a, const void *b) -{ - const git_index_entry_unmerged *info_a = a; - const git_index_entry_unmerged *info_b = b; - - return strcmp(info_a->path, info_b->path); -} - -static unsigned int index_create_mode(unsigned int mode) -{ - if (S_ISLNK(mode)) - return S_IFLNK; - if (S_ISDIR(mode) || (mode & S_IFMT) == (S_IFLNK | S_IFDIR)) - return (S_IFLNK | S_IFDIR); - return S_IFREG | ((mode & 0100) ? 0755 : 0644); -} - -static int index_initialize(git_index **index_out, git_repository *owner, const char *index_path) -{ - git_index *index; - - assert(index_out && index_path); - - index = git__malloc(sizeof(git_index)); - if (index == NULL) - return GIT_ENOMEM; - - memset(index, 0x0, sizeof(git_index)); - - index->index_file_path = git__strdup(index_path); - if (index->index_file_path == NULL) { - free(index); - return GIT_ENOMEM; - } - - index->repository = owner; - - git_vector_init(&index->entries, 32, index_cmp); - - /* Check if index file is stored on disk already */ - if (git_futils_exists(index->index_file_path) == 0) - index->on_disk = 1; - - *index_out = index; - return git_index_read(index); -} - -int git_index_open(git_index **index_out, const char *index_path) -{ - return index_initialize(index_out, NULL, index_path); -} - -/* - * Moved from `repository.c` - */ -int git_repository_index(git_index **index_out, git_repository *repo) -{ - if (repo->is_bare) - return git__throw(GIT_EBAREINDEX, "Failed to open index. Repository is bare"); - - return index_initialize(index_out, repo, repo->path_index); -} - -void git_index_free(git_index *index) -{ - if (index == NULL) - return; - - git_index_clear(index); - git_vector_free(&index->entries); - git_vector_free(&index->unmerged); - - free(index->index_file_path); - free(index); -} - -static void free_tree(git_index_tree *tree) -{ - unsigned int i; - - if (tree == NULL) - return; - - for (i = 0; i < tree->children_count; ++i) - free_tree(tree->children[i]); - - free(tree->name); - free(tree->children); - free(tree); -} - -void git_index_clear(git_index *index) -{ - unsigned int i; - - assert(index); - - for (i = 0; i < index->entries.length; ++i) { - git_index_entry *e; - e = git_vector_get(&index->entries, i); - free(e->path); - free(e); - } - - for (i = 0; i < index->unmerged.length; ++i) { - git_index_entry_unmerged *e; - e = git_vector_get(&index->unmerged, i); - free(e->path); - free(e); - } - - git_vector_clear(&index->entries); - git_vector_clear(&index->unmerged); - index->last_modified = 0; - - free_tree(index->tree); - index->tree = NULL; -} - -int git_index_read(git_index *index) -{ - int error = GIT_SUCCESS, updated; - git_fbuffer buffer = GIT_FBUFFER_INIT; - time_t mtime; - - assert(index->index_file_path); - - if (!index->on_disk || git_futils_exists(index->index_file_path) < 0) { - git_index_clear(index); - index->on_disk = 0; - return GIT_SUCCESS; - } - - /* We don't want to update the mtime if we fail to parse the index */ - mtime = index->last_modified; - error = git_futils_readbuffer_updated(&buffer, index->index_file_path, &mtime, &updated); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to read index"); - - if (updated) { - git_index_clear(index); - error = parse_index(index, buffer.data, buffer.len); - - if (error == GIT_SUCCESS) - index->last_modified = mtime; - - git_futils_freebuffer(&buffer); - } - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse index"); - return error; -} - -int git_index_write(git_index *index) -{ - git_filebuf file; - struct stat indexst; - int error; - - git_vector_sort(&index->entries); - - if ((error = git_filebuf_open(&file, index->index_file_path, GIT_FILEBUF_HASH_CONTENTS)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write index"); - - if ((error = write_index(index, &file)) < GIT_SUCCESS) { - git_filebuf_cleanup(&file); - return git__rethrow(error, "Failed to write index"); - } - - if ((error = git_filebuf_commit(&file)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write index"); - - if (p_stat(index->index_file_path, &indexst) == 0) { - index->last_modified = indexst.st_mtime; - index->on_disk = 1; - } - - return GIT_SUCCESS; -} - -unsigned int git_index_entrycount(git_index *index) -{ - assert(index); - return index->entries.length; -} - -unsigned int git_index_entrycount_unmerged(git_index *index) -{ - assert(index); - return index->unmerged.length; -} - -git_index_entry *git_index_get(git_index *index, unsigned int n) -{ - git_vector_sort(&index->entries); - return git_vector_get(&index->entries, n); -} - -static int index_entry_init(git_index_entry **entry_out, git_index *index, const char *rel_path, int stage) -{ - git_index_entry *entry; - char full_path[GIT_PATH_MAX]; - struct stat st; - git_oid oid; - int error; - - if (index->repository == NULL) - return git__throw(GIT_EBAREINDEX, "Failed to initialize entry. Repository is bare"); - - git_path_join(full_path, index->repository->path_workdir, rel_path); - - if (p_lstat(full_path, &st) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to initialize entry. '%s' cannot be opened", full_path); - - if (stage < 0 || stage > 3) - return git__throw(GIT_ERROR, "Failed to initialize entry. Invalid stage %i", stage); - - /* write the blob to disk and get the oid */ - if ((error = git_blob_create_fromfile(&oid, index->repository, rel_path)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to initialize index entry"); - - entry = git__malloc(sizeof(git_index_entry)); - if (!entry) - return GIT_ENOMEM; - memset(entry, 0x0, sizeof(git_index_entry)); - - entry->ctime.seconds = (git_time_t)st.st_ctime; - entry->mtime.seconds = (git_time_t)st.st_mtime; - /* entry.mtime.nanoseconds = st.st_mtimensec; */ - /* entry.ctime.nanoseconds = st.st_ctimensec; */ - entry->dev= st.st_rdev; - entry->ino = st.st_ino; - entry->mode = index_create_mode(st.st_mode); - entry->uid = st.st_uid; - entry->gid = st.st_gid; - entry->file_size = st.st_size; - entry->oid = oid; - - entry->flags |= (stage << GIT_IDXENTRY_STAGESHIFT); - entry->path = git__strdup(rel_path); - if (entry->path == NULL) { - free(entry); - return GIT_ENOMEM; - } - - *entry_out = entry; - return GIT_SUCCESS; -} - -static git_index_entry *index_entry_dup(const git_index_entry *source_entry) -{ - git_index_entry *entry; - - entry = git__malloc(sizeof(git_index_entry)); - if (!entry) - return NULL; - - memcpy(entry, source_entry, sizeof(git_index_entry)); - - /* duplicate the path string so we own it */ - entry->path = git__strdup(entry->path); - if (!entry->path) - return NULL; - - return entry; -} - -static void index_entry_free(git_index_entry *entry) -{ - if (!entry) - return; - free(entry->path); - free(entry); -} - -static int index_insert(git_index *index, git_index_entry *entry, int replace) -{ - size_t path_length; - int position; - git_index_entry **entry_array; - - assert(index && entry); - - if (entry->path == NULL) - return git__throw(GIT_EMISSINGOBJDATA, "Failed to insert into index. Entry has no path"); - - /* make sure that the path length flag is correct */ - path_length = strlen(entry->path); - - entry->flags &= ~GIT_IDXENTRY_NAMEMASK; - - if (path_length < GIT_IDXENTRY_NAMEMASK) - entry->flags |= path_length & GIT_IDXENTRY_NAMEMASK; - else - entry->flags |= GIT_IDXENTRY_NAMEMASK;; - - /* - * replacing is not requested: just insert entry at the end; - * the index is no longer sorted - */ - if (!replace) { - if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS) - return GIT_ENOMEM; - - return GIT_SUCCESS; - } - - /* look if an entry with this path already exists */ - position = git_index_find(index, entry->path); - - /* - * if no entry exists add the entry at the end; - * the index is no longer sorted - */ - if (position == GIT_ENOTFOUND) { - if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS) - return GIT_ENOMEM; - - return GIT_SUCCESS; - } - - /* exists, replace it */ - entry_array = (git_index_entry **) index->entries.contents; - free(entry_array[position]->path); - free(entry_array[position]); - entry_array[position] = entry; - - return GIT_SUCCESS; -} - -static int index_add(git_index *index, const char *path, int stage, int replace) -{ - git_index_entry *entry = NULL; - int ret; - - ret = index_entry_init(&entry, index, path, stage); - if (ret) - goto err; - - ret = index_insert(index, entry, replace); - if (ret) - goto err; - - return ret; -err: - index_entry_free(entry); - return git__rethrow(ret, "Failed to append to index"); -} - -int git_index_add(git_index *index, const char *path, int stage) -{ - return index_add(index, path, stage, 1); -} - -int git_index_append(git_index *index, const char *path, int stage) -{ - return index_add(index, path, stage, 0); -} - -static int index_add2(git_index *index, const git_index_entry *source_entry, - int replace) -{ - git_index_entry *entry = NULL; - int ret; - - entry = index_entry_dup(source_entry); - if (entry == NULL) { - ret = GIT_ENOMEM; - goto err; - } - - ret = index_insert(index, entry, replace); - if (ret) - goto err; - - return ret; -err: - index_entry_free(entry); - return git__rethrow(ret, "Failed to append to index"); -} - -int git_index_add2(git_index *index, const git_index_entry *source_entry) -{ - return index_add2(index, source_entry, 1); -} - -int git_index_append2(git_index *index, const git_index_entry *source_entry) -{ - return index_add2(index, source_entry, 1); -} - -int git_index_remove(git_index *index, int position) -{ - git_vector_sort(&index->entries); - return git_vector_remove(&index->entries, (unsigned int)position); -} - -int git_index_find(git_index *index, const char *path) -{ - return git_vector_bsearch2(&index->entries, index_srch, path); -} - -void git_index_uniq(git_index *index) -{ - git_vector_uniq(&index->entries); -} - -const git_index_entry_unmerged *git_index_get_unmerged_bypath(git_index *index, const char *path) -{ - int pos; - assert(index && path); - - if (!index->unmerged.length) - return NULL; - - if ((pos = git_vector_bsearch2(&index->unmerged, unmerged_srch, path)) < GIT_SUCCESS) - return NULL; - - return git_vector_get(&index->unmerged, pos); -} - -const git_index_entry_unmerged *git_index_get_unmerged_byindex(git_index *index, unsigned int n) -{ - assert(index); - return git_vector_get(&index->unmerged, n); -} - - -static int read_tree_internal(git_index_tree **out, - const char **buffer_in, const char *buffer_end, git_index_tree *parent) -{ - git_index_tree *tree; - const char *name_start, *buffer; - long count; - int error = GIT_SUCCESS; - - if ((tree = git__malloc(sizeof(git_index_tree))) == NULL) - return GIT_ENOMEM; - - memset(tree, 0x0, sizeof(git_index_tree)); - tree->parent = parent; - - buffer = name_start = *buffer_in; - - if ((buffer = memchr(buffer, '\0', buffer_end - buffer)) == NULL) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - /* NUL-terminated tree name */ - tree->name = git__strdup(name_start); - if (tree->name == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - if (++buffer >= buffer_end) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - /* Blank-terminated ASCII decimal number of entries in this tree */ - if (git__strtol32(&count, buffer, &buffer, 10) < GIT_SUCCESS || count < -1) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - /* Invalidated TREE. Free the tree but report success */ - if (count == -1) { - /* FIXME: return buffer_end or the end position for - * this single tree entry */ - *buffer_in = buffer_end; - *out = NULL; - free_tree(tree); /* Needs to be done manually */ - return GIT_SUCCESS; - } - - tree->entries = count; - - if (*buffer != ' ' || ++buffer >= buffer_end) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - /* Number of children of the tree, newline-terminated */ - if (git__strtol32(&count, buffer, &buffer, 10) < GIT_SUCCESS || - count < 0) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - tree->children_count = count; - - if (*buffer != '\n' || ++buffer >= buffer_end) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - /* 160-bit SHA-1 for this tree and it's children */ - if (buffer + GIT_OID_RAWSZ > buffer_end) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - git_oid_fromraw(&tree->oid, (const unsigned char *)buffer); - buffer += GIT_OID_RAWSZ; - - /* Parse children: */ - if (tree->children_count > 0) { - unsigned int i; - int err; - - tree->children = git__malloc(tree->children_count * sizeof(git_index_tree *)); - if (tree->children == NULL) - goto cleanup; - - for (i = 0; i < tree->children_count; ++i) { - err = read_tree_internal(&tree->children[i], &buffer, buffer_end, tree); - - if (err < GIT_SUCCESS) - goto cleanup; - } - } - - *buffer_in = buffer; - *out = tree; - return GIT_SUCCESS; - - cleanup: - free_tree(tree); - return error; -} - -static int read_tree(git_index *index, const char *buffer, size_t buffer_size) -{ - const char *buffer_end = buffer + buffer_size; - int error; - - error = read_tree_internal(&index->tree, &buffer, buffer_end, NULL); - - if (buffer < buffer_end) - return GIT_EOBJCORRUPTED; - - return error; -} - -static int read_unmerged(git_index *index, const char *buffer, size_t size) -{ - const char *endptr; - size_t len; - int i; - - git_vector_init(&index->unmerged, 16, unmerged_cmp); - - while (size) { - git_index_entry_unmerged *lost; - - len = strlen(buffer) + 1; - if (size <= len) - return git__throw(GIT_ERROR, "Failed to read unmerged entries"); - - if ((lost = git__malloc(sizeof(git_index_entry_unmerged))) == NULL) - return GIT_ENOMEM; - - if (git_vector_insert(&index->unmerged, lost) < GIT_SUCCESS) - return git__throw(GIT_ERROR, "Failed to read unmerged entries"); - - lost->path = git__strdup(buffer); - if (!lost->path) - return GIT_ENOMEM; - - size -= len; - buffer += len; - - for (i = 0; i < 3; i++) { - long tmp; - - if (git__strtol32(&tmp, buffer, &endptr, 8) < GIT_SUCCESS || - !endptr || endptr == buffer || *endptr || (unsigned)tmp > UINT_MAX) - return GIT_ERROR; - - lost->mode[i] = tmp; - - len = (endptr + 1) - buffer; - if (size <= len) - return git__throw(GIT_ERROR, "Failed to read unmerged entries"); - - size -= len; - buffer += len; - } - - for (i = 0; i < 3; i++) { - if (!lost->mode[i]) - continue; - if (size < 20) - return git__throw(GIT_ERROR, "Failed to read unmerged entries"); - git_oid_fromraw(&lost->oid[i], (const unsigned char *) buffer); - size -= 20; - buffer += 20; - } - } - - return GIT_SUCCESS; -} - -static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffer_size) -{ - size_t path_length, entry_size; - uint16_t flags_raw; - const char *path_ptr; - const struct entry_short *source = buffer; - - if (INDEX_FOOTER_SIZE + minimal_entry_size > buffer_size) - return 0; - - memset(dest, 0x0, sizeof(git_index_entry)); - - dest->ctime.seconds = (git_time_t)ntohl(source->ctime.seconds); - dest->ctime.nanoseconds = ntohl(source->ctime.nanoseconds); - dest->mtime.seconds = (git_time_t)ntohl(source->mtime.seconds); - dest->mtime.nanoseconds = ntohl(source->mtime.nanoseconds); - dest->dev = ntohl(source->dev); - dest->ino = ntohl(source->ino); - dest->mode = ntohl(source->mode); - dest->uid = ntohl(source->uid); - dest->gid = ntohl(source->gid); - dest->file_size = ntohl(source->file_size); - git_oid_cpy(&dest->oid, &source->oid); - dest->flags = ntohs(source->flags); - - if (dest->flags & GIT_IDXENTRY_EXTENDED) { - const struct entry_long *source_l = (const struct entry_long *)source; - path_ptr = source_l->path; - - flags_raw = ntohs(source_l->flags_extended); - memcpy(&dest->flags_extended, &flags_raw, 2); - } else - path_ptr = source->path; - - path_length = dest->flags & GIT_IDXENTRY_NAMEMASK; - - /* if this is a very long string, we must find its - * real length without overflowing */ - if (path_length == 0xFFF) { - const char *path_end; - - path_end = memchr(path_ptr, '\0', buffer_size); - if (path_end == NULL) - return 0; - - path_length = path_end - path_ptr; - } - - if (dest->flags & GIT_IDXENTRY_EXTENDED) - entry_size = long_entry_size(path_length); - else - entry_size = short_entry_size(path_length); - - if (INDEX_FOOTER_SIZE + entry_size > buffer_size) - return 0; - - dest->path = git__strdup(path_ptr); - assert(dest->path); - - return entry_size; -} - -static int read_header(struct index_header *dest, const void *buffer) -{ - const struct index_header *source = buffer; - - dest->signature = ntohl(source->signature); - if (dest->signature != INDEX_HEADER_SIG) - return GIT_EOBJCORRUPTED; - - dest->version = ntohl(source->version); - if (dest->version != INDEX_VERSION_NUMBER_EXT && - dest->version != INDEX_VERSION_NUMBER) - return GIT_EOBJCORRUPTED; - - dest->entry_count = ntohl(source->entry_count); - return GIT_SUCCESS; -} - -static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size) -{ - const struct index_extension *source; - struct index_extension dest; - size_t total_size; - - source = (const struct index_extension *)(buffer); - - memcpy(dest.signature, source->signature, 4); - dest.extension_size = ntohl(source->extension_size); - - total_size = dest.extension_size + sizeof(struct index_extension); - - if (buffer_size - total_size < INDEX_FOOTER_SIZE) - return 0; - - /* optional extension */ - if (dest.signature[0] >= 'A' && dest.signature[0] <= 'Z') { - /* tree cache */ - if (memcmp(dest.signature, INDEX_EXT_TREECACHE_SIG, 4) == 0) { - if (read_tree(index, buffer + 8, dest.extension_size) < GIT_SUCCESS) - return 0; - } else if (memcmp(dest.signature, INDEX_EXT_UNMERGED_SIG, 4) == 0) { - if (read_unmerged(index, buffer + 8, dest.extension_size) < GIT_SUCCESS) - return 0; - } - /* else, unsupported extension. We cannot parse this, but we can skip - * it by returning `total_size */ - } else { - /* we cannot handle non-ignorable extensions; - * in fact they aren't even defined in the standard */ - return 0; - } - - return total_size; -} - -static int parse_index(git_index *index, const char *buffer, size_t buffer_size) -{ - unsigned int i; - struct index_header header; - git_oid checksum_calculated, checksum_expected; - -#define seek_forward(_increase) { \ - if (_increase >= buffer_size) \ - return git__throw(GIT_EOBJCORRUPTED, "Failed to seek forward. Buffer size exceeded"); \ - buffer += _increase; \ - buffer_size -= _increase;\ -} - - if (buffer_size < INDEX_HEADER_SIZE + INDEX_FOOTER_SIZE) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Buffer too small"); - - /* Precalculate the SHA1 of the files's contents -- we'll match it to - * the provided SHA1 in the footer */ - git_hash_buf(&checksum_calculated, buffer, buffer_size - INDEX_FOOTER_SIZE); - - /* Parse header */ - if (read_header(&header, buffer) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Header is corrupted"); - - seek_forward(INDEX_HEADER_SIZE); - - git_vector_clear(&index->entries); - - /* Parse all the entries */ - for (i = 0; i < header.entry_count && buffer_size > INDEX_FOOTER_SIZE; ++i) { - size_t entry_size; - git_index_entry *entry; - - entry = git__malloc(sizeof(git_index_entry)); - if (entry == NULL) - return GIT_ENOMEM; - - entry_size = read_entry(entry, buffer, buffer_size); - - /* 0 bytes read means an object corruption */ - if (entry_size == 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Entry size is zero"); - - if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS) - return GIT_ENOMEM; - - seek_forward(entry_size); - } - - if (i != header.entry_count) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Header entries changed while parsing"); - - /* There's still space for some extensions! */ - while (buffer_size > INDEX_FOOTER_SIZE) { - size_t extension_size; - - extension_size = read_extension(index, buffer, buffer_size); - - /* see if we have read any bytes from the extension */ - if (extension_size == 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Extension size is zero"); - - seek_forward(extension_size); - } - - if (buffer_size != INDEX_FOOTER_SIZE) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Buffer size does not match index footer size"); - - /* 160-bit SHA-1 over the content of the index file before this checksum. */ - git_oid_fromraw(&checksum_expected, (const unsigned char *)buffer); - - if (git_oid_cmp(&checksum_calculated, &checksum_expected) != 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse index. Calculated checksum does not match expected checksum"); - -#undef seek_forward - - /* force sorting in the vector: the entries are - * assured to be sorted on the index */ - index->entries.sorted = 1; - return GIT_SUCCESS; -} - -static int is_index_extended(git_index *index) -{ - unsigned int i, extended; - - extended = 0; - - for (i = 0; i < index->entries.length; ++i) { - git_index_entry *entry; - entry = git_vector_get(&index->entries, i); - entry->flags &= ~GIT_IDXENTRY_EXTENDED; - if (entry->flags_extended & GIT_IDXENTRY_EXTENDED_FLAGS) { - extended++; - entry->flags |= GIT_IDXENTRY_EXTENDED; - } - } - return extended; -} - -static int write_disk_entry(git_filebuf *file, git_index_entry *entry) -{ - struct entry_short *ondisk; - size_t path_len, disk_size; - char *path; - - path_len = strlen(entry->path); - - if (entry->flags & GIT_IDXENTRY_EXTENDED) - disk_size = long_entry_size(path_len); - else - disk_size = short_entry_size(path_len); - - if (git_filebuf_reserve(file, (void **)&ondisk, disk_size) < GIT_SUCCESS) - return GIT_ENOMEM; - - memset(ondisk, 0x0, disk_size); - - /** - * Yes, we have to truncate. - * - * The on-disk format for Index entries clearly defines - * the time and size fields to be 4 bytes each -- so even if - * we store these values with 8 bytes on-memory, they must - * be truncated to 4 bytes before writing to disk. - * - * In 2038 I will be either too dead or too rich to care about this - */ - ondisk->ctime.seconds = htonl((uint32_t)entry->ctime.seconds); - ondisk->mtime.seconds = htonl((uint32_t)entry->mtime.seconds); - ondisk->ctime.nanoseconds = htonl(entry->ctime.nanoseconds); - ondisk->mtime.nanoseconds = htonl(entry->mtime.nanoseconds); - ondisk->dev = htonl(entry->dev); - ondisk->ino = htonl(entry->ino); - ondisk->mode = htonl(entry->mode); - ondisk->uid = htonl(entry->uid); - ondisk->gid = htonl(entry->gid); - ondisk->file_size = htonl((uint32_t)entry->file_size); - - git_oid_cpy(&ondisk->oid, &entry->oid); - - ondisk->flags = htons(entry->flags); - - if (entry->flags & GIT_IDXENTRY_EXTENDED) { - struct entry_long *ondisk_ext; - ondisk_ext = (struct entry_long *)ondisk; - ondisk_ext->flags_extended = htons(entry->flags_extended); - path = ondisk_ext->path; - } - else - path = ondisk->path; - - memcpy(path, entry->path, path_len); - - return GIT_SUCCESS; -} - -static int write_entries(git_index *index, git_filebuf *file) -{ - unsigned int i; - - for (i = 0; i < index->entries.length; ++i) { - git_index_entry *entry; - entry = git_vector_get(&index->entries, i); - if (write_disk_entry(file, entry) < GIT_SUCCESS) - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -static int write_index(git_index *index, git_filebuf *file) -{ - int error = GIT_SUCCESS; - git_oid hash_final; - - struct index_header header; - - int is_extended; - - assert(index && file); - - is_extended = is_index_extended(index); - - header.signature = htonl(INDEX_HEADER_SIG); - header.version = htonl(is_extended ? INDEX_VERSION_NUMBER_EXT : INDEX_VERSION_NUMBER); - header.entry_count = htonl(index->entries.length); - - git_filebuf_write(file, &header, sizeof(struct index_header)); - - error = write_entries(index, file); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to write index"); - - /* TODO: write extensions (tree cache) */ - - /* get out the hash for all the contents we've appended to the file */ - git_filebuf_hash(&hash_final, file); - - /* write it at the end of the file */ - git_filebuf_write(file, hash_final.id, GIT_OID_RAWSZ); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write index"); -} - -int git_index_entry_stage(const git_index_entry *entry) -{ - return (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT; -} diff --git a/vendor/libgit2/src/index.h b/vendor/libgit2/src/index.h deleted file mode 100644 index f2402fd71..000000000 --- a/vendor/libgit2/src/index.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef INCLUDE_index_h__ -#define INCLUDE_index_h__ - -#include "fileops.h" -#include "filebuf.h" -#include "vector.h" -#include "git2/odb.h" -#include "git2/index.h" - -struct git_index_tree { - char *name; - - struct git_index_tree *parent; - struct git_index_tree **children; - size_t children_count; - - size_t entries; - git_oid oid; -}; - -typedef struct git_index_tree git_index_tree; - -struct git_index { - git_repository *repository; - char *index_file_path; - - time_t last_modified; - git_vector entries; - - unsigned int on_disk:1; - git_index_tree *tree; - - git_vector unmerged; -}; - -#endif diff --git a/vendor/libgit2/src/indexer.c b/vendor/libgit2/src/indexer.c deleted file mode 100644 index 3934250e2..000000000 --- a/vendor/libgit2/src/indexer.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/indexer.h" -#include "git2/object.h" -#include "git2/zlib.h" -#include "git2/oid.h" - -#include "common.h" -#include "pack.h" -#include "mwindow.h" -#include "posix.h" -#include "pack.h" -#include "filebuf.h" -#include "sha1.h" - -#define UINT31_MAX (0x7FFFFFFF) - -struct entry { - git_oid oid; - uint32_t crc; - uint32_t offset; - uint64_t offset_long; -}; - -struct git_indexer { - struct git_pack_file *pack; - struct stat st; - struct git_pack_header hdr; - size_t nr_objects; - git_vector objects; - git_filebuf file; - unsigned int fanout[256]; - git_oid hash; -}; - -const git_oid *git_indexer_hash(git_indexer *idx) -{ - return &idx->hash; -} - -static int parse_header(git_indexer *idx) -{ - int error; - - /* Verify we recognize this pack file format. */ - if ((error = p_read(idx->pack->mwf.fd, &idx->hdr, sizeof(idx->hdr))) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read in pack header"); - - if (idx->hdr.hdr_signature != ntohl(PACK_SIGNATURE)) - return git__throw(GIT_EOBJCORRUPTED, "Wrong pack signature"); - - if (!pack_version_ok(idx->hdr.hdr_version)) - return git__throw(GIT_EOBJCORRUPTED, "Wrong pack version"); - - - return GIT_SUCCESS; -} - -static int objects_cmp(const void *a, const void *b) -{ - const struct entry *entrya = a; - const struct entry *entryb = b; - - return git_oid_cmp(&entrya->oid, &entryb->oid); -} - -static int cache_cmp(const void *a, const void *b) -{ - const struct git_pack_entry *ea = a; - const struct git_pack_entry *eb = b; - - return git_oid_cmp(&ea->sha1, &eb->sha1); -} - - -int git_indexer_new(git_indexer **out, const char *packname) -{ - git_indexer *idx; - unsigned int namelen; - int ret, error; - - assert(out && packname); - - if (git_path_root(packname) < 0) - return git__throw(GIT_EINVALIDPATH, "Path is not absolute"); - - idx = git__malloc(sizeof(git_indexer)); - if (idx == NULL) - return GIT_ENOMEM; - - memset(idx, 0x0, sizeof(*idx)); - - namelen = strlen(packname); - idx->pack = git__malloc(sizeof(struct git_pack_file) + namelen + 1); - if (idx->pack == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - memset(idx->pack, 0x0, sizeof(struct git_pack_file)); - memcpy(idx->pack->pack_name, packname, namelen + 1); - - ret = p_stat(packname, &idx->st); - if (ret < 0) { - if (errno == ENOENT) - error = git__throw(GIT_ENOTFOUND, "Failed to stat packfile. File not found"); - else - error = git__throw(GIT_EOSERR, "Failed to stat packfile."); - - goto cleanup; - } - - ret = p_open(idx->pack->pack_name, O_RDONLY); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to open packfile"); - goto cleanup; - } - - idx->pack->mwf.fd = ret; - idx->pack->mwf.size = (git_off_t)idx->st.st_size; - - error = parse_header(idx); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to parse packfile header"); - goto cleanup; - } - - idx->nr_objects = ntohl(idx->hdr.hdr_entries); - - error = git_vector_init(&idx->pack->cache, idx->nr_objects, cache_cmp); - if (error < GIT_SUCCESS) - goto cleanup; - - idx->pack->has_cache = 1; - error = git_vector_init(&idx->objects, idx->nr_objects, objects_cmp); - if (error < GIT_SUCCESS) - goto cleanup; - - *out = idx; - - return GIT_SUCCESS; - -cleanup: - git_indexer_free(idx); - - return error; -} - -static void index_path(char *path, git_indexer *idx) -{ - char *ptr; - const char prefix[] = "pack-", suffix[] = ".idx\0"; - - ptr = strrchr(path, '/') + 1; - - memcpy(ptr, prefix, strlen(prefix)); - ptr += strlen(prefix); - git_oid_fmt(ptr, &idx->hash); - ptr += GIT_OID_HEXSZ; - memcpy(ptr, suffix, strlen(suffix)); -} - -int git_indexer_write(git_indexer *idx) -{ - git_mwindow *w = NULL; - int error, namelen; - unsigned int i, long_offsets = 0, left; - struct git_pack_idx_header hdr; - char filename[GIT_PATH_MAX]; - struct entry *entry; - void *packfile_hash; - git_oid file_hash; - SHA_CTX ctx; - - git_vector_sort(&idx->objects); - - namelen = strlen(idx->pack->pack_name); - memcpy(filename, idx->pack->pack_name, namelen); - memcpy(filename + namelen - strlen("pack"), "idx", strlen("idx") + 1); - - error = git_filebuf_open(&idx->file, filename, GIT_FILEBUF_HASH_CONTENTS); - - /* Write out the header */ - hdr.idx_signature = htonl(PACK_IDX_SIGNATURE); - hdr.idx_version = htonl(2); - error = git_filebuf_write(&idx->file, &hdr, sizeof(hdr)); - - /* Write out the fanout table */ - for (i = 0; i < 256; ++i) { - uint32_t n = htonl(idx->fanout[i]); - error = git_filebuf_write(&idx->file, &n, sizeof(n)); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* Write out the object names (SHA-1 hashes) */ - SHA1_Init(&ctx); - git_vector_foreach(&idx->objects, i, entry) { - error = git_filebuf_write(&idx->file, &entry->oid, sizeof(git_oid)); - SHA1_Update(&ctx, &entry->oid, GIT_OID_RAWSZ); - if (error < GIT_SUCCESS) - goto cleanup; - } - SHA1_Final(idx->hash.id, &ctx); - - /* Write out the CRC32 values */ - git_vector_foreach(&idx->objects, i, entry) { - error = git_filebuf_write(&idx->file, &entry->crc, sizeof(uint32_t)); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* Write out the offsets */ - git_vector_foreach(&idx->objects, i, entry) { - uint32_t n; - - if (entry->offset == UINT32_MAX) - n = htonl(0x80000000 | long_offsets++); - else - n = htonl(entry->offset); - - error = git_filebuf_write(&idx->file, &n, sizeof(uint32_t)); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* Write out the long offsets */ - git_vector_foreach(&idx->objects, i, entry) { - uint32_t split[2]; - - if (entry->offset != UINT32_MAX) - continue; - - split[0] = htonl(entry->offset_long >> 32); - split[1] = htonl(entry->offset_long & 0xffffffff); - - error = git_filebuf_write(&idx->file, &split, sizeof(uint32_t) * 2); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* Write out the packfile trailer */ - - packfile_hash = git_mwindow_open(&idx->pack->mwf, &w, idx->st.st_size - GIT_OID_RAWSZ, GIT_OID_RAWSZ, &left); - git_mwindow_close(&w); - if (packfile_hash == NULL) { - error = git__rethrow(GIT_ENOMEM, "Failed to open window to packfile hash"); - goto cleanup; - } - - memcpy(&file_hash, packfile_hash, GIT_OID_RAWSZ); - - git_mwindow_close(&w); - - error = git_filebuf_write(&idx->file, &file_hash, sizeof(git_oid)); - - /* Write out the index sha */ - error = git_filebuf_hash(&file_hash, &idx->file); - if (error < GIT_SUCCESS) - goto cleanup; - - error = git_filebuf_write(&idx->file, &file_hash, sizeof(git_oid)); - if (error < GIT_SUCCESS) - goto cleanup; - - /* Figure out what the final name should be */ - index_path(filename, idx); - /* Commit file */ - error = git_filebuf_commit_at(&idx->file, filename); - -cleanup: - git_mwindow_free_all(&idx->pack->mwf); - if (error < GIT_SUCCESS) - git_filebuf_cleanup(&idx->file); - - return error; -} - -int git_indexer_run(git_indexer *idx, git_indexer_stats *stats) -{ - git_mwindow_file *mwf; - off_t off = sizeof(struct git_pack_header); - int error; - struct entry *entry; - unsigned int left, processed; - - assert(idx && stats); - - mwf = &idx->pack->mwf; - error = git_mwindow_file_register(mwf); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to register mwindow file"); - - stats->total = idx->nr_objects; - stats->processed = processed = 0; - - while (processed < idx->nr_objects) { - git_rawobj obj; - git_oid oid; - struct git_pack_entry *pentry; - git_mwindow *w = NULL; - int i; - off_t entry_start = off; - void *packed; - size_t entry_size; - - entry = git__malloc(sizeof(struct entry)); - memset(entry, 0x0, sizeof(struct entry)); - - if (off > UINT31_MAX) { - entry->offset = UINT32_MAX; - entry->offset_long = off; - } else { - entry->offset = off; - } - - error = git_packfile_unpack(&obj, idx->pack, &off); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to unpack object"); - goto cleanup; - } - - /* FIXME: Parse the object instead of hashing it */ - error = git_odb__hash_obj(&oid, &obj); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to hash object"); - goto cleanup; - } - - pentry = git__malloc(sizeof(struct git_pack_entry)); - if (pentry == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - git_oid_cpy(&pentry->sha1, &oid); - pentry->offset = entry_start; - error = git_vector_insert(&idx->pack->cache, pentry); - if (error < GIT_SUCCESS) - goto cleanup; - - git_oid_cpy(&entry->oid, &oid); - entry->crc = crc32(0L, Z_NULL, 0); - - entry_size = off - entry_start; - packed = git_mwindow_open(mwf, &w, entry_start, entry_size, &left); - if (packed == NULL) { - error = git__rethrow(error, "Failed to open window to read packed data"); - goto cleanup; - } - entry->crc = htonl(crc32(entry->crc, packed, entry_size)); - git_mwindow_close(&w); - - /* Add the object to the list */ - error = git_vector_insert(&idx->objects, entry); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to add entry to list"); - goto cleanup; - } - - for (i = oid.id[0]; i < 256; ++i) { - idx->fanout[i]++; - } - - free(obj.data); - - stats->processed = ++processed; - } - -cleanup: - git_mwindow_free_all(mwf); - - return error; - -} - -void git_indexer_free(git_indexer *idx) -{ - unsigned int i; - struct entry *e; - struct git_pack_entry *pe; - - p_close(idx->pack->mwf.fd); - git_vector_foreach(&idx->objects, i, e) - free(e); - git_vector_free(&idx->objects); - git_vector_foreach(&idx->pack->cache, i, pe) - free(pe); - git_vector_free(&idx->pack->cache); - free(idx->pack); - free(idx); -} - diff --git a/vendor/libgit2/src/map.h b/vendor/libgit2/src/map.h deleted file mode 100644 index 1dfbeeb4b..000000000 --- a/vendor/libgit2/src/map.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef INCLUDE_map_h__ -#define INCLUDE_map_h__ - -#include "common.h" - - -/* p_mmap() prot values */ -#define GIT_PROT_NONE 0x0 -#define GIT_PROT_READ 0x1 -#define GIT_PROT_WRITE 0x2 -#define GIT_PROT_EXEC 0x4 - -/* git__mmmap() flags values */ -#define GIT_MAP_FILE 0 -#define GIT_MAP_SHARED 1 -#define GIT_MAP_PRIVATE 2 -#define GIT_MAP_TYPE 0xf -#define GIT_MAP_FIXED 0x10 - -typedef struct { /* memory mapped buffer */ - void *data; /* data bytes */ - size_t len; /* data length */ -#ifdef GIT_WIN32 - HANDLE fmh; /* file mapping handle */ -#endif -} git_map; - -extern int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset); -extern int p_munmap(git_map *map); - -#endif /* INCLUDE_map_h__ */ diff --git a/vendor/libgit2/src/mingw-compat.h b/vendor/libgit2/src/mingw-compat.h deleted file mode 100644 index b7919c2e8..000000000 --- a/vendor/libgit2/src/mingw-compat.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef INCLUDE_mingw_compat__ -#define INCLUDE_mingw_compat__ - -#if defined(__MINGW32__) - -/* use a 64-bit file offset type */ -# define lseek _lseeki64 -# define stat _stati64 -# define fstat _fstati64 - -#endif - -#endif /* INCLUDE_mingw_compat__ */ diff --git a/vendor/libgit2/src/msvc-compat.h b/vendor/libgit2/src/msvc-compat.h deleted file mode 100644 index d4c031d2d..000000000 --- a/vendor/libgit2/src/msvc-compat.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef INCLUDE_msvc_compat__ -#define INCLUDE_msvc_compat__ - -#if defined(_MSC_VER) - -/* access() mode parameter #defines */ -# define F_OK 0 /* existence check */ -# define W_OK 2 /* write mode check */ -# define R_OK 4 /* read mode check */ - -# define lseek _lseeki64 -# define stat _stat64 -# define fstat _fstat64 - -/* stat: file mode type testing macros */ -# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) -# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) -# define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO) - -#if (_MSC_VER >= 1600) -# include -#else -/* add some missing typedef's */ -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef short int16_t; -typedef unsigned short uint16_t; - -typedef long int32_t; -typedef unsigned long uint32_t; - -typedef long long int64_t; -typedef unsigned long long uint64_t; - -typedef long long intmax_t; -typedef unsigned long long uintmax_t; -#endif - -#endif - -#endif /* INCLUDE_msvc_compat__ */ diff --git a/vendor/libgit2/src/mwindow.c b/vendor/libgit2/src/mwindow.c deleted file mode 100644 index 585d75c12..000000000 --- a/vendor/libgit2/src/mwindow.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "mwindow.h" -#include "vector.h" -#include "fileops.h" -#include "map.h" - -#define DEFAULT_WINDOW_SIZE \ - (sizeof(void*) >= 8 \ - ? 1 * 1024 * 1024 * 1024 \ - : 32 * 1024 * 1024) - -#define DEFAULT_MAPPED_LIMIT \ - ((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256)) - -/* - * We need this because each process is only allowed a specific amount - * of memory. Making it writable should generate one instance per - * process, but we still need to set a couple of variables. - */ - -static git_mwindow_ctl ctl = { - 0, - 0, - DEFAULT_WINDOW_SIZE, - DEFAULT_MAPPED_LIMIT, - 0, - 0, - 0, - 0, - {0, 0, 0, 0, 0} -}; - -/* - * Free all the windows in a sequence, typically because we're done - * with the file - */ -void git_mwindow_free_all(git_mwindow_file *mwf) -{ - unsigned int i; - /* - * Remove these windows from the global list - */ - for (i = 0; i < ctl.windowfiles.length; ++i){ - if (git_vector_get(&ctl.windowfiles, i) == mwf) { - git_vector_remove(&ctl.windowfiles, i); - break; - } - } - - if (ctl.windowfiles.length == 0) { - git_vector_free(&ctl.windowfiles); - ctl.windowfiles.contents = NULL; - } - - while (mwf->windows) { - git_mwindow *w = mwf->windows; - assert(w->inuse_cnt == 0); - - ctl.mapped -= w->window_map.len; - ctl.open_windows--; - - git_futils_mmap_free(&w->window_map); - - mwf->windows = w->next; - free(w); - } -} - -/* - * Check if a window 'win' contains the address 'offset' - */ -int git_mwindow_contains(git_mwindow *win, git_off_t offset) -{ - git_off_t win_off = win->offset; - return win_off <= offset - && offset <= (git_off_t)(win_off + win->window_map.len); -} - -/* - * Find the least-recently-used window in a file - */ -void git_mwindow_scan_lru( - git_mwindow_file *mwf, - git_mwindow **lru_w, - git_mwindow **lru_l) -{ - git_mwindow *w, *w_l; - - for (w_l = NULL, w = mwf->windows; w; w = w->next) { - if (!w->inuse_cnt) { - /* - * If the current one is more recent than the last one, - * store it in the output parameter. If lru_w is NULL, - * it's the first loop, so store it as well. - */ - if (!*lru_w || w->last_used < (*lru_w)->last_used) { - *lru_w = w; - *lru_l = w_l; - } - } - w_l = w; - } -} - -/* - * Close the least recently used window. You should check to see if - * the file descriptors need closing from time to time. - */ -int git_mwindow_close_lru(git_mwindow_file *mwf) -{ - unsigned int i; - git_mwindow *lru_w = NULL, *lru_l = NULL; - - /* FIMXE: Does this give us any advantage? */ - if(mwf->windows) - git_mwindow_scan_lru(mwf, &lru_w, &lru_l); - - for (i = 0; i < ctl.windowfiles.length; ++i) { - git_mwindow_scan_lru(git_vector_get(&ctl.windowfiles, i), &lru_w, &lru_l); - } - - if (lru_w) { - git_mwindow_close(&lru_w); - ctl.mapped -= lru_w->window_map.len; - git_futils_mmap_free(&lru_w->window_map); - - if (lru_l) - lru_l->next = lru_w->next; - else - mwf->windows = lru_w->next; - - free(lru_w); - ctl.open_windows--; - - return GIT_SUCCESS; - } - - return git__throw(GIT_ERROR, "Failed to close memory window. Couln't find LRU"); -} - -static git_mwindow *new_window(git_mwindow_file *mwf, git_file fd, git_off_t size, git_off_t offset) -{ - size_t walign = ctl.window_size / 2; - git_off_t len; - git_mwindow *w; - - w = git__malloc(sizeof(*w)); - if (w == NULL) - return w; - - memset(w, 0x0, sizeof(*w)); - w->offset = (offset / walign) * walign; - - len = size - w->offset; - if (len > (git_off_t)ctl.window_size) - len = (git_off_t)ctl.window_size; - - ctl.mapped += (size_t)len; - - while(ctl.mapped_limit < ctl.mapped && - git_mwindow_close_lru(mwf) == GIT_SUCCESS) {} - - /* FIXME: Shouldn't we error out if there's an error in closing lru? */ - - if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < GIT_SUCCESS) - goto cleanup; - - ctl.mmap_calls++; - ctl.open_windows++; - - if (ctl.mapped > ctl.peak_mapped) - ctl.peak_mapped = ctl.mapped; - - if (ctl.open_windows > ctl.peak_open_windows) - ctl.peak_open_windows = ctl.open_windows; - - return w; - -cleanup: - free(w); - return NULL; -} - -/* - * Open a new window, closing the least recenty used until we have - * enough space. Don't forget to add it to your list - */ -unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, - git_off_t offset, int extra, unsigned int *left) -{ - git_mwindow *w = *cursor; - - if (!w || !git_mwindow_contains(w, offset + extra)) { - if (w) { - w->inuse_cnt--; - } - - for (w = mwf->windows; w; w = w->next) { - if (git_mwindow_contains(w, offset + extra)) - break; - } - - /* - * If there isn't a suitable window, we need to create a new - * one. - */ - if (!w) { - w = new_window(mwf, mwf->fd, mwf->size, offset); - if (w == NULL) - return NULL; - w->next = mwf->windows; - mwf->windows = w; - } - } - - /* If we changed w, store it in the cursor */ - if (w != *cursor) { - w->last_used = ctl.used_ctr++; - w->inuse_cnt++; - *cursor = w; - } - - offset -= w->offset; - assert(git__is_sizet(offset)); - - if (left) - *left = (unsigned int)(w->window_map.len - offset); - - return (unsigned char *) w->window_map.data + offset; -} - -int git_mwindow_file_register(git_mwindow_file *mwf) -{ - int error; - - if (ctl.windowfiles.length == 0 && - (error = git_vector_init(&ctl.windowfiles, 8, NULL)) < GIT_SUCCESS) - return error; - - return git_vector_insert(&ctl.windowfiles, mwf); -} - -void git_mwindow_close(git_mwindow **window) -{ - git_mwindow *w = *window; - if (w) { - w->inuse_cnt--; - *window = NULL; - } -} diff --git a/vendor/libgit2/src/mwindow.h b/vendor/libgit2/src/mwindow.h deleted file mode 100644 index 1d4a58453..000000000 --- a/vendor/libgit2/src/mwindow.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDE_mwindow__ -#define INCLUDE_mwindow__ - -#include "map.h" -#include "vector.h" -#include "fileops.h" - -typedef struct git_mwindow { - struct git_mwindow *next; - git_map window_map; - git_off_t offset; - unsigned int last_used; - unsigned int inuse_cnt; -} git_mwindow; - -typedef struct git_mwindow_file { - git_mwindow *windows; - int fd; - git_off_t size; -} git_mwindow_file; - -typedef struct git_mwindow_ctl { - size_t mapped; - unsigned int open_windows; - size_t window_size; /* needs default value */ - size_t mapped_limit; /* needs default value */ - unsigned int mmap_calls; - unsigned int peak_open_windows; - size_t peak_mapped; - size_t used_ctr; - git_vector windowfiles; -} git_mwindow_ctl; - -int git_mwindow_contains(git_mwindow *win, git_off_t offset); -void git_mwindow_free_all(git_mwindow_file *mwf); -unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset, int extra, unsigned int *left); -void git_mwindow_scan_lru(git_mwindow_file *mwf, git_mwindow **lru_w, git_mwindow **lru_l); -int git_mwindow_file_register(git_mwindow_file *mwf); -void git_mwindow_close(git_mwindow **w_cursor); - -#endif diff --git a/vendor/libgit2/src/netops.c b/vendor/libgit2/src/netops.c deleted file mode 100644 index b5251925e..000000000 --- a/vendor/libgit2/src/netops.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _WIN32 -# include -# include -# include -# include -#else -# define _WIN32_WINNT 0x0501 -# include -# include -# pragma comment(lib, "Ws2_32.lib") -#endif - -#include "git2/errors.h" - -#include "common.h" -#include "netops.h" - -void gitno_buffer_setup(gitno_buffer *buf, char *data, unsigned int len, int fd) -{ - memset(buf, 0x0, sizeof(gitno_buffer)); - memset(data, 0x0, len); - buf->data = data; - buf->len = len - 1; - buf->offset = 0; - buf->fd = fd; -} - -int gitno_recv(gitno_buffer *buf) -{ - int ret; - - ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0); - if (ret < 0) - return git__throw(GIT_EOSERR, "Failed to receive data: %s", strerror(errno)); - if (ret == 0) /* Orderly shutdown, so exit */ - return GIT_SUCCESS; - - buf->offset += ret; - - return ret; -} - -/* Consume up to ptr and move the rest of the buffer to the beginning */ -void gitno_consume(gitno_buffer *buf, const char *ptr) -{ - size_t consumed; - - assert(ptr - buf->data >= 0); - assert(ptr - buf->data <= (int) buf->len); - - consumed = ptr - buf->data; - - memmove(buf->data, ptr, buf->offset - consumed); - memset(buf->data + buf->offset, 0x0, buf->len - buf->offset); - buf->offset -= consumed; -} - -/* Consume const bytes and move the rest of the buffer to the beginning */ -void gitno_consume_n(gitno_buffer *buf, size_t cons) -{ - memmove(buf->data, buf->data + cons, buf->len - buf->offset); - memset(buf->data + cons, 0x0, buf->len - buf->offset); - buf->offset -= cons; -} - -int gitno_connect(const char *host, const char *port) -{ - struct addrinfo *info, *p; - struct addrinfo hints; - int ret, error = GIT_SUCCESS; - int s; - - memset(&hints, 0x0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - ret = getaddrinfo(host, port, &hints, &info); - if (ret != 0) { - error = GIT_EOSERR; - goto cleanup; - } - - for (p = info; p != NULL; p = p->ai_next) { - s = socket(p->ai_family, p->ai_socktype, p->ai_protocol); - if (s < 0) { - error = GIT_EOSERR; - goto cleanup; - } - - ret = connect(s, p->ai_addr, p->ai_addrlen); - /* If we can't connect, try the next one */ - if (ret < 0) { - continue; - } - - /* Return the socket */ - error = s; - goto cleanup; - } - - /* Oops, we couldn't connect to any address */ - error = GIT_EOSERR; - -cleanup: - freeaddrinfo(info); - return error; -} - -int gitno_send(int s, const char *msg, size_t len, int flags) -{ - int ret; - size_t off = 0; - - while (off < len) { - ret = send(s, msg + off, len - off, flags); - if (ret < 0) - return GIT_EOSERR; - - off += ret; - } - - return off; -} - -int gitno_select_in(gitno_buffer *buf, long int sec, long int usec) -{ - fd_set fds; - struct timeval tv; - - tv.tv_sec = sec; - tv.tv_usec = usec; - - FD_ZERO(&fds); - FD_SET(buf->fd, &fds); - - /* The select(2) interface is silly */ - return select(buf->fd + 1, &fds, NULL, NULL, &tv); -} diff --git a/vendor/libgit2/src/netops.h b/vendor/libgit2/src/netops.h deleted file mode 100644 index c259ed2d6..000000000 --- a/vendor/libgit2/src/netops.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * netops.h - convencience functions for networking - */ -#ifndef INCLUDE_netops_h__ -#define INCLUDE_netops_h__ - -#ifndef GIT_WIN32 -typedef int GIT_SOCKET; -#else -typedef unsigned int GIT_SOCKET; -#endif - -typedef struct gitno_buffer { - char *data; - size_t len; - size_t offset; - GIT_SOCKET fd; -} gitno_buffer; - -void gitno_buffer_setup(gitno_buffer *buf, char *data, unsigned int len, int fd); -int gitno_recv(gitno_buffer *buf); -void gitno_consume(gitno_buffer *buf, const char *ptr); -void gitno_consume_n(gitno_buffer *buf, size_t cons); - -int gitno_connect(const char *host, const char *port); -int gitno_send(int s, const char *msg, size_t len, int flags); -int gitno_select_in(gitno_buffer *buf, long int sec, long int usec); - -#endif diff --git a/vendor/libgit2/src/object.c b/vendor/libgit2/src/object.c deleted file mode 100644 index 8b07197f1..000000000 --- a/vendor/libgit2/src/object.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include - -#include "git2/object.h" - -#include "common.h" -#include "repository.h" - -#include "commit.h" -#include "tree.h" -#include "blob.h" -#include "tag.h" - -static const int OBJECT_BASE_SIZE = 4096; - -static struct { - const char *str; /* type name string */ - int loose; /* valid loose object type flag */ - size_t size; /* size in bytes of the object structure */ -} git_objects_table[] = { - /* 0 = GIT_OBJ__EXT1 */ - { "", 0, 0}, - - /* 1 = GIT_OBJ_COMMIT */ - { "commit", 1, sizeof(struct git_commit)}, - - /* 2 = GIT_OBJ_TREE */ - { "tree", 1, sizeof(struct git_tree) }, - - /* 3 = GIT_OBJ_BLOB */ - { "blob", 1, sizeof(struct git_blob) }, - - /* 4 = GIT_OBJ_TAG */ - { "tag", 1, sizeof(struct git_tag) }, - - /* 5 = GIT_OBJ__EXT2 */ - { "", 0, 0 }, - - /* 6 = GIT_OBJ_OFS_DELTA */ - { "OFS_DELTA", 0, 0 }, - - /* 7 = GIT_OBJ_REF_DELTA */ - { "REF_DELTA", 0, 0 } -}; - -static int create_object(git_object **object_out, git_otype type) -{ - git_object *object = NULL; - - assert(object_out); - - *object_out = NULL; - - switch (type) { - case GIT_OBJ_COMMIT: - case GIT_OBJ_TAG: - case GIT_OBJ_BLOB: - case GIT_OBJ_TREE: - object = git__malloc(git_object__size(type)); - if (object == NULL) - return GIT_ENOMEM; - memset(object, 0x0, git_object__size(type)); - break; - - default: - return git__throw(GIT_EINVALIDTYPE, "The given type is invalid"); - } - - object->type = type; - - *object_out = object; - return GIT_SUCCESS; -} - -int git_object_lookup_prefix(git_object **object_out, git_repository *repo, const git_oid *id, unsigned int len, git_otype type) -{ - git_object *object = NULL; - git_odb_object *odb_obj; - int error = GIT_SUCCESS; - - assert(repo && object_out && id); - - if (len < GIT_OID_MINPREFIXLEN) - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, - "Failed to lookup object. Prefix length is lower than %d.", GIT_OID_MINPREFIXLEN); - - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - if (len == GIT_OID_HEXSZ) { - /* We want to match the full id : we can first look up in the cache, - * since there is no need to check for non ambiguousity - */ - object = git_cache_get(&repo->objects, id); - if (object != NULL) { - if (type != GIT_OBJ_ANY && type != object->type) - { - git_object_close(object); - return git__throw(GIT_EINVALIDTYPE, "Failed to lookup object. The given type does not match the type on the ODB"); - } - - *object_out = object; - return GIT_SUCCESS; - } - - /* Object was not found in the cache, let's explore the backends. - * We could just use git_odb_read_unique_short_oid, - * it is the same cost for packed and loose object backends, - * but it may be much more costly for sqlite and hiredis. - */ - error = git_odb_read(&odb_obj, repo->db, id); - } else { - git_oid short_oid; - - /* We copy the first len*4 bits from id and fill the remaining with 0s */ - memcpy(short_oid.id, id->id, (len + 1) / 2); - if (len % 2) - short_oid.id[len / 2] &= 0xF0; - memset(short_oid.id + (len + 1) / 2, 0, (GIT_OID_HEXSZ - len) / 2); - - /* If len < GIT_OID_HEXSZ (a strict short oid was given), we have - * 2 options : - * - We always search in the cache first. If we find that short oid is - * ambiguous, we can stop. But in all the other cases, we must then - * explore all the backends (to find an object if there was match, - * or to check that oid is not ambiguous if we have found 1 match in - * the cache) - * - We never explore the cache, go right to exploring the backends - * We chose the latter : we explore directly the backends. - */ - error = git_odb_read_prefix(&odb_obj, repo->db, &short_oid, len); - } - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to lookup object"); - - if (type != GIT_OBJ_ANY && type != odb_obj->raw.type) { - git_odb_object_close(odb_obj); - return git__throw(GIT_EINVALIDTYPE, "Failed to lookup object. The given type does not match the type on the ODB"); - } - - type = odb_obj->raw.type; - - if ((error = create_object(&object, type)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to lookup object"); - - /* Initialize parent object */ - git_oid_cpy(&object->cached.oid, &odb_obj->cached.oid); - object->repo = repo; - - switch (type) { - case GIT_OBJ_COMMIT: - error = git_commit__parse((git_commit *)object, odb_obj); - break; - - case GIT_OBJ_TREE: - error = git_tree__parse((git_tree *)object, odb_obj); - break; - - case GIT_OBJ_TAG: - error = git_tag__parse((git_tag *)object, odb_obj); - break; - - case GIT_OBJ_BLOB: - error = git_blob__parse((git_blob *)object, odb_obj); - break; - - default: - break; - } - - git_odb_object_close(odb_obj); - - if (error < GIT_SUCCESS) { - git_object__free(object); - return git__rethrow(error, "Failed to lookup object"); - } - - *object_out = git_cache_try_store(&repo->objects, object); - return GIT_SUCCESS; -} - -int git_object_lookup(git_object **object_out, git_repository *repo, const git_oid *id, git_otype type) { - return git_object_lookup_prefix(object_out, repo, id, GIT_OID_HEXSZ, type); -} - -void git_object__free(void *_obj) -{ - git_object *object = (git_object *)_obj; - - assert(object); - - switch (object->type) { - case GIT_OBJ_COMMIT: - git_commit__free((git_commit *)object); - break; - - case GIT_OBJ_TREE: - git_tree__free((git_tree *)object); - break; - - case GIT_OBJ_TAG: - git_tag__free((git_tag *)object); - break; - - case GIT_OBJ_BLOB: - git_blob__free((git_blob *)object); - break; - - default: - free(object); - break; - } -} - -void git_object_close(git_object *object) -{ - if (object == NULL) - return; - - git_cached_obj_decref((git_cached_obj *)object, git_object__free); -} - -const git_oid *git_object_id(const git_object *obj) -{ - assert(obj); - return &obj->cached.oid; -} - -git_otype git_object_type(const git_object *obj) -{ - assert(obj); - return obj->type; -} - -git_repository *git_object_owner(const git_object *obj) -{ - assert(obj); - return obj->repo; -} - -const char *git_object_type2string(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return ""; - - return git_objects_table[type].str; -} - -git_otype git_object_string2type(const char *str) -{ - size_t i; - - if (!str || !*str) - return GIT_OBJ_BAD; - - for (i = 0; i < ARRAY_SIZE(git_objects_table); i++) - if (!strcmp(str, git_objects_table[i].str)) - return (git_otype)i; - - return GIT_OBJ_BAD; -} - -int git_object_typeisloose(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return 0; - - return git_objects_table[type].loose; -} - -size_t git_object__size(git_otype type) -{ - if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table)) - return 0; - - return git_objects_table[type].size; -} - diff --git a/vendor/libgit2/src/odb.c b/vendor/libgit2/src/odb.c deleted file mode 100644 index ec81cdacb..000000000 --- a/vendor/libgit2/src/odb.c +++ /dev/null @@ -1,684 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/zlib.h" -#include "git2/object.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" - -#include "git2/odb_backend.h" - -#define GIT_ALTERNATES_FILE "info/alternates" - -/* TODO: is this correct? */ -#define GIT_LOOSE_PRIORITY 2 -#define GIT_PACKED_PRIORITY 1 - -typedef struct -{ - git_odb_backend *backend; - int priority; - int is_alternate; -} backend_internal; - -static int format_object_header(char *hdr, size_t n, size_t obj_len, git_otype obj_type) -{ - const char *type_str = git_object_type2string(obj_type); - int len = p_snprintf(hdr, n, "%s %"PRIuZ, type_str, obj_len); - - if (len < 0 || ((size_t) len) >= n) - return git__throw(GIT_ERROR, "Cannot format object header. Length is out of bounds"); - - return len+1; -} - -int git_odb__hash_obj(git_oid *id, git_rawobj *obj) -{ - git_buf_vec vec[2]; - char header[64]; - int hdrlen; - - assert(id && obj); - - if (!git_object_typeisloose(obj->type)) - return git__throw(GIT_ERROR, "Failed to hash object. Wrong object type"); - - if (!obj->data && obj->len != 0) - return git__throw(GIT_ERROR, "Failed to hash object. No data given"); - - if ((hdrlen = format_object_header(header, sizeof(header), obj->len, obj->type)) < 0) - return git__rethrow(hdrlen, "Failed to hash object"); - - vec[0].data = header; - vec[0].len = hdrlen; - vec[1].data = obj->data; - vec[1].len = obj->len; - - git_hash_vec(id, vec, 2); - - return GIT_SUCCESS; -} - - -static git_odb_object *new_odb_object(const git_oid *oid, git_rawobj *source) -{ - git_odb_object *object = git__malloc(sizeof(git_odb_object)); - memset(object, 0x0, sizeof(git_odb_object)); - - git_oid_cpy(&object->cached.oid, oid); - memcpy(&object->raw, source, sizeof(git_rawobj)); - - return object; -} - -static void free_odb_object(void *o) -{ - git_odb_object *object = (git_odb_object *)o; - - if (object != NULL) { - free(object->raw.data); - free(object); - } -} - -const git_oid *git_odb_object_id(git_odb_object *object) -{ - return &object->cached.oid; -} - -const void *git_odb_object_data(git_odb_object *object) -{ - return object->raw.data; -} - -size_t git_odb_object_size(git_odb_object *object) -{ - return object->raw.len; -} - -git_otype git_odb_object_type(git_odb_object *object) -{ - return object->raw.type; -} - -void git_odb_object_close(git_odb_object *object) -{ - git_cached_obj_decref((git_cached_obj *)object, &free_odb_object); -} - -int git_odb_hashfile(git_oid *out, const char *path, git_otype type) -{ - int fd, hdr_len; - char hdr[64], buffer[2048]; - git_off_t size; - git_hash_ctx *ctx; - - if ((fd = p_open(path, O_RDONLY)) < 0) - return git__throw(GIT_ENOTFOUND, "Could not open '%s'", path); - - if ((size = git_futils_filesize(fd)) < 0 || !git__is_sizet(size)) { - p_close(fd); - return git__throw(GIT_EOSERR, "'%s' appears to be corrupted", path); - } - - hdr_len = format_object_header(hdr, sizeof(hdr), (size_t)size, type); - if (hdr_len < 0) - return git__throw(GIT_ERROR, "Failed to format blob header. Length is out of bounds"); - - ctx = git_hash_new_ctx(); - - git_hash_update(ctx, hdr, hdr_len); - - while (size > 0) { - ssize_t read_len; - - read_len = read(fd, buffer, sizeof(buffer)); - - if (read_len < 0) { - p_close(fd); - git_hash_free_ctx(ctx); - return git__throw(GIT_EOSERR, "Can't read full file '%s'", path); - } - - git_hash_update(ctx, buffer, read_len); - size -= read_len; - } - - p_close(fd); - - git_hash_final(out, ctx); - git_hash_free_ctx(ctx); - - return GIT_SUCCESS; -} - -int git_odb_hash(git_oid *id, const void *data, size_t len, git_otype type) -{ - git_rawobj raw; - - assert(id); - - raw.data = (void *)data; - raw.len = len; - raw.type = type; - - return git_odb__hash_obj(id, &raw); -} - -/** - * FAKE WSTREAM - */ - -typedef struct { - git_odb_stream stream; - char *buffer; - size_t size, written; - git_otype type; -} fake_wstream; - -static int fake_wstream__fwrite(git_oid *oid, git_odb_stream *_stream) -{ - fake_wstream *stream = (fake_wstream *)_stream; - return _stream->backend->write(oid, _stream->backend, stream->buffer, stream->size, stream->type); -} - -static int fake_wstream__write(git_odb_stream *_stream, const char *data, size_t len) -{ - fake_wstream *stream = (fake_wstream *)_stream; - - if (stream->written + len > stream->size) - return GIT_ENOMEM; - - memcpy(stream->buffer + stream->written, data, len); - stream->written += len; - return GIT_SUCCESS; -} - -static void fake_wstream__free(git_odb_stream *_stream) -{ - fake_wstream *stream = (fake_wstream *)_stream; - - free(stream->buffer); - free(stream); -} - -static int init_fake_wstream(git_odb_stream **stream_p, git_odb_backend *backend, size_t size, git_otype type) -{ - fake_wstream *stream; - - stream = git__calloc(1, sizeof(fake_wstream)); - if (stream == NULL) - return GIT_ENOMEM; - - stream->size = size; - stream->type = type; - stream->buffer = git__malloc(size); - if (stream->buffer == NULL) { - free(stream); - return GIT_ENOMEM; - } - - stream->stream.backend = backend; - stream->stream.read = NULL; /* read only */ - stream->stream.write = &fake_wstream__write; - stream->stream.finalize_write = &fake_wstream__fwrite; - stream->stream.free = &fake_wstream__free; - stream->stream.mode = GIT_STREAM_WRONLY; - - *stream_p = (git_odb_stream *)stream; - return GIT_SUCCESS; -} - -/*********************************************************** - * - * OBJECT DATABASE PUBLIC API - * - * Public calls for the ODB functionality - * - ***********************************************************/ - -static int backend_sort_cmp(const void *a, const void *b) -{ - const backend_internal *backend_a = (const backend_internal *)(a); - const backend_internal *backend_b = (const backend_internal *)(b); - - if (backend_a->is_alternate == backend_b->is_alternate) - return (backend_b->priority - backend_a->priority); - - return backend_a->is_alternate ? 1 : -1; -} - -int git_odb_new(git_odb **out) -{ - int error; - - git_odb *db = git__calloc(1, sizeof(*db)); - if (!db) - return GIT_ENOMEM; - - error = git_cache_init(&db->cache, GIT_DEFAULT_CACHE_SIZE, &free_odb_object); - if (error < GIT_SUCCESS) { - free(db); - return git__rethrow(error, "Failed to create object database"); - } - - if ((error = git_vector_init(&db->backends, 4, backend_sort_cmp)) < GIT_SUCCESS) { - free(db); - return git__rethrow(error, "Failed to create object database"); - } - - *out = db; - return GIT_SUCCESS; -} - -static int add_backend_internal(git_odb *odb, git_odb_backend *backend, int priority, int is_alternate) -{ - backend_internal *internal; - - assert(odb && backend); - - if (backend->odb != NULL && backend->odb != odb) - return git__throw(GIT_EBUSY, "The backend is already owned by another ODB"); - - internal = git__malloc(sizeof(backend_internal)); - if (internal == NULL) - return GIT_ENOMEM; - - internal->backend = backend; - internal->priority = priority; - internal->is_alternate = is_alternate; - - if (git_vector_insert(&odb->backends, internal) < 0) { - free(internal); - return GIT_ENOMEM; - } - - git_vector_sort(&odb->backends); - internal->backend->odb = odb; - return GIT_SUCCESS; -} - -int git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority) -{ - return add_backend_internal(odb, backend, priority, 0); -} - -int git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority) -{ - return add_backend_internal(odb, backend, priority, 1); -} - -static int add_default_backends(git_odb *db, const char *objects_dir, int as_alternates) -{ - git_odb_backend *loose, *packed; - int error; - - /* add the loose object backend */ - error = git_odb_backend_loose(&loose, objects_dir); - if (error < GIT_SUCCESS) - return error; - - error = add_backend_internal(db, loose, GIT_LOOSE_PRIORITY, as_alternates); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to add backend"); - - /* add the packed file backend */ - error = git_odb_backend_pack(&packed, objects_dir); - if (error < GIT_SUCCESS) - return error; - - error = add_backend_internal(db, packed, GIT_PACKED_PRIORITY, as_alternates); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to add backend"); - - return GIT_SUCCESS; -} - -static int load_alternates(git_odb *odb, const char *objects_dir) -{ - char alternates_path[GIT_PATH_MAX]; - char *buffer, *alternate; - - git_fbuffer alternates_buf = GIT_FBUFFER_INIT; - int error; - - git_path_join(alternates_path, objects_dir, GIT_ALTERNATES_FILE); - - if (git_futils_exists(alternates_path) < GIT_SUCCESS) - return GIT_SUCCESS; - - if (git_futils_readbuffer(&alternates_buf, alternates_path) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to add backend. Can't read alternates"); - - buffer = (char *)alternates_buf.data; - error = GIT_SUCCESS; - - /* add each alternate as a new backend; one alternate per line */ - while ((alternate = git__strtok(&buffer, "\r\n")) != NULL) { - char full_path[GIT_PATH_MAX]; - - if (*alternate == '\0' || *alternate == '#') - continue; - - /* relative path: build based on the current `objects` folder */ - if (*alternate == '.') { - git_path_join(full_path, objects_dir, alternate); - alternate = full_path; - } - - if ((error = add_default_backends(odb, alternate, 1)) < GIT_SUCCESS) - break; - } - - git_futils_freebuffer(&alternates_buf); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to load alternates"); - return error; -} - -int git_odb_open(git_odb **out, const char *objects_dir) -{ - git_odb *db; - int error; - - assert(out && objects_dir); - - *out = NULL; - - if ((error = git_odb_new(&db)) < 0) - return git__rethrow(error, "Failed to open ODB"); - - if ((error = add_default_backends(db, objects_dir, 0)) < GIT_SUCCESS) - goto cleanup; - - if ((error = load_alternates(db, objects_dir)) < GIT_SUCCESS) - goto cleanup; - - *out = db; - return GIT_SUCCESS; - -cleanup: - git_odb_close(db); - return error; /* error already set - pass through */ -} - -void git_odb_close(git_odb *db) -{ - unsigned int i; - - if (db == NULL) - return; - - for (i = 0; i < db->backends.length; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *backend = internal->backend; - - if (backend->free) backend->free(backend); - else free(backend); - - free(internal); - } - - git_vector_free(&db->backends); - git_cache_free(&db->cache); - free(db); -} - -int git_odb_exists(git_odb *db, const git_oid *id) -{ - git_odb_object *object; - unsigned int i; - int found = 0; - - assert(db && id); - - if ((object = git_cache_get(&db->cache, id)) != NULL) { - git_odb_object_close(object); - return 1; - } - - for (i = 0; i < db->backends.length && !found; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->exists != NULL) - found = b->exists(b, id); - } - - return found; -} - -int git_odb_read_header(size_t *len_p, git_otype *type_p, git_odb *db, const git_oid *id) -{ - unsigned int i; - int error = GIT_ENOTFOUND; - git_odb_object *object; - - assert(db && id); - - if ((object = git_cache_get(&db->cache, id)) != NULL) { - *len_p = object->raw.len; - *type_p = object->raw.type; - git_odb_object_close(object); - return GIT_SUCCESS; - } - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read_header != NULL) - error = b->read_header(len_p, type_p, b, id); - } - - if (error == GIT_EPASSTHROUGH) - return GIT_SUCCESS; - - /* - * no backend could read only the header. - * try reading the whole object and freeing the contents - */ - if (error < 0) { - if ((error = git_odb_read(&object, db, id)) < GIT_SUCCESS) - return error; /* error already set - pass through */ - - *len_p = object->raw.len; - *type_p = object->raw.type; - git_odb_object_close(object); - } - - return GIT_SUCCESS; -} - -int git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id) -{ - unsigned int i; - int error = GIT_ENOTFOUND; - git_rawobj raw; - - assert(out && db && id); - - *out = git_cache_get(&db->cache, id); - if (*out != NULL) - return GIT_SUCCESS; - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read != NULL) - error = b->read(&raw.data, &raw.len, &raw.type, b, id); - } - - if (error == GIT_EPASSTHROUGH || error == GIT_SUCCESS) { - *out = git_cache_try_store(&db->cache, new_odb_object(id, &raw)); - return GIT_SUCCESS; - } - - return git__rethrow(error, "Failed to read object"); -} - -int git_odb_read_prefix(git_odb_object **out, git_odb *db, const git_oid *short_id, unsigned int len) -{ - unsigned int i; - int error = GIT_ENOTFOUND; - git_oid full_oid; - git_rawobj raw; - int found = 0; - - assert(out && db); - - if (len < GIT_OID_MINPREFIXLEN) - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to lookup object. Prefix length is lower than %d.", GIT_OID_MINPREFIXLEN); - - if (len > GIT_OID_HEXSZ) - len = GIT_OID_HEXSZ; - - if (len == GIT_OID_HEXSZ) { - *out = git_cache_get(&db->cache, short_id); - if (*out != NULL) - return GIT_SUCCESS; - } - - for (i = 0; i < db->backends.length && found < 2; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->read != NULL) { - error = b->read_prefix(&full_oid, &raw.data, &raw.len, &raw.type, b, short_id, len); - switch (error) { - case GIT_SUCCESS: - found++; - break; - case GIT_ENOTFOUND: - case GIT_EPASSTHROUGH: - break; - case GIT_EAMBIGUOUSOIDPREFIX: - return git__rethrow(error, "Failed to read object. Ambiguous sha1 prefix"); - default: - return git__rethrow(error, "Failed to read object"); - } - } - } - - if (found == 1) { - *out = git_cache_try_store(&db->cache, new_odb_object(&full_oid, &raw)); - } else if (found > 1) { - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to read object. Ambiguous sha1 prefix"); - } else { - return git__throw(GIT_ENOTFOUND, "Failed to read object. Object not found"); - } - - return GIT_SUCCESS; -} - -int git_odb_write(git_oid *oid, git_odb *db, const void *data, size_t len, git_otype type) -{ - unsigned int i; - int error = GIT_ERROR; - git_odb_stream *stream; - - assert(oid && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - /* we don't write in alternates! */ - if (internal->is_alternate) - continue; - - if (b->write != NULL) - error = b->write(oid, b, data, len, type); - } - - if (error == GIT_EPASSTHROUGH || error == GIT_SUCCESS) - return GIT_SUCCESS; - - /* if no backends were able to write the object directly, we try a streaming - * write to the backends; just write the whole object into the stream in one - * push */ - - if ((error = git_odb_open_wstream(&stream, db, len, type)) == GIT_SUCCESS) { - stream->write(stream, data, len); - error = stream->finalize_write(oid, stream); - stream->free(stream); - return GIT_SUCCESS; - } - - return git__rethrow(error, "Failed to write object"); -} - -int git_odb_open_wstream(git_odb_stream **stream, git_odb *db, size_t size, git_otype type) -{ - unsigned int i; - int error = GIT_ERROR; - - assert(stream && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - /* we don't write in alternates! */ - if (internal->is_alternate) - continue; - - if (b->writestream != NULL) - error = b->writestream(stream, b, size, type); - else if (b->write != NULL) - error = init_fake_wstream(stream, b, size, type); - } - - if (error == GIT_EPASSTHROUGH || error == GIT_SUCCESS) - return GIT_SUCCESS; - - return git__rethrow(error, "Failed to open write stream"); -} - -int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oid) -{ - unsigned int i; - int error = GIT_ERROR; - - assert(stream && db); - - for (i = 0; i < db->backends.length && error < 0; ++i) { - backend_internal *internal = git_vector_get(&db->backends, i); - git_odb_backend *b = internal->backend; - - if (b->readstream != NULL) - error = b->readstream(stream, b, oid); - } - - if (error == GIT_EPASSTHROUGH || error == GIT_SUCCESS) - return GIT_SUCCESS; - - return git__rethrow(error, "Failed to open read stream"); -} - diff --git a/vendor/libgit2/src/odb.h b/vendor/libgit2/src/odb.h deleted file mode 100644 index 1d4f07dcc..000000000 --- a/vendor/libgit2/src/odb.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef INCLUDE_odb_h__ -#define INCLUDE_odb_h__ - -#include "git2/odb.h" -#include "git2/oid.h" -#include "git2/types.h" - -#include "vector.h" -#include "cache.h" - -/* DO NOT EXPORT */ -typedef struct { - void *data; /**< Raw, decompressed object data. */ - size_t len; /**< Total number of bytes in data. */ - git_otype type; /**< Type of this object. */ -} git_rawobj; - -/* EXPORT */ -struct git_odb_object { - git_cached_obj cached; - git_rawobj raw; -}; - -/* EXPORT */ -struct git_odb { - void *_internal; - git_vector backends; - git_cache cache; -}; - -int git_odb__hash_obj(git_oid *id, git_rawobj *obj); - -#endif diff --git a/vendor/libgit2/src/odb_loose.c b/vendor/libgit2/src/odb_loose.c deleted file mode 100644 index a3a4e5b56..000000000 --- a/vendor/libgit2/src/odb_loose.c +++ /dev/null @@ -1,855 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/zlib.h" -#include "git2/object.h" -#include "git2/oid.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" -#include "filebuf.h" - -#include "git2/odb_backend.h" -#include "git2/types.h" - -typedef struct { /* object header data */ - git_otype type; /* object type */ - size_t size; /* object size */ -} obj_hdr; - -typedef struct { - git_odb_stream stream; - git_filebuf fbuf; - int finished; -} loose_writestream; - -typedef struct loose_backend { - git_odb_backend parent; - - int object_zlib_level; /** loose object zlib compression level. */ - int fsync_object_files; /** loose object file fsync flag. */ - char *objects_dir; -} loose_backend; - -/* State structure for exploring directories, - * in order to locate objects matching a short oid. - */ -typedef struct { - size_t dir_len; - unsigned char short_oid[GIT_OID_HEXSZ]; /* hex formatted oid to match */ - unsigned int short_oid_len; - int found; /* number of matching - * objects already found */ - unsigned char res_oid[GIT_OID_HEXSZ]; /* hex formatted oid of - * the object found */ -} loose_locate_object_state; - - - -/*********************************************************** - * - * MISCELANEOUS HELPER FUNCTIONS - * - ***********************************************************/ - -static size_t object_file_name(char *name, size_t n, char *dir, const git_oid *id) -{ - size_t len = strlen(dir); - - /* check length: 43 = 40 hex sha1 chars + 2 * '/' + '\0' */ - if (len+43 > n) - return len+43; - - /* the object dir: eg $GIT_DIR/objects */ - strcpy(name, dir); - if (name[len-1] != '/') - name[len++] = '/'; - - /* loose object filename: aa/aaa... (41 bytes) */ - git_oid_pathfmt(&name[len], id); - name[len+41] = '\0'; - - return 0; -} - - -static size_t get_binary_object_header(obj_hdr *hdr, git_fbuffer *obj) -{ - unsigned char c; - unsigned char *data = obj->data; - size_t shift, size, used = 0; - - if (obj->len == 0) - return 0; - - c = data[used++]; - hdr->type = (c >> 4) & 7; - - size = c & 15; - shift = 4; - while (c & 0x80) { - if (obj->len <= used) - return 0; - if (sizeof(size_t) * 8 <= shift) - return 0; - c = data[used++]; - size += (c & 0x7f) << shift; - shift += 7; - } - hdr->size = size; - - return used; -} - -static size_t get_object_header(obj_hdr *hdr, unsigned char *data) -{ - char c, typename[10]; - size_t size, used = 0; - - /* - * type name string followed by space. - */ - while ((c = data[used]) != ' ') { - typename[used++] = c; - if (used >= sizeof(typename)) - return 0; - } - typename[used] = 0; - if (used == 0) - return 0; - hdr->type = git_object_string2type(typename); - used++; /* consume the space */ - - /* - * length follows immediately in decimal (without - * leading zeros). - */ - size = data[used++] - '0'; - if (size > 9) - return 0; - if (size) { - while ((c = data[used]) != '\0') { - size_t d = c - '0'; - if (d > 9) - break; - used++; - size = size * 10 + d; - } - } - hdr->size = size; - - /* - * the length must be followed by a zero byte - */ - if (data[used++] != '\0') - return 0; - - return used; -} - - - -/*********************************************************** - * - * ZLIB RELATED FUNCTIONS - * - ***********************************************************/ - -static void init_stream(z_stream *s, void *out, size_t len) -{ - memset(s, 0, sizeof(*s)); - s->next_out = out; - s->avail_out = len; -} - -static void set_stream_input(z_stream *s, void *in, size_t len) -{ - s->next_in = in; - s->avail_in = len; -} - -static void set_stream_output(z_stream *s, void *out, size_t len) -{ - s->next_out = out; - s->avail_out = len; -} - - -static int start_inflate(z_stream *s, git_fbuffer *obj, void *out, size_t len) -{ - int status; - - init_stream(s, out, len); - set_stream_input(s, obj->data, obj->len); - - if ((status = inflateInit(s)) < Z_OK) - return status; - - return inflate(s, 0); -} - -static int finish_inflate(z_stream *s) -{ - int status = Z_OK; - - while (status == Z_OK) - status = inflate(s, Z_FINISH); - - inflateEnd(s); - - if ((status != Z_STREAM_END) || (s->avail_in != 0)) - return git__throw(GIT_ERROR, "Failed to finish inflation. Stream aborted prematurely"); - - return GIT_SUCCESS; -} - -static int is_zlib_compressed_data(unsigned char *data) -{ - unsigned int w; - - w = ((unsigned int)(data[0]) << 8) + data[1]; - return data[0] == 0x78 && !(w % 31); -} - -static int inflate_buffer(void *in, size_t inlen, void *out, size_t outlen) -{ - z_stream zs; - int status = Z_OK; - - memset(&zs, 0x0, sizeof(zs)); - - zs.next_out = out; - zs.avail_out = outlen; - - zs.next_in = in; - zs.avail_in = inlen; - - if (inflateInit(&zs) < Z_OK) - return git__throw(GIT_ERROR, "Failed to inflate buffer"); - - while (status == Z_OK) - status = inflate(&zs, Z_FINISH); - - inflateEnd(&zs); - - if ((status != Z_STREAM_END) /*|| (zs.avail_in != 0) */) - return git__throw(GIT_ERROR, "Failed to inflate buffer. Stream aborted prematurely"); - - if (zs.total_out != outlen) - return git__throw(GIT_ERROR, "Failed to inflate buffer. Stream aborted prematurely"); - - return GIT_SUCCESS; -} - -static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr) -{ - unsigned char *buf, *head = hb; - size_t tail; - - /* - * allocate a buffer to hold the inflated data and copy the - * initial sequence of inflated data from the tail of the - * head buffer, if any. - */ - if ((buf = git__malloc(hdr->size + 1)) == NULL) { - inflateEnd(s); - return NULL; - } - tail = s->total_out - used; - if (used > 0 && tail > 0) { - if (tail > hdr->size) - tail = hdr->size; - memcpy(buf, head + used, tail); - } - used = tail; - - /* - * inflate the remainder of the object data, if any - */ - if (hdr->size < used) - inflateEnd(s); - else { - set_stream_output(s, buf + used, hdr->size - used); - if (finish_inflate(s)) { - free(buf); - return NULL; - } - } - - return buf; -} - -/* - * At one point, there was a loose object format that was intended to - * mimic the format used in pack-files. This was to allow easy copying - * of loose object data into packs. This format is no longer used, but - * we must still read it. - */ -static int inflate_packlike_loose_disk_obj(git_rawobj *out, git_fbuffer *obj) -{ - unsigned char *in, *buf; - obj_hdr hdr; - size_t len, used; - - /* - * read the object header, which is an (uncompressed) - * binary encoding of the object type and size. - */ - if ((used = get_binary_object_header(&hdr, obj)) == 0) - return git__throw(GIT_ERROR, "Failed to inflate loose object. Object has no header"); - - if (!git_object_typeisloose(hdr.type)) - return git__throw(GIT_ERROR, "Failed to inflate loose object. Wrong object type"); - - /* - * allocate a buffer and inflate the data into it - */ - buf = git__malloc(hdr.size + 1); - if (!buf) - return GIT_ENOMEM; - - in = ((unsigned char *)obj->data) + used; - len = obj->len - used; - if (inflate_buffer(in, len, buf, hdr.size)) { - free(buf); - return git__throw(GIT_ERROR, "Failed to inflate loose object. Could not inflate buffer"); - } - buf[hdr.size] = '\0'; - - out->data = buf; - out->len = hdr.size; - out->type = hdr.type; - - return GIT_SUCCESS; -} - -static int inflate_disk_obj(git_rawobj *out, git_fbuffer *obj) -{ - unsigned char head[64], *buf; - z_stream zs; - obj_hdr hdr; - size_t used; - - /* - * check for a pack-like loose object - */ - if (!is_zlib_compressed_data(obj->data)) - return inflate_packlike_loose_disk_obj(out, obj); - - /* - * inflate the initial part of the io buffer in order - * to parse the object header (type and size). - */ - if (start_inflate(&zs, obj, head, sizeof(head)) < Z_OK) - return git__throw(GIT_ERROR, "Failed to inflate disk object. Could not inflate buffer"); - - if ((used = get_object_header(&hdr, head)) == 0) - return git__throw(GIT_ERROR, "Failed to inflate disk object. Object has no header"); - - if (!git_object_typeisloose(hdr.type)) - return git__throw(GIT_ERROR, "Failed to inflate disk object. Wrong object type"); - - /* - * allocate a buffer and inflate the object data into it - * (including the initial sequence in the head buffer). - */ - if ((buf = inflate_tail(&zs, head, used, &hdr)) == NULL) - return GIT_ENOMEM; - buf[hdr.size] = '\0'; - - out->data = buf; - out->len = hdr.size; - out->type = hdr.type; - - return GIT_SUCCESS; -} - - - - - - -/*********************************************************** - * - * ODB OBJECT READING & WRITING - * - * Backend for the public API; read headers and full objects - * from the ODB. Write raw data to the ODB. - * - ***********************************************************/ - -static int read_loose(git_rawobj *out, const char *loc) -{ - int error; - git_fbuffer obj = GIT_FBUFFER_INIT; - - assert(out && loc); - - out->data = NULL; - out->len = 0; - out->type = GIT_OBJ_BAD; - - if (git_futils_readbuffer(&obj, loc) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to read loose object. File not found"); - - error = inflate_disk_obj(out, &obj); - git_futils_freebuffer(&obj); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to read loose object"); -} - -static int read_header_loose(git_rawobj *out, const char *loc) -{ - int error = GIT_SUCCESS, z_return = Z_ERRNO, read_bytes; - git_file fd; - z_stream zs; - obj_hdr header_obj; - unsigned char raw_buffer[16], inflated_buffer[64]; - - assert(out && loc); - - out->data = NULL; - - if ((fd = p_open(loc, O_RDONLY)) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to read loose object header. File not found"); - - init_stream(&zs, inflated_buffer, sizeof(inflated_buffer)); - - if (inflateInit(&zs) < Z_OK) { - error = GIT_EZLIB; - goto cleanup; - } - - do { - if ((read_bytes = read(fd, raw_buffer, sizeof(raw_buffer))) > 0) { - set_stream_input(&zs, raw_buffer, read_bytes); - z_return = inflate(&zs, 0); - } else { - z_return = Z_STREAM_END; - break; - } - } while (z_return == Z_OK); - - if ((z_return != Z_STREAM_END && z_return != Z_BUF_ERROR) - || get_object_header(&header_obj, inflated_buffer) == 0 - || git_object_typeisloose(header_obj.type) == 0) { - error = GIT_EOBJCORRUPTED; - goto cleanup; - } - - out->len = header_obj.size; - out->type = header_obj.type; - -cleanup: - finish_inflate(&zs); - p_close(fd); - - if (error < GIT_SUCCESS) - return git__throw(error, "Failed to read loose object header. Header is corrupted"); - - return GIT_SUCCESS; -} - -static int locate_object(char *object_location, loose_backend *backend, const git_oid *oid) -{ - object_file_name(object_location, GIT_PATH_MAX, backend->objects_dir, oid); - return git_futils_exists(object_location); -} - -/* Explore an entry of a directory and see if it matches a short oid */ -int fn_locate_object_short_oid(void *state, char *pathbuf) { - loose_locate_object_state *sstate = (loose_locate_object_state *)state; - - size_t pathbuf_len = strlen(pathbuf); - if (pathbuf_len - sstate->dir_len != GIT_OID_HEXSZ - 2) { - /* Entry cannot be an object. Continue to next entry */ - return GIT_SUCCESS; - } - - if (!git_futils_exists(pathbuf) && git_futils_isdir(pathbuf)) { - /* We are already in the directory matching the 2 first hex characters, - * compare the first ncmp characters of the oids */ - if (!memcmp(sstate->short_oid + 2, - (unsigned char *)pathbuf + sstate->dir_len, - sstate->short_oid_len - 2)) { - - if (!sstate->found) { - sstate->res_oid[0] = sstate->short_oid[0]; - sstate->res_oid[1] = sstate->short_oid[1]; - memcpy(sstate->res_oid+2, pathbuf+sstate->dir_len, GIT_OID_HEXSZ-2); - } - sstate->found++; - } - } - if (sstate->found > 1) - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Ambiguous sha1 prefix within loose objects"); - - return GIT_SUCCESS; -} - -/* Locate an object matching a given short oid */ -static int locate_object_short_oid(char *object_location, git_oid *res_oid, loose_backend *backend, const git_oid *short_oid, unsigned int len) -{ - char *objects_dir = backend->objects_dir; - size_t dir_len = strlen(objects_dir); - loose_locate_object_state state; - int error; - - if (dir_len+43 > GIT_PATH_MAX) - return git__throw(GIT_ERROR, "Failed to locate object from short oid. Object path too long"); - - strcpy(object_location, objects_dir); - - /* Add a separator if not already there */ - if (object_location[dir_len-1] != '/') - object_location[dir_len++] = '/'; - - /* Convert raw oid to hex formatted oid */ - git_oid_fmt((char *)state.short_oid, short_oid); - /* Explore OBJ_DIR/xx/ where xx is the beginning of hex formatted short oid */ - sprintf(object_location+dir_len, "%.2s/", state.short_oid); - - /* Check that directory exists */ - if (git_futils_exists(object_location) || git_futils_isdir(object_location)) - return git__throw(GIT_ENOTFOUND, "Failed to locate object from short oid. Object not found"); - - state.dir_len = dir_len+3; - state.short_oid_len = len; - state.found = 0; - /* Explore directory to find a unique object matching short_oid */ - error = git_futils_direach(object_location, GIT_PATH_MAX, fn_locate_object_short_oid, &state); - if (error) { - return git__rethrow(error, "Failed to locate object from short oid"); - } - if (!state.found) { - return git__throw(GIT_ENOTFOUND, "Failed to locate object from short oid. Object not found"); - } - - /* Convert obtained hex formatted oid to raw */ - error = git_oid_fromstr(res_oid, (char *)state.res_oid); - if (error) { - return git__rethrow(error, "Failed to locate object from short oid"); - } - - /* Update the location according to the oid obtained */ - git_oid_pathfmt(object_location+dir_len, res_oid); - - return GIT_SUCCESS; -} - - - - - - - - - -/*********************************************************** - * - * LOOSE BACKEND PUBLIC API - * - * Implement the git_odb_backend API calls - * - ***********************************************************/ - -int loose_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - char object_path[GIT_PATH_MAX]; - git_rawobj raw; - int error; - - assert(backend && oid); - - raw.len = 0; - raw.type = GIT_OBJ_BAD; - - if (locate_object(object_path, (loose_backend *)backend, oid) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to read loose backend header. Object not found"); - - if ((error = read_header_loose(&raw, object_path)) < GIT_SUCCESS) - return error; - - *len_p = raw.len; - *type_p = raw.type; - return GIT_SUCCESS; -} - -int loose_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - char object_path[GIT_PATH_MAX]; - git_rawobj raw; - int error; - - assert(backend && oid); - - if (locate_object(object_path, (loose_backend *)backend, oid) < 0) - return git__throw(GIT_ENOTFOUND, "Failed to read loose backend. Object not found"); - - if ((error = read_loose(&raw, object_path)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read loose backend"); - - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - - return GIT_SUCCESS; -} - -int loose_backend__read_prefix( - git_oid *out_oid, - void **buffer_p, - size_t *len_p, - git_otype *type_p, - git_odb_backend *backend, - const git_oid *short_oid, - unsigned int len) -{ - if (len < GIT_OID_MINPREFIXLEN) - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to read loose backend. Prefix length is lower than %d.", GIT_OID_MINPREFIXLEN); - - if (len >= GIT_OID_HEXSZ) { - /* We can fall back to regular read method */ - int error = loose_backend__read(buffer_p, len_p, type_p, backend, short_oid); - if (error == GIT_SUCCESS) - git_oid_cpy(out_oid, short_oid); - - return error; - } else { - char object_path[GIT_PATH_MAX]; - git_rawobj raw; - int error; - - assert(backend && short_oid); - - if ((error = locate_object_short_oid(object_path, out_oid, (loose_backend *)backend, short_oid, len)) < 0) { - return git__rethrow(error, "Failed to read loose backend"); - } - - if ((error = read_loose(&raw, object_path)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read loose backend"); - - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - } - - return GIT_SUCCESS; -} - -int loose_backend__exists(git_odb_backend *backend, const git_oid *oid) -{ - char object_path[GIT_PATH_MAX]; - - assert(backend && oid); - - return locate_object(object_path, (loose_backend *)backend, oid) == GIT_SUCCESS; -} - -int loose_backend__stream_fwrite(git_oid *oid, git_odb_stream *_stream) -{ - loose_writestream *stream = (loose_writestream *)_stream; - loose_backend *backend = (loose_backend *)_stream->backend; - - int error; - char final_path[GIT_PATH_MAX]; - - if ((error = git_filebuf_hash(oid, &stream->fbuf)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write loose backend"); - - if (object_file_name(final_path, sizeof(final_path), backend->objects_dir, oid)) - return GIT_ENOMEM; - - if ((error = git_futils_mkpath2file(final_path)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write loose backend"); - - stream->finished = 1; - return git_filebuf_commit_at(&stream->fbuf, final_path); -} - -int loose_backend__stream_write(git_odb_stream *_stream, const char *data, size_t len) -{ - loose_writestream *stream = (loose_writestream *)_stream; - return git_filebuf_write(&stream->fbuf, data, len); -} - -void loose_backend__stream_free(git_odb_stream *_stream) -{ - loose_writestream *stream = (loose_writestream *)_stream; - - if (!stream->finished) - git_filebuf_cleanup(&stream->fbuf); - - free(stream); -} - -static int format_object_header(char *hdr, size_t n, size_t obj_len, git_otype obj_type) -{ - const char *type_str = git_object_type2string(obj_type); - int len = snprintf(hdr, n, "%s %"PRIuZ, type_str, obj_len); - - assert(len > 0); /* otherwise snprintf() is broken */ - assert(((size_t) len) < n); /* otherwise the caller is broken! */ - - if (len < 0 || ((size_t) len) >= n) - return git__throw(GIT_ERROR, "Failed to format object header. Length is out of bounds"); - return len+1; -} - -int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_backend, size_t length, git_otype type) -{ - loose_backend *backend; - loose_writestream *stream; - - char hdr[64], tmp_path[GIT_PATH_MAX]; - int hdrlen; - int error; - - assert(_backend); - - backend = (loose_backend *)_backend; - *stream_out = NULL; - - hdrlen = format_object_header(hdr, sizeof(hdr), length, type); - if (hdrlen < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to create loose backend stream. Object is corrupted"); - - stream = git__calloc(1, sizeof(loose_writestream)); - if (stream == NULL) - return GIT_ENOMEM; - - stream->stream.backend = _backend; - stream->stream.read = NULL; /* read only */ - stream->stream.write = &loose_backend__stream_write; - stream->stream.finalize_write = &loose_backend__stream_fwrite; - stream->stream.free = &loose_backend__stream_free; - stream->stream.mode = GIT_STREAM_WRONLY; - - git_path_join(tmp_path, backend->objects_dir, "tmp_object"); - - error = git_filebuf_open(&stream->fbuf, tmp_path, - GIT_FILEBUF_HASH_CONTENTS | - GIT_FILEBUF_DEFLATE_CONTENTS | - GIT_FILEBUF_TEMPORARY); - - if (error < GIT_SUCCESS) { - free(stream); - return git__rethrow(error, "Failed to create loose backend stream"); - } - - error = stream->stream.write((git_odb_stream *)stream, hdr, hdrlen); - if (error < GIT_SUCCESS) { - git_filebuf_cleanup(&stream->fbuf); - free(stream); - return git__rethrow(error, "Failed to create loose backend stream"); - } - - *stream_out = (git_odb_stream *)stream; - return GIT_SUCCESS; -} - -int loose_backend__write(git_oid *oid, git_odb_backend *_backend, const void *data, size_t len, git_otype type) -{ - int error, header_len; - char final_path[GIT_PATH_MAX], header[64]; - git_filebuf fbuf; - loose_backend *backend; - - backend = (loose_backend *)_backend; - - /* prepare the header for the file */ - { - header_len = format_object_header(header, sizeof(header), len, type); - if (header_len < GIT_SUCCESS) - return GIT_EOBJCORRUPTED; - } - - git_path_join(final_path, backend->objects_dir, "tmp_object"); - - error = git_filebuf_open(&fbuf, final_path, - GIT_FILEBUF_HASH_CONTENTS | - GIT_FILEBUF_DEFLATE_CONTENTS | - GIT_FILEBUF_TEMPORARY); - - if (error < GIT_SUCCESS) - return error; - - git_filebuf_write(&fbuf, header, header_len); - git_filebuf_write(&fbuf, data, len); - git_filebuf_hash(oid, &fbuf); - - if ((error = object_file_name(final_path, sizeof(final_path), backend->objects_dir, oid)) < GIT_SUCCESS) - goto cleanup; - - if ((error = git_futils_mkpath2file(final_path)) < GIT_SUCCESS) - goto cleanup; - - return git_filebuf_commit_at(&fbuf, final_path); - -cleanup: - git_filebuf_cleanup(&fbuf); - return error; -} - -void loose_backend__free(git_odb_backend *_backend) -{ - loose_backend *backend; - assert(_backend); - backend = (loose_backend *)_backend; - - free(backend->objects_dir); - free(backend); -} - -int git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir) -{ - loose_backend *backend; - - backend = git__calloc(1, sizeof(loose_backend)); - if (backend == NULL) - return GIT_ENOMEM; - - backend->objects_dir = git__strdup(objects_dir); - if (backend->objects_dir == NULL) { - free(backend); - return GIT_ENOMEM; - } - - backend->object_zlib_level = Z_BEST_SPEED; - backend->fsync_object_files = 0; - - backend->parent.read = &loose_backend__read; - backend->parent.write = &loose_backend__write; - backend->parent.read_prefix = &loose_backend__read_prefix; - backend->parent.read_header = &loose_backend__read_header; - backend->parent.writestream = &loose_backend__stream; - backend->parent.exists = &loose_backend__exists; - backend->parent.free = &loose_backend__free; - - *backend_out = (git_odb_backend *)backend; - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/odb_pack.c b/vendor/libgit2/src/odb_pack.c deleted file mode 100644 index 5b2be58e1..000000000 --- a/vendor/libgit2/src/odb_pack.c +++ /dev/null @@ -1,500 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/zlib.h" -#include "git2/repository.h" -#include "git2/oid.h" -#include "fileops.h" -#include "hash.h" -#include "odb.h" -#include "delta-apply.h" -#include "sha1_lookup.h" -#include "mwindow.h" -#include "pack.h" - -#include "git2/odb_backend.h" - -struct pack_backend { - git_odb_backend parent; - git_vector packs; - struct git_pack_file *last_found; - char *pack_folder; - time_t pack_folder_mtime; -}; - -/** - * The wonderful tale of a Packed Object lookup query - * =================================================== - * A riveting and epic story of epicness and ASCII - * art, presented by yours truly, - * Sir Vicent of Marti - * - * - * Chapter 1: Once upon a time... - * Initialization of the Pack Backend - * -------------------------------------------------- - * - * # git_odb_backend_pack - * | Creates the pack backend structure, initializes the - * | callback pointers to our default read() and exist() methods, - * | and tries to preload all the known packfiles in the ODB. - * | - * |-# packfile_load_all - * | Tries to find the `pack` folder, if it exists. ODBs without - * | a pack folder are ignored altogether. If there's a `pack` folder - * | we run a `dirent` callback through every file in the pack folder - * | to find our packfiles. The packfiles are then sorted according - * | to a sorting callback. - * | - * |-# packfile_load__cb - * | | This callback is called from `dirent` with every single file - * | | inside the pack folder. We find the packs by actually locating - * | | their index (ends in ".idx"). From that index, we verify that - * | | the corresponding packfile exists and is valid, and if so, we - * | | add it to the pack list. - * | | - * | |-# packfile_check - * | Make sure that there's a packfile to back this index, and store - * | some very basic information regarding the packfile itself, - * | such as the full path, the size, and the modification time. - * | We don't actually open the packfile to check for internal consistency. - * | - * |-# packfile_sort__cb - * Sort all the preloaded packs according to some specific criteria: - * we prioritize the "newer" packs because it's more likely they - * contain the objects we are looking for, and we prioritize local - * packs over remote ones. - * - * - * - * Chapter 2: To be, or not to be... - * A standard packed `exist` query for an OID - * -------------------------------------------------- - * - * # pack_backend__exists - * | Check if the given SHA1 oid exists in any of the packs - * | that have been loaded for our ODB. - * | - * |-# pack_entry_find - * | Iterate through all the packs that have been preloaded - * | (starting by the pack where the latest object was found) - * | to try to find the OID in one of them. - * | - * |-# pack_entry_find1 - * | Check the index of an individual pack to see if the SHA1 - * | OID can be found. If we can find the offset to that SHA1 - * | inside of the index, that means the object is contained - * | inside of the packfile and we can stop searching. - * | Before returning, we verify that the packfile behing the - * | index we are searching still exists on disk. - * | - * |-# pack_entry_find_offset - * | | Mmap the actual index file to disk if it hasn't been opened - * | | yet, and run a binary search through it to find the OID. - * | | See for specifics - * | | on the Packfile Index format and how do we find entries in it. - * | | - * | |-# pack_index_open - * | | Guess the name of the index based on the full path to the - * | | packfile, open it and verify its contents. Only if the index - * | | has not been opened already. - * | | - * | |-# pack_index_check - * | Mmap the index file and do a quick run through the header - * | to guess the index version (right now we support v1 and v2), - * | and to verify that the size of the index makes sense. - * | - * |-# packfile_open - * See `packfile_open` in Chapter 3 - * - * - * - * Chapter 3: The neverending story... - * A standard packed `lookup` query for an OID - * -------------------------------------------------- - * TODO - * - */ - - -/*********************************************************** - * - * FORWARD DECLARATIONS - * - ***********************************************************/ - -static void pack_window_free_all(struct pack_backend *backend, struct git_pack_file *p); -static int pack_window_contains(git_mwindow *win, off_t offset); - -static int packfile_sort__cb(const void *a_, const void *b_); - -static int packfile_load__cb(void *_data, char *path); -static int packfile_refresh_all(struct pack_backend *backend); - -static int pack_entry_find(struct git_pack_entry *e, - struct pack_backend *backend, const git_oid *oid); - -/* Can find the offset of an object given - * a prefix of an identifier. - * Throws GIT_EAMBIGUOUSOIDPREFIX if short oid - * is ambiguous. - * This method assumes that len is between - * GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ. - */ -static int pack_entry_find_prefix(struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *short_oid, - unsigned int len); - - - -/*********************************************************** - * - * PACK WINDOW MANAGEMENT - * - ***********************************************************/ - -GIT_INLINE(void) pack_window_free_all(struct pack_backend *GIT_UNUSED(backend), struct git_pack_file *p) -{ - GIT_UNUSED_ARG(backend); - git_mwindow_free_all(&p->mwf); -} - -GIT_INLINE(int) pack_window_contains(git_mwindow *win, off_t offset) -{ - /* We must promise at least 20 bytes (one hash) after the - * offset is available from this window, otherwise the offset - * is not actually in this window and a different window (which - * has that one hash excess) must be used. This is to support - * the object header and delta base parsing routines below. - */ - return git_mwindow_contains(win, offset + 20); -} - -static int packfile_sort__cb(const void *a_, const void *b_) -{ - const struct git_pack_file *a = a_; - const struct git_pack_file *b = b_; - int st; - - /* - * Local packs tend to contain objects specific to our - * variant of the project than remote ones. In addition, - * remote ones could be on a network mounted filesystem. - * Favor local ones for these reasons. - */ - st = a->pack_local - b->pack_local; - if (st) - return -st; - - /* - * Younger packs tend to contain more recent objects, - * and more recent objects tend to get accessed more - * often. - */ - if (a->mtime < b->mtime) - return 1; - else if (a->mtime == b->mtime) - return 0; - - return -1; -} - - - -static int packfile_load__cb(void *_data, char *path) -{ - struct pack_backend *backend = (struct pack_backend *)_data; - struct git_pack_file *pack; - int error; - size_t i; - - if (git__suffixcmp(path, ".idx") != 0) - return GIT_SUCCESS; /* not an index */ - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p = git_vector_get(&backend->packs, i); - if (memcmp(p->pack_name, path, strlen(path) - strlen(".idx")) == 0) - return GIT_SUCCESS; - } - - error = git_packfile_check(&pack, path); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to load packfile"); - - if (git_vector_insert(&backend->packs, pack) < GIT_SUCCESS) { - free(pack); - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -static int packfile_refresh_all(struct pack_backend *backend) -{ - int error; - struct stat st; - - if (backend->pack_folder == NULL) - return GIT_SUCCESS; - - if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode)) - return git__throw(GIT_ENOTFOUND, "Failed to refresh packfiles. Backend not found"); - - if (st.st_mtime != backend->pack_folder_mtime) { - char path[GIT_PATH_MAX]; - strcpy(path, backend->pack_folder); - - /* reload all packs */ - error = git_futils_direach(path, GIT_PATH_MAX, packfile_load__cb, (void *)backend); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to refresh packfiles"); - - git_vector_sort(&backend->packs); - backend->pack_folder_mtime = st.st_mtime; - } - - return GIT_SUCCESS; -} - -static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backend, const git_oid *oid) -{ - int error; - size_t i; - - if ((error = packfile_refresh_all(backend)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to find pack entry"); - - if (backend->last_found && - git_pack_entry_find(e, backend->last_found, oid, GIT_OID_HEXSZ) == GIT_SUCCESS) - return GIT_SUCCESS; - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p; - - p = git_vector_get(&backend->packs, i); - if (p == backend->last_found) - continue; - - if (git_pack_entry_find(e, p, oid, GIT_OID_HEXSZ) == GIT_SUCCESS) { - backend->last_found = p; - return GIT_SUCCESS; - } - } - - return git__throw(GIT_ENOTFOUND, "Failed to find pack entry"); -} - -static int pack_entry_find_prefix( - struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *short_oid, - unsigned int len) -{ - int error; - size_t i; - unsigned found = 0; - - if ((error = packfile_refresh_all(backend)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to find pack entry"); - - if (backend->last_found) { - error = git_pack_entry_find(e, backend->last_found, short_oid, len); - if (error == GIT_EAMBIGUOUSOIDPREFIX) { - return git__rethrow(error, "Failed to find pack entry. Ambiguous sha1 prefix"); - } else if (error == GIT_SUCCESS) { - found = 1; - } - } - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p; - - p = git_vector_get(&backend->packs, i); - if (p == backend->last_found) - continue; - - error = git_pack_entry_find(e, p, short_oid, len); - if (error == GIT_EAMBIGUOUSOIDPREFIX) { - return git__rethrow(error, "Failed to find pack entry. Ambiguous sha1 prefix"); - } else if (error == GIT_SUCCESS) { - found++; - if (found > 1) - break; - backend->last_found = p; - } - } - - if (!found) { - return git__rethrow(GIT_ENOTFOUND, "Failed to find pack entry"); - } else if (found > 1) { - return git__rethrow(GIT_EAMBIGUOUSOIDPREFIX, "Failed to find pack entry. Ambiguous sha1 prefix"); - } else { - return GIT_SUCCESS; - } - -} - - -/*********************************************************** - * - * PACKED BACKEND PUBLIC API - * - * Implement the git_odb_backend API calls - * - ***********************************************************/ - -/* -int pack_backend__read_header(git_rawobj *obj, git_odb_backend *backend, const git_oid *oid) -{ - pack_location location; - - assert(obj && backend && oid); - - if (locate_packfile(&location, (struct pack_backend *)backend, oid) < 0) - return GIT_ENOTFOUND; - - return read_header_packed(obj, &location); -} -*/ - -int pack_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid) -{ - struct git_pack_entry e; - git_rawobj raw; - int error; - - if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read pack backend"); - - if ((error = git_packfile_unpack(&raw, e.p, &e.offset)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read pack backend"); - - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - - return GIT_SUCCESS; -} - -int pack_backend__read_prefix( - git_oid *out_oid, - void **buffer_p, - size_t *len_p, - git_otype *type_p, - git_odb_backend *backend, - const git_oid *short_oid, - unsigned int len) -{ - if (len < GIT_OID_MINPREFIXLEN) - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to read pack backend. Prefix length is lower than %d.", GIT_OID_MINPREFIXLEN); - - if (len >= GIT_OID_HEXSZ) { - /* We can fall back to regular read method */ - int error = pack_backend__read(buffer_p, len_p, type_p, backend, short_oid); - if (error == GIT_SUCCESS) - git_oid_cpy(out_oid, short_oid); - - return error; - } else { - struct git_pack_entry e; - git_rawobj raw; - int error; - - if ((error = pack_entry_find_prefix(&e, (struct pack_backend *)backend, short_oid, len)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read pack backend"); - - if ((error = git_packfile_unpack(&raw, e.p, &e.offset)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read pack backend"); - - *buffer_p = raw.data; - *len_p = raw.len; - *type_p = raw.type; - git_oid_cpy(out_oid, &e.sha1); - } - - return GIT_SUCCESS; -} - -int pack_backend__exists(git_odb_backend *backend, const git_oid *oid) -{ - struct git_pack_entry e; - return pack_entry_find(&e, (struct pack_backend *)backend, oid) == GIT_SUCCESS; -} - -void pack_backend__free(git_odb_backend *_backend) -{ - struct pack_backend *backend; - size_t i; - - assert(_backend); - - backend = (struct pack_backend *)_backend; - - for (i = 0; i < backend->packs.length; ++i) { - struct git_pack_file *p = git_vector_get(&backend->packs, i); - packfile_free(p); - } - - git_vector_free(&backend->packs); - free(backend->pack_folder); - free(backend); -} - -int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir) -{ - struct pack_backend *backend; - char path[GIT_PATH_MAX]; - - backend = git__calloc(1, sizeof(struct pack_backend)); - if (backend == NULL) - return GIT_ENOMEM; - - if (git_vector_init(&backend->packs, 8, packfile_sort__cb) < GIT_SUCCESS) { - free(backend); - return GIT_ENOMEM; - } - - git_path_join(path, objects_dir, "pack"); - if (git_futils_isdir(path) == GIT_SUCCESS) { - backend->pack_folder = git__strdup(path); - backend->pack_folder_mtime = 0; - - if (backend->pack_folder == NULL) { - free(backend); - return GIT_ENOMEM; - } - } - - backend->parent.read = &pack_backend__read; - backend->parent.read_prefix = &pack_backend__read_prefix; - backend->parent.read_header = NULL; - backend->parent.exists = &pack_backend__exists; - backend->parent.free = &pack_backend__free; - - *backend_out = (git_odb_backend *)backend; - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/oid.c b/vendor/libgit2/src/oid.c deleted file mode 100644 index f12ba30b9..000000000 --- a/vendor/libgit2/src/oid.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2/oid.h" -#include "repository.h" -#include -#include - -static signed char from_hex[] = { --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 00 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 30 */ --1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 40 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 50 */ --1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 60 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 70 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 90 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* b0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* c0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* d0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* e0 */ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* f0 */ -}; -static char to_hex[] = "0123456789abcdef"; - -int git_oid_fromstrn(git_oid *out, const char *str, size_t length) -{ - size_t p; - - if (length > GIT_OID_HEXSZ) - length = GIT_OID_HEXSZ; - - if (length % 2) - length--; - - for (p = 0; p < length; p += 2) { - int v = (from_hex[(unsigned char)str[p + 0]] << 4) - | from_hex[(unsigned char)str[p + 1]]; - - if (v < 0) - return git__throw(GIT_ENOTOID, "Failed to generate sha1. Given string is not a valid sha1 hash"); - - out->id[p / 2] = (unsigned char)v; - } - - for (; p < GIT_OID_HEXSZ; p += 2) - out->id[p / 2] = 0x0; - - return GIT_SUCCESS; -} - -int git_oid_fromstr(git_oid *out, const char *str) -{ - return git_oid_fromstrn(out, str, GIT_OID_HEXSZ); -} - -GIT_INLINE(char) *fmt_one(char *str, unsigned int val) -{ - *str++ = to_hex[val >> 4]; - *str++ = to_hex[val & 0xf]; - return str; -} - -void git_oid_fmt(char *str, const git_oid *oid) -{ - size_t i; - - for (i = 0; i < sizeof(oid->id); i++) - str = fmt_one(str, oid->id[i]); -} - -void git_oid_pathfmt(char *str, const git_oid *oid) -{ - size_t i; - - str = fmt_one(str, oid->id[0]); - *str++ = '/'; - for (i = 1; i < sizeof(oid->id); i++) - str = fmt_one(str, oid->id[i]); -} - -char *git_oid_allocfmt(const git_oid *oid) -{ - char *str = git__malloc(GIT_OID_HEXSZ + 1); - if (!str) - return NULL; - git_oid_fmt(str, oid); - str[GIT_OID_HEXSZ] = '\0'; - return str; -} - -char *git_oid_to_string(char *out, size_t n, const git_oid *oid) -{ - char str[GIT_OID_HEXSZ]; - - if (!out || n == 0 || !oid) - return ""; - - n--; /* allow room for terminating NUL */ - - if (n > 0) { - git_oid_fmt(str, oid); - if (n > GIT_OID_HEXSZ) - n = GIT_OID_HEXSZ; - memcpy(out, str, n); - } - - out[n] = '\0'; - - return out; -} - -int git_oid__parse(git_oid *oid, const char **buffer_out, - const char *buffer_end, const char *header) -{ - const size_t sha_len = GIT_OID_HEXSZ; - const size_t header_len = strlen(header); - - const char *buffer = *buffer_out; - - if (buffer + (header_len + sha_len + 1) > buffer_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse OID. Buffer too small"); - - if (memcmp(buffer, header, header_len) != 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse OID. Buffer and header do not match"); - - if (buffer[header_len + sha_len] != '\n') - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse OID. Buffer not terminated correctly"); - - if (git_oid_fromstr(oid, buffer + header_len) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse OID. Failed to generate sha1"); - - *buffer_out = buffer + (header_len + sha_len + 1); - - return GIT_SUCCESS; -} - -void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid) -{ - char hex_oid[GIT_OID_HEXSZ]; - - git_oid_fmt(hex_oid, oid); - git_buf_puts(buf, header); - git_buf_put(buf, hex_oid, GIT_OID_HEXSZ); - git_buf_putc(buf, '\n'); -} - -void git_oid_fromraw(git_oid *out, const unsigned char *raw) -{ - memcpy(out->id, raw, sizeof(out->id)); -} - -void git_oid_cpy(git_oid *out, const git_oid *src) -{ - memcpy(out->id, src->id, sizeof(out->id)); -} - -int git_oid_cmp(const git_oid *a, const git_oid *b) -{ - return memcmp(a->id, b->id, sizeof(a->id)); -} - -int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, unsigned int len) -{ - const unsigned char *a = oid_a->id; - const unsigned char *b = oid_b->id; - - do { - if (*a != *b) - return 1; - a++; - b++; - len -= 2; - } while (len > 1); - - if (len) - if ((*a ^ *b) & 0xf0) - return 1; - - return 0; -} - -typedef short node_index; - -typedef union { - const char *tail; - node_index children[16]; -} trie_node; - -struct git_oid_shorten { - trie_node *nodes; - size_t node_count, size; - int min_length, full; -}; - -static int resize_trie(git_oid_shorten *self, size_t new_size) -{ - self->nodes = realloc(self->nodes, new_size * sizeof(trie_node)); - if (self->nodes == NULL) - return GIT_ENOMEM; - - if (new_size > self->size) { - memset(&self->nodes[self->size], 0x0, (new_size - self->size) * sizeof(trie_node)); - } - - self->size = new_size; - return GIT_SUCCESS; -} - -static trie_node *push_leaf(git_oid_shorten *os, node_index idx, int push_at, const char *oid) -{ - trie_node *node, *leaf; - node_index idx_leaf; - - if (os->node_count >= os->size) { - if (resize_trie(os, os->size * 2) < GIT_SUCCESS) - return NULL; - } - - idx_leaf = (node_index)os->node_count++; - - if (os->node_count == SHRT_MAX) - os->full = 1; - - node = &os->nodes[idx]; - node->children[push_at] = -idx_leaf; - - leaf = &os->nodes[idx_leaf]; - leaf->tail = oid; - - return node; -} - -git_oid_shorten *git_oid_shorten_new(size_t min_length) -{ - git_oid_shorten *os; - - os = git__malloc(sizeof(git_oid_shorten)); - if (os == NULL) - return NULL; - - memset(os, 0x0, sizeof(git_oid_shorten)); - - if (resize_trie(os, 16) < GIT_SUCCESS) { - free(os); - return NULL; - } - - os->node_count = 1; - os->min_length = min_length; - - return os; -} - -void git_oid_shorten_free(git_oid_shorten *os) -{ - free(os->nodes); - free(os); -} - - -/* - * What wizardry is this? - * - * This is just a memory-optimized trie: basically a very fancy - * 16-ary tree, which is used to store the prefixes of the OID - * strings. - * - * Read more: http://en.wikipedia.org/wiki/Trie - * - * Magic that happens in this method: - * - * - Each node in the trie is an union, so it can work both as - * a normal node, or as a leaf. - * - * - Each normal node points to 16 children (one for each possible - * character in the oid). This is *not* stored in an array of - * pointers, because in a 64-bit arch this would be sucking - * 16*sizeof(void*) = 128 bytes of memory per node, which is fucking - * insane. What we do is store Node Indexes, and use these indexes - * to look up each node in the om->index array. These indexes are - * signed shorts, so this limits the amount of unique OIDs that - * fit in the structure to about 20000 (assuming a more or less uniform - * distribution). - * - * - All the nodes in om->index array are stored contiguously in - * memory, and each of them is 32 bytes, so we fit 2x nodes per - * cache line. Convenient for speed. - * - * - To differentiate the leafs from the normal nodes, we store all - * the indexes towards a leaf as a negative index (indexes to normal - * nodes are positives). When we find that one of the children for - * a node has a negative value, that means it's going to be a leaf. - * This reduces the amount of indexes we have by two, but also reduces - * the size of each node by 1-4 bytes (the amount we would need to - * add a `is_leaf` field): this is good because it allows the nodes - * to fit cleanly in cache lines. - * - * - Once we reach an empty children, instead of continuing to insert - * new nodes for each remaining character of the OID, we store a pointer - * to the tail in the leaf; if the leaf is reached again, we turn it - * into a normal node and use the tail to create a new leaf. - * - * This is a pretty good balance between performance and memory usage. - */ -int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid) -{ - int i, is_leaf; - node_index idx; - - if (os->full) - return GIT_ENOMEM; - - if (text_oid == NULL) - return os->min_length; - - idx = 0; - is_leaf = 0; - - for (i = 0; i < GIT_OID_HEXSZ; ++i) { - int c = from_hex[(int)text_oid[i]]; - trie_node *node; - - if (c == -1) - return git__throw(GIT_ENOTOID, "Failed to shorten OID. Invalid hex value"); - - node = &os->nodes[idx]; - - if (is_leaf) { - const char *tail; - - tail = node->tail; - node->tail = NULL; - - node = push_leaf(os, idx, from_hex[(int)tail[0]], &tail[1]); - if (node == NULL) - return GIT_ENOMEM; - } - - if (node->children[c] == 0) { - if (push_leaf(os, idx, c, &text_oid[i + 1]) == NULL) - return GIT_ENOMEM; - break; - } - - idx = node->children[c]; - is_leaf = 0; - - if (idx < 0) { - node->children[c] = idx = -idx; - is_leaf = 1; - } - } - - if (++i > os->min_length) - os->min_length = i; - - return os->min_length; -} - diff --git a/vendor/libgit2/src/pack.c b/vendor/libgit2/src/pack.c deleted file mode 100644 index d882516be..000000000 --- a/vendor/libgit2/src/pack.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "mwindow.h" -#include "odb.h" -#include "pack.h" -#include "delta-apply.h" -#include "sha1_lookup.h" - -#include "git2/oid.h" -#include "git2/zlib.h" - -static int packfile_open(struct git_pack_file *p); -static off_t nth_packed_object_offset(const struct git_pack_file *p, uint32_t n); -int packfile_unpack_compressed( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - off_t *curpos, - size_t size, - git_otype type); - -/* Can find the offset of an object given - * a prefix of an identifier. - * Throws GIT_EAMBIGUOUSOIDPREFIX if short oid - * is ambiguous within the pack. - * This method assumes that len is between - * GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ. - */ -static int pack_entry_find_offset( - off_t *offset_out, - git_oid *found_oid, - struct git_pack_file *p, - const git_oid *short_oid, - unsigned int len); - -/*********************************************************** - * - * PACK INDEX METHODS - * - ***********************************************************/ - -static void pack_index_free(struct git_pack_file *p) -{ - if (p->index_map.data) { - git_futils_mmap_free(&p->index_map); - p->index_map.data = NULL; - } -} - -static int pack_index_check(const char *path, struct git_pack_file *p) -{ - struct git_pack_idx_header *hdr; - uint32_t version, nr, i, *index; - - void *idx_map; - size_t idx_size; - - struct stat st; - - /* TODO: properly open the file without access time */ - git_file fd = p_open(path, O_RDONLY /*| O_NOATIME */); - - int error; - - if (fd < 0) - return git__throw(GIT_EOSERR, "Failed to check index. File missing or corrupted"); - - if (p_fstat(fd, &st) < GIT_SUCCESS) { - p_close(fd); - return git__throw(GIT_EOSERR, "Failed to check index. File appears to be corrupted"); - } - - if (!git__is_sizet(st.st_size)) - return GIT_ENOMEM; - - idx_size = (size_t)st.st_size; - - if (idx_size < 4 * 256 + 20 + 20) { - p_close(fd); - return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Object is corrupted"); - } - - error = git_futils_mmap_ro(&p->index_map, fd, 0, idx_size); - p_close(fd); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to check index"); - - hdr = idx_map = p->index_map.data; - - if (hdr->idx_signature == htonl(PACK_IDX_SIGNATURE)) { - version = ntohl(hdr->idx_version); - - if (version < 2 || version > 2) { - git_futils_mmap_free(&p->index_map); - return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Unsupported index version"); - } - - } else - version = 1; - - nr = 0; - index = idx_map; - - if (version > 1) - index += 2; /* skip index header */ - - for (i = 0; i < 256; i++) { - uint32_t n = ntohl(index[i]); - if (n < nr) { - git_futils_mmap_free(&p->index_map); - return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Index is non-monotonic"); - } - nr = n; - } - - if (version == 1) { - /* - * Total size: - * - 256 index entries 4 bytes each - * - 24-byte entries * nr (20-byte sha1 + 4-byte offset) - * - 20-byte SHA1 of the packfile - * - 20-byte SHA1 file checksum - */ - if (idx_size != 4*256 + nr * 24 + 20 + 20) { - git_futils_mmap_free(&p->index_map); - return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Object is corrupted"); - } - } else if (version == 2) { - /* - * Minimum size: - * - 8 bytes of header - * - 256 index entries 4 bytes each - * - 20-byte sha1 entry * nr - * - 4-byte crc entry * nr - * - 4-byte offset entry * nr - * - 20-byte SHA1 of the packfile - * - 20-byte SHA1 file checksum - * And after the 4-byte offset table might be a - * variable sized table containing 8-byte entries - * for offsets larger than 2^31. - */ - unsigned long min_size = 8 + 4*256 + nr*(20 + 4 + 4) + 20 + 20; - unsigned long max_size = min_size; - - if (nr) - max_size += (nr - 1)*8; - - if (idx_size < min_size || idx_size > max_size) { - git_futils_mmap_free(&p->index_map); - return git__throw(GIT_EOBJCORRUPTED, "Failed to check index. Wrong index size"); - } - - /* Make sure that off_t is big enough to access the whole pack... - * Is this an issue in libgit2? It shouldn't. */ - if (idx_size != min_size && (sizeof(off_t) <= 4)) { - git_futils_mmap_free(&p->index_map); - return git__throw(GIT_EOSERR, "Failed to check index. off_t not big enough to access the whole pack"); - } - } - - p->index_version = version; - p->num_objects = nr; - return GIT_SUCCESS; -} - -static int pack_index_open(struct git_pack_file *p) -{ - char *idx_name; - int error; - - if (p->index_map.data) - return GIT_SUCCESS; - - idx_name = git__strdup(p->pack_name); - strcpy(idx_name + strlen(idx_name) - strlen(".pack"), ".idx"); - - error = pack_index_check(idx_name, p); - free(idx_name); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to open index"); -} - -static unsigned char *pack_window_open( - struct git_pack_file *p, - git_mwindow **w_cursor, - off_t offset, - unsigned int *left) -{ - if (p->mwf.fd == -1 && packfile_open(p) < GIT_SUCCESS) - return NULL; - - /* Since packfiles end in a hash of their content and it's - * pointless to ask for an offset into the middle of that - * hash, and the pack_window_contains function above wouldn't match - * don't allow an offset too close to the end of the file. - */ - if (offset > (p->mwf.size - 20)) - return NULL; - - return git_mwindow_open(&p->mwf, w_cursor, offset, 20, left); - } - -static unsigned long packfile_unpack_header1( - size_t *sizep, - git_otype *type, - const unsigned char *buf, - unsigned long len) -{ - unsigned shift; - unsigned long size, c; - unsigned long used = 0; - - c = buf[used++]; - *type = (c >> 4) & 7; - size = c & 15; - shift = 4; - while (c & 0x80) { - if (len <= used || bitsizeof(long) <= shift) - return 0; - - c = buf[used++]; - size += (c & 0x7f) << shift; - shift += 7; - } - - *sizep = (size_t)size; - return used; -} - -int git_packfile_unpack_header( - size_t *size_p, - git_otype *type_p, - git_mwindow_file *mwf, - git_mwindow **w_curs, - off_t *curpos) -{ - unsigned char *base; - unsigned int left; - unsigned long used; - - /* pack_window_open() assures us we have [base, base + 20) available - * as a range that we can look at at. (Its actually the hash - * size that is assured.) With our object header encoding - * the maximum deflated object size is 2^137, which is just - * insane, so we know won't exceed what we have been given. - */ -// base = pack_window_open(p, w_curs, *curpos, &left); - base = git_mwindow_open(mwf, w_curs, *curpos, 20, &left); - if (base == NULL) - return GIT_ENOMEM; - - used = packfile_unpack_header1(size_p, type_p, base, left); - - if (used == 0) - return git__throw(GIT_EOBJCORRUPTED, "Header length is zero"); - - *curpos += used; - return GIT_SUCCESS; -} - -static int packfile_unpack_delta( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - off_t *curpos, - size_t delta_size, - git_otype delta_type, - off_t obj_offset) -{ - off_t base_offset; - git_rawobj base, delta; - int error; - - base_offset = get_delta_base(p, w_curs, curpos, delta_type, obj_offset); - if (base_offset == 0) - return git__throw(GIT_EOBJCORRUPTED, "Delta offset is zero"); - if (base_offset < 0) - return git__rethrow(base_offset, "Failed to get delta base"); - - git_mwindow_close(w_curs); - error = git_packfile_unpack(&base, p, &base_offset); - - /* - * TODO: git.git tries to load the base from other packfiles - * or loose objects. - * - * We'll need to do this in order to support thin packs. - */ - if (error < GIT_SUCCESS) - return git__rethrow(error, "Corrupted delta"); - - error = packfile_unpack_compressed(&delta, p, w_curs, curpos, delta_size, delta_type); - if (error < GIT_SUCCESS) { - free(base.data); - return git__rethrow(error, "Corrupted delta"); - } - - obj->type = base.type; - error = git__delta_apply(obj, - base.data, base.len, - delta.data, delta.len); - - free(base.data); - free(delta.data); - - /* TODO: we might want to cache this shit. eventually */ - //add_delta_base_cache(p, base_offset, base, base_size, *type); - return error; /* error set by git__delta_apply */ -} - -int git_packfile_unpack( - git_rawobj *obj, - struct git_pack_file *p, - off_t *obj_offset) -{ - git_mwindow *w_curs = NULL; - off_t curpos = *obj_offset; - int error; - - size_t size = 0; - git_otype type; - - /* - * TODO: optionally check the CRC on the packfile - */ - - obj->data = NULL; - obj->len = 0; - obj->type = GIT_OBJ_BAD; - - error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to unpack packfile"); - - switch (type) { - case GIT_OBJ_OFS_DELTA: - case GIT_OBJ_REF_DELTA: - error = packfile_unpack_delta( - obj, p, &w_curs, &curpos, - size, type, *obj_offset); - break; - - case GIT_OBJ_COMMIT: - case GIT_OBJ_TREE: - case GIT_OBJ_BLOB: - case GIT_OBJ_TAG: - error = packfile_unpack_compressed( - obj, p, &w_curs, &curpos, - size, type); - break; - - default: - error = GIT_EOBJCORRUPTED; - break; - } - - git_mwindow_close(&w_curs); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to unpack object"); - - *obj_offset = curpos; - return GIT_SUCCESS; -} - -int packfile_unpack_compressed( - git_rawobj *obj, - struct git_pack_file *p, - git_mwindow **w_curs, - off_t *curpos, - size_t size, - git_otype type) -{ - int st; - z_stream stream; - unsigned char *buffer, *in; - - buffer = git__malloc(size + 1); - memset(buffer, 0x0, size + 1); - - memset(&stream, 0, sizeof(stream)); - stream.next_out = buffer; - stream.avail_out = size + 1; - - st = inflateInit(&stream); - if (st != Z_OK) { - free(buffer); - return git__throw(GIT_EZLIB, "Error in zlib"); - } - - do { - in = pack_window_open(p, w_curs, *curpos, &stream.avail_in); - stream.next_in = in; - st = inflate(&stream, Z_FINISH); - - if (!stream.avail_out) - break; /* the payload is larger than it should be */ - - *curpos += stream.next_in - in; - } while (st == Z_OK || st == Z_BUF_ERROR); - - inflateEnd(&stream); - - if ((st != Z_STREAM_END) || stream.total_out != size) { - free(buffer); - return git__throw(GIT_EZLIB, "Error in zlib"); - } - - obj->type = type; - obj->len = size; - obj->data = buffer; - return GIT_SUCCESS; -} - -/* - * curpos is where the data starts, delta_obj_offset is the where the - * header starts - */ -off_t get_delta_base( - struct git_pack_file *p, - git_mwindow **w_curs, - off_t *curpos, - git_otype type, - off_t delta_obj_offset) -{ - unsigned char *base_info = pack_window_open(p, w_curs, *curpos, NULL); - off_t base_offset; - git_oid unused; - - /* pack_window_open() assured us we have [base_info, base_info + 20) - * as a range that we can look at without walking off the - * end of the mapped window. Its actually the hash size - * that is assured. An OFS_DELTA longer than the hash size - * is stupid, as then a REF_DELTA would be smaller to store. - */ - if (type == GIT_OBJ_OFS_DELTA) { - unsigned used = 0; - unsigned char c = base_info[used++]; - base_offset = c & 127; - while (c & 128) { - base_offset += 1; - if (!base_offset || MSB(base_offset, 7)) - return 0; /* overflow */ - c = base_info[used++]; - base_offset = (base_offset << 7) + (c & 127); - } - base_offset = delta_obj_offset - base_offset; - if (base_offset <= 0 || base_offset >= delta_obj_offset) - return 0; /* out of bound */ - *curpos += used; - } else if (type == GIT_OBJ_REF_DELTA) { - /* If we have the cooperative cache, search in it first */ - if (p->has_cache) { - int pos; - struct git_pack_entry key; - - git_oid_fromraw(&key.sha1, base_info); - pos = git_vector_bsearch(&p->cache, &key); - if (pos >= 0) { - *curpos += 20; - return ((struct git_pack_entry *)git_vector_get(&p->cache, pos))->offset; - } - } - /* The base entry _must_ be in the same pack */ - if (pack_entry_find_offset(&base_offset, &unused, p, (git_oid *)base_info, GIT_OID_HEXSZ) < GIT_SUCCESS) - return git__rethrow(GIT_EPACKCORRUPTED, "Base entry delta is not in the same pack"); - *curpos += 20; - } else - return 0; - - return base_offset; -} - -/*********************************************************** - * - * PACKFILE METHODS - * - ***********************************************************/ - -static struct git_pack_file *packfile_alloc(int extra) -{ - struct git_pack_file *p = git__malloc(sizeof(*p) + extra); - memset(p, 0, sizeof(*p)); - p->mwf.fd = -1; - return p; -} - - -void packfile_free(struct git_pack_file *p) -{ - assert(p); - - /* clear_delta_base_cache(); */ - git_mwindow_free_all(&p->mwf); - - if (p->mwf.fd != -1) - p_close(p->mwf.fd); - - pack_index_free(p); - - free(p->bad_object_sha1); - free(p); -} - -static int packfile_open(struct git_pack_file *p) -{ - struct stat st; - struct git_pack_header hdr; - git_oid sha1; - unsigned char *idx_sha1; - - if (!p->index_map.data && pack_index_open(p) < GIT_SUCCESS) - return git__throw(GIT_ENOTFOUND, "Failed to open packfile. File not found"); - - /* TODO: open with noatime */ - p->mwf.fd = p_open(p->pack_name, O_RDONLY); - if (p->mwf.fd < 0 || p_fstat(p->mwf.fd, &st) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to open packfile. File appears to be corrupted"); - - if (git_mwindow_file_register(&p->mwf) < GIT_SUCCESS) { - p_close(p->mwf.fd); - return git__throw(GIT_ERROR, "Failed to register packfile windows"); - } - - /* If we created the struct before we had the pack we lack size. */ - if (!p->mwf.size) { - if (!S_ISREG(st.st_mode)) - goto cleanup; - p->mwf.size = (off_t)st.st_size; - } else if (p->mwf.size != st.st_size) - goto cleanup; - -#if 0 - /* We leave these file descriptors open with sliding mmap; - * there is no point keeping them open across exec(), though. - */ - fd_flag = fcntl(p->mwf.fd, F_GETFD, 0); - if (fd_flag < 0) - return error("cannot determine file descriptor flags"); - - fd_flag |= FD_CLOEXEC; - if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1) - return GIT_EOSERR; -#endif - - /* Verify we recognize this pack file format. */ - if (p_read(p->mwf.fd, &hdr, sizeof(hdr)) < GIT_SUCCESS) - goto cleanup; - - if (hdr.hdr_signature != htonl(PACK_SIGNATURE)) - goto cleanup; - - if (!pack_version_ok(hdr.hdr_version)) - goto cleanup; - - /* Verify the pack matches its index. */ - if (p->num_objects != ntohl(hdr.hdr_entries)) - goto cleanup; - - if (p_lseek(p->mwf.fd, p->mwf.size - GIT_OID_RAWSZ, SEEK_SET) == -1) - goto cleanup; - - if (p_read(p->mwf.fd, sha1.id, GIT_OID_RAWSZ) < GIT_SUCCESS) - goto cleanup; - - idx_sha1 = ((unsigned char *)p->index_map.data) + p->index_map.len - 40; - - if (git_oid_cmp(&sha1, (git_oid *)idx_sha1) != 0) - goto cleanup; - - return GIT_SUCCESS; - -cleanup: - p_close(p->mwf.fd); - p->mwf.fd = -1; - return git__throw(GIT_EPACKCORRUPTED, "Failed to open packfile. Pack is corrupted"); -} - -int git_packfile_check(struct git_pack_file **pack_out, const char *path) -{ - struct stat st; - struct git_pack_file *p; - size_t path_len; - - *pack_out = NULL; - path_len = strlen(path); - p = packfile_alloc(path_len + 2); - - /* - * Make sure a corresponding .pack file exists and that - * the index looks sane. - */ - path_len -= strlen(".idx"); - if (path_len < 1) { - free(p); - return git__throw(GIT_ENOTFOUND, "Failed to check packfile. Wrong path name"); - } - - memcpy(p->pack_name, path, path_len); - - strcpy(p->pack_name + path_len, ".keep"); - if (git_futils_exists(p->pack_name) == GIT_SUCCESS) - p->pack_keep = 1; - - strcpy(p->pack_name + path_len, ".pack"); - if (p_stat(p->pack_name, &st) < GIT_SUCCESS || !S_ISREG(st.st_mode)) { - free(p); - return git__throw(GIT_ENOTFOUND, "Failed to check packfile. File not found"); - } - - /* ok, it looks sane as far as we can check without - * actually mapping the pack file. - */ - p->mwf.size = (off_t)st.st_size; - p->pack_local = 1; - p->mtime = (git_time_t)st.st_mtime; - - /* see if we can parse the sha1 oid in the packfile name */ - if (path_len < 40 || - git_oid_fromstr(&p->sha1, path + path_len - GIT_OID_HEXSZ) < GIT_SUCCESS) - memset(&p->sha1, 0x0, GIT_OID_RAWSZ); - - *pack_out = p; - return GIT_SUCCESS; -} - -/*********************************************************** - * - * PACKFILE ENTRY SEARCH INTERNALS - * - ***********************************************************/ - -static off_t nth_packed_object_offset(const struct git_pack_file *p, uint32_t n) -{ - const unsigned char *index = p->index_map.data; - index += 4 * 256; - if (p->index_version == 1) { - return ntohl(*((uint32_t *)(index + 24 * n))); - } else { - uint32_t off; - index += 8 + p->num_objects * (20 + 4); - off = ntohl(*((uint32_t *)(index + 4 * n))); - if (!(off & 0x80000000)) - return off; - index += p->num_objects * 4 + (off & 0x7fffffff) * 8; - return (((uint64_t)ntohl(*((uint32_t *)(index + 0)))) << 32) | - ntohl(*((uint32_t *)(index + 4))); - } -} - -static int pack_entry_find_offset( - off_t *offset_out, - git_oid *found_oid, - struct git_pack_file *p, - const git_oid *short_oid, - unsigned int len) -{ - const uint32_t *level1_ofs = p->index_map.data; - const unsigned char *index = p->index_map.data; - unsigned hi, lo, stride; - int pos, found = 0; - const unsigned char *current = 0; - - *offset_out = 0; - - if (index == NULL) { - int error; - - if ((error = pack_index_open(p)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to find offset for pack entry"); - - assert(p->index_map.data); - - index = p->index_map.data; - level1_ofs = p->index_map.data; - } - - if (p->index_version > 1) { - level1_ofs += 2; - index += 8; - } - - index += 4 * 256; - hi = ntohl(level1_ofs[(int)short_oid->id[0]]); - lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(level1_ofs[(int)short_oid->id[0] - 1])); - - if (p->index_version > 1) { - stride = 20; - } else { - stride = 24; - index += 4; - } - -#ifdef INDEX_DEBUG_LOOKUP - printf("%02x%02x%02x... lo %u hi %u nr %d\n", - short_oid->id[0], short_oid->id[1], short_oid->id[2], lo, hi, p->num_objects); -#endif - - /* Use git.git lookup code */ - pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, short_oid->id); - - if (pos >= 0) { - /* An object matching exactly the oid was found */ - found = 1; - current = index + pos * stride; - } else { - /* No object was found */ - /* pos refers to the object with the "closest" oid to short_oid */ - pos = - 1 - pos; - if (pos < (int)p->num_objects) { - current = index + pos * stride; - - if (!git_oid_ncmp(short_oid, (const git_oid *)current, len)) { - found = 1; - } - } - } - - if (found && pos + 1 < (int)p->num_objects) { - /* Check for ambiguousity */ - const unsigned char *next = current + stride; - - if (!git_oid_ncmp(short_oid, (const git_oid *)next, len)) { - found = 2; - } - } - - if (!found) { - return git__throw(GIT_ENOTFOUND, "Failed to find offset for pack entry. Entry not found"); - } else if (found > 1) { - return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to find offset for pack entry. Ambiguous sha1 prefix within pack"); - } else { - *offset_out = nth_packed_object_offset(p, pos); - git_oid_fromraw(found_oid, current); - -#ifdef INDEX_DEBUG_LOOKUP - unsigned char hex_sha1[GIT_OID_HEXSZ + 1]; - git_oid_fmt(hex_sha1, found_oid); - hex_sha1[GIT_OID_HEXSZ] = '\0'; - printf("found lo=%d %s\n", lo, hex_sha1); -#endif - return GIT_SUCCESS; - } -} - -int git_pack_entry_find( - struct git_pack_entry *e, - struct git_pack_file *p, - const git_oid *short_oid, - unsigned int len) -{ - off_t offset; - git_oid found_oid; - int error; - - assert(p); - - if (len == GIT_OID_HEXSZ && p->num_bad_objects) { - unsigned i; - for (i = 0; i < p->num_bad_objects; i++) - if (git_oid_cmp(short_oid, &p->bad_object_sha1[i]) == 0) - return git__throw(GIT_ERROR, "Failed to find pack entry. Bad object found"); - } - - error = pack_entry_find_offset(&offset, &found_oid, p, short_oid, len); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to find pack entry. Couldn't find offset"); - - /* we found a unique entry in the index; - * make sure the packfile backing the index - * still exists on disk */ - if (p->mwf.fd == -1 && packfile_open(p) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to find pack entry. Packfile doesn't exist on disk"); - - e->offset = offset; - e->p = p; - - git_oid_cpy(&e->sha1, &found_oid); - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/pack.h b/vendor/libgit2/src/pack.h deleted file mode 100644 index 164086fdf..000000000 --- a/vendor/libgit2/src/pack.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDE_pack_h__ -#define INCLUDE_pack_h__ - -#include "git2/oid.h" - -#include "common.h" -#include "map.h" -#include "mwindow.h" -#include "odb.h" - -#define PACK_SIGNATURE 0x5041434b /* "PACK" */ -#define PACK_VERSION 2 -#define pack_version_ok(v) ((v) == htonl(2) || (v) == htonl(3)) -struct git_pack_header { - uint32_t hdr_signature; - uint32_t hdr_version; - uint32_t hdr_entries; -}; - -/* - * The first four bytes of index formats later than version 1 should - * start with this signature, as all older git binaries would find this - * value illegal and abort reading the file. - * - * This is the case because the number of objects in a packfile - * cannot exceed 1,431,660,000 as every object would need at least - * 3 bytes of data and the overall packfile cannot exceed 4 GiB with - * version 1 of the index file due to the offsets limited to 32 bits. - * Clearly the signature exceeds this maximum. - * - * Very old git binaries will also compare the first 4 bytes to the - * next 4 bytes in the index and abort with a "non-monotonic index" - * error if the second 4 byte word is smaller than the first 4 - * byte word. This would be true in the proposed future index - * format as idx_signature would be greater than idx_version. - */ - -#define PACK_IDX_SIGNATURE 0xff744f63 /* "\377tOc" */ - -struct git_pack_idx_header { - uint32_t idx_signature; - uint32_t idx_version; -}; - -struct git_pack_file { - git_mwindow_file mwf; - git_map index_map; - - uint32_t num_objects; - uint32_t num_bad_objects; - git_oid *bad_object_sha1; /* array of git_oid */ - - int index_version; - git_time_t mtime; - unsigned pack_local:1, pack_keep:1, has_cache:1; - git_oid sha1; - git_vector cache; - - /* something like ".git/objects/pack/xxxxx.pack" */ - char pack_name[GIT_FLEX_ARRAY]; /* more */ -}; - -struct git_pack_entry { - off_t offset; - git_oid sha1; - struct git_pack_file *p; -}; - -int git_packfile_unpack_header( - size_t *size_p, - git_otype *type_p, - git_mwindow_file *mwf, - git_mwindow **w_curs, - off_t *curpos); - -int git_packfile_unpack(git_rawobj *obj, struct git_pack_file *p, off_t *obj_offset); - -off_t get_delta_base(struct git_pack_file *p, git_mwindow **w_curs, - off_t *curpos, git_otype type, - off_t delta_obj_offset); - -void packfile_free(struct git_pack_file *p); -int git_packfile_check(struct git_pack_file **pack_out, const char *path); -int git_pack_entry_find( - struct git_pack_entry *e, - struct git_pack_file *p, - const git_oid *short_oid, - unsigned int len); - -#endif diff --git a/vendor/libgit2/src/path.c b/vendor/libgit2/src/path.c deleted file mode 100644 index 374694432..000000000 --- a/vendor/libgit2/src/path.c +++ /dev/null @@ -1,264 +0,0 @@ -#include "common.h" -#include "path.h" -#include "posix.h" - -#include -#include -#include - -/* - * Based on the Android implementation, BSD licensed. - * Check http://android.git.kernel.org/ - */ -int git_path_basename_r(char *buffer, size_t bufflen, const char *path) -{ - const char *endp, *startp; - int len, result; - - /* Empty or NULL string gets treated as "." */ - if (path == NULL || *path == '\0') { - startp = "."; - len = 1; - goto Exit; - } - - /* Strip trailing slashes */ - endp = path + strlen(path) - 1; - while (endp > path && *endp == '/') - endp--; - - /* All slashes becomes "/" */ - if (endp == path && *endp == '/') { - startp = "/"; - len = 1; - goto Exit; - } - - /* Find the start of the base */ - startp = endp; - while (startp > path && *(startp - 1) != '/') - startp--; - - len = endp - startp +1; - -Exit: - result = len; - if (buffer == NULL) { - return result; - } - if (len > (int)bufflen-1) { - len = (int)bufflen-1; - result = GIT_ENOMEM; - } - - if (len >= 0) { - memmove(buffer, startp, len); - buffer[len] = 0; - } - return result; -} - -/* - * Based on the Android implementation, BSD licensed. - * Check http://android.git.kernel.org/ - */ -int git_path_dirname_r(char *buffer, size_t bufflen, const char *path) -{ - const char *endp; - int result, len; - - /* Empty or NULL string gets treated as "." */ - if (path == NULL || *path == '\0') { - path = "."; - len = 1; - goto Exit; - } - - /* Strip trailing slashes */ - endp = path + strlen(path) - 1; - while (endp > path && *endp == '/') - endp--; - - /* Find the start of the dir */ - while (endp > path && *endp != '/') - endp--; - - /* Either the dir is "/" or there are no slashes */ - if (endp == path) { - path = (*endp == '/') ? "/" : "."; - len = 1; - goto Exit; - } - - do { - endp--; - } while (endp > path && *endp == '/'); - - len = endp - path +1; - -#ifdef GIT_WIN32 - /* Mimic unix behavior where '/.git' returns '/': 'C:/.git' will return - 'C:/' here */ - - if (len == 2 && isalpha(path[0]) && path[1] == ':') { - len = 3; - goto Exit; - } -#endif - -Exit: - result = len; - if (len+1 > GIT_PATH_MAX) { - return GIT_ENOMEM; - } - if (buffer == NULL) - return result; - - if (len > (int)bufflen-1) { - len = (int)bufflen-1; - result = GIT_ENOMEM; - } - - if (len >= 0) { - memmove(buffer, path, len); - buffer[len] = 0; - } - return result; -} - - -char *git_path_dirname(const char *path) -{ - char *dname = NULL; - int len; - - len = (path ? strlen(path) : 0) + 2; - dname = (char *)git__malloc(len); - if (dname == NULL) - return NULL; - - if (git_path_dirname_r(dname, len, path) < GIT_SUCCESS) { - free(dname); - return NULL; - } - - return dname; -} - -char *git_path_basename(const char *path) -{ - char *bname = NULL; - int len; - - len = (path ? strlen(path) : 0) + 2; - bname = (char *)git__malloc(len); - if (bname == NULL) - return NULL; - - if (git_path_basename_r(bname, len, path) < GIT_SUCCESS) { - free(bname); - return NULL; - } - - return bname; -} - - -const char *git_path_topdir(const char *path) -{ - size_t len; - int i; - - assert(path); - len = strlen(path); - - if (!len || path[len - 1] != '/') - return NULL; - - for (i = len - 2; i >= 0; --i) - if (path[i] == '/') - break; - - return &path[i + 1]; -} - -void git_path_join_n(char *buffer_out, int count, ...) -{ - va_list ap; - int i; - char *buffer_start = buffer_out; - - va_start(ap, count); - for (i = 0; i < count; ++i) { - const char *path; - int len; - - path = va_arg(ap, const char *); - - assert((i == 0) || path != buffer_start); - - if (i > 0 && *path == '/' && buffer_out > buffer_start && buffer_out[-1] == '/') - path++; - - if (!*path) - continue; - - len = strlen(path); - memmove(buffer_out, path, len); - buffer_out = buffer_out + len; - - if (i < count - 1 && buffer_out[-1] != '/') - *buffer_out++ = '/'; - } - va_end(ap); - - *buffer_out = '\0'; -} - -int git_path_root(const char *path) -{ - int offset = 0; - -#ifdef GIT_WIN32 - /* Does the root of the path look like a windows drive ? */ - if (isalpha(path[0]) && (path[1] == ':')) - offset += 2; -#endif - - if (*(path + offset) == '/') - return offset; - - return -1; /* Not a real error. Rather a signal than the path is not rooted */ -} - -int git_path_prettify(char *path_out, const char *path, const char *base) -{ - char *result; - - if (base == NULL || git_path_root(path) >= 0) { - result = p_realpath(path, path_out); - } else { - char aux_path[GIT_PATH_MAX]; - git_path_join(aux_path, base, path); - result = p_realpath(aux_path, path_out); - } - - return result ? GIT_SUCCESS : GIT_EOSERR; -} - -int git_path_prettify_dir(char *path_out, const char *path, const char *base) -{ - size_t end; - - if (git_path_prettify(path_out, path, base) < GIT_SUCCESS) - return GIT_EOSERR; - - end = strlen(path_out); - - if (end && path_out[end - 1] != '/') { - path_out[end] = '/'; - path_out[end + 1] = '\0'; - } - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/path.h b/vendor/libgit2/src/path.h deleted file mode 100644 index 36e22a768..000000000 --- a/vendor/libgit2/src/path.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * posix.h - Path management methods - */ -#ifndef INCLUDE_path_h__ -#define INCLUDE_path_h__ - -#include "common.h" - -/* - * The dirname() function shall take a pointer to a character string - * that contains a pathname, and return a pointer to a string that is a - * pathname of the parent directory of that file. Trailing '/' characters - * in the path are not counted as part of the path. - * - * If path does not contain a '/', then dirname() shall return a pointer to - * the string ".". If path is a null pointer or points to an empty string, - * dirname() shall return a pointer to the string "." . - * - * The `git_path_dirname` implementation is thread safe. The returned - * string must be manually free'd. - * - * The `git_path_dirname_r` implementation expects a string allocated - * by the user with big enough size. - */ -extern char *git_path_dirname(const char *path); -extern int git_path_dirname_r(char *buffer, size_t bufflen, const char *path); - -/* - * This function returns the basename of the file, which is the last - * part of its full name given by fname, with the drive letter and - * leading directories stripped off. For example, the basename of - * c:/foo/bar/file.ext is file.ext, and the basename of a:foo is foo. - * - * Trailing slashes and backslashes are significant: the basename of - * c:/foo/bar/ is an empty string after the rightmost slash. - * - * The `git_path_basename` implementation is thread safe. The returned - * string must be manually free'd. - * - * The `git_path_basename_r` implementation expects a string allocated - * by the user with big enough size. - */ -extern char *git_path_basename(const char *path); -extern int git_path_basename_r(char *buffer, size_t bufflen, const char *path); - -extern const char *git_path_topdir(const char *path); - -/** - * Join two paths together. Takes care of properly fixing the - * middle slashes and everything - * - * The paths are joined together into buffer_out; this is expected - * to be an user allocated buffer of `GIT_PATH_MAX` size - */ -extern void git_path_join_n(char *buffer_out, int npath, ...); - -GIT_INLINE(void) git_path_join(char *buffer_out, const char *path_a, const char *path_b) -{ - git_path_join_n(buffer_out, 2, path_a, path_b); -} - -int git_path_root(const char *path); - -int git_path_prettify(char *path_out, const char *path, const char *base); -int git_path_prettify_dir(char *path_out, const char *path, const char *base); - -#ifdef GIT_WIN32 -GIT_INLINE(void) git_path_mkposix(char *path) -{ - while (*path) { - if (*path == '\\') - *path = '/'; - - path++; - } -} -#else -# define git_path_mkposix(p) /* blank */ -#endif - -#endif diff --git a/vendor/libgit2/src/pkt.c b/vendor/libgit2/src/pkt.c deleted file mode 100644 index 4eac0411f..000000000 --- a/vendor/libgit2/src/pkt.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" - -#include "git2/types.h" -#include "git2/errors.h" -#include "git2/refs.h" -#include "git2/revwalk.h" - -#include "pkt.h" -#include "util.h" -#include "netops.h" -#include "posix.h" - -#include - -#define PKT_LEN_SIZE 4 - -static int flush_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - if (pkt == NULL) - return GIT_ENOMEM; - - pkt->type = GIT_PKT_FLUSH; - *out = pkt; - - return GIT_SUCCESS; -} - -/* the rest of the line will be useful for multi_ack */ -static int ack_pkt(git_pkt **out, const char *GIT_UNUSED(line), size_t GIT_UNUSED(len)) -{ - git_pkt *pkt; - GIT_UNUSED_ARG(line); - GIT_UNUSED_ARG(len); - - pkt = git__malloc(sizeof(git_pkt)); - if (pkt == NULL) - return GIT_ENOMEM; - - pkt->type = GIT_PKT_ACK; - *out = pkt; - - return GIT_SUCCESS; -} - -static int nak_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - if (pkt == NULL) - return GIT_ENOMEM; - - pkt->type = GIT_PKT_NAK; - *out = pkt; - - return GIT_SUCCESS; -} - -static int pack_pkt(git_pkt **out) -{ - git_pkt *pkt; - - pkt = git__malloc(sizeof(git_pkt)); - if (pkt == NULL) - return GIT_ENOMEM; - - pkt->type = GIT_PKT_PACK; - *out = pkt; - - return GIT_SUCCESS; -} - -/* - * Parse an other-ref line. - */ -static int ref_pkt(git_pkt **out, const char *line, size_t len) -{ - git_pkt_ref *pkt; - int error, has_caps = 0; - - pkt = git__malloc(sizeof(git_pkt_ref)); - if (pkt == NULL) - return GIT_ENOMEM; - - memset(pkt, 0x0, sizeof(git_pkt_ref)); - pkt->type = GIT_PKT_REF; - error = git_oid_fromstr(&pkt->head.oid, line); - if (error < GIT_SUCCESS) { - error = git__throw(error, "Failed to parse reference ID"); - goto out; - } - - /* Check for a bit of consistency */ - if (line[GIT_OID_HEXSZ] != ' ') { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse ref. No SP"); - goto out; - } - - /* Jump from the name */ - line += GIT_OID_HEXSZ + 1; - len -= (GIT_OID_HEXSZ + 1); - - if (strlen(line) < len) - has_caps = 1; - - if (line[len - 1] == '\n') - --len; - - pkt->head.name = git__malloc(len + 1); - if (pkt->head.name == NULL) { - error = GIT_ENOMEM; - goto out; - } - memcpy(pkt->head.name, line, len); - pkt->head.name[len] = '\0'; - - if (has_caps) { - pkt->capabilities = strchr(pkt->head.name, '\0') + 1; - } - -out: - if (error < GIT_SUCCESS) - free(pkt); - else - *out = (git_pkt *)pkt; - - return error; -} - -static ssize_t parse_len(const char *line) -{ - char num[PKT_LEN_SIZE + 1]; - int i, error; - long len; - const char *num_end; - - memcpy(num, line, PKT_LEN_SIZE); - num[PKT_LEN_SIZE] = '\0'; - - for (i = 0; i < PKT_LEN_SIZE; ++i) { - if (!isxdigit(num[i])) - return GIT_ENOTNUM; - } - - error = git__strtol32(&len, num, &num_end, 16); - if (error < GIT_SUCCESS) { - return error; - } - - return (unsigned int) len; -} - -/* - * As per the documentation, the syntax is: - * - * pkt-line = data-pkt / flush-pkt - * data-pkt = pkt-len pkt-payload - * pkt-len = 4*(HEXDIG) - * pkt-payload = (pkt-len -4)*(OCTET) - * flush-pkt = "0000" - * - * Which means that the first four bytes are the length of the line, - * in ASCII hexadecimal (including itself) - */ - -int git_pkt_parse_line(git_pkt **head, const char *line, const char **out, size_t bufflen) -{ - int error = GIT_SUCCESS; - size_t len; - - /* Not even enough for the length */ - if (bufflen > 0 && bufflen < PKT_LEN_SIZE) - return GIT_ESHORTBUFFER; - - error = parse_len(line); - if (error < GIT_SUCCESS) { - /* - * If we fail to parse the length, it might be because the - * server is trying to send us the packfile already. - */ - if (bufflen >= 4 && !git__prefixcmp(line, "PACK")) { - *out = line; - return pack_pkt(head); - } - - return git__throw(error, "Failed to parse pkt length"); - } - - len = error; - - /* - * If we were given a buffer length, then make sure there is - * enough in the buffer to satisfy this line - */ - if (bufflen > 0 && bufflen < len) - return GIT_ESHORTBUFFER; - - line += PKT_LEN_SIZE; - /* - * TODO: How do we deal with empty lines? Try again? with the next - * line? - */ - if (len == PKT_LEN_SIZE) { - *out = line; - return GIT_SUCCESS; - } - - if (len == 0) { /* Flush pkt */ - *out = line; - return flush_pkt(head); - } - - len -= PKT_LEN_SIZE; /* the encoded length includes its own size */ - - /* Assming the minimal size is actually 4 */ - if (!git__prefixcmp(line, "ACK")) - error = ack_pkt(head, line, len); - else if (!git__prefixcmp(line, "NAK")) - error = nak_pkt(head); - else - error = ref_pkt(head, line, len); - - *out = line + len; - - return error; -} - -void git_pkt_free(git_pkt *pkt) -{ - if(pkt->type == GIT_PKT_REF) { - git_pkt_ref *p = (git_pkt_ref *) pkt; - free(p->head.name); - } - - free(pkt); -} - -int git_pkt_send_flush(int s) -{ - char flush[] = "0000"; - - return gitno_send(s, flush, strlen(flush), 0); -} - -static int send_want_with_caps(git_remote_head *head, git_transport_caps *caps, int fd) -{ - char capstr[20]; /* Longer than we need */ - char oid[GIT_OID_HEXSZ +1] = {0}, *cmd; - int error, len; - - if (caps->ofs_delta) - strcpy(capstr, GIT_CAP_OFS_DELTA); - - len = strlen("XXXXwant ") + GIT_OID_HEXSZ + 1 /* NUL */ + strlen(capstr) + 1 /* LF */; - cmd = git__malloc(len + 1); - if (cmd == NULL) - return GIT_ENOMEM; - - git_oid_fmt(oid, &head->oid); - memset(cmd, 0x0, len + 1); - p_snprintf(cmd, len + 1, "%04xwant %s%c%s\n", len, oid, 0, capstr); - error = gitno_send(fd, cmd, len, 0); - free(cmd); - return error; -} - -/* - * All "want" packets have the same length and format, so what we do - * is overwrite the OID each time. - */ -#define WANT_PREFIX "0032want " - -int git_pkt_send_wants(git_headarray *refs, git_transport_caps *caps, int fd) -{ - unsigned int i = 0; - int error = GIT_SUCCESS; - char buf[sizeof(WANT_PREFIX) + GIT_OID_HEXSZ + 1]; - git_remote_head *head; - - memcpy(buf, WANT_PREFIX, strlen(WANT_PREFIX)); - buf[sizeof(buf) - 2] = '\n'; - buf[sizeof(buf) - 1] = '\0'; - - /* If there are common caps, find the first one */ - if (caps->common) { - for (; i < refs->len; ++i) { - head = refs->heads[i]; - if (head->local) - continue; - else - break; - } - - error = send_want_with_caps(refs->heads[i], caps, fd); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to send want pkt with caps"); - /* Increase it here so it's correct whether we run this or not */ - i++; - } - - /* Continue from where we left off */ - for (; i < refs->len; ++i) { - head = refs->heads[i]; - if (head->local) - continue; - - git_oid_fmt(buf + strlen(WANT_PREFIX), &head->oid); - error = gitno_send(fd, buf, strlen(buf), 0); - return git__rethrow(error, "Failed to send want pkt"); - } - - return git_pkt_send_flush(fd); -} - -/* - * TODO: this should be a more generic function, maybe to be used by - * git_pkt_send_wants, as it's not performance-critical - */ -#define HAVE_PREFIX "0032have " - -int git_pkt_send_have(git_oid *oid, int fd) -{ - char buf[] = "0032have 0000000000000000000000000000000000000000\n"; - - git_oid_fmt(buf + strlen(HAVE_PREFIX), oid); - return gitno_send(fd, buf, strlen(buf), 0); -} - -int git_pkt_send_done(int fd) -{ - char buf[] = "0009done\n"; - - return gitno_send(fd, buf, strlen(buf), 0); -} diff --git a/vendor/libgit2/src/pkt.h b/vendor/libgit2/src/pkt.h deleted file mode 100644 index 1c6a20659..000000000 --- a/vendor/libgit2/src/pkt.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDE_pkt_h__ -#define INCLUDE_pkt_h__ - -#include "common.h" -#include "transport.h" -#include "git2/net.h" - -enum git_pkt_type { - GIT_PKT_CMD, - GIT_PKT_FLUSH, - GIT_PKT_REF, - GIT_PKT_HAVE, - GIT_PKT_ACK, - GIT_PKT_NAK, - GIT_PKT_PACK, -}; - -/* Used for multi-ack */ -enum git_ack_status { - GIT_ACK_NONE, - GIT_ACK_CONTINUE, - GIT_ACK_COMMON, - GIT_ACK_READY -}; - -/* This would be a flush pkt */ -typedef struct { - enum git_pkt_type type; -} git_pkt; - -struct git_pkt_cmd { - enum git_pkt_type type; - char *cmd; - char *path; - char *host; -}; - -/* This is a pkt-line with some info in it */ -typedef struct { - enum git_pkt_type type; - git_remote_head head; - char *capabilities; -} git_pkt_ref; - -/* Useful later */ -typedef struct { - enum git_pkt_type type; - git_oid oid; - enum git_ack_status status; -} git_pkt_ack; - -int git_pkt_parse_line(git_pkt **head, const char *line, const char **out, size_t len); -int git_pkt_send_flush(int s); -int git_pkt_send_done(int s); -int git_pkt_send_wants(git_headarray *refs, git_transport_caps *caps, int fd); -int git_pkt_send_have(git_oid *oid, int fd); -void git_pkt_free(git_pkt *pkt); - -#endif diff --git a/vendor/libgit2/src/posix.c b/vendor/libgit2/src/posix.c deleted file mode 100644 index 4bb8c3246..000000000 --- a/vendor/libgit2/src/posix.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "common.h" -#include "posix.h" -#include "path.h" -#include -#include - -int p_open(const char *path, int flags) -{ - return open(path, flags | O_BINARY); -} - -int p_creat(const char *path, int mode) -{ - return open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode); -} - -int p_read(git_file fd, void *buf, size_t cnt) -{ - char *b = buf; - while (cnt) { - ssize_t r = read(fd, b, cnt); - if (r < 0) { - if (errno == EINTR || errno == EAGAIN) - continue; - return GIT_EOSERR; - } - if (!r) - break; - cnt -= r; - b += r; - } - return (int)(b - (char *)buf); -} - -int p_write(git_file fd, const void *buf, size_t cnt) -{ - const char *b = buf; - while (cnt) { - ssize_t r = write(fd, b, cnt); - if (r < 0) { - if (errno == EINTR || errno == EAGAIN) - continue; - return GIT_EOSERR; - } - if (!r) { - errno = EPIPE; - return GIT_EOSERR; - } - cnt -= r; - b += r; - } - return GIT_SUCCESS; -} - -int p_getcwd(char *buffer_out, size_t size) -{ - char *cwd_buffer; - - assert(buffer_out && size > 0); - -#ifdef GIT_WIN32 - cwd_buffer = _getcwd(buffer_out, size); -#else - cwd_buffer = getcwd(buffer_out, size); -#endif - - if (cwd_buffer == NULL) - return git__throw(GIT_EOSERR, "Failed to retrieve current working directory"); - - git_path_mkposix(buffer_out); - - git_path_join(buffer_out, buffer_out, ""); //Ensure the path ends with a trailing slash - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/posix.h b/vendor/libgit2/src/posix.h deleted file mode 100644 index f1424f8d3..000000000 --- a/vendor/libgit2/src/posix.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * posix.h - OS agnostic POSIX calls - */ -#ifndef INCLUDE_posix_h__ -#define INCLUDE_posix_h__ - -#include "common.h" -#include -#include - -#define S_IFGITLINK 0160000 -#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK) - -#if !defined(O_BINARY) -#define O_BINARY 0 -#endif - -typedef int git_file; - -/** - * Standard POSIX Methods - * - * All the methods starting with the `p_` prefix are - * direct ports of the standard POSIX methods. - * - * Some of the methods are slightly wrapped to provide - * saner defaults. Some of these methods are emulated - * in Windows platforns. - * - * Use your manpages to check the docs on these. - * Straightforward - */ -extern int p_open(const char *path, int flags); -extern int p_creat(const char *path, int mode); -extern int p_read(git_file fd, void *buf, size_t cnt); -extern int p_write(git_file fd, const void *buf, size_t cnt); -extern int p_getcwd(char *buffer_out, size_t size); - -#define p_lseek(f,n,w) lseek(f, n, w) -#define p_stat(p,b) stat(p, b) -#define p_fstat(f,b) fstat(f, b) -#define p_chdir(p) chdir(p) -#define p_rmdir(p) rmdir(p) -#define p_chmod(p,m) chmod(p, m) -#define p_close(fd) close(fd) - -/** - * Platform-dependent methods - */ -#ifdef GIT_WIN32 -# include "win32/posix.h" -#else -# include "unix/posix.h" -#endif - -#endif diff --git a/vendor/libgit2/src/ppc/sha1.c b/vendor/libgit2/src/ppc/sha1.c deleted file mode 100644 index ec6a1926d..000000000 --- a/vendor/libgit2/src/ppc/sha1.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SHA-1 implementation. - * - * Copyright (C) 2005 Paul Mackerras - * - * This version assumes we are running on a big-endian machine. - * It calls an external sha1_core() to process blocks of 64 bytes. - */ -#include -#include -#include "sha1.h" - -extern void ppc_sha1_core(uint32_t *hash, const unsigned char *p, - unsigned int nblocks); - -int ppc_SHA1_Init(ppc_SHA_CTX *c) -{ - c->hash[0] = 0x67452301; - c->hash[1] = 0xEFCDAB89; - c->hash[2] = 0x98BADCFE; - c->hash[3] = 0x10325476; - c->hash[4] = 0xC3D2E1F0; - c->len = 0; - c->cnt = 0; - return 0; -} - -int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *ptr, unsigned long n) -{ - unsigned long nb; - const unsigned char *p = ptr; - - c->len += (uint64_t) n << 3; - while (n != 0) { - if (c->cnt || n < 64) { - nb = 64 - c->cnt; - if (nb > n) - nb = n; - memcpy(&c->buf.b[c->cnt], p, nb); - if ((c->cnt += nb) == 64) { - ppc_sha1_core(c->hash, c->buf.b, 1); - c->cnt = 0; - } - } else { - nb = n >> 6; - ppc_sha1_core(c->hash, p, nb); - nb <<= 6; - } - n -= nb; - p += nb; - } - return 0; -} - -int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c) -{ - unsigned int cnt = c->cnt; - - c->buf.b[cnt++] = 0x80; - if (cnt > 56) { - if (cnt < 64) - memset(&c->buf.b[cnt], 0, 64 - cnt); - ppc_sha1_core(c->hash, c->buf.b, 1); - cnt = 0; - } - if (cnt < 56) - memset(&c->buf.b[cnt], 0, 56 - cnt); - c->buf.l[7] = c->len; - ppc_sha1_core(c->hash, c->buf.b, 1); - memcpy(hash, c->hash, 20); - return 0; -} diff --git a/vendor/libgit2/src/ppc/sha1.h b/vendor/libgit2/src/ppc/sha1.h deleted file mode 100644 index 70957110c..000000000 --- a/vendor/libgit2/src/ppc/sha1.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * SHA-1 implementation. - * - * Copyright (C) 2005 Paul Mackerras - */ -#include - -typedef struct { - uint32_t hash[5]; - uint32_t cnt; - uint64_t len; - union { - unsigned char b[64]; - uint64_t l[8]; - } buf; -} ppc_SHA_CTX; - -int ppc_SHA1_Init(ppc_SHA_CTX *c); -int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *p, unsigned long n); -int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c); - -#define SHA_CTX ppc_SHA_CTX -#define SHA1_Init ppc_SHA1_Init -#define SHA1_Update ppc_SHA1_Update -#define SHA1_Final ppc_SHA1_Final diff --git a/vendor/libgit2/src/ppc/sha1ppc.S b/vendor/libgit2/src/ppc/sha1ppc.S deleted file mode 100644 index 1711eef6e..000000000 --- a/vendor/libgit2/src/ppc/sha1ppc.S +++ /dev/null @@ -1,224 +0,0 @@ -/* - * SHA-1 implementation for PowerPC. - * - * Copyright (C) 2005 Paul Mackerras - */ - -/* - * PowerPC calling convention: - * %r0 - volatile temp - * %r1 - stack pointer. - * %r2 - reserved - * %r3-%r12 - Incoming arguments & return values; volatile. - * %r13-%r31 - Callee-save registers - * %lr - Return address, volatile - * %ctr - volatile - * - * Register usage in this routine: - * %r0 - temp - * %r3 - argument (pointer to 5 words of SHA state) - * %r4 - argument (pointer to data to hash) - * %r5 - Constant K in SHA round (initially number of blocks to hash) - * %r6-%r10 - Working copies of SHA variables A..E (actually E..A order) - * %r11-%r26 - Data being hashed W[]. - * %r27-%r31 - Previous copies of A..E, for final add back. - * %ctr - loop count - */ - - -/* - * We roll the registers for A, B, C, D, E around on each - * iteration; E on iteration t is D on iteration t+1, and so on. - * We use registers 6 - 10 for this. (Registers 27 - 31 hold - * the previous values.) - */ -#define RA(t) (((t)+4)%5+6) -#define RB(t) (((t)+3)%5+6) -#define RC(t) (((t)+2)%5+6) -#define RD(t) (((t)+1)%5+6) -#define RE(t) (((t)+0)%5+6) - -/* We use registers 11 - 26 for the W values */ -#define W(t) ((t)%16+11) - -/* Register 5 is used for the constant k */ - -/* - * The basic SHA-1 round function is: - * E += ROTL(A,5) + F(B,C,D) + W[i] + K; B = ROTL(B,30) - * Then the variables are renamed: (A,B,C,D,E) = (E,A,B,C,D). - * - * Every 20 rounds, the function F() and the constant K changes: - * - 20 rounds of f0(b,c,d) = "bit wise b ? c : d" = (^b & d) + (b & c) - * - 20 rounds of f1(b,c,d) = b^c^d = (b^d)^c - * - 20 rounds of f2(b,c,d) = majority(b,c,d) = (b&d) + ((b^d)&c) - * - 20 more rounds of f1(b,c,d) - * - * These are all scheduled for near-optimal performance on a G4. - * The G4 is a 3-issue out-of-order machine with 3 ALUs, but it can only - * *consider* starting the oldest 3 instructions per cycle. So to get - * maximum performance out of it, you have to treat it as an in-order - * machine. Which means interleaving the computation round t with the - * computation of W[t+4]. - * - * The first 16 rounds use W values loaded directly from memory, while the - * remaining 64 use values computed from those first 16. We preload - * 4 values before starting, so there are three kinds of rounds: - * - The first 12 (all f0) also load the W values from memory. - * - The next 64 compute W(i+4) in parallel. 8*f0, 20*f1, 20*f2, 16*f1. - * - The last 4 (all f1) do not do anything with W. - * - * Therefore, we have 6 different round functions: - * STEPD0_LOAD(t,s) - Perform round t and load W(s). s < 16 - * STEPD0_UPDATE(t,s) - Perform round t and compute W(s). s >= 16. - * STEPD1_UPDATE(t,s) - * STEPD2_UPDATE(t,s) - * STEPD1(t) - Perform round t with no load or update. - * - * The G5 is more fully out-of-order, and can find the parallelism - * by itself. The big limit is that it has a 2-cycle ALU latency, so - * even though it's 2-way, the code has to be scheduled as if it's - * 4-way, which can be a limit. To help it, we try to schedule the - * read of RA(t) as late as possible so it doesn't stall waiting for - * the previous round's RE(t-1), and we try to rotate RB(t) as early - * as possible while reading RC(t) (= RB(t-1)) as late as possible. - */ - -/* the initial loads. */ -#define LOADW(s) \ - lwz W(s),(s)*4(%r4) - -/* - * Perform a step with F0, and load W(s). Uses W(s) as a temporary - * before loading it. - * This is actually 10 instructions, which is an awkward fit. - * It can execute grouped as listed, or delayed one instruction. - * (If delayed two instructions, there is a stall before the start of the - * second line.) Thus, two iterations take 7 cycles, 3.5 cycles per round. - */ -#define STEPD0_LOAD(t,s) \ -add RE(t),RE(t),W(t); andc %r0,RD(t),RB(t); and W(s),RC(t),RB(t); \ -add RE(t),RE(t),%r0; rotlwi %r0,RA(t),5; rotlwi RB(t),RB(t),30; \ -add RE(t),RE(t),W(s); add %r0,%r0,%r5; lwz W(s),(s)*4(%r4); \ -add RE(t),RE(t),%r0 - -/* - * This is likewise awkward, 13 instructions. However, it can also - * execute starting with 2 out of 3 possible moduli, so it does 2 rounds - * in 9 cycles, 4.5 cycles/round. - */ -#define STEPD0_UPDATE(t,s,loadk...) \ -add RE(t),RE(t),W(t); andc %r0,RD(t),RB(t); xor W(s),W((s)-16),W((s)-3); \ -add RE(t),RE(t),%r0; and %r0,RC(t),RB(t); xor W(s),W(s),W((s)-8); \ -add RE(t),RE(t),%r0; rotlwi %r0,RA(t),5; xor W(s),W(s),W((s)-14); \ -add RE(t),RE(t),%r5; loadk; rotlwi RB(t),RB(t),30; rotlwi W(s),W(s),1; \ -add RE(t),RE(t),%r0 - -/* Nicely optimal. Conveniently, also the most common. */ -#define STEPD1_UPDATE(t,s,loadk...) \ -add RE(t),RE(t),W(t); xor %r0,RD(t),RB(t); xor W(s),W((s)-16),W((s)-3); \ -add RE(t),RE(t),%r5; loadk; xor %r0,%r0,RC(t); xor W(s),W(s),W((s)-8); \ -add RE(t),RE(t),%r0; rotlwi %r0,RA(t),5; xor W(s),W(s),W((s)-14); \ -add RE(t),RE(t),%r0; rotlwi RB(t),RB(t),30; rotlwi W(s),W(s),1 - -/* - * The naked version, no UPDATE, for the last 4 rounds. 3 cycles per. - * We could use W(s) as a temp register, but we don't need it. - */ -#define STEPD1(t) \ - add RE(t),RE(t),W(t); xor %r0,RD(t),RB(t); \ -rotlwi RB(t),RB(t),30; add RE(t),RE(t),%r5; xor %r0,%r0,RC(t); \ -add RE(t),RE(t),%r0; rotlwi %r0,RA(t),5; /* spare slot */ \ -add RE(t),RE(t),%r0 - -/* - * 14 instructions, 5 cycles per. The majority function is a bit - * awkward to compute. This can execute with a 1-instruction delay, - * but it causes a 2-instruction delay, which triggers a stall. - */ -#define STEPD2_UPDATE(t,s,loadk...) \ -add RE(t),RE(t),W(t); and %r0,RD(t),RB(t); xor W(s),W((s)-16),W((s)-3); \ -add RE(t),RE(t),%r0; xor %r0,RD(t),RB(t); xor W(s),W(s),W((s)-8); \ -add RE(t),RE(t),%r5; loadk; and %r0,%r0,RC(t); xor W(s),W(s),W((s)-14); \ -add RE(t),RE(t),%r0; rotlwi %r0,RA(t),5; rotlwi W(s),W(s),1; \ -add RE(t),RE(t),%r0; rotlwi RB(t),RB(t),30 - -#define STEP0_LOAD4(t,s) \ - STEPD0_LOAD(t,s); \ - STEPD0_LOAD((t+1),(s)+1); \ - STEPD0_LOAD((t)+2,(s)+2); \ - STEPD0_LOAD((t)+3,(s)+3) - -#define STEPUP4(fn, t, s, loadk...) \ - STEP##fn##_UPDATE(t,s,); \ - STEP##fn##_UPDATE((t)+1,(s)+1,); \ - STEP##fn##_UPDATE((t)+2,(s)+2,); \ - STEP##fn##_UPDATE((t)+3,(s)+3,loadk) - -#define STEPUP20(fn, t, s, loadk...) \ - STEPUP4(fn, t, s,); \ - STEPUP4(fn, (t)+4, (s)+4,); \ - STEPUP4(fn, (t)+8, (s)+8,); \ - STEPUP4(fn, (t)+12, (s)+12,); \ - STEPUP4(fn, (t)+16, (s)+16, loadk) - - .globl ppc_sha1_core -ppc_sha1_core: - stwu %r1,-80(%r1) - stmw %r13,4(%r1) - - /* Load up A - E */ - lmw %r27,0(%r3) - - mtctr %r5 - -1: - LOADW(0) - lis %r5,0x5a82 - mr RE(0),%r31 - LOADW(1) - mr RD(0),%r30 - mr RC(0),%r29 - LOADW(2) - ori %r5,%r5,0x7999 /* K0-19 */ - mr RB(0),%r28 - LOADW(3) - mr RA(0),%r27 - - STEP0_LOAD4(0, 4) - STEP0_LOAD4(4, 8) - STEP0_LOAD4(8, 12) - STEPUP4(D0, 12, 16,) - STEPUP4(D0, 16, 20, lis %r5,0x6ed9) - - ori %r5,%r5,0xeba1 /* K20-39 */ - STEPUP20(D1, 20, 24, lis %r5,0x8f1b) - - ori %r5,%r5,0xbcdc /* K40-59 */ - STEPUP20(D2, 40, 44, lis %r5,0xca62) - - ori %r5,%r5,0xc1d6 /* K60-79 */ - STEPUP4(D1, 60, 64,) - STEPUP4(D1, 64, 68,) - STEPUP4(D1, 68, 72,) - STEPUP4(D1, 72, 76,) - addi %r4,%r4,64 - STEPD1(76) - STEPD1(77) - STEPD1(78) - STEPD1(79) - - /* Add results to original values */ - add %r31,%r31,RE(0) - add %r30,%r30,RD(0) - add %r29,%r29,RC(0) - add %r28,%r28,RB(0) - add %r27,%r27,RA(0) - - bdnz 1b - - /* Save final hash, restore registers, and return */ - stmw %r27,0(%r3) - lmw %r13,4(%r1) - addi %r1,%r1,80 - blr diff --git a/vendor/libgit2/src/pqueue.c b/vendor/libgit2/src/pqueue.c deleted file mode 100644 index 9883a35d8..000000000 --- a/vendor/libgit2/src/pqueue.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * BORING COPYRIGHT NOTICE: - * - * This file is a heavily modified version of the priority queue found - * in the Apache project and the libpqueue library. - * - * https://github.com/vy/libpqueue - * - * These are the original authors: - * - * Copyright 2010 Volkan Yazıcı - * Copyright 2006-2010 The Apache Software Foundation - * - * This file is licensed under the Apache 2.0 license, which - * supposedly makes it compatible with the GPLv2 that libgit2 uses. - * - * Check the Apache license at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * So much licensing trouble for a binary heap. Oh well. - */ - -#include "common.h" -#include "pqueue.h" - -#define left(i) ((i) << 1) -#define right(i) (((i) << 1) + 1) -#define parent(i) ((i) >> 1) - -int git_pqueue_init(git_pqueue *q, size_t n, git_pqueue_cmp cmppri) -{ - assert(q); - - /* Need to allocate n+1 elements since element 0 isn't used. */ - if ((q->d = malloc((n + 1) * sizeof(void *))) == NULL) - return GIT_ENOMEM; - - q->size = 1; - q->avail = q->step = (n + 1); /* see comment above about n+1 */ - q->cmppri = cmppri; - - return GIT_SUCCESS; -} - - -void git_pqueue_free(git_pqueue *q) -{ - free(q->d); - q->d = NULL; -} - -void git_pqueue_clear(git_pqueue *q) -{ - q->size = 1; -} - -size_t git_pqueue_size(git_pqueue *q) -{ - /* queue element 0 exists but doesn't count since it isn't used. */ - return (q->size - 1); -} - - -static void bubble_up(git_pqueue *q, size_t i) -{ - size_t parent_node; - void *moving_node = q->d[i]; - - for (parent_node = parent(i); - ((i > 1) && q->cmppri(q->d[parent_node], moving_node)); - i = parent_node, parent_node = parent(i)) { - q->d[i] = q->d[parent_node]; - } - - q->d[i] = moving_node; -} - - -static size_t maxchild(git_pqueue *q, size_t i) -{ - size_t child_node = left(i); - - if (child_node >= q->size) - return 0; - - if ((child_node + 1) < q->size && - q->cmppri(q->d[child_node], q->d[child_node + 1])) - child_node++; /* use right child instead of left */ - - return child_node; -} - - -static void percolate_down(git_pqueue *q, size_t i) -{ - size_t child_node; - void *moving_node = q->d[i]; - - while ((child_node = maxchild(q, i)) != 0 && - q->cmppri(moving_node, q->d[child_node])) { - q->d[i] = q->d[child_node]; - i = child_node; - } - - q->d[i] = moving_node; -} - - -int git_pqueue_insert(git_pqueue *q, void *d) -{ - void *tmp; - size_t i; - size_t newsize; - - if (!q) return 1; - - /* allocate more memory if necessary */ - if (q->size >= q->avail) { - newsize = q->size + q->step; - if ((tmp = realloc(q->d, sizeof(void *) * newsize)) == NULL) - return GIT_ENOMEM; - - q->d = tmp; - q->avail = newsize; - } - - /* insert item */ - i = q->size++; - q->d[i] = d; - bubble_up(q, i); - - return GIT_SUCCESS; -} - - -void *git_pqueue_pop(git_pqueue *q) -{ - void *head; - - if (!q || q->size == 1) - return NULL; - - head = q->d[1]; - q->d[1] = q->d[--q->size]; - percolate_down(q, 1); - - return head; -} - - -void *git_pqueue_peek(git_pqueue *q) -{ - if (!q || q->size == 1) - return NULL; - return q->d[1]; -} diff --git a/vendor/libgit2/src/pqueue.h b/vendor/libgit2/src/pqueue.h deleted file mode 100644 index ef8362c33..000000000 --- a/vendor/libgit2/src/pqueue.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * BORING COPYRIGHT NOTICE: - * - * This file is a heavily modified version of the priority queue found - * in the Apache project and the libpqueue library. - * - * https://github.com/vy/libpqueue - * - * These are the original authors: - * - * Copyright 2010 Volkan Yazıcı - * Copyright 2006-2010 The Apache Software Foundation - * - * This file is licensed under the Apache 2.0 license, which - * supposedly makes it compatible with the GPLv2 that libgit2 uses. - * - * Check the Apache license at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * So much licensing trouble for a binary heap. Oh well. - */ - -#ifndef INCLUDE_pqueue_h__ -#define INCLUDE_pqueue_h__ - -/** callback functions to get/set/compare the priority of an element */ -typedef int (*git_pqueue_cmp)(void *a, void *b); - -/** the priority queue handle */ -typedef struct { - size_t size, avail, step; - git_pqueue_cmp cmppri; - void **d; -} git_pqueue; - - -/** - * initialize the queue - * - * @param n the initial estimate of the number of queue items for which memory - * should be preallocated - * @param cmppri the callback function to compare two nodes of the queue - * - * @Return the handle or NULL for insufficent memory - */ -int git_pqueue_init(git_pqueue *q, size_t n, git_pqueue_cmp cmppri); - - -/** - * free all memory used by the queue - * @param q the queue - */ -void git_pqueue_free(git_pqueue *q); - -/** - * clear all the elements in the queue - * @param q the queue - */ -void git_pqueue_clear(git_pqueue *q); - -/** - * return the size of the queue. - * @param q the queue - */ -size_t git_pqueue_size(git_pqueue *q); - - -/** - * insert an item into the queue. - * @param q the queue - * @param d the item - * @return 0 on success - */ -int git_pqueue_insert(git_pqueue *q, void *d); - - -/** - * pop the highest-ranking item from the queue. - * @param p the queue - * @param d where to copy the entry to - * @return NULL on error, otherwise the entry - */ -void *git_pqueue_pop(git_pqueue *q); - - -/** - * access highest-ranking item without removing it. - * @param q the queue - * @param d the entry - * @return NULL on error, otherwise the entry - */ -void *git_pqueue_peek(git_pqueue *q); - -#endif /* PQUEUE_H */ -/** @} */ - diff --git a/vendor/libgit2/src/reflog.c b/vendor/libgit2/src/reflog.c deleted file mode 100644 index d28e5cba1..000000000 --- a/vendor/libgit2/src/reflog.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "reflog.h" -#include "repository.h" -#include "filebuf.h" -#include "signature.h" - -static int reflog_init(git_reflog **reflog, git_reference *ref) -{ - git_reflog *log; - - *reflog = NULL; - - log = git__malloc(sizeof(git_reflog)); - if (log == NULL) - return GIT_ENOMEM; - - memset(log, 0x0, sizeof(git_reflog)); - - log->ref_name = git__strdup(ref->name); - - if (git_vector_init(&log->entries, 0, NULL) < 0) { - free(log->ref_name); - free(log); - return GIT_ENOMEM; - } - - *reflog = log; - - return GIT_SUCCESS; -} - -static int reflog_write(const char *log_path, const char *oid_old, - const char *oid_new, const git_signature *committer, - const char *msg) -{ - int error; - git_buf log = GIT_BUF_INIT; - git_filebuf fbuf; - - assert(log_path && oid_old && oid_new && committer); - - git_buf_puts(&log, oid_old); - git_buf_putc(&log, ' '); - - git_buf_puts(&log, oid_new); - - git_signature__writebuf(&log, " ", committer); - log.size--; /* drop LF */ - - if (msg) { - if (strchr(msg, '\n')) { - git_buf_free(&log); - return git__throw(GIT_ERROR, "Reflog message cannot contain newline"); - } - - git_buf_putc(&log, '\t'); - git_buf_puts(&log, msg); - } - - git_buf_putc(&log, '\n'); - - if ((error = git_filebuf_open(&fbuf, log_path, GIT_FILEBUF_APPEND)) < GIT_SUCCESS) { - git_buf_free(&log); - return git__throw(GIT_ERROR, "Failed to write reflog. Cannot open reflog `%s`", log_path); - } - - git_filebuf_write(&fbuf, log.ptr, log.size); - error = git_filebuf_commit(&fbuf); - - git_buf_free(&log); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write reflog"); -} - -static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size) -{ - int error = GIT_SUCCESS; - const char *ptr; - git_reflog_entry *entry; - -#define seek_forward(_increase) { \ - if (_increase >= buf_size) { \ - if (entry->committer) \ - free(entry->committer); \ - free(entry); \ - return git__throw(GIT_ERROR, "Failed to seek forward. Buffer size exceeded"); \ - } \ - buf += _increase; \ - buf_size -= _increase; \ -} - - while (buf_size > GIT_REFLOG_SIZE_MIN) { - entry = git__malloc(sizeof(git_reflog_entry)); - if (entry == NULL) - return GIT_ENOMEM; - entry->committer = NULL; - - if (git_oid_fromstrn(&entry->oid_old, buf, GIT_OID_HEXSZ) < GIT_SUCCESS) { - free(entry); - return GIT_ERROR; - } - seek_forward(GIT_OID_HEXSZ + 1); - - if (git_oid_fromstrn(&entry->oid_cur, buf, GIT_OID_HEXSZ) < GIT_SUCCESS) { - free(entry); - return GIT_ERROR; - } - seek_forward(GIT_OID_HEXSZ + 1); - - ptr = buf; - - /* Seek forward to the end of the signature. */ - while (*buf && *buf != '\t' && *buf != '\n') - seek_forward(1); - - entry->committer = git__malloc(sizeof(git_signature)); - if (entry->committer == NULL) { - free(entry); - return GIT_ENOMEM; - } - - if ((error = git_signature__parse(entry->committer, &ptr, buf + 1, NULL, *buf)) < GIT_SUCCESS) { - free(entry->committer); - free(entry); - return git__rethrow(error, "Failed to parse reflog. Could not parse signature"); - } - - if (*buf == '\t') { - /* We got a message. Read everything till we reach LF. */ - seek_forward(1); - ptr = buf; - - while (*buf && *buf != '\n') - seek_forward(1); - - entry->msg = git__strndup(ptr, buf - ptr); - } else - entry->msg = NULL; - - while (*buf && *buf == '\n' && buf_size > 1) - seek_forward(1); - - if ((error = git_vector_insert(&log->entries, entry)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse reflog. Could not add new entry"); - } - -#undef seek_forward - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse reflog"); -} - -void git_reflog_free(git_reflog *reflog) -{ - unsigned int i; - git_reflog_entry *entry; - - for (i=0; i < reflog->entries.length; i++) { - entry = git_vector_get(&reflog->entries, i); - - git_signature_free(entry->committer); - - free(entry->msg); - free(entry); - } - - git_vector_free(&reflog->entries); - free(reflog->ref_name); - free(reflog); -} - -int git_reflog_read(git_reflog **reflog, git_reference *ref) -{ - int error; - char log_path[GIT_PATH_MAX]; - git_fbuffer log_file = GIT_FBUFFER_INIT; - git_reflog *log = NULL; - - *reflog = NULL; - - if ((error = reflog_init(&log, ref)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to read reflog. Cannot init reflog"); - - git_path_join_n(log_path, 3, ref->owner->path_repository, GIT_REFLOG_DIR, ref->name); - - if ((error = git_futils_readbuffer(&log_file, log_path)) < GIT_SUCCESS) { - git_reflog_free(log); - return git__rethrow(error, "Failed to read reflog. Cannot read file `%s`", log_path); - } - - error = reflog_parse(log, log_file.data, log_file.len); - - git_futils_freebuffer(&log_file); - - if (error == GIT_SUCCESS) - *reflog = log; - else - git_reflog_free(log); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to read reflog"); -} - -int git_reflog_write(git_reference *ref, const git_oid *oid_old, - const git_signature *committer, const char *msg) -{ - int error; - char old[GIT_OID_HEXSZ+1]; - char new[GIT_OID_HEXSZ+1]; - char log_path[GIT_PATH_MAX]; - git_reference *r; - const git_oid *oid; - - if ((error = git_reference_resolve(&r, ref)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write reflog. Cannot resolve reference `%s`", ref->name); - - oid = git_reference_oid(r); - if (oid == NULL) - return git__throw(GIT_ERROR, "Failed to write reflog. Cannot resolve reference `%s`", r->name); - - git_oid_to_string(new, GIT_OID_HEXSZ+1, oid); - - git_path_join_n(log_path, 3, ref->owner->path_repository, GIT_REFLOG_DIR, ref->name); - - if (git_futils_exists(log_path)) { - if ((error = git_futils_mkpath2file(log_path)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write reflog. Cannot create reflog directory"); - } else if (git_futils_isfile(log_path)) { - return git__throw(GIT_ERROR, "Failed to write reflog. `%s` is directory", log_path); - } else if (oid_old == NULL) - return git__throw(GIT_ERROR, "Failed to write reflog. Old OID cannot be NULL for existing reference"); - - if (oid_old) - git_oid_to_string(old, GIT_OID_HEXSZ+1, oid_old); - else - p_snprintf(old, GIT_OID_HEXSZ+1, "%0*d", GIT_OID_HEXSZ, 0); - - return reflog_write(log_path, old, new, committer, msg); -} - -unsigned int git_reflog_entrycount(git_reflog *reflog) -{ - assert(reflog); - return reflog->entries.length; -} - -const git_reflog_entry * git_reflog_entry_byindex(git_reflog *reflog, unsigned int idx) -{ - assert(reflog); - return git_vector_get(&reflog->entries, idx); -} - -const git_oid * git_reflog_entry_oidold(const git_reflog_entry *entry) -{ - assert(entry); - return &entry->oid_old; -} - -const git_oid * git_reflog_entry_oidnew(const git_reflog_entry *entry) -{ - assert(entry); - return &entry->oid_cur; -} - -git_signature * git_reflog_entry_committer(const git_reflog_entry *entry) -{ - assert(entry); - return entry->committer; -} - -char * git_reflog_entry_msg(const git_reflog_entry *entry) -{ - assert(entry); - return entry->msg; -} diff --git a/vendor/libgit2/src/reflog.h b/vendor/libgit2/src/reflog.h deleted file mode 100644 index b6daf2a76..000000000 --- a/vendor/libgit2/src/reflog.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef INCLUDE_reflog_h__ -#define INCLUDE_reflog_h__ - -#include "common.h" -#include "git2/reflog.h" -#include "vector.h" - -#define GIT_REFLOG_DIR "logs/" - -#define GIT_REFLOG_SIZE_MIN (2*GIT_OID_HEXSZ+2+17) - -struct git_reflog_entry { - git_oid oid_old; - git_oid oid_cur; - - git_signature *committer; - - char *msg; -}; - -struct git_reflog { - char *ref_name; - git_vector entries; -}; - -#endif /* INCLUDE_reflog_h__ */ diff --git a/vendor/libgit2/src/refs.c b/vendor/libgit2/src/refs.c deleted file mode 100644 index 77521bc63..000000000 --- a/vendor/libgit2/src/refs.c +++ /dev/null @@ -1,1753 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "refs.h" -#include "hash.h" -#include "repository.h" -#include "fileops.h" - -#include -#include - -#define MAX_NESTING_LEVEL 5 - -typedef struct { - git_reference ref; - git_oid oid; - git_oid peel_target; -} reference_oid; - -typedef struct { - git_reference ref; - char *target; -} reference_symbolic; - -static const int default_table_size = 32; - -static uint32_t reftable_hash(const void *key, int hash_id) -{ - static uint32_t hash_seeds[GIT_HASHTABLE_HASHES] = { - 2147483647, - 0x5d20bb23, - 0x7daaab3c - }; - - return git__hash(key, strlen((const char *)key), hash_seeds[hash_id]); -} - -static void reference_free(git_reference *reference); -static int reference_create(git_reference **ref_out, git_repository *repo, const char *name, git_rtype type); -static int reference_read(git_fbuffer *file_content, time_t *mtime, const char *repo_path, const char *ref_name, int *updated); - -/* loose refs */ -static int loose_parse_symbolic(git_reference *ref, git_fbuffer *file_content); -static int loose_parse_oid(git_reference *ref, git_fbuffer *file_content); -static int loose_lookup(git_reference **ref_out, git_repository *repo, const char *name, int skip_symbolic); -static int loose_write(git_reference *ref); -static int loose_update(git_reference *ref); - -/* packed refs */ -static int packed_parse_peel(reference_oid *tag_ref, const char **buffer_out, const char *buffer_end); -static int packed_parse_oid(reference_oid **ref_out, git_repository *repo, const char **buffer_out, const char *buffer_end); -static int packed_load(git_repository *repo); -static int packed_loadloose(git_repository *repository); -static int packed_write_ref(reference_oid *ref, git_filebuf *file); -static int packed_find_peel(reference_oid *ref); -static int packed_remove_loose(git_repository *repo, git_vector *packing_list); -static int packed_sort(const void *a, const void *b); -static int packed_write(git_repository *repo); - -/* internal helpers */ -static int reference_available(git_repository *repo, const char *ref, const char *old_ref); - -/* name normalization */ -static int check_valid_ref_char(char ch); -static int normalize_name(char *buffer_out, size_t out_size, const char *name, int is_oid_ref); - -/***************************************** - * Internal methods - Constructor/destructor - *****************************************/ -static void reference_free(git_reference *reference) -{ - if (reference == NULL) - return; - - if (reference->name) - free(reference->name); - - if (reference->type == GIT_REF_SYMBOLIC) - free(((reference_symbolic *)reference)->target); - - free(reference); -} - -static int reference_create( - git_reference **ref_out, - git_repository *repo, - const char *name, - git_rtype type) -{ - char normalized[GIT_REFNAME_MAX]; - int error = GIT_SUCCESS, size; - git_reference *reference = NULL; - - assert(ref_out && repo && name); - - if (type == GIT_REF_SYMBOLIC) - size = sizeof(reference_symbolic); - else if (type == GIT_REF_OID) - size = sizeof(reference_oid); - else - return git__throw(GIT_EINVALIDARGS, - "Invalid reference type. Use either GIT_REF_OID or GIT_REF_SYMBOLIC as type specifier"); - - reference = git__malloc(size); - if (reference == NULL) - return GIT_ENOMEM; - - memset(reference, 0x0, size); - reference->owner = repo; - reference->type = type; - - error = normalize_name(normalized, sizeof(normalized), name, (type & GIT_REF_OID)); - if (error < GIT_SUCCESS) - goto cleanup; - - reference->name = git__strdup(normalized); - if (reference->name == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - *ref_out = reference; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create reference"); - -cleanup: - reference_free(reference); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create reference"); -} - -static int reference_read(git_fbuffer *file_content, time_t *mtime, const char *repo_path, const char *ref_name, int *updated) -{ - char path[GIT_PATH_MAX]; - - assert(file_content && repo_path && ref_name); - - /* Determine the full path of the file */ - git_path_join(path, repo_path, ref_name); - - return git_futils_readbuffer_updated(file_content, path, mtime, updated); -} - - - - -/***************************************** - * Internal methods - Loose references - *****************************************/ -static int loose_update(git_reference *ref) -{ - int error, updated; - git_fbuffer ref_file = GIT_FBUFFER_INIT; - - if (ref->type & GIT_REF_PACKED) - return packed_load(ref->owner); - -/* error = reference_read(NULL, &ref_time, ref->owner->path_repository, ref->name); - if (error < GIT_SUCCESS) - goto cleanup; - - if (ref_time == ref->mtime) - return GIT_SUCCESS; -*/ - error = reference_read(&ref_file, &ref->mtime, ref->owner->path_repository, ref->name, &updated); - if (error < GIT_SUCCESS) - goto cleanup; - - if (!updated) - goto cleanup; - - if (ref->type == GIT_REF_SYMBOLIC) - error = loose_parse_symbolic(ref, &ref_file); - else if (ref->type == GIT_REF_OID) - error = loose_parse_oid(ref, &ref_file); - else - error = git__throw(GIT_EOBJCORRUPTED, - "Invalid reference type (%d) for loose reference", ref->type); - - -cleanup: - git_futils_freebuffer(&ref_file); - if (error != GIT_SUCCESS) { - reference_free(ref); - git_hashtable_remove(ref->owner->references.loose_cache, ref->name); - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to update loose reference"); -} - -static int loose_parse_symbolic(git_reference *ref, git_fbuffer *file_content) -{ - const unsigned int header_len = strlen(GIT_SYMREF); - const char *refname_start; - char *eol; - reference_symbolic *ref_sym; - - refname_start = (const char *)file_content->data; - ref_sym = (reference_symbolic *)ref; - - if (file_content->len < (header_len + 1)) - return git__throw(GIT_EOBJCORRUPTED, - "Failed to parse loose reference. Object too short"); - - /* - * Assume we have already checked for the header - * before calling this function - */ - - refname_start += header_len; - - free(ref_sym->target); - ref_sym->target = git__strdup(refname_start); - if (ref_sym->target == NULL) - return GIT_ENOMEM; - - /* remove newline at the end of file */ - eol = strchr(ref_sym->target, '\n'); - if (eol == NULL) - return git__throw(GIT_EOBJCORRUPTED, - "Failed to parse loose reference. Missing EOL"); - - *eol = '\0'; - if (eol[-1] == '\r') - eol[-1] = '\0'; - - return GIT_SUCCESS; -} - -static int loose_parse_oid(git_reference *ref, git_fbuffer *file_content) -{ - int error; - reference_oid *ref_oid; - char *buffer; - - buffer = (char *)file_content->data; - ref_oid = (reference_oid *)ref; - - /* File format: 40 chars (OID) + newline */ - if (file_content->len < GIT_OID_HEXSZ + 1) - return git__throw(GIT_EOBJCORRUPTED, - "Failed to parse loose reference. Reference too short"); - - if ((error = git_oid_fromstr(&ref_oid->oid, buffer)) < GIT_SUCCESS) - return git__rethrow(GIT_EOBJCORRUPTED, "Failed to parse loose reference."); - - buffer = buffer + GIT_OID_HEXSZ; - if (*buffer == '\r') - buffer++; - - if (*buffer != '\n') - return git__throw(GIT_EOBJCORRUPTED, - "Failed to parse loose reference. Missing EOL"); - - return GIT_SUCCESS; -} - - -static git_rtype loose_guess_rtype(const char *full_path) -{ - git_fbuffer ref_file = GIT_FBUFFER_INIT; - git_rtype type; - - type = GIT_REF_INVALID; - - if (git_futils_readbuffer(&ref_file, full_path) == GIT_SUCCESS) { - if (git__prefixcmp((const char *)(ref_file.data), GIT_SYMREF) == 0) - type = GIT_REF_SYMBOLIC; - else - type = GIT_REF_OID; - } - - git_futils_freebuffer(&ref_file); - return type; -} - -static int loose_lookup( - git_reference **ref_out, - git_repository *repo, - const char *name, - int skip_symbolic) -{ - int error = GIT_SUCCESS; - git_fbuffer ref_file = GIT_FBUFFER_INIT; - git_reference *ref = NULL; - time_t ref_time = 0; - - *ref_out = NULL; - - error = reference_read(&ref_file, &ref_time, repo->path_repository, name, NULL); - if (error < GIT_SUCCESS) - goto cleanup; - - if (git__prefixcmp((const char *)(ref_file.data), GIT_SYMREF) == 0) { - if (skip_symbolic) - return GIT_SUCCESS; - - error = reference_create(&ref, repo, name, GIT_REF_SYMBOLIC); - if (error < GIT_SUCCESS) - goto cleanup; - - error = loose_parse_symbolic(ref, &ref_file); - } else { - error = reference_create(&ref, repo, name, GIT_REF_OID); - if (error < GIT_SUCCESS) - goto cleanup; - - error = loose_parse_oid(ref, &ref_file); - } - - if (error < GIT_SUCCESS) - goto cleanup; - - ref->mtime = ref_time; - *ref_out = ref; - git_futils_freebuffer(&ref_file); - return GIT_SUCCESS; - -cleanup: - git_futils_freebuffer(&ref_file); - reference_free(ref); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to lookup loose reference"); -} - -static int loose_write(git_reference *ref) -{ - git_filebuf file; - char ref_path[GIT_PATH_MAX]; - int error; - struct stat st; - - git_path_join(ref_path, ref->owner->path_repository, ref->name); - - if ((error = git_filebuf_open(&file, ref_path, GIT_FILEBUF_FORCE)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write loose reference"); - - if (ref->type & GIT_REF_OID) { - reference_oid *ref_oid = (reference_oid *)ref; - char oid[GIT_OID_HEXSZ + 1]; - - memset(oid, 0x0, sizeof(oid)); - - git_oid_fmt(oid, &ref_oid->oid); - error = git_filebuf_printf(&file, "%s\n", oid); - if (error < GIT_SUCCESS) - goto unlock; - - } else if (ref->type & GIT_REF_SYMBOLIC) { /* GIT_REF_SYMBOLIC */ - reference_symbolic *ref_sym = (reference_symbolic *)ref; - - error = git_filebuf_printf(&file, GIT_SYMREF "%s\n", ref_sym->target); - } else { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to write reference. Invalid reference type"); - goto unlock; - } - - error = git_filebuf_commit(&file); - - if (p_stat(ref_path, &st) == GIT_SUCCESS) - ref->mtime = st.st_mtime; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference"); - -unlock: - git_filebuf_cleanup(&file); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference"); -} - - - - - - -/***************************************** - * Internal methods - Packed references - *****************************************/ - -static int packed_parse_peel( - reference_oid *tag_ref, - const char **buffer_out, - const char *buffer_end) -{ - const char *buffer = *buffer_out + 1; - - assert(buffer[-1] == '^'); - - /* Ensure it's not the first entry of the file */ - if (tag_ref == NULL) - return git__throw(GIT_EPACKEDREFSCORRUPTED, "Failed to parse packed reference. Reference is the first entry of the file"); - - /* Ensure reference is a tag */ - if (git__prefixcmp(tag_ref->ref.name, GIT_REFS_TAGS_DIR) != 0) - return git__throw(GIT_EPACKEDREFSCORRUPTED, "Failed to parse packed reference. Reference is not a tag"); - - if (buffer + GIT_OID_HEXSZ >= buffer_end) - return git__throw(GIT_EPACKEDREFSCORRUPTED, "Failed to parse packed reference. Buffer too small"); - - /* Is this a valid object id? */ - if (git_oid_fromstr(&tag_ref->peel_target, buffer) < GIT_SUCCESS) - return git__throw(GIT_EPACKEDREFSCORRUPTED, "Failed to parse packed reference. Not a valid object ID"); - - buffer = buffer + GIT_OID_HEXSZ; - if (*buffer == '\r') - buffer++; - - if (*buffer != '\n') - return git__throw(GIT_EPACKEDREFSCORRUPTED, "Failed to parse packed reference. Buffer not terminated correctly"); - - *buffer_out = buffer + 1; - tag_ref->ref.type |= GIT_REF_HAS_PEEL; - - return GIT_SUCCESS; -} - -static int packed_parse_oid( - reference_oid **ref_out, - git_repository *repo, - const char **buffer_out, - const char *buffer_end) -{ - reference_oid *ref = NULL; - - const char *buffer = *buffer_out; - const char *refname_begin, *refname_end; - - int error = GIT_SUCCESS; - int refname_len; - char refname[GIT_REFNAME_MAX]; - git_oid id; - - refname_begin = (buffer + GIT_OID_HEXSZ + 1); - if (refname_begin >= buffer_end || - refname_begin[-1] != ' ') { - error = GIT_EPACKEDREFSCORRUPTED; - goto cleanup; - } - - /* Is this a valid object id? */ - if ((error = git_oid_fromstr(&id, buffer)) < GIT_SUCCESS) - goto cleanup; - - refname_end = memchr(refname_begin, '\n', buffer_end - refname_begin); - if (refname_end == NULL) { - error = GIT_EPACKEDREFSCORRUPTED; - goto cleanup; - } - - refname_len = refname_end - refname_begin; - - memcpy(refname, refname_begin, refname_len); - refname[refname_len] = 0; - - if (refname[refname_len - 1] == '\r') - refname[refname_len - 1] = 0; - - error = reference_create((git_reference **)&ref, repo, refname, GIT_REF_OID); - if (error < GIT_SUCCESS) - goto cleanup; - - git_oid_cpy(&ref->oid, &id); - ref->ref.type |= GIT_REF_PACKED; - - *ref_out = ref; - *buffer_out = refname_end + 1; - - return GIT_SUCCESS; - -cleanup: - reference_free((git_reference *)ref); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse OID of packed reference"); -} - -static int packed_load(git_repository *repo) -{ - int error = GIT_SUCCESS, updated; - git_fbuffer packfile = GIT_FBUFFER_INIT; - const char *buffer_start, *buffer_end; - git_refcache *ref_cache = &repo->references; - - /* First we make sure we have allocated the hash table */ - if (ref_cache->packfile == NULL) { - ref_cache->packfile = git_hashtable_alloc( - default_table_size, - reftable_hash, - (git_hash_keyeq_ptr)(&git__strcmp_cb)); - - if (ref_cache->packfile == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - } - - error = reference_read(&packfile, &ref_cache->packfile_time, - repo->path_repository, GIT_PACKEDREFS_FILE, &updated); - - /* - * If we couldn't find the file, we need to clear the table and - * return. On any other error, we return that error. If everything - * went fine and the file wasn't updated, then there's nothing new - * for us here, so just return. Anything else means we need to - * refresh the packed refs. - */ - if (error == GIT_ENOTFOUND) { - git_hashtable_clear(ref_cache->packfile); - return GIT_SUCCESS; - } else if (error < GIT_SUCCESS) { - return git__rethrow(error, "Failed to read packed refs"); - } else if (!updated) { - return GIT_SUCCESS; - } - - /* - * At this point, we want to refresh the packed refs. We already - * have the contents in our buffer. - */ - - git_hashtable_clear(ref_cache->packfile); - - buffer_start = (const char *)packfile.data; - buffer_end = (const char *)(buffer_start) + packfile.len; - - while (buffer_start < buffer_end && buffer_start[0] == '#') { - buffer_start = strchr(buffer_start, '\n'); - if (buffer_start == NULL) { - error = GIT_EPACKEDREFSCORRUPTED; - goto cleanup; - } - buffer_start++; - } - - while (buffer_start < buffer_end) { - reference_oid *ref = NULL; - - error = packed_parse_oid(&ref, repo, &buffer_start, buffer_end); - if (error < GIT_SUCCESS) - goto cleanup; - - if (buffer_start[0] == '^') { - error = packed_parse_peel(ref, &buffer_start, buffer_end); - if (error < GIT_SUCCESS) - goto cleanup; - } - - error = git_hashtable_insert(ref_cache->packfile, ref->ref.name, ref); - if (error < GIT_SUCCESS) { - reference_free((git_reference *)ref); - goto cleanup; - } - } - - git_futils_freebuffer(&packfile); - return GIT_SUCCESS; - -cleanup: - git_hashtable_free(ref_cache->packfile); - ref_cache->packfile = NULL; - git_futils_freebuffer(&packfile); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to load packed references"); -} - - - - -struct dirent_list_data { - git_repository *repo; - size_t repo_path_len; - unsigned int list_flags; - - int (*callback)(const char *, void *); - void *callback_payload; -}; - -static int _dirent_loose_listall(void *_data, char *full_path) -{ - struct dirent_list_data *data = (struct dirent_list_data *)_data; - char *file_path = full_path + data->repo_path_len; - - if (git_futils_isdir(full_path) == GIT_SUCCESS) - return git_futils_direach(full_path, GIT_PATH_MAX, _dirent_loose_listall, _data); - - /* do not add twice a reference that exists already in the packfile */ - if ((data->list_flags & GIT_REF_PACKED) != 0 && - git_hashtable_lookup(data->repo->references.packfile, file_path) != NULL) - return GIT_SUCCESS; - - if (data->list_flags != GIT_REF_LISTALL) { - if ((data->list_flags & loose_guess_rtype(full_path)) == 0) - return GIT_SUCCESS; /* we are filtering out this reference */ - } - - return data->callback(file_path, data->callback_payload); -} - -static int _dirent_loose_load(void *data, char *full_path) -{ - git_repository *repository = (git_repository *)data; - git_reference *reference, *old_ref; - char *file_path; - int error; - - if (git_futils_isdir(full_path) == GIT_SUCCESS) - return git_futils_direach(full_path, GIT_PATH_MAX, _dirent_loose_load, repository); - - file_path = full_path + strlen(repository->path_repository); - error = loose_lookup(&reference, repository, file_path, 1); - if (error == GIT_SUCCESS && reference != NULL) { - reference->type |= GIT_REF_PACKED; - - if (git_hashtable_insert2(repository->references.packfile, reference->name, reference, (void **)&old_ref) < GIT_SUCCESS) { - reference_free(reference); - return GIT_ENOMEM; - } - - if (old_ref != NULL) - reference_free(old_ref); - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to load loose dirent"); -} - -/* - * Load all the loose references from the repository - * into the in-memory Packfile, and build a vector with - * all the references so it can be written back to - * disk. - */ -static int packed_loadloose(git_repository *repository) -{ - char refs_path[GIT_PATH_MAX]; - - /* the packfile must have been previously loaded! */ - assert(repository->references.packfile); - - git_path_join(refs_path, repository->path_repository, GIT_REFS_DIR); - - /* Remove any loose references from the cache */ - { - const void *GIT_UNUSED(_unused); - git_reference *reference; - - GIT_HASHTABLE_FOREACH(repository->references.loose_cache, _unused, reference, - reference_free(reference); - ); - } - - git_hashtable_clear(repository->references.loose_cache); - - /* - * Load all the loose files from disk into the Packfile table. - * This will overwrite any old packed entries with their - * updated loose versions - */ - return git_futils_direach(refs_path, GIT_PATH_MAX, _dirent_loose_load, repository); -} - -/* - * Write a single reference into a packfile - */ -static int packed_write_ref(reference_oid *ref, git_filebuf *file) -{ - int error; - char oid[GIT_OID_HEXSZ + 1]; - - git_oid_fmt(oid, &ref->oid); - oid[GIT_OID_HEXSZ] = 0; - - /* - * For references that peel to an object in the repo, we must - * write the resulting peel on a separate line, e.g. - * - * 6fa8a902cc1d18527e1355773c86721945475d37 refs/tags/libgit2-0.4 - * ^2ec0cb7959b0bf965d54f95453f5b4b34e8d3100 - * - * This obviously only applies to tags. - * The required peels have already been loaded into `ref->peel_target`. - */ - if (ref->ref.type & GIT_REF_HAS_PEEL) { - char peel[GIT_OID_HEXSZ + 1]; - git_oid_fmt(peel, &ref->peel_target); - peel[GIT_OID_HEXSZ] = 0; - - error = git_filebuf_printf(file, "%s %s\n^%s\n", oid, ref->ref.name, peel); - } else { - error = git_filebuf_printf(file, "%s %s\n", oid, ref->ref.name); - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write packed reference"); -} - -/* - * Find out what object this reference resolves to. - * - * For references that point to a 'big' tag (e.g. an - * actual tag object on the repository), we need to - * cache on the packfile the OID of the object to - * which that 'big tag' is pointing to. - */ -static int packed_find_peel(reference_oid *ref) -{ - git_object *object; - int error; - - if (ref->ref.type & GIT_REF_HAS_PEEL) - return GIT_SUCCESS; - - /* - * Only applies to tags, i.e. references - * in the /refs/tags folder - */ - if (git__prefixcmp(ref->ref.name, GIT_REFS_TAGS_DIR) != 0) - return GIT_SUCCESS; - - /* - * Find the tagged object in the repository - */ - error = git_object_lookup(&object, ref->ref.owner, &ref->oid, GIT_OBJ_ANY); - if (error < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to find packed reference"); - - /* - * If the tagged object is a Tag object, we need to resolve it; - * if the ref is actually a 'weak' ref, we don't need to resolve - * anything. - */ - if (git_object_type(object) == GIT_OBJ_TAG) { - git_tag *tag = (git_tag *)object; - - /* - * Find the object pointed at by this tag - */ - git_oid_cpy(&ref->peel_target, git_tag_target_oid(tag)); - ref->ref.type |= GIT_REF_HAS_PEEL; - - /* - * The reference has now cached the resolved OID, and is - * marked at such. When written to the packfile, it'll be - * accompanied by this resolved oid - */ - } - - git_object_close(object); - - return GIT_SUCCESS; -} - -/* - * Remove all loose references - * - * Once we have successfully written a packfile, - * all the loose references that were packed must be - * removed from disk. - * - * This is a dangerous method; make sure the packfile - * is well-written, because we are destructing references - * here otherwise. - */ -static int packed_remove_loose(git_repository *repo, git_vector *packing_list) -{ - unsigned int i; - char full_path[GIT_PATH_MAX]; - int error = GIT_SUCCESS; - git_reference *reference; - - for (i = 0; i < packing_list->length; ++i) { - git_reference *ref = git_vector_get(packing_list, i); - - /* Ensure the packed reference doesn't exist - * in a (more up-to-date?) state as a loose reference - */ - reference = git_hashtable_lookup(ref->owner->references.loose_cache, ref->name); - if (reference != NULL) - continue; - - git_path_join(full_path, repo->path_repository, ref->name); - - if (git_futils_exists(full_path) == GIT_SUCCESS && - p_unlink(full_path) < GIT_SUCCESS) - error = GIT_EOSERR; - - /* - * if we fail to remove a single file, this is *not* good, - * but we should keep going and remove as many as possible. - * After we've removed as many files as possible, we return - * the error code anyway. - * - * TODO: mark this with a very special error code? - * GIT_EFAILTORMLOOSE - */ - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to remove loose packed reference"); -} - -static int packed_sort(const void *a, const void *b) -{ - const git_reference *ref_a = (const git_reference *)a; - const git_reference *ref_b = (const git_reference *)b; - - return strcmp(ref_a->name, ref_b->name); -} - -/* - * Write all the contents in the in-memory packfile to disk. - */ -static int packed_write(git_repository *repo) -{ - git_filebuf pack_file; - int error; - unsigned int i; - char pack_file_path[GIT_PATH_MAX]; - - git_vector packing_list; - size_t total_refs; - - assert(repo && repo->references.packfile); - - total_refs = repo->references.packfile->key_count; - if ((error = git_vector_init(&packing_list, total_refs, packed_sort)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write packed reference"); - - /* Load all the packfile into a vector */ - { - git_reference *reference; - const void *GIT_UNUSED(_unused); - - GIT_HASHTABLE_FOREACH(repo->references.packfile, _unused, reference, - git_vector_insert(&packing_list, reference); /* cannot fail: vector already has the right size */ - ); - } - - /* sort the vector so the entries appear sorted on the packfile */ - git_vector_sort(&packing_list); - - /* Now we can open the file! */ - git_path_join(pack_file_path, repo->path_repository, GIT_PACKEDREFS_FILE); - if ((error = git_filebuf_open(&pack_file, pack_file_path, 0)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write packed reference"); - - /* Packfiles have a header... apparently - * This is in fact not required, but we might as well print it - * just for kicks */ - if ((error = git_filebuf_printf(&pack_file, "%s\n", GIT_PACKEDREFS_HEADER)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to write packed reference"); - - for (i = 0; i < packing_list.length; ++i) { - reference_oid *ref = (reference_oid *)git_vector_get(&packing_list, i); - - /* only direct references go to the packfile; otherwise - * this is a disaster */ - assert(ref->ref.type & GIT_REF_OID); - - if ((error = packed_find_peel(ref)) < GIT_SUCCESS) { - error = git__throw(GIT_EOBJCORRUPTED, "A reference cannot be peeled"); - goto cleanup; - } - - - if ((error = packed_write_ref(ref, &pack_file)) < GIT_SUCCESS) - goto cleanup; - } - -cleanup: - /* if we've written all the references properly, we can commit - * the packfile to make the changes effective */ - if (error == GIT_SUCCESS) { - error = git_filebuf_commit(&pack_file); - - /* when and only when the packfile has been properly written, - * we can go ahead and remove the loose refs */ - if (error == GIT_SUCCESS) { - struct stat st; - - error = packed_remove_loose(repo, &packing_list); - - if (p_stat(pack_file_path, &st) == GIT_SUCCESS) - repo->references.packfile_time = st.st_mtime; - } - } - else git_filebuf_cleanup(&pack_file); - - git_vector_free(&packing_list); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write packed reference"); -} - -static int _reference_available_cb(const char *ref, void *data) -{ - const char *new, *old; - git_vector *refs; - - assert(ref && data); - - refs = (git_vector *)data; - - new = (const char *)git_vector_get(refs, 0); - old = (const char *)git_vector_get(refs, 1); - - if (!old || strcmp(old, ref)) { - int reflen = strlen(ref); - int newlen = strlen(new); - int cmplen = reflen < newlen ? reflen : newlen; - const char *lead = reflen < newlen ? new : ref; - - if (!strncmp(new, ref, cmplen) && - lead[cmplen] == '/') - return GIT_EEXISTS; - } - - return GIT_SUCCESS; -} - -static int reference_available(git_repository *repo, const char *ref, const char* old_ref) -{ - int error; - git_vector refs; - - if (git_vector_init(&refs, 2, NULL) < GIT_SUCCESS) - return GIT_ENOMEM; - - git_vector_insert(&refs, (void *)ref); - git_vector_insert(&refs, (void *)old_ref); - - error = git_reference_foreach(repo, GIT_REF_LISTALL, _reference_available_cb, (void *)&refs); - - git_vector_free(&refs); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__throw(GIT_EEXISTS, "Reference name `%s` conflicts with existing reference", ref); -} - -/***************************************** - * External Library API - *****************************************/ - -/** - * Constructors - */ -int git_reference_lookup(git_reference **ref_out, git_repository *repo, const char *name) -{ - int error; - char normalized_name[GIT_REFNAME_MAX]; - - assert(ref_out && repo && name); - - *ref_out = NULL; - - error = normalize_name(normalized_name, sizeof(normalized_name), name, 0); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to lookup reference"); - - /* First, check has been previously loaded and cached */ - *ref_out = git_hashtable_lookup(repo->references.loose_cache, normalized_name); - if (*ref_out != NULL) - return loose_update(*ref_out); - - /* Then check if there is a loose file for that reference.*/ - error = loose_lookup(ref_out, repo, normalized_name, 0); - - /* If the file exists, we store it on the cache */ - if (error == GIT_SUCCESS) - return git_hashtable_insert(repo->references.loose_cache, (*ref_out)->name, (*ref_out)); - - /* The loose lookup has failed, but not because the reference wasn't found; - * probably the loose reference is corrupted. this is bad. */ - if (error != GIT_ENOTFOUND) - return git__rethrow(error, "Failed to lookup reference"); - - /* - * If we cannot find a loose reference, we look into the packfile - * Load the packfile first if it hasn't been loaded - */ - /* load all the packed references */ - error = packed_load(repo); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to lookup reference"); - - /* Look up on the packfile */ - *ref_out = git_hashtable_lookup(repo->references.packfile, normalized_name); - if (*ref_out != NULL) - return GIT_SUCCESS; - - /* The reference doesn't exist anywhere */ - return git__throw(GIT_ENOTFOUND, "Failed to lookup reference. Reference doesn't exist"); -} - -/** - * Getters - */ -git_rtype git_reference_type(git_reference *ref) -{ - assert(ref); - - if (ref->type & GIT_REF_OID) - return GIT_REF_OID; - - if (ref->type & GIT_REF_SYMBOLIC) - return GIT_REF_SYMBOLIC; - - return GIT_REF_INVALID; -} - -const char *git_reference_name(git_reference *ref) -{ - assert(ref); - return ref->name; -} - -git_repository *git_reference_owner(git_reference *ref) -{ - assert(ref); - return ref->owner; -} - -const git_oid *git_reference_oid(git_reference *ref) -{ - assert(ref); - - if ((ref->type & GIT_REF_OID) == 0) - return NULL; - - if (loose_update(ref) < GIT_SUCCESS) - return NULL; - - return &((reference_oid *)ref)->oid; -} - -const char *git_reference_target(git_reference *ref) -{ - assert(ref); - - if ((ref->type & GIT_REF_SYMBOLIC) == 0) - return NULL; - - if (loose_update(ref) < GIT_SUCCESS) - return NULL; - - return ((reference_symbolic *)ref)->target; -} - -int git_reference_create_symbolic(git_reference **ref_out, git_repository *repo, const char *name, const char *target, int force) -{ - char normalized[GIT_REFNAME_MAX]; - int error = GIT_SUCCESS, updated = 0; - git_reference *ref = NULL, *old_ref = NULL; - - if (git_reference_lookup(&ref, repo, name) == GIT_SUCCESS && !force) - return git__throw(GIT_EEXISTS, "Failed to create symbolic reference. Reference already exists"); - - /* - * If they old ref was of the same type, then we can just update - * it (once we've checked that the target is valid). Otherwise we - * need a new reference because we can't make a symbolic ref out - * of an oid one. - * If if didn't exist, then we need to create a new one anyway. - */ - if (ref && ref->type & GIT_REF_SYMBOLIC){ - updated = 1; - } else { - ref = NULL; - error = reference_create(&ref, repo, name, GIT_REF_SYMBOLIC); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* The target can aither be the name of an object id reference or the name of another symbolic reference */ - error = normalize_name(normalized, sizeof(normalized), target, 0); - if (error < GIT_SUCCESS) - goto cleanup; - - /* set the target; this will write the reference on disk */ - error = git_reference_set_target(ref, normalized); - if (error < GIT_SUCCESS) - goto cleanup; - - /* - * If we didn't update the ref, then we need to insert or replace - * it in the loose cache. If we replaced a ref, free it. - */ - if (!updated){ - error = git_hashtable_insert2(repo->references.loose_cache, ref->name, ref, (void **) &old_ref); - if (error < GIT_SUCCESS) - goto cleanup; - - if(old_ref) - reference_free(old_ref); - } - - *ref_out = ref; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create symbolic reference"); - -cleanup: - reference_free(ref); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create symbolic reference"); -} - -int git_reference_create_oid(git_reference **ref_out, git_repository *repo, const char *name, const git_oid *id, int force) -{ - int error = GIT_SUCCESS, updated = 0; - git_reference *ref = NULL, *old_ref = NULL; - - if(git_reference_lookup(&ref, repo, name) == GIT_SUCCESS && !force) - return git__throw(GIT_EEXISTS, "Failed to create reference OID. Reference already exists"); - - if ((error = reference_available(repo, name, NULL)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to create reference"); - - /* - * If they old ref was of the same type, then we can just update - * it (once we've checked that the target is valid). Otherwise we - * need a new reference because we can't make a symbolic ref out - * of an oid one. - * If if didn't exist, then we need to create a new one anyway. - */ - if (ref && ref-> type & GIT_REF_OID){ - updated = 1; - } else { - ref = NULL; - error = reference_create(&ref, repo, name, GIT_REF_OID); - if (error < GIT_SUCCESS) - goto cleanup; - } - - /* set the oid; this will write the reference on disk */ - error = git_reference_set_oid(ref, id); - if (error < GIT_SUCCESS) - goto cleanup; - - if(!updated){ - error = git_hashtable_insert2(repo->references.loose_cache, ref->name, ref, (void **) &old_ref); - if (error < GIT_SUCCESS) - goto cleanup; - - if(old_ref) - reference_free(old_ref); - } - - *ref_out = ref; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create reference OID"); - -cleanup: - reference_free(ref); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create reference OID"); -} - -/** - * Setters - */ - -/* - * Change the OID target of a reference. - * - * For loose references, just change the oid in memory - * and overwrite the file in disk. - * - * For packed files, this is not pretty: - * For performance reasons, we write the new reference - * loose on disk (it replaces the old on the packfile), - * but we cannot invalidate the pointer to the reference, - * and most importantly, the `packfile` object must stay - * consistent with the representation of the packfile - * on disk. This is what we need to: - * - * 1. Copy the reference - * 2. Change the oid on the original - * 3. Write the original to disk - * 4. Write the original to the loose cache - * 5. Replace the original with the copy (old reference) in the packfile cache - */ -int git_reference_set_oid(git_reference *ref, const git_oid *id) -{ - reference_oid *ref_oid; - reference_oid *ref_old = NULL; - int error = GIT_SUCCESS; - - if ((ref->type & GIT_REF_OID) == 0) - return git__throw(GIT_EINVALIDREFSTATE, "Failed to set OID target of reference. Not an OID reference"); - - ref_oid = (reference_oid *)ref; - - assert(ref->owner); - - /* Don't let the user create references to OIDs that - * don't exist in the ODB */ - if (!git_odb_exists(git_repository_database(ref->owner), id)) - return git__throw(GIT_ENOTFOUND, "Failed to set OID target of reference. OID doesn't exist in ODB"); - - /* duplicate the reference; - * this copy will stay on the packfile cache */ - if (ref->type & GIT_REF_PACKED) { - ref_old = git__malloc(sizeof(reference_oid)); - if (ref_old == NULL) - return GIT_ENOMEM; - - ref_old->ref.name = git__strdup(ref->name); - if (ref_old->ref.name == NULL) { - free(ref_old); - return GIT_ENOMEM; - } - } - - git_oid_cpy(&ref_oid->oid, id); - ref->type &= ~GIT_REF_HAS_PEEL; - - error = loose_write(ref); - if (error < GIT_SUCCESS) - goto cleanup; - - if (ref->type & GIT_REF_PACKED) { - /* insert the original on the loose cache */ - error = git_hashtable_insert(ref->owner->references.loose_cache, ref->name, ref); - if (error < GIT_SUCCESS) - goto cleanup; - - ref->type &= ~GIT_REF_PACKED; - - /* replace the original in the packfile with the copy */ - error = git_hashtable_insert(ref->owner->references.packfile, ref_old->ref.name, ref_old); - if (error < GIT_SUCCESS) - goto cleanup; - } - - return GIT_SUCCESS; - -cleanup: - reference_free((git_reference *)ref_old); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to set OID target of reference"); -} - -/* - * Change the target of a symbolic reference. - * - * This is easy because symrefs cannot be inside - * a pack. We just change the target in memory - * and overwrite the file on disk. - */ -int git_reference_set_target(git_reference *ref, const char *target) -{ - reference_symbolic *ref_sym; - - if ((ref->type & GIT_REF_SYMBOLIC) == 0) - return git__throw(GIT_EINVALIDREFSTATE, "Failed to set reference target. Not a symbolic reference"); - - ref_sym = (reference_symbolic *)ref; - - free(ref_sym->target); - ref_sym->target = git__strdup(target); - if (ref_sym->target == NULL) - return GIT_ENOMEM; - - return loose_write(ref); -} - -/** - * Other - */ - -int git_reference_rename(git_reference *ref, const char *new_name, int force) -{ - int error; - char *old_name = NULL; - - char aux_path[GIT_PATH_MAX]; - char normalized[GIT_REFNAME_MAX]; - - const char *target_ref = NULL; - const char *head_target = NULL; - const git_oid *target_oid = NULL; - git_reference *new_ref = NULL, *old_ref = NULL, *head = NULL; - - assert(ref); - - error = normalize_name(normalized, sizeof(normalized), new_name, ref->type & GIT_REF_OID); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to rename reference. Invalid name"); - - new_name = normalized; - - error = git_reference_lookup(&new_ref, ref->owner, new_name); - if (error == GIT_SUCCESS) { - if (!force) - return git__throw(GIT_EEXISTS, "Failed to rename reference. Reference already exists"); - - error = git_reference_delete(new_ref); - } - - if (error < GIT_SUCCESS && error != GIT_ENOTFOUND) - goto cleanup; - - if ((error = reference_available(ref->owner, new_name, ref->name)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to rename reference. Reference already exists"); - - /* - * First, we backup the reference targets. Just keeping the old - * reference won't work, since we may have to remove it to create - * the new reference, e.g. when renaming foo/bar -> foo. - */ - - old_name = git__strdup(ref->name); - - if (ref->type & GIT_REF_SYMBOLIC) { - if ((target_ref = git_reference_target(ref)) == NULL) - goto cleanup; - } else { - if ((target_oid = git_reference_oid(ref)) == NULL) - goto cleanup; - } - - /* - * Now delete the old ref and remove an possibly existing directory - * named `new_name`. - */ - - if (ref->type & GIT_REF_PACKED) { - ref->type &= ~GIT_REF_PACKED; - - git_hashtable_remove(ref->owner->references.packfile, old_name); - if ((error = packed_write(ref->owner)) < GIT_SUCCESS) - goto rollback; - } else { - git_path_join(aux_path, ref->owner->path_repository, old_name); - if ((error = p_unlink(aux_path)) < GIT_SUCCESS) - goto cleanup; - - git_hashtable_remove(ref->owner->references.loose_cache, old_name); - } - - /* build new path */ - git_path_join(aux_path, ref->owner->path_repository, new_name); - - if (git_futils_exists(aux_path) == GIT_SUCCESS) { - if (git_futils_isdir(aux_path) == GIT_SUCCESS) { - if ((error = git_futils_rmdir_r(aux_path, 0)) < GIT_SUCCESS) - goto rollback; - } else goto rollback; - } - - /* - * Crude hack: delete any logs till we support proper reflogs. - * Otherwise git.git will possibly fail and leave a mess. git.git - * writes reflogs by default in any repo with a working directory: - * - * "We only enable reflogs in repositories that have a working directory - * associated with them, as shared/bare repositories do not have - * an easy means to prune away old log entries, or may fail logging - * entirely if the user's gecos information is not valid during a push. - * This heuristic was suggested on the mailing list by Junio." - * - * Shawn O. Pearce - 0bee59186976b1d9e6b2dd77332480c9480131d5 - * - * TODO - * - */ - - git_path_join_n(aux_path, 3, ref->owner->path_repository, "logs", old_name); - if (git_futils_isfile(aux_path) == GIT_SUCCESS) { - if ((error = p_unlink(aux_path)) < GIT_SUCCESS) - goto rollback; - } - - /* - * Finally we can create the new reference. - */ - if (ref->type & GIT_REF_SYMBOLIC) { - if ((error = git_reference_create_symbolic(&new_ref, ref->owner, new_name, target_ref, 0)) < GIT_SUCCESS) - goto rollback; - } else { - if ((error = git_reference_create_oid(&new_ref, ref->owner, new_name, target_oid, 0)) < GIT_SUCCESS) - goto rollback; - } - - free(ref->name); - ref->name = new_ref->name; - - /* - * No need in new_ref anymore. We created it to fix the change on disk. - * TODO: Refactoring required. - */ - new_ref->name = NULL; - reference_free(new_ref); - - if ((error = git_hashtable_insert2(ref->owner->references.loose_cache, ref->name, ref, (void **)&old_ref)) < GIT_SUCCESS) - goto rollback; - - /* - * Check if we have to update HEAD. - */ - - if ((error = git_reference_lookup(&head, ref->owner, GIT_HEAD_FILE)) < GIT_SUCCESS) - goto cleanup; - - head_target = git_reference_target(head); - - if (head_target && !strcmp(head_target, old_name)) - if ((error = git_reference_create_symbolic(&head, ref->owner, "HEAD", ref->name, 1)) < GIT_SUCCESS) - goto rollback; - -cleanup: - free(old_name); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to rename reference"); - -rollback: - /* - * Try to create the old reference again. - */ - if (ref->type & GIT_REF_SYMBOLIC) - error = git_reference_create_symbolic(&new_ref, ref->owner, old_name, target_ref, 0); - else - error = git_reference_create_oid(&new_ref, ref->owner, old_name, target_oid, 0); - - ref->name = old_name; - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to rename reference. Failed to rollback"); -} - -/* - * Delete a reference. - * - * If the reference is packed, this is an expensive - * operation. We need to remove the reference from - * the memory cache and then rewrite the whole pack - * - * If the reference is loose, we remove it on - * the filesystem and update the in-memory cache - * accordingly. We also make sure that an older version - * of it doesn't exist as a packed reference. If this - * is the case, this packed reference is removed as well. - * - * This obviously invalidates the `ref` pointer. - */ -int git_reference_delete(git_reference *ref) -{ - int error; - git_reference *reference; - - assert(ref); - - if (ref->type & GIT_REF_PACKED) { - /* load the existing packfile */ - if ((error = packed_load(ref->owner)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to delete reference"); - - if (git_hashtable_remove(ref->owner->references.packfile, ref->name) < GIT_SUCCESS) - return git__throw(GIT_ENOTFOUND, "Reference not found"); - - error = packed_write(ref->owner); - } else { - char full_path[GIT_PATH_MAX]; - git_path_join(full_path, ref->owner->path_repository, ref->name); - git_hashtable_remove(ref->owner->references.loose_cache, ref->name); - error = p_unlink(full_path); - if (error < GIT_SUCCESS) - goto cleanup; - - /* When deleting a loose reference, we have to ensure that an older - * packed version of it doesn't exist - */ - if (!git_reference_lookup(&reference, ref->owner, ref->name)) { - assert((reference->type & GIT_REF_PACKED) != 0); - error = git_reference_delete(reference); - } - } - -cleanup: - reference_free(ref); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to delete reference"); -} - -int git_reference_resolve(git_reference **resolved_ref, git_reference *ref) -{ - git_repository *repo; - int error, i; - - assert(resolved_ref && ref); - *resolved_ref = NULL; - - if ((error = loose_update(ref)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to resolve reference"); - - repo = ref->owner; - - for (i = 0; i < MAX_NESTING_LEVEL; ++i) { - reference_symbolic *ref_sym; - - *resolved_ref = ref; - - if (ref->type & GIT_REF_OID) - return GIT_SUCCESS; - - ref_sym = (reference_symbolic *)ref; - if ((error = git_reference_lookup(&ref, repo, ref_sym->target)) < GIT_SUCCESS) - return error; - } - - return git__throw(GIT_ENOMEM, "Failed to resolve reference. Reference is too nested"); -} - -int git_reference_packall(git_repository *repo) -{ - int error; - - /* load the existing packfile */ - if ((error = packed_load(repo)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to pack references"); - - /* update it in-memory with all the loose references */ - if ((error = packed_loadloose(repo)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to pack references"); - - /* write it back to disk */ - return packed_write(repo); -} - -int git_reference_foreach(git_repository *repo, unsigned int list_flags, int (*callback)(const char *, void *), void *payload) -{ - int error; - struct dirent_list_data data; - char refs_path[GIT_PATH_MAX]; - - /* list all the packed references first */ - if (list_flags & GIT_REF_PACKED) { - const char *ref_name; - void *GIT_UNUSED(_unused); - - if ((error = packed_load(repo)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to list references"); - - GIT_HASHTABLE_FOREACH(repo->references.packfile, ref_name, _unused, - if ((error = callback(ref_name, payload)) < GIT_SUCCESS) - return git__throw(error, "Failed to list references. User callback failed"); - ); - } - - /* now list the loose references, trying not to - * duplicate the ref names already in the packed-refs file */ - - data.repo_path_len = strlen(repo->path_repository); - data.list_flags = list_flags; - data.repo = repo; - data.callback = callback; - data.callback_payload = payload; - - - git_path_join(refs_path, repo->path_repository, GIT_REFS_DIR); - return git_futils_direach(refs_path, GIT_PATH_MAX, _dirent_loose_listall, &data); -} - -int cb__reflist_add(const char *ref, void *data) -{ - return git_vector_insert((git_vector *)data, git__strdup(ref)); -} - -int git_reference_listall(git_strarray *array, git_repository *repo, unsigned int list_flags) -{ - int error; - git_vector ref_list; - - assert(array && repo); - - array->strings = NULL; - array->count = 0; - - if (git_vector_init(&ref_list, 8, NULL) < GIT_SUCCESS) - return GIT_ENOMEM; - - error = git_reference_foreach(repo, list_flags, &cb__reflist_add, (void *)&ref_list); - - if (error < GIT_SUCCESS) { - git_vector_free(&ref_list); - return error; - } - - array->strings = (char **)ref_list.contents; - array->count = ref_list.length; - return GIT_SUCCESS; -} - - - - -/***************************************** - * Init/free (repository API) - *****************************************/ -int git_repository__refcache_init(git_refcache *refs) -{ - assert(refs); - - refs->loose_cache = git_hashtable_alloc( - default_table_size, - reftable_hash, - (git_hash_keyeq_ptr)(&git__strcmp_cb)); - - /* packfile loaded lazily */ - refs->packfile = NULL; - refs->packfile_time = 0; - - return (refs->loose_cache) ? GIT_SUCCESS : GIT_ENOMEM; -} - -void git_repository__refcache_free(git_refcache *refs) -{ - git_reference *reference; - const void *GIT_UNUSED(_unused); - - assert(refs); - - GIT_HASHTABLE_FOREACH(refs->loose_cache, _unused, reference, - reference_free(reference); - ); - - git_hashtable_free(refs->loose_cache); - - if (refs->packfile) { - GIT_HASHTABLE_FOREACH(refs->packfile, _unused, reference, - reference_free(reference); - ); - - git_hashtable_free(refs->packfile); - } -} - - - -/***************************************** - * Name normalization - *****************************************/ -static int check_valid_ref_char(char ch) -{ - if ((unsigned) ch <= ' ') - return GIT_ERROR; - - switch (ch) { - case '~': - case '^': - case ':': - case '\\': - case '?': - case '[': - case '*': - return GIT_ERROR; - default: - return GIT_SUCCESS; - } -} - -static int normalize_name(char *buffer_out, size_t out_size, const char *name, int is_oid_ref) -{ - const char *name_end, *buffer_out_start; - const char *current; - int contains_a_slash = 0; - - assert(name && buffer_out); - - buffer_out_start = buffer_out; - current = name; - name_end = name + strlen(name); - - /* Terminating null byte */ - out_size--; - - /* A refname can not be empty */ - if (name_end == name) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name is empty"); - - /* A refname can not end with a dot or a slash */ - if (*(name_end - 1) == '.' || *(name_end - 1) == '/') - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name ends with dot or slash"); - - while (current < name_end && out_size) { - if (check_valid_ref_char(*current)) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name contains invalid characters"); - - if (buffer_out > buffer_out_start) { - char prev = *(buffer_out - 1); - - /* A refname can not start with a dot nor contain a double dot */ - if (*current == '.' && ((prev == '.') || (prev == '/'))) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name starts with a dot or contains a double dot"); - - /* '@{' is forbidden within a refname */ - if (*current == '{' && prev == '@') - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name contains '@{'"); - - /* Prevent multiple slashes from being added to the output */ - if (*current == '/' && prev == '/') { - current++; - continue; - } - } - - if (*current == '/') - contains_a_slash = 1; - - *buffer_out++ = *current++; - out_size--; - } - - if (!out_size) - return git__throw(GIT_EINVALIDREFNAME, "Reference name is too long"); - - /* Object id refname have to contain at least one slash, except - * for HEAD in a detached state or MERGE_HEAD if we're in the - * middle of a merge */ - if (is_oid_ref && !contains_a_slash && (strcmp(name, GIT_HEAD_FILE) && strcmp(name, GIT_MERGE_HEAD_FILE))) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name contains no slashes"); - - /* A refname can not end with ".lock" */ - if (!git__suffixcmp(name, GIT_FILELOCK_EXTENSION)) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name ends with '.lock'"); - - *buffer_out = '\0'; - - /* - * For object id references, name has to start with refs/. Again, - * we need to allow HEAD to be in a detached state. - */ - if (is_oid_ref && !(git__prefixcmp(buffer_out_start, GIT_REFS_DIR) || - strcmp(buffer_out_start, GIT_HEAD_FILE))) - return git__throw(GIT_EINVALIDREFNAME, "Failed to normalize name. Reference name does not start with 'refs/'"); - - return GIT_SUCCESS; -} - -int git_reference__normalize_name(char *buffer_out, size_t out_size, const char *name) -{ - return normalize_name(buffer_out, out_size, name, 0); -} - -int git_reference__normalize_name_oid(char *buffer_out, size_t out_size, const char *name) -{ - return normalize_name(buffer_out, out_size, name, 1); -} diff --git a/vendor/libgit2/src/refs.h b/vendor/libgit2/src/refs.h deleted file mode 100644 index dfac455e0..000000000 --- a/vendor/libgit2/src/refs.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef INCLUDE_refs_h__ -#define INCLUDE_refs_h__ - -#include "common.h" -#include "git2/oid.h" -#include "git2/refs.h" -#include "hashtable.h" - -#define GIT_REFS_DIR "refs/" -#define GIT_REFS_HEADS_DIR GIT_REFS_DIR "heads/" -#define GIT_REFS_TAGS_DIR GIT_REFS_DIR "tags/" -#define GIT_REFS_REMOTES_DIR GIT_REFS_DIR "remotes/" - -#define GIT_RENAMED_REF_FILE GIT_REFS_DIR "RENAMED-REF" - -#define GIT_SYMREF "ref: " -#define GIT_PACKEDREFS_FILE "packed-refs" -#define GIT_PACKEDREFS_HEADER "# pack-refs with: peeled " - -#define GIT_HEAD_FILE "HEAD" -#define GIT_MERGE_HEAD_FILE "MERGE_HEAD" -#define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master" - -#define GIT_REFNAME_MAX 1024 - -struct git_reference { - git_repository *owner; - char *name; - unsigned int type; - time_t mtime; -}; - -typedef struct { - git_hashtable *packfile; - git_hashtable *loose_cache; - time_t packfile_time; -} git_refcache; - - -void git_repository__refcache_free(git_refcache *refs); -int git_repository__refcache_init(git_refcache *refs); - -int git_reference__normalize_name(char *buffer_out, size_t out_size, const char *name); -int git_reference__normalize_name_oid(char *buffer_out, size_t out_size, const char *name); - -#endif diff --git a/vendor/libgit2/src/refspec.c b/vendor/libgit2/src/refspec.c deleted file mode 100644 index 8500e07ea..000000000 --- a/vendor/libgit2/src/refspec.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/errors.h" - -#include "common.h" -#include "refspec.h" -#include "util.h" - -int git_refspec_parse(git_refspec *refspec, const char *str) -{ - char *delim; - - memset(refspec, 0x0, sizeof(git_refspec)); - - if (*str == '+') { - refspec->force = 1; - str++; - } - - delim = strchr(str, ':'); - if (delim == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse refspec. No ':'"); - - refspec->src = git__strndup(str, delim - str); - if (refspec->src == NULL) - return GIT_ENOMEM; - - refspec->dst = git__strdup(delim + 1); - if (refspec->dst == NULL) { - free(refspec->src); - refspec->src = NULL; - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -const char *git_refspec_src(const git_refspec *refspec) -{ - return refspec->src; -} - -const char *git_refspec_dst(const git_refspec *refspec) -{ - return refspec->dst; -} - -int git_refspec_src_match(const git_refspec *refspec, const char *refname) -{ - return git__fnmatch(refspec->src, refname, 0); -} - -int git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, const char *name) -{ - size_t baselen, namelen; - - baselen = strlen(spec->dst); - if (outlen <= baselen) - return git__throw(GIT_EINVALIDREFNAME, "Reference name too long"); - - /* - * No '*' at the end means that it's mapped to one specific local - * branch, so no actual transformation is needed. - */ - if (spec->dst[baselen - 1] != '*') { - memcpy(out, spec->dst, baselen + 1); /* include '\0' */ - return GIT_SUCCESS; - } - - /* There's a '*' at the end, so remove its length */ - baselen--; - - /* skip the prefix, -1 is for the '*' */ - name += strlen(spec->src) - 1; - - namelen = strlen(name); - - if (outlen <= baselen + namelen) - return git__throw(GIT_EINVALIDREFNAME, "Reference name too long"); - - memcpy(out, spec->dst, baselen); - memcpy(out + baselen, name, namelen + 1); - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/refspec.h b/vendor/libgit2/src/refspec.h deleted file mode 100644 index 230135a4a..000000000 --- a/vendor/libgit2/src/refspec.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef INCLUDE_refspec_h__ -#define INCLUDE_refspec_h__ - -#include "git2/refspec.h" - -struct git_refspec { - int force; - char *src; - char *dst; -}; - -int git_refspec_parse(struct git_refspec *refspec, const char *str); - -#endif diff --git a/vendor/libgit2/src/remote.c b/vendor/libgit2/src/remote.c deleted file mode 100644 index 297789a69..000000000 --- a/vendor/libgit2/src/remote.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/remote.h" -#include "git2/config.h" -#include "git2/types.h" - -#include "config.h" -#include "repository.h" -#include "remote.h" -#include "fetch.h" -#include "refs.h" - -static int refspec_parse(git_refspec *refspec, const char *str) -{ - char *delim; - - memset(refspec, 0x0, sizeof(git_refspec)); - - if (*str == '+') { - refspec->force = 1; - str++; - } - - delim = strchr(str, ':'); - if (delim == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse refspec. No ':'"); - - refspec->src = git__strndup(str, delim - str); - if (refspec->src == NULL) - return GIT_ENOMEM; - - refspec->dst = git__strdup(delim + 1); - if (refspec->dst == NULL) { - free(refspec->src); - refspec->src = NULL; - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -static int parse_remote_refspec(git_config *cfg, git_refspec *refspec, const char *var) -{ - const char *val; - int error; - - error = git_config_get_string(cfg, var, &val); - if (error < GIT_SUCCESS) - return error; - - return refspec_parse(refspec, val); -} - -int git_remote_new(git_remote **out, git_repository *repo, const char *url) -{ - git_remote *remote; - - remote = git__malloc(sizeof(git_remote)); - if (remote == NULL) - return GIT_ENOMEM; - - memset(remote, 0x0, sizeof(git_remote)); - remote->repo = repo; - remote->url = git__strdup(url); - if (remote->url == NULL) { - free(remote); - return GIT_ENOMEM; - } - - *out = remote; - return GIT_SUCCESS; -} - -int git_remote_get(git_remote **out, git_config *cfg, const char *name) -{ - git_remote *remote; - char *buf = NULL; - const char *val; - int ret, error, buf_len; - - remote = git__malloc(sizeof(git_remote)); - if (remote == NULL) - return GIT_ENOMEM; - - memset(remote, 0x0, sizeof(git_remote)); - remote->name = git__strdup(name); - if (remote->name == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - /* "fetch" is the longest var name we're interested in */ - buf_len = strlen("remote.") + strlen(".fetch") + strlen(name) + 1; - buf = git__malloc(buf_len); - if (buf == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - ret = p_snprintf(buf, buf_len, "%s.%s.%s", "remote", name, "url"); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to build config var name"); - goto cleanup; - } - - error = git_config_get_string(cfg, buf, &val); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Remote's url doesn't exist"); - goto cleanup; - } - - remote->repo = cfg->repo; - remote->url = git__strdup(val); - if (remote->url == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - ret = p_snprintf(buf, buf_len, "%s.%s.%s", "remote", name, "fetch"); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to build config var name"); - goto cleanup; - } - - error = parse_remote_refspec(cfg, &remote->fetch, buf); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to get fetch refspec"); - goto cleanup; - } - - ret = p_snprintf(buf, buf_len, "%s.%s.%s", "remote", name, "push"); - if (ret < 0) { - error = git__throw(GIT_EOSERR, "Failed to build config var name"); - goto cleanup; - } - - error = parse_remote_refspec(cfg, &remote->push, buf); - /* Not finding push is fine */ - if (error == GIT_ENOTFOUND) - error = GIT_SUCCESS; - - if (error < GIT_SUCCESS) - goto cleanup; - - *out = remote; - -cleanup: - free(buf); - if (error < GIT_SUCCESS) - git_remote_free(remote); - - return error; -} - -const char *git_remote_name(struct git_remote *remote) -{ - return remote->name; -} - -const char *git_remote_url(struct git_remote *remote) -{ - return remote->url; -} - -const git_refspec *git_remote_fetchspec(struct git_remote *remote) -{ - return &remote->fetch; -} - -const git_refspec *git_remote_pushspec(struct git_remote *remote) -{ - return &remote->push; -} - -int git_remote_connect(git_remote *remote, int direction) -{ - int error; - git_transport *t; - - error = git_transport_new(&t, remote->url); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create transport"); - - error = t->connect(t, direction); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to connect the transport"); - goto cleanup; - } - - remote->transport = t; - -cleanup: - if (error < GIT_SUCCESS) - t->free(t); - - return error; -} - -int git_remote_ls(git_remote *remote, git_headarray *refs) -{ - return remote->transport->ls(remote->transport, refs); -} - -int git_remote_negotiate(git_remote *remote) -{ - return git_fetch_negotiate(remote); -} - -int git_remote_download(char **filename, git_remote *remote) -{ - return git_fetch_download_pack(filename, remote); -} - -git_headarray *git_remote_tips(git_remote *remote) -{ - return &remote->refs; -} - -int git_remote_update_tips(struct git_remote *remote) -{ - int error = GIT_SUCCESS; - unsigned int i; - char refname[GIT_PATH_MAX]; - git_headarray *refs = &remote->refs; - git_remote_head *head; - git_reference *ref; - struct git_refspec *spec = &remote->fetch; - - memset(refname, 0x0, sizeof(refname)); - - for (i = 0; i < refs->len; ++i) { - head = refs->heads[i]; - error = git_refspec_transform(refname, sizeof(refname), spec, head->name); - if (error < GIT_SUCCESS) - return error; - - error = git_reference_create_oid(&ref, remote->repo, refname, &head->oid, 1); - if (error < GIT_SUCCESS) - return error; - } - - return GIT_SUCCESS; -} - -void git_remote_free(git_remote *remote) -{ - free(remote->fetch.src); - free(remote->fetch.dst); - free(remote->push.src); - free(remote->push.dst); - free(remote->url); - free(remote->name); - if (remote->transport != NULL) { - if (remote->transport->connected) - remote->transport->close(remote->transport); - - remote->transport->free(remote->transport); - } - free(remote); -} diff --git a/vendor/libgit2/src/remote.h b/vendor/libgit2/src/remote.h deleted file mode 100644 index 21313acd4..000000000 --- a/vendor/libgit2/src/remote.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef INCLUDE_remote_h__ -#define INCLUDE_remote_h__ - -#include "refspec.h" -#include "transport.h" -#include "repository.h" - -struct git_remote { - char *name; - char *url; - git_headarray refs; - struct git_refspec fetch; - struct git_refspec push; - git_transport *transport; - git_repository *repo; - int need_pack:1; -}; - -#endif diff --git a/vendor/libgit2/src/repository.c b/vendor/libgit2/src/repository.c deleted file mode 100644 index 1b06c4f03..000000000 --- a/vendor/libgit2/src/repository.c +++ /dev/null @@ -1,794 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include - -#include "git2/object.h" - -#include "common.h" -#include "repository.h" -#include "commit.h" -#include "tag.h" -#include "blob.h" -#include "fileops.h" -#include "config.h" -#include "refs.h" - -#define GIT_OBJECTS_INFO_DIR GIT_OBJECTS_DIR "info/" -#define GIT_OBJECTS_PACK_DIR GIT_OBJECTS_DIR "pack/" - -#define GIT_FILE_CONTENT_PREFIX "gitdir: " - -#define GIT_BRANCH_MASTER "master" - -/* - * Git repository open methods - * - * Open a repository object from its path - */ -static int assign_repository_dirs( - git_repository *repo, - const char *git_dir, - const char *git_object_directory, - const char *git_index_file, - const char *git_work_tree) -{ - char path_aux[GIT_PATH_MAX]; - int error = GIT_SUCCESS; - - assert(repo); - - if (git_dir == NULL) - return git__throw(GIT_ENOTFOUND, "Failed to open repository. Git dir not found"); - - error = git_path_prettify_dir(path_aux, git_dir, NULL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to open repository"); - - /* store GIT_DIR */ - repo->path_repository = git__strdup(path_aux); - if (repo->path_repository == NULL) - return GIT_ENOMEM; - - /* path to GIT_OBJECT_DIRECTORY */ - if (git_object_directory == NULL) - git_path_join(path_aux, repo->path_repository, GIT_OBJECTS_DIR); - else { - error = git_path_prettify_dir(path_aux, git_object_directory, NULL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to open repository"); - } - - /* Store GIT_OBJECT_DIRECTORY */ - repo->path_odb = git__strdup(path_aux); - if (repo->path_odb == NULL) - return GIT_ENOMEM; - - /* path to GIT_WORK_TREE */ - if (git_work_tree == NULL) - repo->is_bare = 1; - else { - error = git_path_prettify_dir(path_aux, git_work_tree, NULL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to open repository"); - - /* Store GIT_WORK_TREE */ - repo->path_workdir = git__strdup(path_aux); - if (repo->path_workdir == NULL) - return GIT_ENOMEM; - - /* Path to GIT_INDEX_FILE */ - if (git_index_file == NULL) - git_path_join(path_aux, repo->path_repository, GIT_INDEX_FILE); - else { - error = git_path_prettify(path_aux, git_index_file, NULL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to open repository"); - } - - /* store GIT_INDEX_FILE */ - repo->path_index = git__strdup(path_aux); - if (repo->path_index == NULL) - return GIT_ENOMEM; - } - - return GIT_SUCCESS; -} - -static int check_repository_dirs(git_repository *repo) -{ - char path_aux[GIT_PATH_MAX]; - - if (git_futils_isdir(repo->path_repository) < GIT_SUCCESS) - return git__throw(GIT_ENOTAREPO, "`%s` is not a folder", repo->path_repository); - - /* Ensure GIT_OBJECT_DIRECTORY exists */ - if (git_futils_isdir(repo->path_odb) < GIT_SUCCESS) - return git__throw(GIT_ENOTAREPO, "`%s` does not exist", repo->path_odb); - - /* Ensure HEAD file exists */ - git_path_join(path_aux, repo->path_repository, GIT_HEAD_FILE); - if (git_futils_isfile(path_aux) < 0) - return git__throw(GIT_ENOTAREPO, "HEAD file is missing"); - - return GIT_SUCCESS; -} - -static int guess_repository_dirs(git_repository *repo, const char *repository_path) -{ - char buffer[GIT_PATH_MAX]; - const char *path_work_tree = NULL; - - /* Git directory name */ - if (git_path_basename_r(buffer, sizeof(buffer), repository_path) < 0) - return git__throw(GIT_EINVALIDPATH, "Unable to parse folder name from `%s`", repository_path); - - if (strcmp(buffer, DOT_GIT) == 0) { - /* Path to working dir */ - if (git_path_dirname_r(buffer, sizeof(buffer), repository_path) < 0) - return git__throw(GIT_EINVALIDPATH, "Unable to parse parent folder name from `%s`", repository_path); - path_work_tree = buffer; - } - - return assign_repository_dirs(repo, repository_path, NULL, NULL, path_work_tree); -} - -static int quickcheck_repository_dir(const char *repository_path) -{ - char path_aux[GIT_PATH_MAX]; - - /* Ensure HEAD file exists */ - git_path_join(path_aux, repository_path, GIT_HEAD_FILE); - if (git_futils_isfile(path_aux) < 0) - return GIT_ERROR; - - git_path_join(path_aux, repository_path, GIT_OBJECTS_DIR); - if (git_futils_isdir(path_aux) < 0) - return GIT_ERROR; - - git_path_join(path_aux, repository_path, GIT_REFS_DIR); - if (git_futils_isdir(path_aux) < 0) - return GIT_ERROR; - - return GIT_SUCCESS; -} - -static git_repository *repository_alloc() -{ - int error; - - git_repository *repo = git__malloc(sizeof(git_repository)); - if (!repo) - return NULL; - - memset(repo, 0x0, sizeof(git_repository)); - - error = git_cache_init(&repo->objects, GIT_DEFAULT_CACHE_SIZE, &git_object__free); - if (error < GIT_SUCCESS) { - free(repo); - return NULL; - } - - if (git_repository__refcache_init(&repo->references) < GIT_SUCCESS) { - free(repo); - return NULL; - } - - return repo; -} - -static int init_odb(git_repository *repo) -{ - return git_odb_open(&repo->db, repo->path_odb); -} - -int git_repository_open3(git_repository **repo_out, - const char *git_dir, - git_odb *object_database, - const char *git_index_file, - const char *git_work_tree) -{ - git_repository *repo; - int error = GIT_SUCCESS; - - assert(repo_out); - - if (object_database == NULL) - return git__throw(GIT_EINVALIDARGS, "Failed to open repository. `object_database` can't be null"); - - repo = repository_alloc(); - if (repo == NULL) - return GIT_ENOMEM; - - error = assign_repository_dirs(repo, - git_dir, - NULL, - git_index_file, - git_work_tree); - - if (error < GIT_SUCCESS) - goto cleanup; - - error = check_repository_dirs(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - repo->db = object_database; - - *repo_out = repo; - return GIT_SUCCESS; - -cleanup: - git_repository_free(repo); - return git__rethrow(error, "Failed to open repository"); -} - - -int git_repository_open2(git_repository **repo_out, - const char *git_dir, - const char *git_object_directory, - const char *git_index_file, - const char *git_work_tree) -{ - git_repository *repo; - int error = GIT_SUCCESS; - - assert(repo_out); - - repo = repository_alloc(); - if (repo == NULL) - return GIT_ENOMEM; - - error = assign_repository_dirs(repo, - git_dir, - git_object_directory, - git_index_file, - git_work_tree); - - if (error < GIT_SUCCESS) - goto cleanup; - - error = check_repository_dirs(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - error = init_odb(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - *repo_out = repo; - return GIT_SUCCESS; - -cleanup: - git_repository_free(repo); - return git__rethrow(error, "Failed to open repository"); -} - -int git_repository_config( - git_config **out, - git_repository *repo, - const char *user_config_path, - const char *system_config_path) -{ - char config_path[GIT_PATH_MAX]; - int error; - - assert(out && repo); - - error = git_config_new(out); - if (error < GIT_SUCCESS) - return error; - - git_path_join(config_path, repo->path_repository, GIT_CONFIG_FILENAME_INREPO); - error = git_config_add_file_ondisk(*out, config_path, 3); - if (error < GIT_SUCCESS) - goto cleanup; - - if (user_config_path != NULL) { - error = git_config_add_file_ondisk(*out, user_config_path, 2); - if (error < GIT_SUCCESS) - goto cleanup; - } - - if (system_config_path != NULL) { - error = git_config_add_file_ondisk(*out, system_config_path, 1); - if (error < GIT_SUCCESS) - goto cleanup; - } - - (*out)->repo = repo; - return GIT_SUCCESS; - -cleanup: - git_config_free(*out); - return error; -} - -static int discover_repository_dirs(git_repository *repo, const char *path) -{ - int error; - - error = guess_repository_dirs(repo, path); - if (error < GIT_SUCCESS) - return error; - - error = check_repository_dirs(repo); - if (error < GIT_SUCCESS) - return error; - - return GIT_SUCCESS; -} - -int git_repository_open(git_repository **repo_out, const char *path) -{ - git_repository *repo; - int error = GIT_SUCCESS; - - assert(repo_out && path); - - repo = repository_alloc(); - if (repo == NULL) - return GIT_ENOMEM; - - error = discover_repository_dirs(repo, path); - if (error < GIT_SUCCESS) - goto cleanup; - - error = init_odb(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - *repo_out = repo; - return GIT_SUCCESS; - -cleanup: - git_repository_free(repo); - return git__rethrow(error, "Failed to open repository"); -} - -static int retrieve_device(dev_t *device_out, const char *path) -{ - struct stat path_info; - - assert(device_out); - - if (p_lstat(path, &path_info)) - return git__throw(GIT_EOSERR, "Failed to get file informations: %s", path); - - *device_out = path_info.st_dev; - - return GIT_SUCCESS; -} - -static int retrieve_ceiling_directories_offset(const char *path, const char *ceiling_directories) -{ - char buf[GIT_PATH_MAX + 1]; - char buf2[GIT_PATH_MAX + 1]; - const char *ceil, *sep; - int len, max_len = -1; - int min_len; - - assert(path); - - min_len = git_path_root(path) + 1; - - if (ceiling_directories == NULL || min_len == 0) - return min_len; - - for (sep = ceil = ceiling_directories; *sep; ceil = sep + 1) { - for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++); - len = sep - ceil; - - if (len == 0 || len > GIT_PATH_MAX || git_path_root(ceil) == -1) - continue; - - strncpy(buf, ceil, len); - buf[len] = '\0'; - - if (p_realpath(buf, buf2) == NULL) - continue; - - len = strlen(buf2); - if (len > 0 && buf2[len-1] == '/') - buf[--len] = '\0'; - - if (!strncmp(path, buf2, len) && - path[len] == '/' && - len > max_len) - { - max_len = len; - } - } - - return max_len <= min_len ? min_len : max_len; -} - -static int read_gitfile(char *path_out, const char *file_path, const char *base_path) -{ - git_fbuffer file; - int error; - size_t end_offset; - char *data; - - assert(path_out && file_path && base_path); - - error = git_futils_readbuffer(&file, file_path); - - if (error < GIT_SUCCESS) - return error; - - data = (char*)(file.data); - - if (git__prefixcmp(data, GIT_FILE_CONTENT_PREFIX)) { - git_futils_freebuffer(&file); - return git__throw(GIT_ENOTFOUND, "Invalid gitfile format `%s`", file_path); - } - - end_offset = strlen(data) - 1; - - for (;data[end_offset] == '\r' || data[end_offset] == '\n'; --end_offset); - data[end_offset + 1] = '\0'; - - if (strlen(GIT_FILE_CONTENT_PREFIX) == end_offset + 1) { - git_futils_freebuffer(&file); - return git__throw(GIT_ENOTFOUND, "No path in git file `%s`", file_path); - } - - data = data + strlen(GIT_FILE_CONTENT_PREFIX); - error = git_path_prettify_dir(path_out, data, base_path); - git_futils_freebuffer(&file); - - if (error == 0 && git_futils_exists(path_out) == 0) - return GIT_SUCCESS; - - return git__throw(GIT_EOBJCORRUPTED, "The `.git` file points to an inexisting path"); -} - -static void git_repository__free_dirs(git_repository *repo) -{ - free(repo->path_workdir); - repo->path_workdir = NULL; - free(repo->path_index); - repo->path_index = NULL; - free(repo->path_repository); - repo->path_repository = NULL; - free(repo->path_odb); - repo->path_odb = NULL; -} - -void git_repository_free(git_repository *repo) -{ - if (repo == NULL) - return; - - git_cache_free(&repo->objects); - git_repository__refcache_free(&repo->references); - git_repository__free_dirs(repo); - - if (repo->db != NULL) - git_odb_close(repo->db); - - free(repo); -} - -int git_repository_discover(char *repository_path, size_t size, const char *start_path, int across_fs, const char *ceiling_dirs) -{ - int error, ceiling_offset; - char bare_path[GIT_PATH_MAX]; - char normal_path[GIT_PATH_MAX]; - char *found_path; - dev_t current_device = 0; - - assert(start_path && repository_path); - - error = git_path_prettify_dir(bare_path, start_path, NULL); - if (error < GIT_SUCCESS) - return error; - - if (!across_fs) { - error = retrieve_device(¤t_device, bare_path); - if (error < GIT_SUCCESS) - return error; - } - - ceiling_offset = retrieve_ceiling_directories_offset(bare_path, ceiling_dirs); - git_path_join(normal_path, bare_path, DOT_GIT); - - while(1) { - /** - * If the `.git` file is regular instead of - * a directory, it should contain the path of the actual git repository - */ - if (git_futils_isfile(normal_path) == GIT_SUCCESS) { - error = read_gitfile(repository_path, normal_path, bare_path); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Unable to read git file `%s`", normal_path); - - error = quickcheck_repository_dir(repository_path); - if (error < GIT_SUCCESS) - return git__throw(GIT_ENOTFOUND, "The `.git` file found at '%s' points" - "to an inexisting Git folder", normal_path); - - return GIT_SUCCESS; - } - - /** - * If the `.git` file is a folder, we check inside of it - */ - if (git_futils_isdir(normal_path) == GIT_SUCCESS) { - error = quickcheck_repository_dir(normal_path); - if (error == GIT_SUCCESS) { - found_path = normal_path; - break; - } - } - - /** - * Otherwise, the repository may be bare, let's check - * the root anyway - */ - error = quickcheck_repository_dir(bare_path); - if (error == GIT_SUCCESS) { - found_path = bare_path; - break; - } - - if (git_path_dirname_r(normal_path, sizeof(normal_path), bare_path) < GIT_SUCCESS) - return git__throw(GIT_EOSERR, "Failed to dirname '%s'", bare_path); - - if (!across_fs) { - dev_t new_device; - error = retrieve_device(&new_device, normal_path); - - if (error < GIT_SUCCESS || current_device != new_device) { - return git__throw(GIT_ENOTAREPO,"Not a git repository (or any parent up to mount parent %s)\n" - "Stopping at filesystem boundary.", bare_path); - } - current_device = new_device; - } - - strcpy(bare_path, normal_path); - git_path_join(normal_path, bare_path, DOT_GIT); - - // nothing has been found, lets try the parent directory - if (bare_path[ceiling_offset] == '\0') { - return git__throw(GIT_ENOTAREPO,"Not a git repository (or any of the parent directories): %s", start_path); - } - } - - if (size < (strlen(found_path) + 2) * sizeof(char)) { - return git__throw(GIT_EOVERFLOW, "The repository buffer is not long enough to handle the repository path `%s`", found_path); - } - - git_path_join(repository_path, found_path, ""); - return GIT_SUCCESS; -} - -git_odb *git_repository_database(git_repository *repo) -{ - assert(repo); - return repo->db; -} - -static int repo_init_reinit(const char *repository_path, int is_bare) -{ - /* TODO: reinit the repository */ - return git__throw(GIT_ENOTIMPLEMENTED, - "Failed to reinitialize the %srepository at '%s'. " - "This feature is not yet implemented", - is_bare ? "bare" : "", repository_path); -} - -static int repo_init_createhead(git_repository *repo) -{ - git_reference *head_reference; - return git_reference_create_symbolic(&head_reference, repo, GIT_HEAD_FILE, GIT_REFS_HEADS_MASTER_FILE, 0); -} - -static int repo_init_structure(const char *git_dir, int is_bare) -{ - const int mode = 0755; /* or 0777 ? */ - int error; - - char temp_path[GIT_PATH_MAX]; - - if (git_futils_mkdir_r(git_dir, mode)) - return git__throw(GIT_ERROR, "Failed to initialize repository structure. Could not mkdir"); - - /* Hides the ".git" directory */ - if (!is_bare) { -#ifdef GIT_WIN32 - error = p_hide_directory__w32(git_dir); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to initialize repository structure"); -#endif - } - - /* Creates the '/objects/info/' directory */ - git_path_join(temp_path, git_dir, GIT_OBJECTS_INFO_DIR); - error = git_futils_mkdir_r(temp_path, mode); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to initialize repository structure"); - - /* Creates the '/objects/pack/' directory */ - git_path_join(temp_path, git_dir, GIT_OBJECTS_PACK_DIR); - error = p_mkdir(temp_path, mode); - if (error < GIT_SUCCESS) - return git__throw(error, "Unable to create `%s` folder", temp_path); - - /* Creates the '/refs/heads/' directory */ - git_path_join(temp_path, git_dir, GIT_REFS_HEADS_DIR); - error = git_futils_mkdir_r(temp_path, mode); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to initialize repository structure"); - - /* Creates the '/refs/tags/' directory */ - git_path_join(temp_path, git_dir, GIT_REFS_TAGS_DIR); - error = p_mkdir(temp_path, mode); - if (error < GIT_SUCCESS) - return git__throw(error, "Unable to create `%s` folder", temp_path); - - /* TODO: what's left? templates? */ - - return GIT_SUCCESS; -} - -int git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare) -{ - int error = GIT_SUCCESS; - git_repository *repo = NULL; - char repository_path[GIT_PATH_MAX]; - - assert(repo_out && path); - - git_path_join(repository_path, path, is_bare ? "" : GIT_DIR); - - if (git_futils_isdir(repository_path)) { - if (quickcheck_repository_dir(repository_path) == GIT_SUCCESS) - return repo_init_reinit(repository_path, is_bare); - } - - error = repo_init_structure(repository_path, is_bare); - if (error < GIT_SUCCESS) - goto cleanup; - - repo = repository_alloc(); - if (repo == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - error = guess_repository_dirs(repo, repository_path); - if (error < GIT_SUCCESS) - goto cleanup; - - assert(repo->is_bare == is_bare); - - error = init_odb(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - error = repo_init_createhead(repo); - if (error < GIT_SUCCESS) - goto cleanup; - - /* should never fail */ - assert(check_repository_dirs(repo) == GIT_SUCCESS); - - *repo_out = repo; - return GIT_SUCCESS; - -cleanup: - git_repository_free(repo); - return git__rethrow(error, "Failed to (re)init the repository `%s`", path); -} - -int git_repository_head_detached(git_repository *repo) -{ - git_reference *ref; - int error; - size_t GIT_UNUSED(_size); - git_otype type; - - error = git_reference_lookup(&ref, repo, GIT_HEAD_FILE); - if (error < GIT_SUCCESS) - return error; - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) - return 0; - - error = git_odb_read_header(&_size, &type, repo->db, git_reference_oid(ref)); - if (error < GIT_SUCCESS) - return error; - - if (type != GIT_OBJ_COMMIT) - return git__throw(GIT_EOBJCORRUPTED, "HEAD is not a commit"); - - return 1; -} - -int git_repository_head_orphan(git_repository *repo) -{ - git_reference *ref; - int error; - - error = git_reference_lookup(&ref, repo, GIT_HEAD_FILE); - if (error < GIT_SUCCESS) - return error; - - if (git_reference_type(ref) == GIT_REF_OID) - return 0; - - error = git_reference_resolve(&ref, ref); - - return error == GIT_ENOTFOUND ? 1 : error; -} - -int git_repository_is_empty(git_repository *repo) -{ - git_reference *head, *branch; - int error; - - error = git_reference_lookup(&head, repo, "HEAD"); - if (error < GIT_SUCCESS) - return git__throw(error, "Corrupted repository. HEAD does not exist"); - - if (git_reference_type(head) != GIT_REF_SYMBOLIC) - return 0; - - if (strcmp(git_reference_target(head), "refs/heads/master") != 0) - return 0; - - error = git_reference_resolve(&branch, head); - return error == GIT_ENOTFOUND ? 1 : error; -} - -const char *git_repository_path(git_repository *repo, git_repository_pathid id) -{ - assert(repo); - - switch (id) { - case GIT_REPO_PATH: - return repo->path_repository; - - case GIT_REPO_PATH_INDEX: - return repo->path_index; - - case GIT_REPO_PATH_ODB: - return repo->path_odb; - - case GIT_REPO_PATH_WORKDIR: - return repo->path_workdir; - - default: - return NULL; - } -} - -int git_repository_is_bare(git_repository *repo) -{ - assert(repo); - return repo->is_bare; -} diff --git a/vendor/libgit2/src/repository.h b/vendor/libgit2/src/repository.h deleted file mode 100644 index 2e0b9e352..000000000 --- a/vendor/libgit2/src/repository.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef INCLUDE_repository_h__ -#define INCLUDE_repository_h__ - -#include "git2/common.h" -#include "git2/oid.h" -#include "git2/odb.h" -#include "git2/repository.h" -#include "git2/object.h" - -#include "hashtable.h" -#include "index.h" -#include "cache.h" -#include "refs.h" -#include "buffer.h" - -#define DOT_GIT ".git" -#define GIT_DIR DOT_GIT "/" -#define GIT_OBJECTS_DIR "objects/" -#define GIT_INDEX_FILE "index" - -struct git_object { - git_cached_obj cached; - git_repository *repo; - git_otype type; -}; - -struct git_repository { - git_odb *db; - - git_cache objects; - git_refcache references; - - char *path_repository; - char *path_index; - char *path_odb; - char *path_workdir; - - unsigned is_bare:1; - unsigned int lru_counter; -}; - -/* fully free the object; internal method, do not - * export */ -void git_object__free(void *object); - -int git_oid__parse(git_oid *oid, const char **buffer_out, const char *buffer_end, const char *header); -void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid); - -#endif diff --git a/vendor/libgit2/src/revwalk.c b/vendor/libgit2/src/revwalk.c deleted file mode 100644 index 538928cb1..000000000 --- a/vendor/libgit2/src/revwalk.c +++ /dev/null @@ -1,578 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "commit.h" -#include "odb.h" -#include "hashtable.h" -#include "pqueue.h" - -#include "git2/revwalk.h" - -typedef struct commit_object { - git_oid oid; - uint32_t time; - unsigned int seen:1, - uninteresting:1, - topo_delay:1, - parsed:1; - - unsigned short in_degree; - unsigned short out_degree; - - struct commit_object **parents; -} commit_object; - -typedef struct commit_list { - commit_object *item; - struct commit_list *next; -} commit_list; - -struct git_revwalk { - git_repository *repo; - - git_hashtable *commits; - - commit_list *iterator_topo; - commit_list *iterator_rand; - commit_list *iterator_reverse; - git_pqueue iterator_time; - - int (*get_next)(commit_object **, git_revwalk *); - int (*enqueue)(git_revwalk *, commit_object *); - - git_vector memory_alloc; - size_t chunk_size; - - unsigned walking:1; - unsigned int sorting; -}; - -commit_list *commit_list_insert(commit_object *item, commit_list **list_p) -{ - commit_list *new_list = git__malloc(sizeof(commit_list)); - new_list->item = item; - new_list->next = *list_p; - *list_p = new_list; - return new_list; -} - -void commit_list_free(commit_list **list_p) -{ - commit_list *list = *list_p; - - while (list) { - commit_list *temp = list; - list = temp->next; - free(temp); - } - - *list_p = NULL; -} - -commit_object *commit_list_pop(commit_list **stack) -{ - commit_list *top = *stack; - commit_object *item = top ? top->item : NULL; - - if (top) { - *stack = top->next; - free(top); - } - return item; -} - -static int commit_time_cmp(void *a, void *b) -{ - commit_object *commit_a = (commit_object *)a; - commit_object *commit_b = (commit_object *)b; - - return (commit_a->time < commit_b->time); -} - -static uint32_t object_table_hash(const void *key, int hash_id) -{ - uint32_t r; - const git_oid *id = key; - - memcpy(&r, id->id + (hash_id * sizeof(uint32_t)), sizeof(r)); - return r; -} - -#define COMMITS_PER_CHUNK 128 -#define CHUNK_STEP 64 -#define PARENTS_PER_COMMIT ((CHUNK_STEP - sizeof(commit_object)) / sizeof(commit_object *)) - -static int alloc_chunk(git_revwalk *walk) -{ - void *chunk; - - chunk = git__calloc(COMMITS_PER_CHUNK, CHUNK_STEP); - if (chunk == NULL) - return GIT_ENOMEM; - - walk->chunk_size = 0; - return git_vector_insert(&walk->memory_alloc, chunk); -} - -static commit_object *alloc_commit(git_revwalk *walk) -{ - unsigned char *chunk; - - if (walk->chunk_size == COMMITS_PER_CHUNK) - alloc_chunk(walk); - - chunk = git_vector_get(&walk->memory_alloc, walk->memory_alloc.length - 1); - chunk += (walk->chunk_size * CHUNK_STEP); - walk->chunk_size++; - - return (commit_object *)chunk; -} - -static commit_object **alloc_parents(commit_object *commit, size_t n_parents) -{ - if (n_parents <= PARENTS_PER_COMMIT) - return (commit_object **)((unsigned char *)commit + sizeof(commit_object)); - - return git__malloc(n_parents * sizeof(commit_object *)); -} - - -static commit_object *commit_lookup(git_revwalk *walk, const git_oid *oid) -{ - commit_object *commit; - - if ((commit = git_hashtable_lookup(walk->commits, oid)) != NULL) - return commit; - - commit = alloc_commit(walk); - if (commit == NULL) - return NULL; - - git_oid_cpy(&commit->oid, oid); - - if (git_hashtable_insert(walk->commits, &commit->oid, commit) < GIT_SUCCESS) { - free(commit); - return NULL; - } - - return commit; -} - -static int commit_quick_parse(git_revwalk *walk, commit_object *commit, git_rawobj *raw) -{ - const int parent_len = strlen("parent ") + GIT_OID_HEXSZ + 1; - - unsigned char *buffer = raw->data; - unsigned char *buffer_end = buffer + raw->len; - unsigned char *parents_start; - - int i, parents = 0; - long commit_time; - - buffer += strlen("tree ") + GIT_OID_HEXSZ + 1; - - parents_start = buffer; - while (buffer + parent_len < buffer_end && memcmp(buffer, "parent ", strlen("parent ")) == 0) { - parents++; - buffer += parent_len; - } - - commit->parents = alloc_parents(commit, parents); - if (commit->parents == NULL) - return GIT_ENOMEM; - - buffer = parents_start; - for (i = 0; i < parents; ++i) { - git_oid oid; - - if (git_oid_fromstr(&oid, (char *)buffer + strlen("parent ")) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse commit. Parent object is corrupted"); - - commit->parents[i] = commit_lookup(walk, &oid); - if (commit->parents[i] == NULL) - return GIT_ENOMEM; - - buffer += parent_len; - } - - commit->out_degree = (unsigned short)parents; - - if ((buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse commit. Object is corrupted"); - - buffer = memchr(buffer, '>', buffer_end - buffer); - if (buffer == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse commit. Can't find author"); - - if (git__strtol32(&commit_time, (char *)buffer + 2, NULL, 10) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse commit. Can't parse commit time"); - - commit->time = (time_t)commit_time; - commit->parsed = 1; - return GIT_SUCCESS; -} - -static int commit_parse(git_revwalk *walk, commit_object *commit) -{ - git_odb_object *obj; - int error; - - if (commit->parsed) - return GIT_SUCCESS; - - if ((error = git_odb_read(&obj, walk->repo->db, &commit->oid)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to parse commit. Can't read object"); - - if (obj->raw.type != GIT_OBJ_COMMIT) { - git_odb_object_close(obj); - return git__throw(GIT_EOBJTYPE, "Failed to parse commit. Object is no commit object"); - } - - error = commit_quick_parse(walk, commit, &obj->raw); - git_odb_object_close(obj); - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse commit"); -} - -static void mark_uninteresting(commit_object *commit) -{ - unsigned short i; - assert(commit); - - commit->uninteresting = 1; - - for (i = 0; i < commit->out_degree; ++i) - if (!commit->parents[i]->uninteresting) - mark_uninteresting(commit->parents[i]); -} - -static int process_commit(git_revwalk *walk, commit_object *commit, int hide) -{ - int error; - - if (hide) - mark_uninteresting(commit); - - if (commit->seen) - return GIT_SUCCESS; - - commit->seen = 1; - - if ((error = commit_parse(walk, commit)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to process commit"); - - return walk->enqueue(walk, commit); -} - -static int process_commit_parents(git_revwalk *walk, commit_object *commit) -{ - unsigned short i; - int error = GIT_SUCCESS; - - for (i = 0; i < commit->out_degree && error == GIT_SUCCESS; ++i) { - error = process_commit(walk, commit->parents[i], commit->uninteresting); - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to process commit parents"); -} - -static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting) -{ - commit_object *commit; - - commit = commit_lookup(walk, oid); - if (commit == NULL) - return git__throw(GIT_ENOTFOUND, "Failed to push commit. Object not found"); - - return process_commit(walk, commit, uninteresting); -} - -int git_revwalk_push(git_revwalk *walk, const git_oid *oid) -{ - assert(walk && oid); - return push_commit(walk, oid, 0); -} - -int git_revwalk_hide(git_revwalk *walk, const git_oid *oid) -{ - assert(walk && oid); - return push_commit(walk, oid, 1); -} - -static int revwalk_enqueue_timesort(git_revwalk *walk, commit_object *commit) -{ - return git_pqueue_insert(&walk->iterator_time, commit); -} - -static int revwalk_enqueue_unsorted(git_revwalk *walk, commit_object *commit) -{ - return commit_list_insert(commit, &walk->iterator_rand) ? GIT_SUCCESS : GIT_ENOMEM; -} - -static int revwalk_next_timesort(commit_object **object_out, git_revwalk *walk) -{ - int error; - commit_object *next; - - while ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) { - if ((error = process_commit_parents(walk, next)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to load next revision"); - - if (!next->uninteresting) { - *object_out = next; - return GIT_SUCCESS; - } - } - - return git__throw(GIT_EREVWALKOVER, "Failed to load next revision"); -} - -static int revwalk_next_unsorted(commit_object **object_out, git_revwalk *walk) -{ - int error; - commit_object *next; - - while ((next = commit_list_pop(&walk->iterator_rand)) != NULL) { - if ((error = process_commit_parents(walk, next)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to load next revision"); - - if (!next->uninteresting) { - *object_out = next; - return GIT_SUCCESS; - } - } - - return git__throw(GIT_EREVWALKOVER, "Failed to load next revision"); -} - -static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk) -{ - commit_object *next; - unsigned short i; - - for (;;) { - next = commit_list_pop(&walk->iterator_topo); - if (next == NULL) - return git__throw(GIT_EREVWALKOVER, "Failed to load next revision"); - - if (next->in_degree > 0) { - next->topo_delay = 1; - continue; - } - - for (i = 0; i < next->out_degree; ++i) { - commit_object *parent = next->parents[i]; - - if (--parent->in_degree == 0 && parent->topo_delay) { - parent->topo_delay = 0; - commit_list_insert(parent, &walk->iterator_topo); - } - } - - *object_out = next; - return GIT_SUCCESS; - } -} - -static int revwalk_next_reverse(commit_object **object_out, git_revwalk *walk) -{ - *object_out = commit_list_pop(&walk->iterator_reverse); - return *object_out ? GIT_SUCCESS : GIT_EREVWALKOVER; -} - - -static int prepare_walk(git_revwalk *walk) -{ - int error; - commit_object *next; - - if (walk->sorting & GIT_SORT_TOPOLOGICAL) { - unsigned short i; - - while ((error = walk->get_next(&next, walk)) == GIT_SUCCESS) { - for (i = 0; i < next->out_degree; ++i) { - commit_object *parent = next->parents[i]; - parent->in_degree++; - } - - commit_list_insert(next, &walk->iterator_topo); - } - - if (error != GIT_EREVWALKOVER) - return git__rethrow(error, "Failed to prepare revision walk"); - - walk->get_next = &revwalk_next_toposort; - } - - if (walk->sorting & GIT_SORT_REVERSE) { - - while ((error = walk->get_next(&next, walk)) == GIT_SUCCESS) - commit_list_insert(next, &walk->iterator_reverse); - - if (error != GIT_EREVWALKOVER) - return git__rethrow(error, "Failed to prepare revision walk"); - - walk->get_next = &revwalk_next_reverse; - } - - walk->walking = 1; - return GIT_SUCCESS; -} - - - - - -int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo) -{ - git_revwalk *walk; - - walk = git__malloc(sizeof(git_revwalk)); - if (walk == NULL) - return GIT_ENOMEM; - - memset(walk, 0x0, sizeof(git_revwalk)); - - walk->commits = git_hashtable_alloc(64, - object_table_hash, - (git_hash_keyeq_ptr)git_oid_cmp); - - if (walk->commits == NULL) { - free(walk); - return GIT_ENOMEM; - } - - git_pqueue_init(&walk->iterator_time, 8, commit_time_cmp); - git_vector_init(&walk->memory_alloc, 8, NULL); - alloc_chunk(walk); - - walk->get_next = &revwalk_next_unsorted; - walk->enqueue = &revwalk_enqueue_unsorted; - - walk->repo = repo; - - *revwalk_out = walk; - return GIT_SUCCESS; -} - -void git_revwalk_free(git_revwalk *walk) -{ - unsigned int i; - const void *GIT_UNUSED(_unused); - commit_object *commit; - - if (walk == NULL) - return; - - git_revwalk_reset(walk); - - /* if the parent has more than PARENTS_PER_COMMIT parents, - * we had to allocate a separate array for those parents. - * make sure it's being free'd */ - GIT_HASHTABLE_FOREACH(walk->commits, _unused, commit, { - if (commit->out_degree > PARENTS_PER_COMMIT) - free(commit->parents); - }); - - git_hashtable_free(walk->commits); - git_pqueue_free(&walk->iterator_time); - - for (i = 0; i < walk->memory_alloc.length; ++i) - free(git_vector_get(&walk->memory_alloc, i)); - - git_vector_free(&walk->memory_alloc); - free(walk); -} - -git_repository *git_revwalk_repository(git_revwalk *walk) -{ - assert(walk); - return walk->repo; -} - -void git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode) -{ - assert(walk); - - if (walk->walking) - git_revwalk_reset(walk); - - walk->sorting = sort_mode; - - if (walk->sorting & GIT_SORT_TIME) { - walk->get_next = &revwalk_next_timesort; - walk->enqueue = &revwalk_enqueue_timesort; - } else { - walk->get_next = &revwalk_next_unsorted; - walk->enqueue = &revwalk_enqueue_unsorted; - } -} - -int git_revwalk_next(git_oid *oid, git_revwalk *walk) -{ - int error; - commit_object *next; - - assert(walk && oid); - - if (!walk->walking) { - if ((error = prepare_walk(walk)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to load next revision"); - } - - error = walk->get_next(&next, walk); - - if (error == GIT_EREVWALKOVER) { - git_revwalk_reset(walk); - return GIT_EREVWALKOVER; - } - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to load next revision"); - - git_oid_cpy(oid, &next->oid); - return GIT_SUCCESS; -} - -void git_revwalk_reset(git_revwalk *walk) -{ - const void *GIT_UNUSED(_unused); - commit_object *commit; - - assert(walk); - - GIT_HASHTABLE_FOREACH(walk->commits, _unused, commit, - commit->seen = 0; - commit->in_degree = 0; - commit->topo_delay = 0; - ); - - git_pqueue_clear(&walk->iterator_time); - commit_list_free(&walk->iterator_topo); - commit_list_free(&walk->iterator_rand); - commit_list_free(&walk->iterator_reverse); - walk->walking = 0; -} - diff --git a/vendor/libgit2/src/sha1.c b/vendor/libgit2/src/sha1.c deleted file mode 100644 index 0bccb4953..000000000 --- a/vendor/libgit2/src/sha1.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * SHA1 routine optimized to do word accesses rather than byte accesses, - * and to avoid unnecessary copies into the context array. - * - * This was initially based on the Mozilla SHA1 implementation, although - * none of the original Mozilla code remains. - */ - -#include "common.h" -#include "sha1.h" - -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -/* - * Force usage of rol or ror by selecting the one with the smaller constant. - * It _can_ generate slightly smaller code (a constant of 1 is special), but - * perhaps more importantly it's possibly faster on any uarch that does a - * rotate with a loop. - */ - -#define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; }) -#define SHA_ROL(x,n) SHA_ASM("rol", x, n) -#define SHA_ROR(x,n) SHA_ASM("ror", x, n) - -#else - -#define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r))) -#define SHA_ROL(X,n) SHA_ROT(X,n,32-(n)) -#define SHA_ROR(X,n) SHA_ROT(X,32-(n),n) - -#endif - -/* - * If you have 32 registers or more, the compiler can (and should) - * try to change the array[] accesses into registers. However, on - * machines with less than ~25 registers, that won't really work, - * and at least gcc will make an unholy mess of it. - * - * So to avoid that mess which just slows things down, we force - * the stores to memory to actually happen (we might be better off - * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as - * suggested by Artur Skawina - that will also make gcc unable to - * try to do the silly "optimize away loads" part because it won't - * see what the value will be). - * - * Ben Herrenschmidt reports that on PPC, the C version comes close - * to the optimized asm with this (ie on PPC you don't want that - * 'volatile', since there are lots of registers). - * - * On ARM we get the best code generation by forcing a full memory barrier - * between each SHA_ROUND, otherwise gcc happily get wild with spilling and - * the stack frame size simply explode and performance goes down the drain. - */ - -#if defined(__i386__) || defined(__x86_64__) - #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val)) -#elif defined(__GNUC__) && defined(__arm__) - #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) -#else - #define setW(x, val) (W(x) = (val)) -#endif - -/* - * Performance might be improved if the CPU architecture is OK with - * unaligned 32-bit loads and a fast ntohl() is available. - * Otherwise fall back to byte loads and shifts which is portable, - * and is faster on architectures with memory alignment issues. - */ - -#if defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) || \ - defined(__ppc__) || defined(__ppc64__) || \ - defined(__powerpc__) || defined(__powerpc64__) || \ - defined(__s390__) || defined(__s390x__) - -#define get_be32(p) ntohl(*(const unsigned int *)(p)) -#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) - -#else - -#define get_be32(p) ( \ - (*((const unsigned char *)(p) + 0) << 24) | \ - (*((const unsigned char *)(p) + 1) << 16) | \ - (*((const unsigned char *)(p) + 2) << 8) | \ - (*((const unsigned char *)(p) + 3) << 0) ) -#define put_be32(p, v) do { \ - unsigned int __v = (v); \ - *((unsigned char *)(p) + 0) = __v >> 24; \ - *((unsigned char *)(p) + 1) = __v >> 16; \ - *((unsigned char *)(p) + 2) = __v >> 8; \ - *((unsigned char *)(p) + 3) = __v >> 0; } while (0) - -#endif - -/* This "rolls" over the 512-bit array */ -#define W(x) (array[(x)&15]) - -/* - * Where do we get the source from? The first 16 iterations get it from - * the input data, the next mix it from the 512-bit array. - */ -#define SHA_SRC(t) get_be32(data + t) -#define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) - -#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ - unsigned int TEMP = input(t); setW(t, TEMP); \ - E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \ - B = SHA_ROR(B, 2); } while (0) - -#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) -#define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) -#define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) -#define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) - -static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data) -{ - unsigned int A,B,C,D,E; - unsigned int array[16]; - - A = ctx->H[0]; - B = ctx->H[1]; - C = ctx->H[2]; - D = ctx->H[3]; - E = ctx->H[4]; - - /* Round 1 - iterations 0-16 take their input from 'data' */ - T_0_15( 0, A, B, C, D, E); - T_0_15( 1, E, A, B, C, D); - T_0_15( 2, D, E, A, B, C); - T_0_15( 3, C, D, E, A, B); - T_0_15( 4, B, C, D, E, A); - T_0_15( 5, A, B, C, D, E); - T_0_15( 6, E, A, B, C, D); - T_0_15( 7, D, E, A, B, C); - T_0_15( 8, C, D, E, A, B); - T_0_15( 9, B, C, D, E, A); - T_0_15(10, A, B, C, D, E); - T_0_15(11, E, A, B, C, D); - T_0_15(12, D, E, A, B, C); - T_0_15(13, C, D, E, A, B); - T_0_15(14, B, C, D, E, A); - T_0_15(15, A, B, C, D, E); - - /* Round 1 - tail. Input from 512-bit mixing array */ - T_16_19(16, E, A, B, C, D); - T_16_19(17, D, E, A, B, C); - T_16_19(18, C, D, E, A, B); - T_16_19(19, B, C, D, E, A); - - /* Round 2 */ - T_20_39(20, A, B, C, D, E); - T_20_39(21, E, A, B, C, D); - T_20_39(22, D, E, A, B, C); - T_20_39(23, C, D, E, A, B); - T_20_39(24, B, C, D, E, A); - T_20_39(25, A, B, C, D, E); - T_20_39(26, E, A, B, C, D); - T_20_39(27, D, E, A, B, C); - T_20_39(28, C, D, E, A, B); - T_20_39(29, B, C, D, E, A); - T_20_39(30, A, B, C, D, E); - T_20_39(31, E, A, B, C, D); - T_20_39(32, D, E, A, B, C); - T_20_39(33, C, D, E, A, B); - T_20_39(34, B, C, D, E, A); - T_20_39(35, A, B, C, D, E); - T_20_39(36, E, A, B, C, D); - T_20_39(37, D, E, A, B, C); - T_20_39(38, C, D, E, A, B); - T_20_39(39, B, C, D, E, A); - - /* Round 3 */ - T_40_59(40, A, B, C, D, E); - T_40_59(41, E, A, B, C, D); - T_40_59(42, D, E, A, B, C); - T_40_59(43, C, D, E, A, B); - T_40_59(44, B, C, D, E, A); - T_40_59(45, A, B, C, D, E); - T_40_59(46, E, A, B, C, D); - T_40_59(47, D, E, A, B, C); - T_40_59(48, C, D, E, A, B); - T_40_59(49, B, C, D, E, A); - T_40_59(50, A, B, C, D, E); - T_40_59(51, E, A, B, C, D); - T_40_59(52, D, E, A, B, C); - T_40_59(53, C, D, E, A, B); - T_40_59(54, B, C, D, E, A); - T_40_59(55, A, B, C, D, E); - T_40_59(56, E, A, B, C, D); - T_40_59(57, D, E, A, B, C); - T_40_59(58, C, D, E, A, B); - T_40_59(59, B, C, D, E, A); - - /* Round 4 */ - T_60_79(60, A, B, C, D, E); - T_60_79(61, E, A, B, C, D); - T_60_79(62, D, E, A, B, C); - T_60_79(63, C, D, E, A, B); - T_60_79(64, B, C, D, E, A); - T_60_79(65, A, B, C, D, E); - T_60_79(66, E, A, B, C, D); - T_60_79(67, D, E, A, B, C); - T_60_79(68, C, D, E, A, B); - T_60_79(69, B, C, D, E, A); - T_60_79(70, A, B, C, D, E); - T_60_79(71, E, A, B, C, D); - T_60_79(72, D, E, A, B, C); - T_60_79(73, C, D, E, A, B); - T_60_79(74, B, C, D, E, A); - T_60_79(75, A, B, C, D, E); - T_60_79(76, E, A, B, C, D); - T_60_79(77, D, E, A, B, C); - T_60_79(78, C, D, E, A, B); - T_60_79(79, B, C, D, E, A); - - ctx->H[0] += A; - ctx->H[1] += B; - ctx->H[2] += C; - ctx->H[3] += D; - ctx->H[4] += E; -} - -void git__blk_SHA1_Init(blk_SHA_CTX *ctx) -{ - ctx->size = 0; - - /* Initialize H with the magic constants (see FIPS180 for constants) */ - ctx->H[0] = 0x67452301; - ctx->H[1] = 0xefcdab89; - ctx->H[2] = 0x98badcfe; - ctx->H[3] = 0x10325476; - ctx->H[4] = 0xc3d2e1f0; -} - -void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len) -{ - unsigned int lenW = ctx->size & 63; - - ctx->size += len; - - /* Read the data into W and process blocks as they get full */ - if (lenW) { - unsigned int left = 64 - lenW; - if (len < left) - left = len; - memcpy(lenW + (char *)ctx->W, data, left); - lenW = (lenW + left) & 63; - len -= left; - data = ((const char *)data + left); - if (lenW) - return; - blk_SHA1_Block(ctx, ctx->W); - } - while (len >= 64) { - blk_SHA1_Block(ctx, data); - data = ((const char *)data + 64); - len -= 64; - } - if (len) - memcpy(ctx->W, data, len); -} - -void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx) -{ - static const unsigned char pad[64] = { 0x80 }; - unsigned int padlen[2]; - int i; - - /* Pad with a binary 1 (ie 0x80), then zeroes, then length */ - padlen[0] = htonl((uint32_t)(ctx->size >> 29)); - padlen[1] = htonl((uint32_t)(ctx->size << 3)); - - i = ctx->size & 63; - git__blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i))); - git__blk_SHA1_Update(ctx, padlen, 8); - - /* Output hash */ - for (i = 0; i < 5; i++) - put_be32(hashout + i*4, ctx->H[i]); -} diff --git a/vendor/libgit2/src/sha1.h b/vendor/libgit2/src/sha1.h deleted file mode 100644 index 558d6aece..000000000 --- a/vendor/libgit2/src/sha1.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SHA1 routine optimized to do word accesses rather than byte accesses, - * and to avoid unnecessary copies into the context array. - * - * This was initially based on the Mozilla SHA1 implementation, although - * none of the original Mozilla code remains. - */ - -typedef struct { - unsigned long long size; - unsigned int H[5]; - unsigned int W[16]; -} blk_SHA_CTX; - -void git__blk_SHA1_Init(blk_SHA_CTX *ctx); -void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len); -void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx); - -#define SHA_CTX blk_SHA_CTX -#define SHA1_Init git__blk_SHA1_Init -#define SHA1_Update git__blk_SHA1_Update -#define SHA1_Final git__blk_SHA1_Final diff --git a/vendor/libgit2/src/sha1_lookup.c b/vendor/libgit2/src/sha1_lookup.c deleted file mode 100644 index 6ac00c5aa..000000000 --- a/vendor/libgit2/src/sha1_lookup.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * This file is basically taken from git code. - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include - -#include "sha1_lookup.h" -#include "common.h" - -/* - * Conventional binary search loop looks like this: - * - * unsigned lo, hi; - * do { - * unsigned mi = (lo + hi) / 2; - * int cmp = "entry pointed at by mi" minus "target"; - * if (!cmp) - * return (mi is the wanted one) - * if (cmp > 0) - * hi = mi; "mi is larger than target" - * else - * lo = mi+1; "mi is smaller than target" - * } while (lo < hi); - * - * The invariants are: - * - * - When entering the loop, lo points at a slot that is never - * above the target (it could be at the target), hi points at a - * slot that is guaranteed to be above the target (it can never - * be at the target). - * - * - We find a point 'mi' between lo and hi (mi could be the same - * as lo, but never can be as same as hi), and check if it hits - * the target. There are three cases: - * - * - if it is a hit, we are happy. - * - * - if it is strictly higher than the target, we set it to hi, - * and repeat the search. - * - * - if it is strictly lower than the target, we update lo to - * one slot after it, because we allow lo to be at the target. - * - * If the loop exits, there is no matching entry. - * - * When choosing 'mi', we do not have to take the "middle" but - * anywhere in between lo and hi, as long as lo <= mi < hi is - * satisfied. When we somehow know that the distance between the - * target and lo is much shorter than the target and hi, we could - * pick mi that is much closer to lo than the midway. - * - * Now, we can take advantage of the fact that SHA-1 is a good hash - * function, and as long as there are enough entries in the table, we - * can expect uniform distribution. An entry that begins with for - * example "deadbeef..." is much likely to appear much later than in - * the midway of the table. It can reasonably be expected to be near - * 87% (222/256) from the top of the table. - * - * However, we do not want to pick "mi" too precisely. If the entry at - * the 87% in the above example turns out to be higher than the target - * we are looking for, we would end up narrowing the search space down - * only by 13%, instead of 50% we would get if we did a simple binary - * search. So we would want to hedge our bets by being less aggressive. - * - * The table at "table" holds at least "nr" entries of "elem_size" - * bytes each. Each entry has the SHA-1 key at "key_offset". The - * table is sorted by the SHA-1 key of the entries. The caller wants - * to find the entry with "key", and knows that the entry at "lo" is - * not higher than the entry it is looking for, and that the entry at - * "hi" is higher than the entry it is looking for. - */ -int sha1_entry_pos(const void *table, - size_t elem_size, - size_t key_offset, - unsigned lo, unsigned hi, unsigned nr, - const unsigned char *key) -{ - const unsigned char *base = (const unsigned char*)table; - const unsigned char *hi_key, *lo_key; - unsigned ofs_0; - - if (!nr || lo >= hi) - return -1; - - if (nr == hi) - hi_key = NULL; - else - hi_key = base + elem_size * hi + key_offset; - lo_key = base + elem_size * lo + key_offset; - - ofs_0 = 0; - do { - int cmp; - unsigned ofs, mi, range; - unsigned lov, hiv, kyv; - const unsigned char *mi_key; - - range = hi - lo; - if (hi_key) { - for (ofs = ofs_0; ofs < 20; ofs++) - if (lo_key[ofs] != hi_key[ofs]) - break; - ofs_0 = ofs; - /* - * byte 0 thru (ofs-1) are the same between - * lo and hi; ofs is the first byte that is - * different. - */ - hiv = hi_key[ofs_0]; - if (ofs_0 < 19) - hiv = (hiv << 8) | hi_key[ofs_0+1]; - } else { - hiv = 256; - if (ofs_0 < 19) - hiv <<= 8; - } - lov = lo_key[ofs_0]; - kyv = key[ofs_0]; - if (ofs_0 < 19) { - lov = (lov << 8) | lo_key[ofs_0+1]; - kyv = (kyv << 8) | key[ofs_0+1]; - } - assert(lov < hiv); - - if (kyv < lov) - return -1 - lo; - if (hiv < kyv) - return -1 - hi; - - /* - * Even if we know the target is much closer to 'hi' - * than 'lo', if we pick too precisely and overshoot - * (e.g. when we know 'mi' is closer to 'hi' than to - * 'lo', pick 'mi' that is higher than the target), we - * end up narrowing the search space by a smaller - * amount (i.e. the distance between 'mi' and 'hi') - * than what we would have (i.e. about half of 'lo' - * and 'hi'). Hedge our bets to pick 'mi' less - * aggressively, i.e. make 'mi' a bit closer to the - * middle than we would otherwise pick. - */ - kyv = (kyv * 6 + lov + hiv) / 8; - if (lov < hiv - 1) { - if (kyv == lov) - kyv++; - else if (kyv == hiv) - kyv--; - } - mi = (range - 1) * (kyv - lov) / (hiv - lov) + lo; - -#ifdef INDEX_DEBUG_LOOKUP - printf("lo %u hi %u rg %u mi %u ", lo, hi, range, mi); - printf("ofs %u lov %x, hiv %x, kyv %x\n", - ofs_0, lov, hiv, kyv); -#endif - - if (!(lo <= mi && mi < hi)) { - return git__throw(GIT_ERROR, "Assertion failure. Binary search invariant is false"); - } - - mi_key = base + elem_size * mi + key_offset; - cmp = memcmp(mi_key + ofs_0, key + ofs_0, 20 - ofs_0); - if (!cmp) - return mi; - if (cmp > 0) { - hi = mi; - hi_key = mi_key; - } else { - lo = mi + 1; - lo_key = mi_key + elem_size; - } - } while (lo < hi); - return -((int)lo)-1; -} diff --git a/vendor/libgit2/src/sha1_lookup.h b/vendor/libgit2/src/sha1_lookup.h deleted file mode 100644 index 5caa2f5ed..000000000 --- a/vendor/libgit2/src/sha1_lookup.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef INCLUDE_sha1_lookup_h__ -#define INCLUDE_sha1_lookup_h__ - -#include - -int sha1_entry_pos(const void *table, - size_t elem_size, - size_t key_offset, - unsigned lo, unsigned hi, unsigned nr, - const unsigned char *key); - -#endif diff --git a/vendor/libgit2/src/signature.c b/vendor/libgit2/src/signature.c deleted file mode 100644 index 327efe247..000000000 --- a/vendor/libgit2/src/signature.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "signature.h" -#include "repository.h" -#include "git2/common.h" - -void git_signature_free(git_signature *sig) -{ - if (sig == NULL) - return; - - free(sig->name); - free(sig->email); - free(sig); -} - -static const char *skip_leading_spaces(const char *buffer, const char *buffer_end) -{ - while (*buffer == ' ' && buffer < buffer_end) - buffer++; - - return buffer; -} - -static const char *skip_trailing_spaces(const char *buffer_start, const char *buffer_end) -{ - while (*buffer_end == ' ' && buffer_end > buffer_start) - buffer_end--; - - return buffer_end; -} - -static int process_trimming(const char *input, char **storage, const char *input_end, int fail_when_empty) -{ - const char *left, *right; - int trimmed_input_length; - - left = skip_leading_spaces(input, input_end); - right = skip_trailing_spaces(input, input_end - 1); - - if (right < left) { - if (fail_when_empty) - return git__throw(GIT_EINVALIDARGS, "Failed to trim. Input is either empty or only contains spaces"); - else - right = left - 1; - } - - trimmed_input_length = right - left + 1; - - *storage = git__malloc(trimmed_input_length + 1); - if (*storage == NULL) - return GIT_ENOMEM; - - memcpy(*storage, left, trimmed_input_length); - (*storage)[trimmed_input_length] = 0; - - return GIT_SUCCESS; -} - -int git_signature_new(git_signature **sig_out, const char *name, const char *email, git_time_t time, int offset) -{ - int error; - git_signature *p = NULL; - - assert(name && email); - - *sig_out = NULL; - - if ((p = git__malloc(sizeof(git_signature))) == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - memset(p, 0x0, sizeof(git_signature)); - - error = process_trimming(name, &p->name, name + strlen(name), 1); - if (error < GIT_SUCCESS) { - git__rethrow(GIT_EINVALIDARGS, "Failed to create signature. 'name' argument is invalid"); - goto cleanup; - } - - error = process_trimming(email, &p->email, email + strlen(email), 1); - if (error < GIT_SUCCESS) { - git__rethrow(GIT_EINVALIDARGS, "Failed to create signature. 'email' argument is invalid"); - goto cleanup; - } - - p->when.time = time; - p->when.offset = offset; - - *sig_out = p; - - return error; - -cleanup: - git_signature_free(p); - return error; -} - -git_signature *git_signature_dup(const git_signature *sig) -{ - git_signature *new; - if (git_signature_new(&new, sig->name, sig->email, sig->when.time, sig->when.offset) < GIT_SUCCESS) - return NULL; - return new; -} - -int git_signature_now(git_signature **sig_out, const char *name, const char *email) -{ - int error; - time_t now; - time_t offset; - struct tm *utc_tm, *local_tm; - git_signature *sig; - -#ifndef GIT_WIN32 - struct tm _utc, _local; -#endif - - *sig_out = NULL; - - time(&now); - - /** - * On Win32, `gmtime_r` doesn't exist but - * `gmtime` is threadsafe, so we can use that - */ -#ifdef GIT_WIN32 - utc_tm = gmtime(&now); - local_tm = localtime(&now); -#else - utc_tm = gmtime_r(&now, &_utc); - local_tm = localtime_r(&now, &_local); -#endif - - offset = mktime(local_tm) - mktime(utc_tm); - offset /= 60; - - /* mktime takes care of setting tm_isdst correctly */ - if (local_tm->tm_isdst) - offset += 60; - - if ((error = git_signature_new(&sig, name, email, now, (int)offset)) < GIT_SUCCESS) - return error; - - *sig_out = sig; - - return error; -} - -static int parse_timezone_offset(const char *buffer, int *offset_out) -{ - long dec_offset; - int mins, hours, offset; - - const char *offset_start; - const char *offset_end; - - offset_start = buffer; - - if (*offset_start == '\n') { - *offset_out = 0; - return GIT_SUCCESS; - } - - if (offset_start[0] != '-' && offset_start[0] != '+') - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. It doesn't start with '+' or '-'"); - - if (offset_start[1] < '0' || offset_start[1] > '9') - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset."); - - if (git__strtol32(&dec_offset, offset_start + 1, &offset_end, 10) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. It isn't a number"); - - if (offset_end - offset_start != 5) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. Invalid length"); - - if (dec_offset > 1400) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. Value too large"); - - hours = dec_offset / 100; - mins = dec_offset % 100; - - if (hours > 14) // see http://www.worldtimezone.com/faq.html - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. Hour value too large"); - - if (mins > 59) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse TZ offset. Minute value too large"); - - offset = (hours * 60) + mins; - - if (offset_start[0] == '-') - offset *= -1; - - *offset_out = offset; - - return GIT_SUCCESS; -} - -int process_next_token(const char **buffer_out, char **storage, - const char *token_end, const char *right_boundary) -{ - int error = process_trimming(*buffer_out, storage, token_end, 0); - if (error < GIT_SUCCESS) - return error; - - *buffer_out = token_end + 1; - - if (*buffer_out > right_boundary) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Signature too short"); - - return GIT_SUCCESS; -} - -const char *scan_for_previous_token(const char *buffer, const char *left_boundary) -{ - const char *start; - - if (buffer <= left_boundary) - return NULL; - - start = skip_trailing_spaces(left_boundary, buffer); - - /* Search for previous occurence of space */ - while (start[-1] != ' ' && start > left_boundary) - start--; - - return start; -} - -int parse_time(git_time_t *time_out, const char *buffer) -{ - long time; - int error; - - if (*buffer == '+' || *buffer == '-') - return git__throw(GIT_ERROR, "Failed while parsing time. '%s' rather look like a timezone offset.", buffer); - - error = git__strtol32(&time, buffer, &buffer, 10); - - if (error < GIT_SUCCESS) - return error; - - *time_out = (git_time_t)time; - - return GIT_SUCCESS; -} - -int git_signature__parse(git_signature *sig, const char **buffer_out, - const char *buffer_end, const char *header, char ender) -{ - const char *buffer = *buffer_out; - const char *line_end, *name_end, *email_end, *tz_start, *time_start; - int error = GIT_SUCCESS; - - memset(sig, 0x0, sizeof(git_signature)); - - if ((line_end = memchr(buffer, ender, buffer_end - buffer)) == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. No newline given"); - - if (header) { - const size_t header_len = strlen(header); - - if (memcmp(buffer, header, header_len) != 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Expected prefix '%s' doesn't match actual", header); - - buffer += header_len; - } - - if (buffer > line_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Signature too short"); - - if ((name_end = strchr(buffer, '<')) == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Cannot find '<' in signature"); - - if ((email_end = strchr(buffer, '>')) == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Cannot find '>' in signature"); - - if (email_end < name_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse signature. Malformed e-mail"); - - error = process_next_token(&buffer, &sig->name, name_end, line_end); - if (error < GIT_SUCCESS) - return error; - - error = process_next_token(&buffer, &sig->email, email_end, line_end); - if (error < GIT_SUCCESS) - return error; - - tz_start = scan_for_previous_token(line_end - 1, buffer); - - if (tz_start == NULL) - goto clean_exit; /* No timezone nor date */ - - time_start = scan_for_previous_token(tz_start - 1, buffer); - if (time_start == NULL || parse_time(&sig->when.time, time_start) < GIT_SUCCESS) { - /* The tz_start might point at the time */ - parse_time(&sig->when.time, tz_start); - goto clean_exit; - } - - if (parse_timezone_offset(tz_start, &sig->when.offset) < GIT_SUCCESS) { - sig->when.time = 0; /* Bogus timezone, we reset the time */ - } - -clean_exit: - *buffer_out = line_end + 1; - return GIT_SUCCESS; -} - -void git_signature__writebuf(git_buf *buf, const char *header, const git_signature *sig) -{ - int offset, hours, mins; - char sign; - - offset = sig->when.offset; - sign = (sig->when.offset < 0) ? '-' : '+'; - - if (offset < 0) - offset = -offset; - - hours = offset / 60; - mins = offset % 60; - - git_buf_printf(buf, "%s%s <%s> %u %c%02d%02d\n", - header ? header : "", sig->name, sig->email, - (unsigned)sig->when.time, sign, hours, mins); -} - diff --git a/vendor/libgit2/src/signature.h b/vendor/libgit2/src/signature.h deleted file mode 100644 index 2fe6cd7c9..000000000 --- a/vendor/libgit2/src/signature.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef INCLUDE_signature_h__ -#define INCLUDE_signature_h__ - -#include "git2/common.h" -#include "git2/signature.h" -#include "repository.h" -#include - -int git_signature__parse(git_signature *sig, const char **buffer_out, const char *buffer_end, const char *header, char ender); -void git_signature__writebuf(git_buf *buf, const char *header, const git_signature *sig); - -#endif diff --git a/vendor/libgit2/src/status.c b/vendor/libgit2/src/status.c deleted file mode 100644 index d9613c129..000000000 --- a/vendor/libgit2/src/status.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "git2.h" -#include "fileops.h" -#include "hash.h" -#include "vector.h" -#include "tree.h" -#include "git2/status.h" - -struct status_entry { - char path[GIT_PATH_MAX]; - - git_index_time mtime; - - git_oid head_oid; - git_oid index_oid; - git_oid wt_oid; - - unsigned int status_flags:6; -}; - -static int status_cmp(const void *a, const void *b) -{ - const struct status_entry *entry_a = (const struct status_entry *)(a); - const struct status_entry *entry_b = (const struct status_entry *)(b); - - return strcmp(entry_a->path, entry_b->path); -} - -static int status_srch(const void *key, const void *array_member) -{ - const char *path = (const char *)key; - const struct status_entry *entry = (const struct status_entry *)(array_member); - - return strcmp(path, entry->path); -} - -static int find_status_entry(git_vector *entries, const char *path) -{ - return git_vector_bsearch2(entries, status_srch, path); -} - -static struct status_entry *new_status_entry(git_vector *entries, const char *path) -{ - struct status_entry *e = git__malloc(sizeof(struct status_entry)); - memset(e, 0x0, sizeof(struct status_entry)); - if (entries != NULL) - git_vector_insert(entries, e); - strcpy(e->path, path); - return e; -} - -static void recurse_tree_entries(git_tree *tree, git_vector *entries, char *path) -{ - int i, cnt, idx; - struct status_entry *e; - char file_path[GIT_PATH_MAX]; - git_tree *subtree; - - cnt = git_tree_entrycount(tree); - for (i = 0; i < cnt; ++i) { - const git_tree_entry *tree_entry = git_tree_entry_byindex(tree, i); - - git_path_join(file_path, path, tree_entry->filename); - - if (git_tree_lookup(&subtree, tree->object.repo, &tree_entry->oid) == GIT_SUCCESS) { - recurse_tree_entries(subtree, entries, file_path); - git_tree_close(subtree); - continue; - } - - if ((idx = find_status_entry(entries, file_path)) != GIT_ENOTFOUND) - e = (struct status_entry *)git_vector_get(entries, idx); - else - e = new_status_entry(entries, file_path); - - git_oid_cpy(&e->head_oid, &tree_entry->oid); - } -} - -static void recurse_tree_entry(git_tree *tree, struct status_entry *e, const char *path) -{ - char *dir_sep; - char buffer[GIT_PATH_MAX]; - const git_tree_entry *tree_entry; - git_tree *subtree; - - strcpy(buffer, path); - - dir_sep = strchr(buffer, '/'); - if (dir_sep) { - *dir_sep = '\0'; - - tree_entry = git_tree_entry_byname(tree, buffer); - if (tree_entry != NULL) { - if (git_tree_lookup(&subtree, tree->object.repo, &tree_entry->oid) == GIT_SUCCESS) { - recurse_tree_entry(subtree, e, dir_sep+1); - git_tree_close(subtree); - return; - } - } - } - - tree_entry = git_tree_entry_byname(tree, path); - if (tree_entry != NULL) { - git_oid_cpy(&e->head_oid, &tree_entry->oid); - } -} - -struct status_st { - union { - git_vector *vector; - struct status_entry *e; - } entry; - - int workdir_path_len; -}; - -static int dirent_cb(void *state, char *full_path) -{ - int idx; - struct status_entry *e; - struct status_st *st = (struct status_st *)state; - char *file_path = full_path + st->workdir_path_len; - struct stat filest; - git_oid oid; - - if ((git_futils_isdir(full_path) == GIT_SUCCESS) && (!strcmp(".git", file_path))) - return 0; - - if (git_futils_isdir(full_path) == GIT_SUCCESS) - return git_futils_direach(full_path, GIT_PATH_MAX, dirent_cb, state); - - if ((idx = find_status_entry(st->entry.vector, file_path)) != GIT_ENOTFOUND) { - e = (struct status_entry *)git_vector_get(st->entry.vector, idx); - - if (p_stat(full_path, &filest) < 0) - return git__throw(GIT_EOSERR, "Failed to read file %s", full_path); - - if (e->mtime.seconds == (git_time_t)filest.st_mtime) { - git_oid_cpy(&e->wt_oid, &e->index_oid); - return 0; - } - } else { - e = new_status_entry(st->entry.vector, file_path); - } - - git_odb_hashfile(&oid, full_path, GIT_OBJ_BLOB); - git_oid_cpy(&e->wt_oid, &oid); - - return 0; -} - -static int single_dirent_cb(void *state, char *full_path) -{ - struct status_st *st = (struct status_st *)state; - struct status_entry *e = st->entry.e; - - char *file_path = full_path + st->workdir_path_len; - struct stat filest; - git_oid oid; - - if ((git_futils_isdir(full_path) == GIT_SUCCESS) && (!strcmp(".git", file_path))) - return 0; - - if (git_futils_isdir(full_path) == GIT_SUCCESS) - return git_futils_direach(full_path, GIT_PATH_MAX, single_dirent_cb, state); - - if (!strcmp(file_path, e->path)) { - if (p_stat(full_path, &filest) < 0) - return git__throw(GIT_EOSERR, "Failed to read file %s", full_path); - - if (e->mtime.seconds == (git_time_t)filest.st_mtime) { - git_oid_cpy(&e->wt_oid, &e->index_oid); - return 1; - } - - git_odb_hashfile(&oid, full_path, GIT_OBJ_BLOB); - git_oid_cpy(&e->wt_oid, &oid); - return 1; - } - - return 0; -} - -static int set_status_flags(struct status_entry *e) -{ - git_oid zero; - int head_zero, index_zero, wt_zero; - - memset(&zero, 0x0, sizeof(git_oid)); - - head_zero = git_oid_cmp(&zero, &e->head_oid); - index_zero = git_oid_cmp(&zero, &e->index_oid); - wt_zero = git_oid_cmp(&zero, &e->wt_oid); - - if (head_zero == 0 && index_zero == 0 && wt_zero == 0) - return GIT_ENOTFOUND; - - if (head_zero == 0 && index_zero != 0) - e->status_flags |= GIT_STATUS_INDEX_NEW; - else if (index_zero == 0 && head_zero != 0) - e->status_flags |= GIT_STATUS_INDEX_DELETED; - else if (git_oid_cmp(&e->head_oid, &e->index_oid) != 0) - e->status_flags |= GIT_STATUS_INDEX_MODIFIED; - - if (index_zero == 0 && wt_zero != 0) - e->status_flags |= GIT_STATUS_WT_NEW; - else if (wt_zero == 0 && index_zero != 0) - e->status_flags |= GIT_STATUS_WT_DELETED; - else if (git_oid_cmp(&e->index_oid, &e->wt_oid) != 0) - e->status_flags |= GIT_STATUS_WT_MODIFIED; - - return GIT_SUCCESS; -} - -int git_status_foreach(git_repository *repo, int (*callback)(const char *, unsigned int, void *), void *payload) -{ - git_vector entries; - struct status_entry *e; - git_index *index; - unsigned int i, cnt; - git_index_entry *index_entry; - char temp_path[GIT_PATH_MAX]; - int error; - git_tree *tree; - struct status_st dirent_st; - - git_reference *head_ref, *resolved_head_ref; - git_commit *head_commit; - - git_repository_index(&index, repo); - - cnt = git_index_entrycount(index); - git_vector_init(&entries, cnt, status_cmp); - for (i = 0; i < cnt; ++i) { - index_entry = git_index_get(index, i); - - e = new_status_entry(&entries, index_entry->path); - git_oid_cpy(&e->index_oid, &index_entry->oid); - e->mtime = index_entry->mtime; - } - git_index_free(index); - - git_reference_lookup(&head_ref, repo, GIT_HEAD_FILE); - git_reference_resolve(&resolved_head_ref, head_ref); - - git_commit_lookup(&head_commit, repo, git_reference_oid(resolved_head_ref)); - - // recurse through tree entries - git_commit_tree(&tree, head_commit); - recurse_tree_entries(tree, &entries, ""); - git_tree_close(tree); - git_commit_close(head_commit); - - dirent_st.workdir_path_len = strlen(repo->path_workdir); - dirent_st.entry.vector = &entries; - strcpy(temp_path, repo->path_workdir); - git_futils_direach(temp_path, GIT_PATH_MAX, dirent_cb, &dirent_st); - - for (i = 0; i < entries.length; ++i) { - e = (struct status_entry *)git_vector_get(&entries, i); - - set_status_flags(e); - } - - - for (i = 0; i < entries.length; ++i) { - e = (struct status_entry *)git_vector_get(&entries, i); - - if ((error = callback(e->path, e->status_flags, payload)) < GIT_SUCCESS) - return git__throw(error, "Failed to list statuses. User callback failed"); - } - - for (i = 0; i < entries.length; ++i) { - e = (struct status_entry *)git_vector_get(&entries, i); - free(e); - } - git_vector_free(&entries); - - return GIT_SUCCESS; -} - -int git_status_file(unsigned int *status_flags, git_repository *repo, const char *path) -{ - struct status_entry *e; - git_index *index; - git_index_entry *index_entry; - char temp_path[GIT_PATH_MAX]; - int idx, error; - git_tree *tree; - git_reference *head_ref, *resolved_head_ref; - git_commit *head_commit; - struct status_st dirent_st; - - assert(status_flags); - - e = new_status_entry(NULL, path); - - // Find file in Index - git_repository_index(&index, repo); - idx = git_index_find(index, path); - if (idx >= 0) { - index_entry = git_index_get(index, idx); - git_oid_cpy(&e->index_oid, &index_entry->oid); - e->mtime = index_entry->mtime; - } - git_index_free(index); - - // Find file in HEAD - git_reference_lookup(&head_ref, repo, GIT_HEAD_FILE); - git_reference_resolve(&resolved_head_ref, head_ref); - - git_commit_lookup(&head_commit, repo, git_reference_oid(resolved_head_ref)); - - git_commit_tree(&tree, head_commit); - recurse_tree_entry(tree, e, path); - git_tree_close(tree); - git_commit_close(head_commit); - - // Find file in Workdir - dirent_st.workdir_path_len = strlen(repo->path_workdir); - dirent_st.entry.e = e; - strcpy(temp_path, repo->path_workdir); - git_futils_direach(temp_path, GIT_PATH_MAX, single_dirent_cb, &dirent_st); - - if ((error = set_status_flags(e)) < GIT_SUCCESS) { - free(e); - return git__throw(error, "Nonexistent file"); - } - - *status_flags = e->status_flags; - - free(e); - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/t03-data.h b/vendor/libgit2/src/t03-data.h deleted file mode 100644 index a4b73fec3..000000000 --- a/vendor/libgit2/src/t03-data.h +++ /dev/null @@ -1,344 +0,0 @@ - -typedef struct object_data { - char *id; /* object id (sha1) */ - char *dir; /* object store (fan-out) directory name */ - char *file; /* object store filename */ -} object_data; - -static object_data commit = { - "3d7f8a6af076c8c3f20071a8935cdbe8228594d1", - "test-objects/3d", - "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1", -}; - -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - -static git_rawobj commit_obj = { - commit_data, - sizeof(commit_data), - GIT_OBJ_COMMIT -}; - -static object_data tree = { - "dff2da90b254e1beb889d1f1f1288be1803782df", - "test-objects/df", - "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df", -}; - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static git_rawobj tree_obj = { - tree_data, - sizeof(tree_data), - GIT_OBJ_TREE -}; - -static object_data tag = { - "09d373e1dfdc16b129ceec6dd649739911541e05", - "test-objects/09", - "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05", -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -static git_rawobj tag_obj = { - tag_data, - sizeof(tag_data), - GIT_OBJ_TAG -}; - -static object_data zero = { - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "test-objects/e6", - "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", -}; - -static unsigned char zero_data[] = { - 0x00 /* dummy data */ -}; - -static git_rawobj zero_obj = { - zero_data, - 0, - GIT_OBJ_BLOB -}; - -static object_data one = { - "8b137891791fe96927ad78e64b0aad7bded08bdc", - "test-objects/8b", - "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc", -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static git_rawobj one_obj = { - one_data, - sizeof(one_data), - GIT_OBJ_BLOB -}; - -static object_data two = { - "78981922613b2afb6025042ff6bd878ac1994e85", - "test-objects/78", - "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85", -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static git_rawobj two_obj = { - two_data, - sizeof(two_data), - GIT_OBJ_BLOB -}; - -static object_data some = { - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "test-objects/fd", - "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe", -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -static git_rawobj some_obj = { - some_data, - sizeof(some_data), - GIT_OBJ_BLOB -}; diff --git a/vendor/libgit2/src/tag.c b/vendor/libgit2/src/tag.c deleted file mode 100644 index 21bc3c726..000000000 --- a/vendor/libgit2/src/tag.c +++ /dev/null @@ -1,435 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "commit.h" -#include "tag.h" -#include "signature.h" -#include "git2/object.h" -#include "git2/repository.h" -#include "git2/signature.h" - -void git_tag__free(git_tag *tag) -{ - git_signature_free(tag->tagger); - free(tag->message); - free(tag->tag_name); - free(tag); -} - -const git_oid *git_tag_id(git_tag *c) -{ - return git_object_id((git_object *)c); -} - -int git_tag_target(git_object **target, git_tag *t) -{ - assert(t); - return git_object_lookup(target, t->object.repo, &t->target, t->type); -} - -const git_oid *git_tag_target_oid(git_tag *t) -{ - assert(t); - return &t->target; -} - -git_otype git_tag_type(git_tag *t) -{ - assert(t); - return t->type; -} - -const char *git_tag_name(git_tag *t) -{ - assert(t); - return t->tag_name; -} - -const git_signature *git_tag_tagger(git_tag *t) -{ - return t->tagger; -} - -const char *git_tag_message(git_tag *t) -{ - assert(t); - return t->message; -} - -static int parse_tag_buffer(git_tag *tag, const char *buffer, const char *buffer_end) -{ - static const char *tag_types[] = { - NULL, "commit\n", "tree\n", "blob\n", "tag\n" - }; - - unsigned int i, text_len; - char *search; - int error; - - if ((error = git_oid__parse(&tag->target, &buffer, buffer_end, "object ")) < 0) - return git__rethrow(error, "Failed to parse tag. Object field invalid"); - - if (buffer + 5 >= buffer_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Object too short"); - - if (memcmp(buffer, "type ", 5) != 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Type field not found"); - buffer += 5; - - tag->type = GIT_OBJ_BAD; - - for (i = 1; i < ARRAY_SIZE(tag_types); ++i) { - size_t type_length = strlen(tag_types[i]); - - if (buffer + type_length >= buffer_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Object too short"); - - if (memcmp(buffer, tag_types[i], type_length) == 0) { - tag->type = i; - buffer += type_length; - break; - } - } - - if (tag->type == GIT_OBJ_BAD) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Invalid object type"); - - if (buffer + 4 >= buffer_end) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Object too short"); - - if (memcmp(buffer, "tag ", 4) != 0) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Tag field not found"); - - buffer += 4; - - search = memchr(buffer, '\n', buffer_end - buffer); - if (search == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. Object too short"); - - text_len = search - buffer; - - tag->tag_name = git__malloc(text_len + 1); - if (tag->tag_name == NULL) - return GIT_ENOMEM; - - memcpy(tag->tag_name, buffer, text_len); - tag->tag_name[text_len] = '\0'; - - buffer = search + 1; - - tag->tagger = git__malloc(sizeof(git_signature)); - if (tag->tagger == NULL) - return GIT_ENOMEM; - - if ((error = git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ", '\n')) != 0) { - free(tag->tag_name); - git_signature_free(tag->tagger); - return git__rethrow(error, "Failed to parse tag"); - } - - if( *buffer != '\n' ) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tag. No new line before message"); - - text_len = buffer_end - ++buffer; - - tag->message = git__malloc(text_len + 1); - if (tag->message == NULL) - return GIT_ENOMEM; - - memcpy(tag->message, buffer, text_len); - tag->message[text_len] = '\0'; - - return GIT_SUCCESS; -} - -static int retrieve_tag_reference(git_reference **tag_reference_out, char *ref_name_out, git_repository *repo, const char *tag_name) -{ - git_reference *tag_ref; - int error; - - git_path_join(ref_name_out, GIT_REFS_TAGS_DIR, tag_name); - error = git_reference_lookup(&tag_ref, repo, ref_name_out); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to retrieve tag reference"); - - *tag_reference_out = tag_ref; - - return GIT_SUCCESS; -} - -static int write_tag_annotation( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message) -{ - int error = GIT_SUCCESS; - git_buf tag = GIT_BUF_INIT; - - git_oid__writebuf(&tag, "object ", git_object_id(target)); - git_buf_printf(&tag, "type %s\n", git_object_type2string(git_object_type(target))); - git_buf_printf(&tag, "tag %s\n", tag_name); - git_signature__writebuf(&tag, "tagger ", tagger); - git_buf_putc(&tag, '\n'); - git_buf_puts(&tag, message); - - if (git_buf_oom(&tag)) { - git_buf_free(&tag); - return git__throw(GIT_ENOMEM, "Not enough memory to build the tag data"); - } - - error = git_odb_write(oid, git_repository_database(repo), tag.ptr, tag.size, GIT_OBJ_TAG); - git_buf_free(&tag); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create tag annotation"); - - return error; -} - -static int git_tag_create__internal( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int allow_ref_overwrite, - int create_tag_annotation) -{ - git_reference *new_ref = NULL; - char ref_name[GIT_REFNAME_MAX]; - - int error, should_update_ref = 0; - - assert(repo && tag_name && target); - assert(!create_tag_annotation || (tagger && message)); - - if (git_object_owner(target) != repo) - return git__throw(GIT_EINVALIDARGS, "The given target does not belong to this repository"); - - error = retrieve_tag_reference(&new_ref, ref_name, repo, tag_name); - - switch (error) { - case GIT_SUCCESS: - case GIT_ENOTFOUND: - break; - - default: - return git__rethrow(error, "Failed to create tag"); - } - - /** Ensure the tag name doesn't conflict with an already existing - * reference unless overwriting has explictly been requested **/ - if (new_ref != NULL) { - if (!allow_ref_overwrite) { - git_oid_cpy(oid, git_reference_oid(new_ref)); - return git__throw(GIT_EEXISTS, "Tag already exists"); - } else { - should_update_ref = 1; - } - } - - if (create_tag_annotation) { - if ((error = write_tag_annotation(oid, repo, tag_name, target, tagger, message)) < GIT_SUCCESS) - return error; - } else - git_oid_cpy(oid, git_object_id(target)); - - if (!should_update_ref) - error = git_reference_create_oid(&new_ref, repo, ref_name, oid, 0); - else - error = git_reference_set_oid(new_ref, oid); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create tag"); -} - -int git_tag_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int allow_ref_overwrite) -{ - return git_tag_create__internal(oid, repo, tag_name, target, tagger, message, allow_ref_overwrite, 1); -} - -int git_tag_create_lightweight( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - int allow_ref_overwrite) -{ - return git_tag_create__internal(oid, repo, tag_name, target, NULL, NULL, allow_ref_overwrite, 0); -} - -int git_tag_create_frombuffer(git_oid *oid, git_repository *repo, const char *buffer, int allow_ref_overwrite) -{ - git_tag tag; - int error, should_update_ref = 0; - git_odb_stream *stream; - git_odb_object *target_obj; - - git_reference *new_ref; - char ref_name[GIT_REFNAME_MAX]; - - assert(oid && buffer); - - memset(&tag, 0, sizeof(tag)); - - /* validate the buffer */ - if ((error = parse_tag_buffer(&tag, buffer, buffer + strlen(buffer))) < GIT_SUCCESS) - return git__rethrow(error, "Failed to create tag"); - - /* validate the target */ - if ((error = git_odb_read(&target_obj, repo->db, &tag.target)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to create tag"); - - if (tag.type != target_obj->raw.type) - return git__throw(error, "The type for the given target is invalid"); - - git_odb_object_close(target_obj); - - error = retrieve_tag_reference(&new_ref, ref_name, repo, tag.tag_name); - - switch (error) { - case GIT_SUCCESS: - case GIT_ENOTFOUND: - break; - - default: - return git__rethrow(error, "Failed to create tag"); - } - - /** Ensure the tag name doesn't conflict with an already existing - * reference unless overwriting has explictly been requested **/ - if (new_ref != NULL) { - if (!allow_ref_overwrite) { - git_oid_cpy(oid, git_reference_oid(new_ref)); - return git__throw(GIT_EEXISTS, "Tag already exists"); - } else { - should_update_ref = 1; - } - } - - /* write the buffer */ - if ((error = git_odb_open_wstream(&stream, repo->db, strlen(buffer), GIT_OBJ_TAG)) < GIT_SUCCESS) - return git__rethrow(error, "Failed to create tag"); - - stream->write(stream, buffer, strlen(buffer)); - - error = stream->finalize_write(oid, stream); - stream->free(stream); - - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create tag"); - - if (!should_update_ref) - error = git_reference_create_oid(&new_ref, repo, ref_name, oid, 0); - else - error = git_reference_set_oid(new_ref, oid); - - git_signature_free(tag.tagger); - free(tag.tag_name); - free(tag.message); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to create tag"); -} - -int git_tag_delete(git_repository *repo, const char *tag_name) -{ - int error; - git_reference *tag_ref; - char ref_name[GIT_REFNAME_MAX]; - - error = retrieve_tag_reference(&tag_ref, ref_name, repo, tag_name); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to delete tag"); - - return git_reference_delete(tag_ref); -} - -int git_tag__parse(git_tag *tag, git_odb_object *obj) -{ - assert(tag); - return parse_tag_buffer(tag, obj->raw.data, (char *)obj->raw.data + obj->raw.len); -} - -typedef struct { - git_vector *taglist; - const char *pattern; -} tag_filter_data; - -#define GIT_REFS_TAGS_DIR_LEN strlen(GIT_REFS_TAGS_DIR) - -static int tag_list_cb(const char *tag_name, void *payload) -{ - tag_filter_data *filter; - - if (git__prefixcmp(tag_name, GIT_REFS_TAGS_DIR) != 0) - return GIT_SUCCESS; - - filter = (tag_filter_data *)payload; - if (!*filter->pattern || p_fnmatch(filter->pattern, tag_name + GIT_REFS_TAGS_DIR_LEN, 0) == GIT_SUCCESS) - return git_vector_insert(filter->taglist, git__strdup(tag_name)); - - return GIT_SUCCESS; -} - -int git_tag_list_match(git_strarray *tag_names, const char *pattern, git_repository *repo) -{ - int error; - tag_filter_data filter; - git_vector taglist; - - assert(tag_names && repo && pattern); - - if (git_vector_init(&taglist, 8, NULL) < GIT_SUCCESS) - return GIT_ENOMEM; - - filter.taglist = &taglist; - filter.pattern = pattern; - - error = git_reference_foreach(repo, GIT_REF_OID|GIT_REF_PACKED, &tag_list_cb, (void *)&filter); - if (error < GIT_SUCCESS) { - git_vector_free(&taglist); - return git__rethrow(error, "Failed to list tags"); - } - - tag_names->strings = (char **)taglist.contents; - tag_names->count = taglist.length; - return GIT_SUCCESS; -} - -int git_tag_list(git_strarray *tag_names, git_repository *repo) -{ - return git_tag_list_match(tag_names, "", repo); -} diff --git a/vendor/libgit2/src/tag.h b/vendor/libgit2/src/tag.h deleted file mode 100644 index eddf8fa3a..000000000 --- a/vendor/libgit2/src/tag.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef INCLUDE_tag_h__ -#define INCLUDE_tag_h__ - -#include "git2/tag.h" -#include "repository.h" -#include "odb.h" - -struct git_tag { - git_object object; - - git_oid target; - git_otype type; - - char *tag_name; - git_signature *tagger; - char *message; -}; - -void git_tag__free(git_tag *tag); -int git_tag__parse(git_tag *tag, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/thread-utils.c b/vendor/libgit2/src/thread-utils.c deleted file mode 100644 index 5e8220f46..000000000 --- a/vendor/libgit2/src/thread-utils.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "common.h" -#include "thread-utils.h" - -#ifdef _WIN32 -# define WIN32_LEAN_AND_MEAN -# include -#elif defined(hpux) || defined(__hpux) || defined(_hpux) -# include -#endif - -/* - * By doing this in two steps we can at least get - * the function to be somewhat coherent, even - * with this disgusting nest of #ifdefs. - */ -#ifndef _SC_NPROCESSORS_ONLN -# ifdef _SC_NPROC_ONLN -# define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN -# elif defined _SC_CRAY_NCPU -# define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU -# endif -#endif - -int git_online_cpus(void) -{ -#ifdef _SC_NPROCESSORS_ONLN - long ncpus; -#endif - -#ifdef _WIN32 - SYSTEM_INFO info; - GetSystemInfo(&info); - - if ((int)info.dwNumberOfProcessors > 0) - return (int)info.dwNumberOfProcessors; -#elif defined(hpux) || defined(__hpux) || defined(_hpux) - struct pst_dynamic psd; - - if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)) - return (int)psd.psd_proc_cnt; -#endif - -#ifdef _SC_NPROCESSORS_ONLN - if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0) - return (int)ncpus; -#endif - - return 1; -} diff --git a/vendor/libgit2/src/thread-utils.h b/vendor/libgit2/src/thread-utils.h deleted file mode 100644 index 20d6022ea..000000000 --- a/vendor/libgit2/src/thread-utils.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef INCLUDE_thread_utils_h__ -#define INCLUDE_thread_utils_h__ - - - -/* Common operations even if threading has been disabled */ -typedef struct { -#if defined(_MSC_VER) - volatile long val; -#else - volatile int val; -#endif -} git_atomic; - -GIT_INLINE(void) git_atomic_set(git_atomic *a, int val) -{ - a->val = val; -} - -#ifdef GIT_THREADS - -#define git_thread pthread_t -#define git_thread_create(thread, attr, start_routine, arg) pthread_create(thread, attr, start_routine, arg) -#define git_thread_kill(thread) pthread_cancel(thread) -#define git_thread_exit(status) pthread_exit(status) -#define git_thread_join(id, status) pthread_join(id, status) - -/* Pthreads Mutex */ -#define git_mutex pthread_mutex_t -#define git_mutex_init(a) pthread_mutex_init(a, NULL) -#define git_mutex_lock(a) pthread_mutex_lock(a) -#define git_mutex_unlock(a) pthread_mutex_unlock(a) -#define git_mutex_free(a) pthread_mutex_destroy(a) - -/* Pthreads condition vars -- disabled by now */ -#define git_cond unsigned int //pthread_cond_t -#define git_cond_init(c, a) (void)0 //pthread_cond_init(c, a) -#define git_cond_free(c) (void)0 //pthread_cond_destroy(c) -#define git_cond_wait(c, l) (void)0 //pthread_cond_wait(c, l) -#define git_cond_signal(c) (void)0 //pthread_cond_signal(c) -#define git_cond_broadcast(c) (void)0 //pthread_cond_broadcast(c) - -GIT_INLINE(int) git_atomic_inc(git_atomic *a) -{ -#ifdef __GNUC__ - return __sync_add_and_fetch(&a->val, 1); -#elif defined(_MSC_VER) - return InterlockedIncrement(&a->val); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -GIT_INLINE(int) git_atomic_dec(git_atomic *a) -{ -#ifdef __GNUC__ - return __sync_sub_and_fetch(&a->val, 1); -#elif defined(_MSC_VER) - return InterlockedDecrement(&a->val); -#else -# error "Unsupported architecture for atomic operations" -#endif -} - -#else - -#define git_thread unsigned int -#define git_thread_create(thread, attr, start_routine, arg) (void)0 -#define git_thread_kill(thread) (void)0 -#define git_thread_exit(status) (void)0 -#define git_thread_join(id, status) (void)0 - -/* Pthreads Mutex */ -#define git_mutex unsigned int -#define git_mutex_init(a) (void)0 -#define git_mutex_lock(a) (void)0 -#define git_mutex_unlock(a) (void)0 -#define git_mutex_free(a) (void)0 - -/* Pthreads condition vars */ -#define git_cond unsigned int -#define git_cond_init(c, a) (void)0 -#define git_cond_free(c) (void)0 -#define git_cond_wait(c, l) (void)0 -#define git_cond_signal(c) (void)0 -#define git_cond_broadcast(c) (void)0 - -GIT_INLINE(int) git_atomic_inc(git_atomic *a) -{ - return ++a->val; -} - -GIT_INLINE(int) git_atomic_dec(git_atomic *a) -{ - return --a->val; -} - -#endif - -extern int git_online_cpus(void); - -#endif /* INCLUDE_thread_utils_h__ */ diff --git a/vendor/libgit2/src/transport.c b/vendor/libgit2/src/transport.c deleted file mode 100644 index 91f621c46..000000000 --- a/vendor/libgit2/src/transport.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "common.h" -#include "git2/types.h" -#include "git2/transport.h" -#include "git2/net.h" -#include "transport.h" - -struct { - char *prefix; - git_transport_cb fn; -} transports[] = { - {"git://", git_transport_git}, - {"http://", git_transport_dummy}, - {"https://", git_transport_dummy}, - {"file://", git_transport_local}, - {"git+ssh://", git_transport_dummy}, - {"ssh+git://", git_transport_dummy}, - {NULL, 0} -}; - -static git_transport_cb transport_new_fn(const char *url) -{ - int i = 0; - - while (1) { - if (transports[i].prefix == NULL) - break; - - if (!strncasecmp(url, transports[i].prefix, strlen(transports[i].prefix))) - return transports[i].fn; - - ++i; - } - - /* - * If we still haven't found the transport, we assume we mean a - * local file. - * TODO: Parse "example.com:project.git" as an SSH URL - */ - return git_transport_local; -} - -/************** - * Public API * - **************/ - -int git_transport_dummy(git_transport **GIT_UNUSED(transport)) -{ - GIT_UNUSED_ARG(transport); - return git__throw(GIT_ENOTIMPLEMENTED, "This protocol isn't implemented. Sorry"); -} - -int git_transport_new(git_transport **out, const char *url) -{ - git_transport_cb fn; - git_transport *transport; - int error; - - fn = transport_new_fn(url); - - error = fn(&transport); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to create new transport"); - - transport->url = git__strdup(url); - if (transport->url == NULL) - return GIT_ENOMEM; - - *out = transport; - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/transport.h b/vendor/libgit2/src/transport.h deleted file mode 100644 index 9489ac803..000000000 --- a/vendor/libgit2/src/transport.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef INCLUDE_transport_h__ -#define INCLUDE_transport_h__ - -#include "git2/transport.h" -#include "git2/net.h" -#include "vector.h" - -#define GIT_CAP_OFS_DELTA "ofs-delta" - -typedef struct git_transport_caps { - int common:1, - ofs_delta:1; -} git_transport_caps; - -/* - * A day in the life of a network operation - * ======================================== - * - * The library gets told to ls-remote/push/fetch on/to/from some - * remote. We look at the URL of the remote and fill the function - * table with whatever is appropriate (the remote may be git over git, - * ssh or http(s). It may even be an hg or svn repository, the library - * at this level doesn't care, it just calls the helpers. - * - * The first call is to ->connect() which connects to the remote, - * making use of the direction if necessary. This function must also - * store the remote heads and any other information it needs. - * - * The next useful step is to call ->ls() to get the list of - * references available to the remote. These references may have been - * collected on connect, or we may build them now. For ls-remote, - * nothing else is needed other than closing the connection. - * Otherwise, the higher leves decide which objects we want to - * have. ->send_have() is used to tell the other end what we have. If - * we do need to download a pack, ->download_pack() is called. - * - * When we're done, we call ->close() to close the - * connection. ->free() takes care of freeing all the resources. - */ - -struct git_transport { - /** - * Where the repo lives - */ - char *url; - /** - * Whether we want to push or fetch - */ - int direction : 1, /* 0 fetch, 1 push */ - connected : 1; - /** - * Connect and store the remote heads - */ - int (*connect)(struct git_transport *transport, int dir); - /** - * Give a list of references, useful for ls-remote - */ - int (*ls)(struct git_transport *transport, git_headarray *headarray); - /** - * Push the changes over - */ - int (*push)(struct git_transport *transport); - /** - * Send the list of 'want' refs - */ - int (*send_wants)(struct git_transport *transport, git_headarray *list); - /** - * Send the list of 'have' refs - */ - int (*send_have)(struct git_transport *transport, git_oid *oid); - /** - * Send a 'done' message - */ - int (*send_done)(struct git_transport *transport); - /** - * Negotiate the minimal amount of objects that need to be - * retrieved - */ - int (*negotiate_fetch)(struct git_transport *transport, git_repository *repo, git_headarray *list); - /** - * Send a flush - */ - int (*send_flush)(struct git_transport *transport); - /** - * Download the packfile - */ - int (*download_pack)(char **out, struct git_transport *transport, git_repository *repo); - /** - * Fetch the changes - */ - int (*fetch)(struct git_transport *transport); - /** - * Close the connection - */ - int (*close)(struct git_transport *transport); - /** - * Free the associated resources - */ - void (*free)(struct git_transport *transport); -}; - -int git_transport_local(struct git_transport **transport); -int git_transport_git(struct git_transport **transport); -int git_transport_dummy(struct git_transport **transport); - -#endif diff --git a/vendor/libgit2/src/transport_git.c b/vendor/libgit2/src/transport_git.c deleted file mode 100644 index 7b0edcfef..000000000 --- a/vendor/libgit2/src/transport_git.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "git2/net.h" -#include "git2/common.h" -#include "git2/types.h" -#include "git2/errors.h" -#include "git2/net.h" -#include "git2/revwalk.h" - -#include "vector.h" -#include "transport.h" -#include "pkt.h" -#include "common.h" -#include "netops.h" -#include "filebuf.h" -#include "repository.h" - -typedef struct { - git_transport parent; - int socket; - git_vector refs; - git_remote_head **heads; - git_transport_caps caps; -} transport_git; - -/* - * Create a git procol request. - * - * For example: 0035git-upload-pack /libgit2/libgit2\0host=github.com\0 - */ -static int gen_proto(char **out, int *outlen, const char *cmd, const char *url) -{ - char *delim, *repo, *ptr; - char default_command[] = "git-upload-pack"; - char host[] = "host="; - int len; - - delim = strchr(url, '/'); - if (delim == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Failed to create proto-request: malformed URL"); - - repo = delim; - - delim = strchr(url, ':'); - if (delim == NULL) - delim = strchr(url, '/'); - - if (cmd == NULL) - cmd = default_command; - - len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + strlen(host) + (delim - url) + 2; - - *out = git__malloc(len); - if (*out == NULL) - return GIT_ENOMEM; - - *outlen = len - 1; - ptr = *out; - memset(ptr, 0x0, len); - /* We expect the return value to be > len - 1 so don't bother checking it */ - snprintf(ptr, len -1, "%04x%s %s%c%s%s", len - 1, cmd, repo, 0, host, url); - - return GIT_SUCCESS; -} - -static int send_request(int s, const char *cmd, const char *url) -{ - int error, len; - char *msg = NULL; - - error = gen_proto(&msg, &len, cmd, url); - if (error < GIT_SUCCESS) - goto cleanup; - - error = gitno_send(s, msg, len, 0); - -cleanup: - free(msg); - return error; -} - -/* The URL should already have been stripped of the protocol */ -static int extract_host_and_port(char **host, char **port, const char *url) -{ - char *colon, *slash, *delim; - int error = GIT_SUCCESS; - - colon = strchr(url, ':'); - slash = strchr(url, '/'); - - if (slash == NULL) - return git__throw(GIT_EOBJCORRUPTED, "Malformed URL: missing /"); - - if (colon == NULL) { - *port = git__strdup(GIT_DEFAULT_PORT); - } else { - *port = git__strndup(colon + 1, slash - colon - 1); - } - if (*port == NULL) - return GIT_ENOMEM;; - - - delim = colon == NULL ? slash : colon; - *host = git__strndup(url, delim - url); - if (*host == NULL) { - free(*port); - error = GIT_ENOMEM; - } - - return error; -} - -/* - * Parse the URL and connect to a server, storing the socket in - * out. For convenience this also takes care of asking for the remote - * refs - */ -static int do_connect(transport_git *t, const char *url) -{ - int s = -1; - char *host, *port; - const char prefix[] = "git://"; - int error, connected = 0; - - if (!git__prefixcmp(url, prefix)) - url += strlen(prefix); - - error = extract_host_and_port(&host, &port, url); - if (error < GIT_SUCCESS) - return error; - s = gitno_connect(host, port); - connected = 1; - error = send_request(s, NULL, url); - t->socket = s; - - free(host); - free(port); - - if (error < GIT_SUCCESS && s > 0) - close(s); - if (!connected) - error = git__throw(GIT_EOSERR, "Failed to connect to any of the addresses"); - - return error; -} - -/* - * Read from the socket and store the references in the vector - */ -static int store_refs(transport_git *t) -{ - gitno_buffer buf; - int s = t->socket; - git_vector *refs = &t->refs; - int error = GIT_SUCCESS; - char buffer[1024]; - const char *line_end, *ptr; - git_pkt *pkt; - - gitno_buffer_setup(&buf, buffer, sizeof(buffer), s); - - while (1) { - error = gitno_recv(&buf); - if (error < GIT_SUCCESS) - return git__rethrow(GIT_EOSERR, "Failed to receive data"); - if (error == GIT_SUCCESS) /* Orderly shutdown, so exit */ - return GIT_SUCCESS; - - ptr = buf.data; - while (1) { - if (buf.offset == 0) - break; - error = git_pkt_parse_line(&pkt, ptr, &line_end, buf.offset); - /* - * If the error is GIT_ESHORTBUFFER, it means the buffer - * isn't long enough to satisfy the request. Break out and - * wait for more input. - * On any other error, fail. - */ - if (error == GIT_ESHORTBUFFER) { - break; - } - if (error < GIT_SUCCESS) { - return error; - } - - /* Get rid of the part we've used already */ - gitno_consume(&buf, line_end); - - error = git_vector_insert(refs, pkt); - if (error < GIT_SUCCESS) - return error; - - if (pkt->type == GIT_PKT_FLUSH) - return GIT_SUCCESS; - - } - } - - return error; -} - -static int detect_caps(transport_git *t) -{ - git_vector *refs = &t->refs; - git_pkt_ref *pkt; - git_transport_caps *caps = &t->caps; - const char *ptr; - - pkt = git_vector_get(refs, 0); - /* No refs or capabilites, odd but not a problem */ - if (pkt == NULL || pkt->capabilities == NULL) - return GIT_SUCCESS; - - ptr = pkt->capabilities; - while (ptr != NULL && *ptr != '\0') { - if (*ptr == ' ') - ptr++; - - if(!git__prefixcmp(ptr, GIT_CAP_OFS_DELTA)) { - caps->common = caps->ofs_delta = 1; - ptr += strlen(GIT_CAP_OFS_DELTA); - continue; - } - - /* We don't know this capability, so skip it */ - ptr = strchr(ptr, ' '); - } - - return GIT_SUCCESS; -} - -/* - * Since this is a network connection, we need to parse and store the - * pkt-lines at this stage and keep them there. - */ -static int git_connect(git_transport *transport, int direction) -{ - transport_git *t = (transport_git *) transport; - int error = GIT_SUCCESS; - - if (direction == GIT_DIR_PUSH) - return git__throw(GIT_EINVALIDARGS, "Pushing is not supported with the git protocol"); - - t->parent.direction = direction; - error = git_vector_init(&t->refs, 16, NULL); - if (error < GIT_SUCCESS) - goto cleanup; - - /* Connect and ask for the refs */ - error = do_connect(t, transport->url); - if (error < GIT_SUCCESS) - return error; - - t->parent.connected = 1; - error = store_refs(t); - if (error < GIT_SUCCESS) - return error; - - error = detect_caps(t); - -cleanup: - if (error < GIT_SUCCESS) { - git_vector_free(&t->refs); - } - - return error; -} - -static int git_ls(git_transport *transport, git_headarray *array) -{ - transport_git *t = (transport_git *) transport; - git_vector *refs = &t->refs; - int len = 0; - unsigned int i; - - array->heads = git__calloc(refs->length, sizeof(git_remote_head *)); - if (array->heads == NULL) - return GIT_ENOMEM; - - for (i = 0; i < refs->length; ++i) { - git_pkt *p = git_vector_get(refs, i); - if (p->type != GIT_PKT_REF) - continue; - - ++len; - array->heads[i] = &(((git_pkt_ref *) p)->head); - } - array->len = len; - t->heads = array->heads; - - return GIT_SUCCESS; -} - -static int git_send_wants(git_transport *transport, git_headarray *array) -{ - transport_git *t = (transport_git *) transport; - - return git_pkt_send_wants(array, &t->caps, t->socket); -} - -static int git_send_have(git_transport *transport, git_oid *oid) -{ - transport_git *t = (transport_git *) transport; - - return git_pkt_send_have(oid, t->socket); -} - -static int git_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *GIT_UNUSED(list)) -{ - transport_git *t = (transport_git *) transport; - git_revwalk *walk; - git_reference *ref; - git_strarray refs; - git_oid oid; - int error; - unsigned int i; - char buff[128]; - gitno_buffer buf; - GIT_UNUSED_ARG(list); - - gitno_buffer_setup(&buf, buff, sizeof(buff), t->socket); - - error = git_reference_listall(&refs, repo, GIT_REF_LISTALL); - if (error < GIT_ERROR) - return git__rethrow(error, "Failed to list all references"); - - error = git_revwalk_new(&walk, repo); - if (error < GIT_ERROR) { - error = git__rethrow(error, "Failed to list all references"); - goto cleanup; - } - git_revwalk_sorting(walk, GIT_SORT_TIME); - - for (i = 0; i < refs.count; ++i) { - /* No tags */ - if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR)) - continue; - - error = git_reference_lookup(&ref, repo, refs.strings[i]); - if (error < GIT_ERROR) { - error = git__rethrow(error, "Failed to lookup %s", refs.strings[i]); - goto cleanup; - } - - if (git_reference_type(ref) == GIT_REF_SYMBOLIC) - continue; - error = git_revwalk_push(walk, git_reference_oid(ref)); - if (error < GIT_ERROR) { - error = git__rethrow(error, "Failed to push %s", refs.strings[i]); - goto cleanup; - } - } - git_strarray_free(&refs); - - /* - * We don't support any kind of ACK extensions, so the negotiation - * boils down to sending what we have and listening for an ACK - * every once in a while. - */ - i = 0; - while ((error = git_revwalk_next(&oid, walk)) == GIT_SUCCESS) { - error = git_pkt_send_have(&oid, t->socket); - i++; - if (i % 20 == 0) { - const char *ptr = buf.data, *line_end; - git_pkt *pkt; - git_pkt_send_flush(t->socket); - while (1) { - /* Wait for max. 1 second */ - error = gitno_select_in(&buf, 1, 0); - if (error < GIT_SUCCESS) { - error = git__throw(GIT_EOSERR, "Error in select"); - } else if (error == 0) { - /* - * Some servers don't respond immediately, so if this - * happens, we keep sending information until it - * answers. - */ - break; - } - - error = gitno_recv(&buf); - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Error receiving data"); - goto cleanup; - } - error = git_pkt_parse_line(&pkt, ptr, &line_end, buf.offset); - if (error == GIT_ESHORTBUFFER) - continue; - if (error < GIT_SUCCESS) { - error = git__rethrow(error, "Failed to get answer"); - goto cleanup; - } - - gitno_consume(&buf, line_end); - - if (pkt->type == GIT_PKT_ACK) { - error = GIT_SUCCESS; - goto done; - } else if (pkt->type == GIT_PKT_NAK) { - break; - } else { - error = git__throw(GIT_ERROR, "Got unexpected pkt type"); - goto cleanup; - } - } - } - } - if (error == GIT_EREVWALKOVER) - error = GIT_SUCCESS; - -done: - git_pkt_send_flush(t->socket); - git_pkt_send_done(t->socket); - -cleanup: - git_revwalk_free(walk); - return error; -} - -static int git_send_flush(git_transport *transport) -{ - transport_git *t = (transport_git *) transport; - - return git_pkt_send_flush(t->socket); -} - -static int git_send_done(git_transport *transport) -{ - transport_git *t = (transport_git *) transport; - - return git_pkt_send_done(t->socket); -} - -static int store_pack(char **out, gitno_buffer *buf, git_repository *repo) -{ - git_filebuf file; - int error; - char path[GIT_PATH_MAX], suff[] = "/objects/pack/pack-received\0"; - off_t off = 0; - - strcpy(path, repo->path_repository); - off += strlen(repo->path_repository); - strcat(path, suff); - //memcpy(path + off, suff, GIT_PATH_MAX - off - strlen(suff) - 1); - - if (memcmp(buf->data, "PACK", strlen("PACK"))) { - return git__throw(GIT_ERROR, "The pack doesn't start with the signature"); - } - - error = git_filebuf_open(&file, path, GIT_FILEBUF_TEMPORARY); - if (error < GIT_SUCCESS) - goto cleanup; - - while (1) { - /* Part of the packfile has been received, don't loose it */ - error = git_filebuf_write(&file, buf->data, buf->offset); - if (error < GIT_SUCCESS) - goto cleanup; - - gitno_consume_n(buf, buf->offset); - error = gitno_recv(buf); - if (error < GIT_SUCCESS) - goto cleanup; - if (error == 0) /* Orderly shutdown */ - break; - } - - *out = git__strdup(file.path_lock); - if (*out == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - - /* A bit dodgy, but we need to keep the pack at the temporary path */ - error = git_filebuf_commit_at(&file, file.path_lock); -cleanup: - if (error < GIT_SUCCESS) - git_filebuf_cleanup(&file); - - return error; -} - -static int git_download_pack(char **out, git_transport *transport, git_repository *repo) -{ - transport_git *t = (transport_git *) transport; - int s = t->socket, error = GIT_SUCCESS; - gitno_buffer buf; - char buffer[1024]; - git_pkt *pkt; - const char *line_end, *ptr; - - gitno_buffer_setup(&buf, buffer, sizeof(buffer), s); - /* - * For now, we ignore everything and wait for the pack - */ - while (1) { - error = gitno_recv(&buf); - if (error < GIT_SUCCESS) - return git__rethrow(GIT_EOSERR, "Failed to receive data"); - if (error == 0) /* Orderly shutdown */ - return GIT_SUCCESS; - - ptr = buf.data; - /* Whilst we're searching for the pack */ - while (1) { - if (buf.offset == 0) - break; - error = git_pkt_parse_line(&pkt, ptr, &line_end, buf.offset); - if (error == GIT_ESHORTBUFFER) - break; - if (error < GIT_SUCCESS) - return error; - - if (pkt->type == GIT_PKT_PACK) - return store_pack(out, &buf, repo); - - /* For now we don't care about anything */ - free(pkt); - gitno_consume(&buf, line_end); - } - } -} - - -static int git_close(git_transport *transport) -{ - transport_git *t = (transport_git*) transport; - int s = t->socket; - int error; - - /* Can't do anything if there's an error, so don't bother checking */ - git_pkt_send_flush(s); - error = close(s); - if (error < 0) - error = git__throw(GIT_EOSERR, "Failed to close socket"); - - return error; -} - -static void git_free(git_transport *transport) -{ - transport_git *t = (transport_git *) transport; - git_vector *refs = &t->refs; - unsigned int i; - - for (i = 0; i < refs->length; ++i) { - git_pkt *p = git_vector_get(refs, i); - git_pkt_free(p); - } - - git_vector_free(refs); - free(t->heads); - free(t->parent.url); - free(t); -} - -int git_transport_git(git_transport **out) -{ - transport_git *t; - - t = git__malloc(sizeof(transport_git)); - if (t == NULL) - return GIT_ENOMEM; - - memset(t, 0x0, sizeof(transport_git)); - - t->parent.connect = git_connect; - t->parent.ls = git_ls; - t->parent.send_wants = git_send_wants; - t->parent.send_have = git_send_have; - t->parent.negotiate_fetch = git_negotiate_fetch; - t->parent.send_flush = git_send_flush; - t->parent.send_done = git_send_done; - t->parent.download_pack = git_download_pack; - t->parent.close = git_close; - t->parent.free = git_free; - - *out = (git_transport *) t; - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/transport_local.c b/vendor/libgit2/src/transport_local.c deleted file mode 100644 index ab0922cf2..000000000 --- a/vendor/libgit2/src/transport_local.c +++ /dev/null @@ -1,234 +0,0 @@ -#include "common.h" -#include "git2/types.h" -#include "git2/transport.h" -#include "git2/net.h" -#include "git2/repository.h" -#include "git2/object.h" -#include "git2/tag.h" -#include "refs.h" -#include "transport.h" -#include "posix.h" - -typedef struct { - git_transport parent; - git_repository *repo; - git_vector *refs; - git_headarray wants_list; -} transport_local; - -/* - * Try to open the url as a git directory. The direction doesn't - * matter in this case because we're calulating the heads ourselves. - */ -static int local_connect(git_transport *transport, int GIT_UNUSED(direction)) -{ - git_repository *repo; - int error; - transport_local *t = (transport_local *) transport; - const char *path; - const char file_prefix[] = "file://"; - GIT_UNUSED_ARG(direction); - - /* The repo layer doesn't want the prefix */ - if (!git__prefixcmp(transport->url, file_prefix)) - path = transport->url + strlen(file_prefix); - else - path = transport->url; - - error = git_repository_open(&repo, path); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to open remote"); - - t->repo = repo; - t->parent.connected = 1; - - return GIT_SUCCESS; -} - -static int add_ref(const char *name, git_repository *repo, git_vector *vec) -{ - const char peeled[] = "^{}"; - git_remote_head *head; - git_reference *ref; - git_object *obj = NULL; - int error = GIT_SUCCESS, peel_len, ret; - - head = git__malloc(sizeof(git_remote_head)); - if (head == NULL) - return GIT_ENOMEM; - - head->name = git__strdup(name); - if (head->name == NULL) { - error = GIT_ENOMEM; - goto out; - } - - error = git_reference_lookup(&ref, repo, name); - if (error < GIT_SUCCESS) - goto out; - - error = git_reference_resolve(&ref, ref); - if (error < GIT_SUCCESS) - goto out; - - git_oid_cpy(&head->oid, git_reference_oid(ref)); - - error = git_vector_insert(vec, head); - if (error < GIT_SUCCESS) - goto out; - - /* If it's not a tag, we don't need to try to peel it */ - if (git__prefixcmp(name, GIT_REFS_TAGS_DIR)) - goto out; - - error = git_object_lookup(&obj, repo, &head->oid, GIT_OBJ_ANY); - if (error < GIT_SUCCESS) { - git__rethrow(error, "Failed to lookup object"); - } - - /* If it's not an annotated tag, just get out */ - if (git_object_type(obj) != GIT_OBJ_TAG) - goto out; - - /* And if it's a tag, peel it, and add it to the list */ - head = git__malloc(sizeof(git_remote_head)); - peel_len = strlen(name) + strlen(peeled); - head->name = git__malloc(peel_len + 1); - ret = p_snprintf(head->name, peel_len + 1, "%s%s", name, peeled); - if (ret >= peel_len + 1) { - error = git__throw(GIT_ERROR, "The string is magically to long"); - } - - git_oid_cpy(&head->oid, git_tag_target_oid((git_tag *) obj)); - - error = git_vector_insert(vec, head); - if (error < GIT_SUCCESS) - goto out; - - out: - git_object_close(obj); - if (error < GIT_SUCCESS) { - free(head->name); - free(head); - } - return error; -} - -static int local_ls(git_transport *transport, git_headarray *array) -{ - int error; - unsigned int i; - git_repository *repo; - git_vector *vec; - git_strarray refs; - transport_local *t = (transport_local *) transport; - - assert(transport && transport->connected); - - repo = t->repo; - - error = git_reference_listall(&refs, repo, GIT_REF_LISTALL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to list remote heads"); - - vec = git__malloc(sizeof(git_vector)); - if (vec == NULL) { - error = GIT_ENOMEM; - goto out; - } - - error = git_vector_init(vec, refs.count, NULL); - if (error < GIT_SUCCESS) - return error; - - /* Sort the references first */ - git__tsort((void **)refs.strings, refs.count, &git__strcmp_cb); - - /* Add HEAD */ - error = add_ref(GIT_HEAD_FILE, repo, vec); - if (error < GIT_SUCCESS) - goto out; - - for (i = 0; i < refs.count; ++i) { - error = add_ref(refs.strings[i], repo, vec); - if (error < GIT_SUCCESS) - goto out; - } - - array->len = vec->length; - array->heads = (git_remote_head **)vec->contents; - - t->refs = vec; - - out: - - git_strarray_free(&refs); - - return error; -} - -static int local_send_wants(git_transport *transport, git_headarray *array) -{ - transport_local *t = (transport_local *) transport; - git_headarray *wants = &t->wants_list; - - /* - * We need to store the list of wanted references so we can figure - * out what to transmit later. - */ - wants->len = array->len; - wants->heads = array->heads; - - /* We're local anyway, so we don't need this */ - return GIT_SUCCESS; -} - -static int local_close(git_transport *GIT_UNUSED(transport)) -{ - /* Nothing to do */ - GIT_UNUSED_ARG(transport); - return GIT_SUCCESS; -} - -static void local_free(git_transport *transport) -{ - unsigned int i; - transport_local *t = (transport_local *) transport; - git_vector *vec = t->refs; - - assert(transport); - - for (i = 0; i < vec->length; ++i) { - git_remote_head *h = git_vector_get(vec, i); - free(h->name); - free(h); - } - git_vector_free(vec); - free(vec); - git_repository_free(t->repo); - free(t->parent.url); - free(t); -} - -/************** - * Public API * - **************/ - -int git_transport_local(git_transport **out) -{ - transport_local *t; - - t = git__malloc(sizeof(transport_local)); - if (t == NULL) - return GIT_ENOMEM; - - t->parent.connect = local_connect; - t->parent.ls = local_ls; - t->parent.send_wants = local_send_wants; - t->parent.close = local_close; - t->parent.free = local_free; - - *out = (git_transport *) t; - - return GIT_SUCCESS; -} diff --git a/vendor/libgit2/src/tree.c b/vendor/libgit2/src/tree.c deleted file mode 100644 index d993d549a..000000000 --- a/vendor/libgit2/src/tree.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "commit.h" -#include "tree.h" -#include "git2/repository.h" -#include "git2/object.h" - -#define DEFAULT_TREE_SIZE 16 -#define MAX_FILEMODE 0777777 -#define MAX_FILEMODE_BYTES 6 - -static int valid_attributes(const int attributes) { - return attributes >= 0 && attributes <= MAX_FILEMODE; -} - -struct tree_key_search { - const char *filename; - size_t filename_len; -}; - -int entry_search_cmp(const void *key, const void *array_member) -{ - const struct tree_key_search *ksearch = key; - const git_tree_entry *entry = array_member; - - int result = - git_futils_cmp_path( - ksearch->filename, ksearch->filename_len, entry->attr & 040000, - entry->filename, entry->filename_len, entry->attr & 040000); - - return result ? result : ((int)ksearch->filename_len - (int)entry->filename_len); -} - -int entry_sort_cmp(const void *a, const void *b) -{ - const git_tree_entry *entry_a = (const git_tree_entry *)(a); - const git_tree_entry *entry_b = (const git_tree_entry *)(b); - - return git_futils_cmp_path( - entry_a->filename, entry_a->filename_len, entry_a->attr & 040000, - entry_b->filename, entry_b->filename_len, entry_b->attr & 040000); -} - -static int build_ksearch(struct tree_key_search *ksearch, const char *path) -{ - size_t len = strlen(path); - - if (len && path[len - 1] == '/') - len--; - - if (len == 0 || memchr(path, '/', len) != NULL) - return GIT_ERROR; - - ksearch->filename = path; - ksearch->filename_len = len; - - return GIT_SUCCESS; -} - -void git_tree__free(git_tree *tree) -{ - unsigned int i; - - for (i = 0; i < tree->entries.length; ++i) { - git_tree_entry *e; - e = git_vector_get(&tree->entries, i); - - free(e->filename); - free(e); - } - - git_vector_free(&tree->entries); - free(tree); -} - -const git_oid *git_tree_id(git_tree *c) -{ - return git_object_id((git_object *)c); -} - -unsigned int git_tree_entry_attributes(const git_tree_entry *entry) -{ - return entry->attr; -} - -const char *git_tree_entry_name(const git_tree_entry *entry) -{ - assert(entry); - return entry->filename; -} - -const git_oid *git_tree_entry_id(const git_tree_entry *entry) -{ - assert(entry); - return &entry->oid; -} - -git_otype git_tree_entry_type(const git_tree_entry *entry) -{ - assert(entry); - - if (S_ISGITLINK(entry->attr)) - return GIT_OBJ_COMMIT; - else if (S_ISDIR(entry->attr)) - return GIT_OBJ_TREE; - else - return GIT_OBJ_BLOB; -} - -int git_tree_entry_2object(git_object **object_out, git_repository *repo, const git_tree_entry *entry) -{ - assert(entry && object_out); - return git_object_lookup(object_out, repo, &entry->oid, GIT_OBJ_ANY); -} - -const git_tree_entry *git_tree_entry_byname(git_tree *tree, const char *filename) -{ - int idx; - struct tree_key_search ksearch; - - assert(tree && filename); - - if (build_ksearch(&ksearch, filename) < GIT_SUCCESS) - return NULL; - - idx = git_vector_bsearch2(&tree->entries, entry_search_cmp, &ksearch); - if (idx == GIT_ENOTFOUND) - return NULL; - - return git_vector_get(&tree->entries, idx); -} - -const git_tree_entry *git_tree_entry_byindex(git_tree *tree, unsigned int idx) -{ - assert(tree); - return git_vector_get(&tree->entries, idx); -} - -unsigned int git_tree_entrycount(git_tree *tree) -{ - assert(tree); - return tree->entries.length; -} - -static int tree_parse_buffer(git_tree *tree, const char *buffer, const char *buffer_end) -{ - int error = GIT_SUCCESS; - - if (git_vector_init(&tree->entries, DEFAULT_TREE_SIZE, entry_sort_cmp) < GIT_SUCCESS) - return GIT_ENOMEM; - - while (buffer < buffer_end) { - git_tree_entry *entry; - - entry = git__calloc(1, sizeof(git_tree_entry)); - if (entry == NULL) { - error = GIT_ENOMEM; - break; - } - - if (git_vector_insert(&tree->entries, entry) < GIT_SUCCESS) - return GIT_ENOMEM; - - if (git__strtol32((long *)&entry->attr, buffer, &buffer, 8) < GIT_SUCCESS) - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tree. Can't parse attributes"); - - if (*buffer++ != ' ') { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse tree. Object it corrupted"); - break; - } - - if (memchr(buffer, 0, buffer_end - buffer) == NULL) { - error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse tree. Object it corrupted"); - break; - } - - entry->filename = git__strdup(buffer); - entry->filename_len = strlen(buffer); - - while (buffer < buffer_end && *buffer != 0) - buffer++; - - buffer++; - - git_oid_fromraw(&entry->oid, (const unsigned char *)buffer); - buffer += GIT_OID_RAWSZ; - } - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to parse buffer"); -} - -int git_tree__parse(git_tree *tree, git_odb_object *obj) -{ - assert(tree); - return tree_parse_buffer(tree, (char *)obj->raw.data, (char *)obj->raw.data + obj->raw.len); -} - -static int write_index_entry(char *buffer, int mode, const char *path, size_t path_len, const git_oid *oid) -{ - int written; - written = sprintf(buffer, "%o %.*s%c", mode, (int)path_len, path, 0); - memcpy(buffer + written, &oid->id, GIT_OID_RAWSZ); - return written + GIT_OID_RAWSZ; -} - -static int write_index(git_oid *oid, git_index *index, const char *base, int baselen, int entry_no, int maxentries) -{ - size_t size, offset; - char *buffer; - int nr, error; - - /* Guess at some random initial size */ - size = maxentries * 40; - buffer = git__malloc(size); - if (buffer == NULL) - return GIT_ENOMEM; - - offset = 0; - - for (nr = entry_no; nr < maxentries; ++nr) { - git_index_entry *entry = git_index_get(index, nr); - - const char *pathname = entry->path, *filename, *dirname; - int pathlen = strlen(pathname), entrylen; - - unsigned int write_mode; - git_oid subtree_oid; - git_oid *write_oid; - - /* Did we hit the end of the directory? Return how many we wrote */ - if (baselen >= pathlen || memcmp(base, pathname, baselen) != 0) - break; - - /* Do we have _further_ subdirectories? */ - filename = pathname + baselen; - dirname = strchr(filename, '/'); - - write_oid = &entry->oid; - write_mode = entry->mode; - - if (dirname) { - int subdir_written; - -#if 0 - if (entry->mode != S_IFDIR) { - free(buffer); - return GIT_EOBJCORRUPTED; - } -#endif - subdir_written = write_index(&subtree_oid, index, pathname, dirname - pathname + 1, nr, maxentries); - - if (subdir_written < GIT_SUCCESS) { - free(buffer); - return subdir_written; - } - - nr = subdir_written - 1; - - /* Now we need to write out the directory entry into this tree.. */ - pathlen = dirname - pathname; - write_oid = &subtree_oid; - write_mode = S_IFDIR; - } - - entrylen = pathlen - baselen; - if (offset + entrylen + 32 > size) { - size = alloc_nr(offset + entrylen + 32); - buffer = git__realloc(buffer, size); - - if (buffer == NULL) - return GIT_ENOMEM; - } - - offset += write_index_entry(buffer + offset, write_mode, filename, entrylen, write_oid); - } - - error = git_odb_write(oid, index->repository->db, buffer, offset, GIT_OBJ_TREE); - free(buffer); - - return (error == GIT_SUCCESS) ? nr : git__rethrow(error, "Failed to write index"); -} - -int git_tree_create_fromindex(git_oid *oid, git_index *index) -{ - int error; - - if (index->repository == NULL) - return git__throw(GIT_EBAREINDEX, "Failed to create tree. The index file is not backed up by an existing repository"); - - error = write_index(oid, index, "", 0, 0, git_index_entrycount(index)); - return (error < GIT_SUCCESS) ? git__rethrow(error, "Failed to create tree") : GIT_SUCCESS; -} - -static void sort_entries(git_treebuilder *bld) -{ - git_vector_sort(&bld->entries); -} - -int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) -{ - git_treebuilder *bld; - unsigned int i, source_entries = DEFAULT_TREE_SIZE; - - assert(builder_p); - - bld = git__calloc(1, sizeof(git_treebuilder)); - if (bld == NULL) - return GIT_ENOMEM; - - if (source != NULL) - source_entries = source->entries.length; - - if (git_vector_init(&bld->entries, source_entries, entry_sort_cmp) < GIT_SUCCESS) { - free(bld); - return GIT_ENOMEM; - } - - if (source != NULL) { - bld->entry_count = source_entries; - for (i = 0; i < source->entries.length; ++i) { - git_tree_entry *entry_src = source->entries.contents[i]; - git_tree_entry *entry = git__calloc(1, sizeof(git_tree_entry)); - - if (entry == NULL) { - git_treebuilder_free(bld); - return GIT_ENOMEM; - } - - entry->filename = git__strdup(entry_src->filename); - - if (entry->filename == NULL) { - free(entry); - git_treebuilder_free(bld); - return GIT_ENOMEM; - } - - entry->filename_len = entry_src->filename_len; - git_oid_cpy(&entry->oid, &entry_src->oid); - entry->attr = entry_src->attr; - - git_vector_insert(&bld->entries, entry); - } - } - - *builder_p = bld; - return GIT_SUCCESS; -} - -int git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld, const char *filename, const git_oid *id, unsigned int attributes) -{ - git_tree_entry *entry; - int pos; - struct tree_key_search ksearch; - - assert(bld && id && filename); - - if (!valid_attributes(attributes)) - return git__throw(GIT_ERROR, "Failed to insert entry. Invalid attributes"); - - if (build_ksearch(&ksearch, filename) < GIT_SUCCESS) - return git__throw(GIT_ERROR, "Failed to insert entry. Invalid filename '%s'", filename); - - if ((pos = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch)) != GIT_ENOTFOUND) { - entry = git_vector_get(&bld->entries, pos); - if (entry->removed) { - entry->removed = 0; - bld->entry_count++; - } - } else { - if ((entry = git__malloc(sizeof(git_tree_entry))) == NULL) - return GIT_ENOMEM; - - memset(entry, 0x0, sizeof(git_tree_entry)); - entry->filename = git__strdup(filename); - entry->filename_len = strlen(entry->filename); - - bld->entry_count++; - } - - git_oid_cpy(&entry->oid, id); - entry->attr = attributes; - - if (pos == GIT_ENOTFOUND) { - if (git_vector_insert(&bld->entries, entry) < 0) - return GIT_ENOMEM; - } - - if (entry_out != NULL) - *entry_out = entry; - - return GIT_SUCCESS; -} - -static git_tree_entry *treebuilder_get(git_treebuilder *bld, const char *filename) -{ - int idx; - git_tree_entry *entry; - struct tree_key_search ksearch; - - assert(bld && filename); - - if (build_ksearch(&ksearch, filename) < GIT_SUCCESS) - return NULL; - - idx = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch); - if (idx == GIT_ENOTFOUND) - return NULL; - - entry = git_vector_get(&bld->entries, idx); - if (entry->removed) - return NULL; - - return entry; -} - -const git_tree_entry *git_treebuilder_get(git_treebuilder *bld, const char *filename) -{ - return treebuilder_get(bld, filename); -} - -int git_treebuilder_remove(git_treebuilder *bld, const char *filename) -{ - git_tree_entry *remove_ptr = treebuilder_get(bld, filename); - - if (remove_ptr == NULL || remove_ptr->removed) - return git__throw(GIT_ENOTFOUND, "Failed to remove entry. File isn't in the tree"); - - remove_ptr->removed = 1; - bld->entry_count--; - return GIT_SUCCESS; -} - -int git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *bld) -{ - unsigned int i; - int error; - git_buf tree = GIT_BUF_INIT; - - assert(bld); - - sort_entries(bld); - - /* Grow the buffer beforehand to an estimated size */ - git_buf_grow(&tree, bld->entries.length * 72); - - for (i = 0; i < bld->entries.length; ++i) { - git_tree_entry *entry = bld->entries.contents[i]; - - if (entry->removed) - continue; - - git_buf_printf(&tree, "%o ", entry->attr); - git_buf_put(&tree, entry->filename, entry->filename_len + 1); - git_buf_put(&tree, (char *)entry->oid.id, GIT_OID_RAWSZ); - } - - if (git_buf_oom(&tree)) { - git_buf_free(&tree); - return git__throw(GIT_ENOMEM, "Not enough memory to build the tree data"); - } - - error = git_odb_write(oid, git_repository_database(repo), tree.ptr, tree.size, GIT_OBJ_TREE); - git_buf_free(&tree); - - return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write tree"); -} - -void git_treebuilder_filter(git_treebuilder *bld, int (*filter)(const git_tree_entry *, void *), void *payload) -{ - unsigned int i; - - assert(bld && filter); - - for (i = 0; i < bld->entries.length; ++i) { - git_tree_entry *entry = bld->entries.contents[i]; - if (!entry->removed && filter(entry, payload)) - entry->removed = 1; - } -} - -void git_treebuilder_clear(git_treebuilder *bld) -{ - unsigned int i; - assert(bld); - - for (i = 0; i < bld->entries.length; ++i) { - git_tree_entry *e = bld->entries.contents[i]; - free(e->filename); - free(e); - } - - git_vector_clear(&bld->entries); -} - -void git_treebuilder_free(git_treebuilder *bld) -{ - git_treebuilder_clear(bld); - git_vector_free(&bld->entries); - free(bld); -} - - diff --git a/vendor/libgit2/src/tree.h b/vendor/libgit2/src/tree.h deleted file mode 100644 index bff3f8edb..000000000 --- a/vendor/libgit2/src/tree.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef INCLUDE_tree_h__ -#define INCLUDE_tree_h__ - -#include "git2/tree.h" -#include "repository.h" -#include "odb.h" -#include "vector.h" - -struct git_tree_entry { - unsigned int attr; - char *filename; - git_oid oid; - size_t filename_len; - int removed; -}; - -struct git_tree { - git_object object; - git_vector entries; -}; - -struct git_treebuilder { - git_vector entries; - size_t entry_count; -}; - - -void git_tree__free(git_tree *tree); -int git_tree__parse(git_tree *tree, git_odb_object *obj); - -#endif diff --git a/vendor/libgit2/src/tsort.c b/vendor/libgit2/src/tsort.c deleted file mode 100644 index 14b15c232..000000000 --- a/vendor/libgit2/src/tsort.c +++ /dev/null @@ -1,359 +0,0 @@ - -#include "common.h" - -/** - * An array-of-pointers implementation of Python's Timsort - * Based on code by Christopher Swenson under the MIT license - * - * Copyright (c) 2010 Christopher Swenson - * Copyright (c) 2011 Vicent Marti - */ - -#ifndef MAX -# define MAX(x,y) (((x) > (y) ? (x) : (y))) -#endif - -#ifndef MIN -# define MIN(x,y) (((x) < (y) ? (x) : (y))) -#endif - -typedef int (*cmp_ptr_t)(const void *, const void *); - -static int binsearch(void **dst, const void *x, size_t size, cmp_ptr_t cmp) -{ - int l, c, r; - void *lx, *cx; - - l = 0; - r = size - 1; - c = r >> 1; - lx = dst[l]; - - /* check for beginning conditions */ - if (cmp(x, lx) < 0) - return 0; - - else if (cmp(x, lx) == 0) { - int i = 1; - while (cmp(x, dst[i]) == 0) - i++; - return i; - } - - /* guaranteed not to be >= rx */ - cx = dst[c]; - while (1) { - const int val = cmp(x, cx); - if (val < 0) { - if (c - l <= 1) return c; - r = c; - } else if (val > 0) { - if (r - c <= 1) return c + 1; - l = c; - lx = cx; - } else { - do { - cx = dst[++c]; - } while (cmp(x, cx) == 0); - return c; - } - c = l + ((r - l) >> 1); - cx = dst[c]; - } -} - -/* Binary insertion sort, but knowing that the first "start" entries are sorted. Used in timsort. */ -static void bisort(void **dst, size_t start, size_t size, cmp_ptr_t cmp) -{ - size_t i; - void *x; - int location; - - for (i = start; i < size; i++) { - int j; - /* If this entry is already correct, just move along */ - if (cmp(dst[i - 1], dst[i]) <= 0) - continue; - - /* Else we need to find the right place, shift everything over, and squeeze in */ - x = dst[i]; - location = binsearch(dst, x, i, cmp); - for (j = i - 1; j >= location; j--) { - dst[j + 1] = dst[j]; - } - dst[location] = x; - } -} - - -/* timsort implementation, based on timsort.txt */ -struct tsort_run { - ssize_t start; - ssize_t length; -}; - -struct tsort_store { - size_t alloc; - cmp_ptr_t cmp; - void **storage; -}; - -static void reverse_elements(void **dst, int start, int end) -{ - while (start < end) { - void *tmp = dst[start]; - dst[start] = dst[end]; - dst[end] = tmp; - - start++; - end--; - } -} - -static int count_run(void **dst, ssize_t start, ssize_t size, struct tsort_store *store) -{ - ssize_t curr = start + 2; - - if (size - start == 1) - return 1; - - if (start >= size - 2) { - if (store->cmp(dst[size - 2], dst[size - 1]) > 0) { - void *tmp = dst[size - 1]; - dst[size - 1] = dst[size - 2]; - dst[size - 2] = tmp; - } - - return 2; - } - - if (store->cmp(dst[start], dst[start + 1]) <= 0) { - while (curr < size - 1 && store->cmp(dst[curr - 1], dst[curr]) <= 0) - curr++; - - return curr - start; - } else { - while (curr < size - 1 && store->cmp(dst[curr - 1], dst[curr]) > 0) - curr++; - - /* reverse in-place */ - reverse_elements(dst, start, curr - 1); - return curr - start; - } -} - -static int compute_minrun(size_t n) -{ - int r = 0; - while (n >= 64) { - r |= n & 1; - n >>= 1; - } - return n + r; -} - -static int check_invariant(struct tsort_run *stack, int stack_curr) -{ - if (stack_curr < 2) - return 1; - - else if (stack_curr == 2) { - const int A = stack[stack_curr - 2].length; - const int B = stack[stack_curr - 1].length; - return (A > B); - } else { - const int A = stack[stack_curr - 3].length; - const int B = stack[stack_curr - 2].length; - const int C = stack[stack_curr - 1].length; - return !((A <= B + C) || (B <= C)); - } -} - -static int resize(struct tsort_store *store, size_t new_size) -{ - if (store->alloc < new_size) { - void **tempstore = realloc(store->storage, new_size * sizeof(void *)); - - /** - * Do not propagate on OOM; this will abort the sort and - * leave the array unsorted, but no error code will be - * raised - */ - if (tempstore == NULL) - return -1; - - store->storage = tempstore; - store->alloc = new_size; - } - - return 0; -} - -static void merge(void **dst, const struct tsort_run *stack, int stack_curr, struct tsort_store *store) -{ - const ssize_t A = stack[stack_curr - 2].length; - const ssize_t B = stack[stack_curr - 1].length; - const ssize_t curr = stack[stack_curr - 2].start; - - void **storage; - ssize_t i, j, k; - - if (resize(store, MIN(A, B)) < 0) - return; - - storage = store->storage; - - /* left merge */ - if (A < B) { - memcpy(storage, &dst[curr], A * sizeof(void *)); - i = 0; - j = curr + A; - - for (k = curr; k < curr + A + B; k++) { - if ((i < A) && (j < curr + A + B)) { - if (store->cmp(storage[i], dst[j]) <= 0) - dst[k] = storage[i++]; - else - dst[k] = dst[j++]; - } else if (i < A) { - dst[k] = storage[i++]; - } else - dst[k] = dst[j++]; - } - } else { - memcpy(storage, &dst[curr + A], B * sizeof(void *)); - i = B - 1; - j = curr + A - 1; - - for (k = curr + A + B - 1; k >= curr; k--) { - if ((i >= 0) && (j >= curr)) { - if (store->cmp(dst[j], storage[i]) > 0) - dst[k] = dst[j--]; - else - dst[k] = storage[i--]; - } else if (i >= 0) - dst[k] = storage[i--]; - else - dst[k] = dst[j--]; - } - } -} - -static ssize_t collapse(void **dst, struct tsort_run *stack, ssize_t stack_curr, struct tsort_store *store, ssize_t size) -{ - ssize_t A, B, C; - - while (1) { - /* if the stack only has one thing on it, we are done with the collapse */ - if (stack_curr <= 1) - break; - - /* if this is the last merge, just do it */ - if ((stack_curr == 2) && (stack[0].length + stack[1].length == size)) { - merge(dst, stack, stack_curr, store); - stack[0].length += stack[1].length; - stack_curr--; - break; - } - - /* check if the invariant is off for a stack of 2 elements */ - else if ((stack_curr == 2) && (stack[0].length <= stack[1].length)) { - merge(dst, stack, stack_curr, store); - stack[0].length += stack[1].length; - stack_curr--; - break; - } - else if (stack_curr == 2) - break; - - A = stack[stack_curr - 3].length; - B = stack[stack_curr - 2].length; - C = stack[stack_curr - 1].length; - - /* check first invariant */ - if (A <= B + C) { - if (A < C) { - merge(dst, stack, stack_curr - 1, store); - stack[stack_curr - 3].length += stack[stack_curr - 2].length; - stack[stack_curr - 2] = stack[stack_curr - 1]; - stack_curr--; - } else { - merge(dst, stack, stack_curr, store); - stack[stack_curr - 2].length += stack[stack_curr - 1].length; - stack_curr--; - } - } else if (B <= C) { - merge(dst, stack, stack_curr, store); - stack[stack_curr - 2].length += stack[stack_curr - 1].length; - stack_curr--; - } else - break; - } - - return stack_curr; -} - -#define PUSH_NEXT() do {\ - len = count_run(dst, curr, size, store);\ - run = minrun;\ - if (run < minrun) run = minrun;\ - if (run > (ssize_t)size - curr) run = size - curr;\ - if (run > len) {\ - bisort(&dst[curr], len, run, cmp);\ - len = run;\ - }\ - run_stack[stack_curr].start = curr;\ - run_stack[stack_curr++].length = len;\ - curr += len;\ - if (curr == (ssize_t)size) {\ - /* finish up */ \ - while (stack_curr > 1) { \ - merge(dst, run_stack, stack_curr, store); \ - run_stack[stack_curr - 2].length += run_stack[stack_curr - 1].length; \ - stack_curr--; \ - } \ - if (store->storage != NULL) {\ - free(store->storage);\ - store->storage = NULL;\ - }\ - return;\ - }\ -}\ -while (0) - -void git__tsort(void **dst, size_t size, cmp_ptr_t cmp) -{ - struct tsort_store _store, *store = &_store; - struct tsort_run run_stack[128]; - - ssize_t stack_curr = 0; - ssize_t len, run; - ssize_t curr = 0; - ssize_t minrun; - - if (size < 64) { - bisort(dst, 1, size, cmp); - return; - } - - /* compute the minimum run length */ - minrun = compute_minrun(size); - - /* temporary storage for merges */ - store->alloc = 0; - store->storage = NULL; - store->cmp = cmp; - - PUSH_NEXT(); - PUSH_NEXT(); - PUSH_NEXT(); - - while (1) { - if (!check_invariant(run_stack, stack_curr)) { - stack_curr = collapse(dst, run_stack, stack_curr, store, size); - continue; - } - - PUSH_NEXT(); - } -} diff --git a/vendor/libgit2/src/unix/map.c b/vendor/libgit2/src/unix/map.c deleted file mode 100644 index 5192c8e4c..000000000 --- a/vendor/libgit2/src/unix/map.c +++ /dev/null @@ -1,64 +0,0 @@ -#include - -#ifndef GIT_WIN32 - -#include "map.h" -#include -#include - -int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) -{ - int mprot = 0; - int mflag = 0; - - assert((out != NULL) && (len > 0)); - - if ((out == NULL) || (len == 0)) { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. No map or zero length"); - } - - out->data = NULL; - out->len = 0; - - if (prot & GIT_PROT_WRITE) - mprot = PROT_WRITE; - else if (prot & GIT_PROT_READ) - mprot = PROT_READ; - else { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. Invalid protection parameters"); - } - - if ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED) - mflag = MAP_SHARED; - else if ((flags & GIT_MAP_TYPE) == GIT_MAP_PRIVATE) - mflag = MAP_PRIVATE; - - if (flags & GIT_MAP_FIXED) { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. FIXED not set"); - } - - out->data = mmap(NULL, len, mprot, mflag, fd, offset); - if (!out->data || out->data == MAP_FAILED) - return git__throw(GIT_EOSERR, "Failed to mmap. Could not write data"); - out->len = len; - - return GIT_SUCCESS; -} - -int p_munmap(git_map *map) -{ - assert(map != NULL); - - if (!map) - return git__throw(GIT_ERROR, "Failed to munmap. Map does not exist"); - - munmap(map->data, map->len); - - return GIT_SUCCESS; -} - -#endif - diff --git a/vendor/libgit2/src/unix/posix.h b/vendor/libgit2/src/unix/posix.h deleted file mode 100644 index a49a5cfe7..000000000 --- a/vendor/libgit2/src/unix/posix.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef INCLUDE_posix__w32_h__ -#define INCLUDE_posix__w32_h__ - -#include - -#define p_lstat(p,b) lstat(p,b) -#define p_readlink(a, b, c) readlink(a, b, c) -#define p_link(o,n) link(o, n) -#define p_unlink(p) unlink(p) -#define p_mkdir(p,m) mkdir(p, m) -#define p_fsync(fd) fsync(fd) -#define p_realpath(p, po) realpath(p, po) -#define p_fnmatch(p, s, f) fnmatch(p, s, f) -#define p_vsnprintf(b, c, f, a) vsnprintf(b, c, f, a) -#define p_snprintf(b, c, f, ...) snprintf(b, c, f, __VA_ARGS__) -#define p_mkstemp(p) mkstemp(p) - -#endif diff --git a/vendor/libgit2/src/util.c b/vendor/libgit2/src/util.c deleted file mode 100644 index 29bf755f8..000000000 --- a/vendor/libgit2/src/util.c +++ /dev/null @@ -1,357 +0,0 @@ -#include -#include "common.h" -#include -#include -#include -#include "posix.h" - -#ifdef _MSC_VER -# include -#endif - -void git_libgit2_version(int *major, int *minor, int *rev) -{ - *major = LIBGIT2_VER_MAJOR; - *minor = LIBGIT2_VER_MINOR; - *rev = LIBGIT2_VER_REVISION; -} - -void git_strarray_free(git_strarray *array) -{ - size_t i; - for (i = 0; i < array->count; ++i) - free(array->strings[i]); - - free(array->strings); -} - -int git__fnmatch(const char *pattern, const char *name, int flags) -{ - int ret; - - ret = p_fnmatch(pattern, name, flags); - switch (ret) { - case 0: - return GIT_SUCCESS; - case FNM_NOMATCH: - return GIT_ENOMATCH; - default: - return git__throw(GIT_EOSERR, "Error trying to match path"); - } -} - -int git__strtol32(long *result, const char *nptr, const char **endptr, int base) -{ - const char *p; - long n, nn; - int c, ovfl, v, neg, ndig; - - p = nptr; - neg = 0; - n = 0; - ndig = 0; - ovfl = 0; - - /* - * White space - */ - while (isspace(*p)) - p++; - - /* - * Sign - */ - if (*p == '-' || *p == '+') - if (*p++ == '-') - neg = 1; - - /* - * Base - */ - if (base == 0) { - if (*p != '0') - base = 10; - else { - base = 8; - if (p[1] == 'x' || p[1] == 'X') { - p += 2; - base = 16; - } - } - } else if (base == 16 && *p == '0') { - if (p[1] == 'x' || p[1] == 'X') - p += 2; - } else if (base < 0 || 36 < base) - goto Return; - - /* - * Non-empty sequence of digits - */ - for (;; p++,ndig++) { - c = *p; - v = base; - if ('0'<=c && c<='9') - v = c - '0'; - else if ('a'<=c && c<='z') - v = c - 'a' + 10; - else if ('A'<=c && c<='Z') - v = c - 'A' + 10; - if (v >= base) - break; - nn = n*base + v; - if (nn < n) - ovfl = 1; - n = nn; - } - -Return: - if (ndig == 0) - return git__throw(GIT_ENOTNUM, "Failed to convert string to long. Not a number"); - - if (endptr) - *endptr = p; - - if (ovfl) - return git__throw(GIT_EOVERFLOW, "Failed to convert string to long. Overflow error"); - - *result = neg ? -n : n; - return GIT_SUCCESS; -} - -void git__strntolower(char *str, int len) -{ - int i; - - for (i = 0; i < len; ++i) { - str[i] = (char) tolower(str[i]); - } -} - -void git__strtolower(char *str) -{ - git__strntolower(str, strlen(str)); -} - -int git__prefixcmp(const char *str, const char *prefix) -{ - for (;;) { - char p = *(prefix++), s; - if (!p) - return 0; - if ((s = *(str++)) != p) - return s - p; - } -} - -int git__suffixcmp(const char *str, const char *suffix) -{ - size_t a = strlen(str); - size_t b = strlen(suffix); - if (a < b) - return -1; - return strcmp(str + (a - b), suffix); -} - -char *git__strtok(char **end, const char *sep) -{ - char *ptr = *end; - - while (*ptr && strchr(sep, *ptr)) - ++ptr; - - if (*ptr) { - char *start = ptr; - *end = start + 1; - - while (**end && !strchr(sep, **end)) - ++*end; - - if (**end) { - **end = '\0'; - ++*end; - } - - return start; - } - - return NULL; -} - -void git__hexdump(const char *buffer, size_t len) -{ - static const size_t LINE_WIDTH = 16; - - size_t line_count, last_line, i, j; - const char *line; - - line_count = (len / LINE_WIDTH); - last_line = (len % LINE_WIDTH); - - for (i = 0; i < line_count; ++i) { - line = buffer + (i * LINE_WIDTH); - for (j = 0; j < LINE_WIDTH; ++j, ++line) - printf("%02X ", (unsigned char)*line & 0xFF); - - printf("| "); - - line = buffer + (i * LINE_WIDTH); - for (j = 0; j < LINE_WIDTH; ++j, ++line) - printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); - - printf("\n"); - } - - if (last_line > 0) { - - line = buffer + (line_count * LINE_WIDTH); - for (j = 0; j < last_line; ++j, ++line) - printf("%02X ", (unsigned char)*line & 0xFF); - - for (j = 0; j < (LINE_WIDTH - last_line); ++j) - printf(" "); - - printf("| "); - - line = buffer + (line_count * LINE_WIDTH); - for (j = 0; j < last_line; ++j, ++line) - printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); - - printf("\n"); - } - - printf("\n"); -} - -#ifdef GIT_LEGACY_HASH -uint32_t git__hash(const void *key, int len, unsigned int seed) -{ - const uint32_t m = 0x5bd1e995; - const int r = 24; - uint32_t h = seed ^ len; - - const unsigned char *data = (const unsigned char *)key; - - while(len >= 4) { - uint32_t k = *(uint32_t *)data; - - k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k; - - data += 4; - len -= 4; - } - - switch(len) { - case 3: h ^= data[2] << 16; - case 2: h ^= data[1] << 8; - case 1: h ^= data[0]; - h *= m; - }; - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; -} -#else -/* - Cross-platform version of Murmurhash3 - http://code.google.com/p/smhasher/wiki/MurmurHash3 - by Austin Appleby (aappleby@gmail.com) - - This code is on the public domain. -*/ -uint32_t git__hash(const void *key, int len, uint32_t seed) -{ - -#define MURMUR_BLOCK() {\ - k1 *= c1; \ - k1 = git__rotl(k1,11);\ - k1 *= c2;\ - h1 ^= k1;\ - h1 = h1*3 + 0x52dce729;\ - c1 = c1*5 + 0x7b7d159c;\ - c2 = c2*5 + 0x6bce6396;\ -} - - const uint8_t *data = (const uint8_t*)key; - const int nblocks = len / 4; - - const uint32_t *blocks = (const uint32_t *)(data + nblocks * 4); - const uint8_t *tail = (const uint8_t *)(data + nblocks * 4); - - uint32_t h1 = 0x971e137b ^ seed; - uint32_t k1; - - uint32_t c1 = 0x95543787; - uint32_t c2 = 0x2ad7eb25; - - int i; - - for (i = -nblocks; i; i++) { - k1 = blocks[i]; - MURMUR_BLOCK(); - } - - k1 = 0; - - switch(len & 3) { - case 3: k1 ^= tail[2] << 16; - case 2: k1 ^= tail[1] << 8; - case 1: k1 ^= tail[0]; - MURMUR_BLOCK(); - } - - h1 ^= len; - h1 ^= h1 >> 16; - h1 *= 0x85ebca6b; - h1 ^= h1 >> 13; - h1 *= 0xc2b2ae35; - h1 ^= h1 >> 16; - - return h1; -} -#endif - -/** - * A modified `bsearch` from the BSD glibc. - * - * Copyright (c) 1990 Regents of the University of California. - * All rights reserved. - */ -void **git__bsearch(const void *key, void **base, size_t nmemb, int (*compar)(const void *, const void *)) -{ - int lim, cmp; - void **p; - - for (lim = nmemb; lim != 0; lim >>= 1) { - p = base + (lim >> 1); - cmp = (*compar)(key, *p); - if (cmp > 0) { /* key > p: move right */ - base = p + 1; - lim--; - } else if (cmp == 0) { - return (void **)p; - } /* else move left */ - } - return NULL; -} - -/** - * A strcmp wrapper - * - * We don't want direct pointers to the CRT on Windows, we may - * get stdcall conflicts. - */ -int git__strcmp_cb(const void *a, const void *b) -{ - const char *stra = (const char *)a; - const char *strb = (const char *)b; - - return strcmp(stra, strb); -} diff --git a/vendor/libgit2/src/util.h b/vendor/libgit2/src/util.h deleted file mode 100644 index 78f9f8276..000000000 --- a/vendor/libgit2/src/util.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef INCLUDE_util_h__ -#define INCLUDE_util_h__ - -#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) -#define bitsizeof(x) (CHAR_BIT * sizeof(x)) -#define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits)))) -#ifndef min -# define min(a,b) ((a) < (b) ? (a) : (b)) -#endif - -/* - * Custom memory allocation wrappers - * that set error code and error message - * on allocation failure - */ -GIT_INLINE(void *) git__malloc(size_t len) -{ - void *ptr = malloc(len); - if (!ptr) - git__throw(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)len); - return ptr; -} - -GIT_INLINE(void *) git__calloc(size_t nelem, size_t elsize) -{ - void *ptr = calloc(nelem, elsize); - if (!ptr) - git__throw(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)elsize); - return ptr; -} - -GIT_INLINE(char *) git__strdup(const char *str) -{ - char *ptr = strdup(str); - if (!ptr) - git__throw(GIT_ENOMEM, "Out of memory. Failed to duplicate string"); - return ptr; -} - -GIT_INLINE(char *) git__strndup(const char *str, size_t n) -{ - size_t length; - char *ptr; - - length = strlen(str); - if (n < length) - length = n; - - ptr = (char*)malloc(length + 1); - if (!ptr) { - git__throw(GIT_ENOMEM, "Out of memory. Failed to duplicate string"); - return NULL; - } - - memcpy(ptr, str, length); - ptr[length] = '\0'; - - return ptr; -} - -GIT_INLINE(void *) git__realloc(void *ptr, size_t size) -{ - void *new_ptr = realloc(ptr, size); - if (!new_ptr) - git__throw(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)size); - return new_ptr; -} - -extern int git__prefixcmp(const char *str, const char *prefix); -extern int git__suffixcmp(const char *str, const char *suffix); - -extern int git__strtol32(long *n, const char *buff, const char **end_buf, int base); - -extern void git__hexdump(const char *buffer, size_t n); -extern uint32_t git__hash(const void *key, int len, uint32_t seed); - -/** @return true if p fits into the range of a size_t */ -GIT_INLINE(int) git__is_sizet(git_off_t p) -{ - size_t r = (size_t)p; - return p == (git_off_t)r; -} - -/* 32-bit cross-platform rotl */ -#ifdef _MSC_VER /* use built-in method in MSVC */ -# define git__rotl(v, s) (uint32_t)_rotl(v, s) -#else /* use bitops in GCC; with o2 this gets optimized to a rotl instruction */ -# define git__rotl(v, s) (uint32_t)(((uint32_t)(v) << (s)) | ((uint32_t)(v) >> (32 - (s)))) -#endif - -extern char *git__strtok(char **end, const char *sep); - -extern void git__strntolower(char *str, int len); -extern void git__strtolower(char *str); - -extern int git__fnmatch(const char *pattern, const char *name, int flags); - -/* - * Realloc the buffer pointed at by variable 'x' so that it can hold - * at least 'nr' entries; the number of entries currently allocated - * is 'alloc', using the standard growing factor alloc_nr() macro. - * - * DO NOT USE any expression with side-effect for 'x' or 'alloc'. - */ -#define alloc_nr(x) (((x)+16)*3/2) -#define ALLOC_GROW(x, nr, alloc) \ - do { \ - if ((nr) > alloc) { \ - if (alloc_nr(alloc) < (nr)) \ - alloc = (nr); \ - else \ - alloc = alloc_nr(alloc); \ - x = xrealloc((x), alloc * sizeof(*(x))); \ - } \ - } while (0) - -extern void git__tsort(void **dst, size_t size, int (*cmp)(const void *, const void *)); -extern void **git__bsearch(const void *key, void **base, size_t nmemb, - int (*compar)(const void *, const void *)); - -extern int git__strcmp_cb(const void *a, const void *b); - -#endif /* INCLUDE_util_h__ */ diff --git a/vendor/libgit2/src/vector.c b/vendor/libgit2/src/vector.c deleted file mode 100644 index 0b83b8b0d..000000000 --- a/vendor/libgit2/src/vector.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "repository.h" -#include "vector.h" - -static const double resize_factor = 1.75; -static const size_t minimum_size = 8; - -static int resize_vector(git_vector *v) -{ - v->_alloc_size = ((unsigned int)(v->_alloc_size * resize_factor)) + 1; - if (v->_alloc_size < minimum_size) - v->_alloc_size = minimum_size; - - v->contents = realloc(v->contents, v->_alloc_size * sizeof(void *)); - if (v->contents == NULL) - return GIT_ENOMEM; - - return GIT_SUCCESS; -} - - -void git_vector_free(git_vector *v) -{ - assert(v); - free(v->contents); -} - -int git_vector_init(git_vector *v, unsigned int initial_size, git_vector_cmp cmp) -{ - assert(v); - - memset(v, 0x0, sizeof(git_vector)); - - if (initial_size == 0) - initial_size = minimum_size; - - v->_alloc_size = initial_size; - v->_cmp = cmp; - - v->length = 0; - v->sorted = 1; - - v->contents = git__malloc(v->_alloc_size * sizeof(void *)); - if (v->contents == NULL) - return GIT_ENOMEM; - - return GIT_SUCCESS; -} - -int git_vector_insert(git_vector *v, void *element) -{ - assert(v); - - if (v->length >= v->_alloc_size) { - if (resize_vector(v) < 0) - return GIT_ENOMEM; - } - - v->contents[v->length++] = element; - v->sorted = 0; - - return GIT_SUCCESS; -} - -void git_vector_sort(git_vector *v) -{ - assert(v); - - if (v->sorted || v->_cmp == NULL) - return; - - git__tsort(v->contents, v->length, v->_cmp); - v->sorted = 1; -} - -int git_vector_bsearch2(git_vector *v, git_vector_cmp key_lookup, const void *key) -{ - void **find; - - assert(v && key && key_lookup); - - /* need comparison function to sort the vector */ - if (v->_cmp == NULL) - return git__throw(GIT_ENOTFOUND, "Can't sort vector. No comparison function set"); - - git_vector_sort(v); - - find = git__bsearch(key, v->contents, v->length, key_lookup); - if (find != NULL) - return (int)(find - v->contents); - - return git__throw(GIT_ENOTFOUND, "Can't find element"); -} - -int git_vector_search2(git_vector *v, git_vector_cmp key_lookup, const void *key) -{ - unsigned int i; - - assert(v && key && key_lookup); - - for (i = 0; i < v->length; ++i) { - if (key_lookup(key, v->contents[i]) == 0) - return i; - } - - return git__throw(GIT_ENOTFOUND, "Can't find element"); -} - -static int strict_comparison(const void *a, const void *b) -{ - return (a == b) ? 0 : -1; -} - -int git_vector_search(git_vector *v, const void *entry) -{ - return git_vector_search2(v, v->_cmp ? v->_cmp : strict_comparison, entry); -} - -int git_vector_bsearch(git_vector *v, const void *key) -{ - return git_vector_bsearch2(v, v->_cmp, key); -} - -int git_vector_remove(git_vector *v, unsigned int idx) -{ - unsigned int i; - - assert(v); - - if (idx >= v->length || v->length == 0) - return git__throw(GIT_ENOTFOUND, "Can't remove element. Index out of bounds"); - - for (i = idx; i < v->length - 1; ++i) - v->contents[i] = v->contents[i + 1]; - - v->length--; - return GIT_SUCCESS; -} - -void git_vector_uniq(git_vector *v) -{ - git_vector_cmp cmp; - unsigned int i, j; - - if (v->length <= 1) - return; - - git_vector_sort(v); - cmp = v->_cmp ? v->_cmp : strict_comparison; - - for (i = 0, j = 1 ; j < v->length; ++j) - if (!cmp(v->contents[i], v->contents[j])) - v->contents[i] = v->contents[j]; - else - v->contents[++i] = v->contents[j]; - - v->length -= j - i - 1; -} - -void git_vector_clear(git_vector *v) -{ - assert(v); - v->length = 0; - v->sorted = 1; -} - - diff --git a/vendor/libgit2/src/vector.h b/vendor/libgit2/src/vector.h deleted file mode 100644 index c43a7ce07..000000000 --- a/vendor/libgit2/src/vector.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef INCLUDE_vector_h__ -#define INCLUDE_vector_h__ - -#include "git2/common.h" - -typedef int (*git_vector_cmp)(const void *, const void *); - -typedef struct git_vector { - unsigned int _alloc_size; - git_vector_cmp _cmp; - void **contents; - unsigned int length; - int sorted; -} git_vector; - -int git_vector_init(git_vector *v, unsigned int initial_size, git_vector_cmp cmp); -void git_vector_free(git_vector *v); -void git_vector_clear(git_vector *v); - -int git_vector_search(git_vector *v, const void *entry); -int git_vector_search2(git_vector *v, git_vector_cmp cmp, const void *key); - -int git_vector_bsearch(git_vector *v, const void *entry); -int git_vector_bsearch2(git_vector *v, git_vector_cmp cmp, const void *key); - -void git_vector_sort(git_vector *v); - -GIT_INLINE(void *) git_vector_get(git_vector *v, unsigned int position) -{ - return (position < v->length) ? v->contents[position] : NULL; -} - -#define git_vector_foreach(v, iter, elem) \ - for ((iter) = 0; (iter) < (v)->length && ((elem) = (v)->contents[(iter)], 1); (iter)++ ) - -int git_vector_insert(git_vector *v, void *element); -int git_vector_remove(git_vector *v, unsigned int idx); -void git_vector_uniq(git_vector *v); -#endif diff --git a/vendor/libgit2/src/win32/dir.c b/vendor/libgit2/src/win32/dir.c deleted file mode 100644 index 069a41c3a..000000000 --- a/vendor/libgit2/src/win32/dir.c +++ /dev/null @@ -1,98 +0,0 @@ -#define GIT__WIN32_NO_WRAP_DIR -#include "dir.h" - -static int init_filter(char *filter, size_t n, const char *dir) -{ - size_t len = strlen(dir); - - if (len+3 >= n) - return 0; - - strcpy(filter, dir); - if (len && dir[len-1] != '/') - strcat(filter, "/"); - strcat(filter, "*"); - - return 1; -} - -git__DIR *git__opendir(const char *dir) -{ - char filter[4096]; - git__DIR *new; - - if (!dir || !init_filter(filter, sizeof(filter), dir)) - return NULL; - - new = git__malloc(sizeof(*new)); - if (!new) - return NULL; - - new->dir = git__malloc(strlen(dir)+1); - if (!new->dir) { - free(new); - return NULL; - } - strcpy(new->dir, dir); - - new->h = FindFirstFile(filter, &new->f); - if (new->h == INVALID_HANDLE_VALUE) { - free(new->dir); - free(new); - return NULL; - } - new->first = 1; - - return new; -} - -struct git__dirent *git__readdir(git__DIR *d) -{ - if (!d || d->h == INVALID_HANDLE_VALUE) - return NULL; - - if (d->first) - d->first = 0; - else { - if (!FindNextFile(d->h, &d->f)) - return NULL; - } - - if (strlen(d->f.cFileName) >= sizeof(d->entry.d_name)) - return NULL; - - d->entry.d_ino = 0; - strcpy(d->entry.d_name, d->f.cFileName); - - return &d->entry; -} - -void git__rewinddir(git__DIR *d) -{ - char filter[4096]; - - if (d) { - if (d->h != INVALID_HANDLE_VALUE) - FindClose(d->h); - d->h = INVALID_HANDLE_VALUE; - d->first = 0; - if (init_filter(filter, sizeof(filter), d->dir)) { - d->h = FindFirstFile(filter, &d->f); - if (d->h != INVALID_HANDLE_VALUE) - d->first = 1; - } - } -} - -int git__closedir(git__DIR *d) -{ - if (d) { - if (d->h != INVALID_HANDLE_VALUE) - FindClose(d->h); - if (d->dir) - free(d->dir); - free(d); - } - return 0; -} - diff --git a/vendor/libgit2/src/win32/fileops.c b/vendor/libgit2/src/win32/fileops.c deleted file mode 100644 index d435e706e..000000000 --- a/vendor/libgit2/src/win32/fileops.c +++ /dev/null @@ -1,41 +0,0 @@ -#define GIT__WIN32_NO_HIDE_FILEOPS -#include "fileops.h" -#include - -int git__unlink(const char *path) -{ - chmod(path, 0666); - return unlink(path); -} - -int git__mkstemp(char *template) -{ - char *file = mktemp(template); - if (file == NULL) - return -1; - return open(file, O_RDWR | O_CREAT | O_BINARY, 0600); -} - -int git__fsync(int fd) -{ - HANDLE fh = (HANDLE)_get_osfhandle(fd); - - if (fh == INVALID_HANDLE_VALUE) { - errno = EBADF; - return -1; - } - - if (!FlushFileBuffers(fh)) { - DWORD code = GetLastError(); - - if (code == ERROR_INVALID_HANDLE) - errno = EINVAL; - else - errno = EIO; - - return -1; - } - - return 0; -} - diff --git a/vendor/libgit2/src/win32/fnmatch.c b/vendor/libgit2/src/win32/fnmatch.c deleted file mode 100644 index de2f3e74f..000000000 --- a/vendor/libgit2/src/win32/fnmatch.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. - * Compares a filename or pathname to a pattern. - */ - -#include -#include -#include - -#include "fnmatch.h" - -#define EOS '\0' - -#define RANGE_MATCH 1 -#define RANGE_NOMATCH 0 -#define RANGE_ERROR (-1) - -static int rangematch(const char *, char, int, char **); - -int -p_fnmatch(const char *pattern, const char *string, int flags) -{ - const char *stringstart; - char *newp; - char c, test; - - for (stringstart = string;;) - switch (c = *pattern++) { - case EOS: - if ((flags & FNM_LEADING_DIR) && *string == '/') - return (0); - return (*string == EOS ? 0 : FNM_NOMATCH); - case '?': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - ++string; - break; - case '*': - c = *pattern; - /* Collapse multiple stars. */ - while (c == '*') - c = *++pattern; - - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - /* Optimize for pattern with * at end or before /. */ - if (c == EOS) { - if (flags & FNM_PATHNAME) - return ((flags & FNM_LEADING_DIR) || - strchr(string, '/') == NULL ? - 0 : FNM_NOMATCH); - else - return (0); - } else if (c == '/' && (flags & FNM_PATHNAME)) { - if ((string = strchr(string, '/')) == NULL) - return (FNM_NOMATCH); - break; - } - - /* General case, use recursion. */ - while ((test = *string) != EOS) { - if (!p_fnmatch(pattern, string, flags & ~FNM_PERIOD)) - return (0); - if (test == '/' && (flags & FNM_PATHNAME)) - break; - ++string; - } - return (FNM_NOMATCH); - case '[': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - switch (rangematch(pattern, *string, flags, &newp)) { - case RANGE_ERROR: - /* not a good range, treat as normal text */ - goto normal; - case RANGE_MATCH: - pattern = newp; - break; - case RANGE_NOMATCH: - return (FNM_NOMATCH); - } - ++string; - break; - case '\\': - if (!(flags & FNM_NOESCAPE)) { - if ((c = *pattern++) == EOS) { - c = '\\'; - --pattern; - } - } - /* FALLTHROUGH */ - default: - normal: - if (c != *string && !((flags & FNM_CASEFOLD) && - (tolower((unsigned char)c) == - tolower((unsigned char)*string)))) - return (FNM_NOMATCH); - ++string; - break; - } - /* NOTREACHED */ -} - -static int -rangematch(const char *pattern, char test, int flags, char **newp) -{ - int negate, ok; - char c, c2; - - /* - * A bracket expression starting with an unquoted circumflex - * character produces unspecified results (IEEE 1003.2-1992, - * 3.13.2). This implementation treats it like '!', for - * consistency with the regular expression syntax. - * J.T. Conklin (conklin@ngai.kaleida.com) - */ - if ((negate = (*pattern == '!' || *pattern == '^')) != 0) - ++pattern; - - if (flags & FNM_CASEFOLD) - test = (char)tolower((unsigned char)test); - - /* - * A right bracket shall lose its special meaning and represent - * itself in a bracket expression if it occurs first in the list. - * -- POSIX.2 2.8.3.2 - */ - ok = 0; - c = *pattern++; - do { - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *pattern++; - if (c == EOS) - return (RANGE_ERROR); - if (c == '/' && (flags & FNM_PATHNAME)) - return (RANGE_NOMATCH); - if ((flags & FNM_CASEFOLD)) - c = (char)tolower((unsigned char)c); - if (*pattern == '-' - && (c2 = *(pattern+1)) != EOS && c2 != ']') { - pattern += 2; - if (c2 == '\\' && !(flags & FNM_NOESCAPE)) - c2 = *pattern++; - if (c2 == EOS) - return (RANGE_ERROR); - if (flags & FNM_CASEFOLD) - c2 = (char)tolower((unsigned char)c2); - if (c <= test && test <= c2) - ok = 1; - } else if (c == test) - ok = 1; - } while ((c = *pattern++) != ']'); - - *newp = (char *)pattern; - return (ok == negate ? RANGE_NOMATCH : RANGE_MATCH); -} - diff --git a/vendor/libgit2/src/win32/fnmatch.h b/vendor/libgit2/src/win32/fnmatch.h deleted file mode 100644 index 1309c6e9a..000000000 --- a/vendor/libgit2/src/win32/fnmatch.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef INCLUDE_fnmatch__w32_h__ -#define INCLUDE_fnmatch__w32_h__ - -#include "common.h" - -#define FNM_NOMATCH 1 /* Match failed. */ -#define FNM_NOSYS 2 /* Function not supported (unused). */ - -#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ -#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ -#define FNM_PERIOD 0x04 /* Period must be matched by period. */ -#define FNM_LEADING_DIR 0x08 /* Ignore / after Imatch. */ -#define FNM_CASEFOLD 0x10 /* Case insensitive search. */ - -#define FNM_IGNORECASE FNM_CASEFOLD -#define FNM_FILE_NAME FNM_PATHNAME - -extern int p_fnmatch(const char *pattern, const char *string, int flags); - -#endif /* _FNMATCH_H */ - diff --git a/vendor/libgit2/src/win32/map.c b/vendor/libgit2/src/win32/map.c deleted file mode 100644 index 76b926490..000000000 --- a/vendor/libgit2/src/win32/map.c +++ /dev/null @@ -1,125 +0,0 @@ - -#include "map.h" -#include - - -static DWORD get_page_size(void) -{ - static DWORD page_size; - SYSTEM_INFO sys; - - if (!page_size) { - GetSystemInfo(&sys); - page_size = sys.dwAllocationGranularity; - } - - return page_size; -} - -int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) -{ - HANDLE fh = (HANDLE)_get_osfhandle(fd); - DWORD page_size = get_page_size(); - DWORD fmap_prot = 0; - DWORD view_prot = 0; - DWORD off_low = 0; - DWORD off_hi = 0; - git_off_t page_start; - git_off_t page_offset; - - assert((out != NULL) && (len > 0)); - - if ((out == NULL) || (len == 0)) { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. No map or zero length"); - } - - out->data = NULL; - out->len = 0; - out->fmh = NULL; - - if (fh == INVALID_HANDLE_VALUE) { - errno = EBADF; - return git__throw(GIT_ERROR, "Failed to mmap. Invalid handle value"); - } - - if (prot & GIT_PROT_WRITE) - fmap_prot |= PAGE_READWRITE; - else if (prot & GIT_PROT_READ) - fmap_prot |= PAGE_READONLY; - else { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. Invalid protection parameters"); - } - - if (prot & GIT_PROT_WRITE) - view_prot |= FILE_MAP_WRITE; - if (prot & GIT_PROT_READ) - view_prot |= FILE_MAP_READ; - - if (flags & GIT_MAP_FIXED) { - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. FIXED not set"); - } - - page_start = (offset / page_size) * page_size; - page_offset = offset - page_start; - - if (page_offset != 0) { /* offset must be multiple of page size */ - errno = EINVAL; - return git__throw(GIT_ERROR, "Failed to mmap. Offset must be multiple of page size"); - } - - out->fmh = CreateFileMapping(fh, NULL, fmap_prot, 0, 0, NULL); - if (!out->fmh || out->fmh == INVALID_HANDLE_VALUE) { - /* errno = ? */ - out->fmh = NULL; - return git__throw(GIT_ERROR, "Failed to mmap. Invalid handle value"); - } - - assert(sizeof(git_off_t) == 8); - off_low = (DWORD)(page_start); - off_hi = (DWORD)(page_start >> 32); - out->data = MapViewOfFile(out->fmh, view_prot, off_hi, off_low, len); - if (!out->data) { - /* errno = ? */ - CloseHandle(out->fmh); - out->fmh = NULL; - return git__throw(GIT_ERROR, "Failed to mmap. No data written"); - } - out->len = len; - - return GIT_SUCCESS; -} - -int p_munmap(git_map *map) -{ - assert(map != NULL); - - if (!map) - return git__throw(GIT_ERROR, "Failed to munmap. Map does not exist"); - - if (map->data) { - if (!UnmapViewOfFile(map->data)) { - /* errno = ? */ - CloseHandle(map->fmh); - map->data = NULL; - map->fmh = NULL; - return git__throw(GIT_ERROR, "Failed to munmap. Could not unmap view of file"); - } - map->data = NULL; - } - - if (map->fmh) { - if (!CloseHandle(map->fmh)) { - /* errno = ? */ - map->fmh = NULL; - return git__throw(GIT_ERROR, "Failed to munmap. Could not close handle"); - } - map->fmh = NULL; - } - - return GIT_SUCCESS; -} - - diff --git a/vendor/libgit2/src/win32/mingw-compat.h b/vendor/libgit2/src/win32/mingw-compat.h deleted file mode 100644 index 64d780b16..000000000 --- a/vendor/libgit2/src/win32/mingw-compat.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef INCLUDE_mingw_compat__ -#define INCLUDE_mingw_compat__ - -#if defined(__MINGW32__) - -/* use a 64-bit file offset type */ -# define lseek _lseeki64 -# define stat _stati64 -# define fstat _fstati64 - -/* stat: file mode type testing macros */ -# define _S_IFLNK 0120000 -# define S_IFLNK _S_IFLNK -# define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) - -#endif - -#endif /* INCLUDE_mingw_compat__ */ diff --git a/vendor/libgit2/src/win32/msvc-compat.h b/vendor/libgit2/src/win32/msvc-compat.h deleted file mode 100644 index df3e62d11..000000000 --- a/vendor/libgit2/src/win32/msvc-compat.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef INCLUDE_msvc_compat__ -#define INCLUDE_msvc_compat__ - -#if defined(_MSC_VER) - -/* access() mode parameter #defines */ -# define F_OK 0 /* existence check */ -# define W_OK 2 /* write mode check */ -# define R_OK 4 /* read mode check */ - -# define lseek _lseeki64 -# define stat _stat64 -# define fstat _fstat64 - -/* stat: file mode type testing macros */ -# define _S_IFLNK 0120000 -# define S_IFLNK _S_IFLNK - -# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) -# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) -# define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO) -# define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) - -# define mode_t unsigned short - -/* case-insensitive string comparison */ -# define strcasecmp _stricmp -# define strncasecmp _strnicmp - -#if (_MSC_VER >= 1600) -# include -#else -/* add some missing typedef's */ -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef short int16_t; -typedef unsigned short uint16_t; - -typedef long int32_t; -typedef unsigned long uint32_t; - -typedef long long int64_t; -typedef unsigned long long uint64_t; - -typedef long long intmax_t; -typedef unsigned long long uintmax_t; -#endif - -#endif - -#endif /* INCLUDE_msvc_compat__ */ diff --git a/vendor/libgit2/src/win32/posix.c b/vendor/libgit2/src/win32/posix.c deleted file mode 100644 index be6a7c0d0..000000000 --- a/vendor/libgit2/src/win32/posix.c +++ /dev/null @@ -1,248 +0,0 @@ -#include "posix.h" -#include "path.h" -#include -#include - -int p_unlink(const char *path) -{ - chmod(path, 0666); - return unlink(path); -} - -int p_fsync(int fd) -{ - HANDLE fh = (HANDLE)_get_osfhandle(fd); - - if (fh == INVALID_HANDLE_VALUE) { - errno = EBADF; - return -1; - } - - if (!FlushFileBuffers(fh)) { - DWORD code = GetLastError(); - - if (code == ERROR_INVALID_HANDLE) - errno = EINVAL; - else - errno = EIO; - - return -1; - } - - return 0; -} - -GIT_INLINE(time_t) filetime_to_time_t(const FILETIME *ft) -{ - long long winTime = ((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime; - winTime -= 116444736000000000LL; /* Windows to Unix Epoch conversion */ - winTime /= 10000000; /* Nano to seconds resolution */ - return (time_t)winTime; -} - -static int do_lstat(const char *file_name, struct stat *buf) -{ - WIN32_FILE_ATTRIBUTE_DATA fdata; - - if (GetFileAttributesExA(file_name, GetFileExInfoStandard, &fdata)) { - int fMode = S_IREAD; - - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - fMode |= S_IFDIR; - else - fMode |= S_IFREG; - - if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) - fMode |= S_IWRITE; - - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) - fMode |= S_IFLNK; - - buf->st_ino = 0; - buf->st_gid = 0; - buf->st_uid = 0; - buf->st_nlink = 1; - buf->st_mode = (mode_t)fMode; - buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */ - buf->st_dev = buf->st_rdev = (_getdrive() - 1); - buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime)); - buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime)); - buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime)); - return GIT_SUCCESS; - } - - switch (GetLastError()) { - case ERROR_ACCESS_DENIED: - case ERROR_SHARING_VIOLATION: - case ERROR_LOCK_VIOLATION: - case ERROR_SHARING_BUFFER_EXCEEDED: - return GIT_EOSERR; - - case ERROR_BUFFER_OVERFLOW: - case ERROR_NOT_ENOUGH_MEMORY: - return GIT_ENOMEM; - - default: - return GIT_EINVALIDPATH; - } -} - -int p_lstat(const char *file_name, struct stat *buf) -{ - int namelen, error; - char alt_name[GIT_PATH_MAX]; - - if ((error = do_lstat(file_name, buf)) == GIT_SUCCESS) - return GIT_SUCCESS; - - /* if file_name ended in a '/', Windows returned ENOENT; - * try again without trailing slashes - */ - if (error != GIT_EINVALIDPATH) - return git__throw(GIT_EOSERR, "Failed to lstat file"); - - namelen = strlen(file_name); - if (namelen && file_name[namelen-1] != '/') - return git__throw(GIT_EOSERR, "Failed to lstat file"); - - while (namelen && file_name[namelen-1] == '/') - --namelen; - - if (!namelen || namelen >= GIT_PATH_MAX) - return git__throw(GIT_ENOMEM, "Failed to lstat file"); - - memcpy(alt_name, file_name, namelen); - alt_name[namelen] = 0; - return do_lstat(alt_name, buf); -} - -int p_readlink(const char *link, char *target, size_t target_len) -{ - typedef DWORD (WINAPI *fpath_func)(HANDLE, LPTSTR, DWORD, DWORD); - static fpath_func pGetFinalPath = NULL; - HANDLE hFile; - DWORD dwRet; - - /* - * Try to load the pointer to pGetFinalPath dynamically, because - * it is not available in platforms older than Vista - */ - if (pGetFinalPath == NULL) { - HINSTANCE library = LoadLibrary("kernel32"); - - if (library != NULL) - pGetFinalPath = (fpath_func)GetProcAddress(library, "GetFinalPathNameByHandleA"); - - if (pGetFinalPath == NULL) - return git__throw(GIT_EOSERR, - "'GetFinalPathNameByHandleA' is not available in this platform"); - } - - hFile = CreateFile(link, // file to open - GENERIC_READ, // open for reading - FILE_SHARE_READ, // share for reading - NULL, // default security - OPEN_EXISTING, // existing file only - FILE_FLAG_BACKUP_SEMANTICS, // normal file - NULL); // no attr. template - - if (hFile == INVALID_HANDLE_VALUE) - return GIT_EOSERR; - - dwRet = pGetFinalPath(hFile, target, target_len, 0x0); - if (dwRet >= target_len) - return GIT_ENOMEM; - - CloseHandle(hFile); - - if (dwRet > 4) { - /* Skip first 4 characters if they are "\\?\" */ - if (target[0] == '\\' && target[1] == '\\' && target[2] == '?' && target[3] == '\\') { - char tmp[GIT_PATH_MAX]; - unsigned int offset = 4; - dwRet -= 4; - - /* \??\UNC\ */ - if (dwRet > 7 && target[4] == 'U' && target[5] == 'N' && target[6] == 'C') { - offset += 2; - dwRet -= 2; - target[offset] = '\\'; - } - - memcpy(tmp, target + offset, dwRet); - memcpy(target, tmp, dwRet); - } - } - - target[dwRet] = '\0'; - return dwRet; -} - -int p_hide_directory__w32(const char *path) -{ - int error; - - error = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) != 0 ? - GIT_SUCCESS : GIT_ERROR; /* MSDN states a "non zero" value indicates a success */ - - if (error < GIT_SUCCESS) - error = git__throw(GIT_EOSERR, "Failed to hide directory '%s'", path); - - return error; -} - -char *p_realpath(const char *orig_path, char *buffer) -{ - int ret, alloc = 0; - - if (buffer == NULL) { - buffer = (char *)git__malloc(GIT_PATH_MAX); - alloc = 1; - } - - ret = GetFullPathName(orig_path, GIT_PATH_MAX, buffer, NULL); - if (!ret || ret > GIT_PATH_MAX) { - if (alloc) free(buffer); - return NULL; - } - - git_path_mkposix(buffer); - return buffer; -} - -int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr) -{ -#ifdef _MSC_VER - int len = _vsnprintf(buffer, count, format, argptr); - return (len < 0) ? _vscprintf(format, argptr) : len; -#else /* MinGW */ - return vsnprintf(buffer, count, format, argptr); -#endif -} - -int p_snprintf(char *buffer, size_t count, const char *format, ...) -{ - va_list va; - int r; - - va_start(va, format); - r = p_vsnprintf(buffer, count, format, va); - va_end(va); - - return r; -} - -extern int p_creat(const char *path, int mode); - -int p_mkstemp(char *tmp_path) -{ -#if defined(_MSC_VER) - if (_mktemp_s(tmp_path, GIT_PATH_MAX) != 0) - return GIT_EOSERR; -#else - if (_mktemp(tmp_path) == NULL) - return GIT_EOSERR; -#endif - - return p_creat(tmp_path, 0744); -} diff --git a/vendor/libgit2/src/win32/posix.h b/vendor/libgit2/src/win32/posix.h deleted file mode 100644 index 28d978959..000000000 --- a/vendor/libgit2/src/win32/posix.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef INCLUDE_posix__w32_h__ -#define INCLUDE_posix__w32_h__ - -#include "common.h" -#include "fnmatch.h" - -GIT_INLINE(int) p_link(const char *GIT_UNUSED(old), const char *GIT_UNUSED(new)) -{ - GIT_UNUSED_ARG(old) - GIT_UNUSED_ARG(new) - errno = ENOSYS; - return -1; -} - -GIT_INLINE(int) p_mkdir(const char *path, int GIT_UNUSED(mode)) -{ - GIT_UNUSED_ARG(mode) - return mkdir(path); -} - -extern int p_unlink(const char *path); -extern int p_lstat(const char *file_name, struct stat *buf); -extern int p_readlink(const char *link, char *target, size_t target_len); -extern int p_hide_directory__w32(const char *path); -extern char *p_realpath(const char *orig_path, char *buffer); -extern int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr); -extern int p_snprintf(char *buffer, size_t count, const char *format, ...) GIT_FORMAT_PRINTF(3, 4); -extern int p_mkstemp(char *tmp_path); - -#endif diff --git a/vendor/libgit2/src/win32/pthread.c b/vendor/libgit2/src/win32/pthread.c deleted file mode 100644 index 41cf5b35b..000000000 --- a/vendor/libgit2/src/win32/pthread.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - * Original code by Ramiro Polla (Public Domain) - */ - -#include "pthread.h" - -int pthread_create(pthread_t *GIT_RESTRICT thread, - const pthread_attr_t *GIT_RESTRICT GIT_UNUSED(attr), - void *(*start_routine)(void*), void *GIT_RESTRICT arg) -{ - GIT_UNUSED_ARG(attr); - *thread = (pthread_t) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL); - return *thread ? GIT_SUCCESS : git__throw(GIT_EOSERR, "Failed to create pthread"); -} - -int pthread_join(pthread_t thread, void **value_ptr) -{ - int ret; - ret = WaitForSingleObject(thread, INFINITE); - if (ret && value_ptr) - GetExitCodeThread(thread, (void*) value_ptr); - return -(!!ret); -} - -int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT mutex, - const pthread_mutexattr_t *GIT_RESTRICT GIT_UNUSED(mutexattr)) -{ - GIT_UNUSED_ARG(mutexattr); - InitializeCriticalSection(mutex); - return 0; -} - -int pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - DeleteCriticalSection(mutex); - return 0; -} - -int pthread_mutex_lock(pthread_mutex_t *mutex) -{ - EnterCriticalSection(mutex); - return 0; -} - -int pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - LeaveCriticalSection(mutex); - return 0; -} - -int pthread_num_processors_np(void) -{ - DWORD_PTR p, s; - int n = 0; - - if (GetProcessAffinityMask(GetCurrentProcess(), &p, &s)) - for (; p; p >>= 1) - n += p&1; - - return n ? n : 1; -} - diff --git a/vendor/libgit2/src/win32/pthread.h b/vendor/libgit2/src/win32/pthread.h deleted file mode 100644 index 10949f1eb..000000000 --- a/vendor/libgit2/src/win32/pthread.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - * Original code by Ramiro Polla (Public Domain) - */ - -#ifndef GIT_PTHREAD_H -#define GIT_PTHREAD_H - -#include "../common.h" - -#if defined (_MSC_VER) -# define GIT_RESTRICT __restrict -#else -# define GIT_RESTRICT __restrict__ -#endif - -typedef int pthread_mutexattr_t; -typedef int pthread_condattr_t; -typedef int pthread_attr_t; -typedef CRITICAL_SECTION pthread_mutex_t; -typedef HANDLE pthread_t; - -#define PTHREAD_MUTEX_INITIALIZER {(void*)-1}; - -int pthread_create(pthread_t *GIT_RESTRICT, - const pthread_attr_t *GIT_RESTRICT, - void *(*start_routine)(void*), void *__restrict); - -int pthread_join(pthread_t, void **); - -int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT, const pthread_mutexattr_t *GIT_RESTRICT); -int pthread_mutex_destroy(pthread_mutex_t *); -int pthread_mutex_lock(pthread_mutex_t *); -int pthread_mutex_unlock(pthread_mutex_t *); - -int pthread_num_processors_np(void); - -#endif diff --git a/vendor/libgit2/tests/.gitignore b/vendor/libgit2/tests/.gitignore deleted file mode 100644 index 690624bdf..000000000 --- a/vendor/libgit2/tests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.toc diff --git a/vendor/libgit2/tests/NAMING b/vendor/libgit2/tests/NAMING deleted file mode 100644 index c2da0163f..000000000 --- a/vendor/libgit2/tests/NAMING +++ /dev/null @@ -1,52 +0,0 @@ -Test sources should be named: - - t????-function.c - -where ???? is a four digit code. The first two digits classify -the test into a major category; the final two digits indicate the -sequence of the test within that category. The function part of -the test name should give a rough indication of what it does. - -Categories ----------- - -00__: Core library routines based only on the standard library, - and that are essential for everything else to run. E.g. - errno and malloc. - -01__: Basic hashing functions, needed to handle the content - addressable store. - -02__: Basic object read access. - -03__: Basic object writing. - -04__: Parsing and loading commit data - -05__: Revision walking - -06__: Index reading, writing and searching - -07__: Tests for the internal hashtable code - -08__: Tag reading and writing - -09__: Reading tree objects - -10__: Symbolic, loose and packed references reading and writing. - -11__: SQLite backend - -12__: Repository init and opening - -13__: Threads, empty as of now - -14__: Redis backend - -15__: Configuration parsing - -16__: Remotes - -17__: Buffers - -18__: File Status diff --git a/vendor/libgit2/tests/resources/.gitignore b/vendor/libgit2/tests/resources/.gitignore deleted file mode 100644 index 43a19cc9d..000000000 --- a/vendor/libgit2/tests/resources/.gitignore +++ /dev/null @@ -1 +0,0 @@ -discover.git diff --git a/vendor/libgit2/tests/resources/big.index b/vendor/libgit2/tests/resources/big.index deleted file mode 100644 index 66932f14b5e007fb01893750e5cbf1485b40bf57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335272 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 z

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 z z{_Gv|I#d6%{MOeLD{3l8nOd(IWbV3-ZddvOiJ|%^?gyAFSjO?Q_W7mljXtBHb4H6z z`83z$SvAwSULN280E7pR@8%-y@Db*6_Xc^l@ju;YC&JO6@TR4Ymn@e_+)WUo*%j;$ zQy;xxGN0^%c|?}O9TNr4@3gtNCdANE+6ZZU73fU3GJ;}W%??=rciizZhosn zAVHAM!zR2mAc6;cow0mk58ZXw5syX*+{)UZ=w#rP8FyfG*F1Xp7<~xA`wa6~pAPS8 z){t|!OXN!L*m*ed@#RCdg)(&efpBdH`T&C9eSvtyj+EnvDw~bioX)=JvmF$1-!$<1 zNzDQRKdrvhf8sy{?<>S35GwUUcH1oyXpQSD5h6%_($nHHsFSAG7w|x6uQ!z_(_#EE VG(3WMz{zEAtze$S?|uQx{{e9W4*UQB diff --git a/vendor/libgit2/tests/resources/config/.gitconfig b/vendor/libgit2/tests/resources/config/.gitconfig deleted file mode 100644 index fa72bddfc..000000000 --- a/vendor/libgit2/tests/resources/config/.gitconfig +++ /dev/null @@ -1,3 +0,0 @@ -[core] - repositoryformatversion = 5 - something = 2 \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config0 b/vendor/libgit2/tests/resources/config/config0 deleted file mode 100644 index 85235c501..000000000 --- a/vendor/libgit2/tests/resources/config/config0 +++ /dev/null @@ -1,7 +0,0 @@ -# This is a test -; of different comments -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config1 b/vendor/libgit2/tests/resources/config/config1 deleted file mode 100644 index 211dc9e7d..000000000 --- a/vendor/libgit2/tests/resources/config/config1 +++ /dev/null @@ -1,5 +0,0 @@ -# This one checks for case sensitivity -[this "that"] - other = true -[this "That"] - other = yes diff --git a/vendor/libgit2/tests/resources/config/config10 b/vendor/libgit2/tests/resources/config/config10 deleted file mode 100644 index dde17911b..000000000 --- a/vendor/libgit2/tests/resources/config/config10 +++ /dev/null @@ -1 +0,0 @@ -[empty] diff --git a/vendor/libgit2/tests/resources/config/config2 b/vendor/libgit2/tests/resources/config/config2 deleted file mode 100644 index 60a389827..000000000 --- a/vendor/libgit2/tests/resources/config/config2 +++ /dev/null @@ -1,5 +0,0 @@ -; This one tests for multiline values -[this "That"] - and = one one one \ -two two \ -three three \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/config/config3 b/vendor/libgit2/tests/resources/config/config3 deleted file mode 100644 index 44a5e50ea..000000000 --- a/vendor/libgit2/tests/resources/config/config3 +++ /dev/null @@ -1,3 +0,0 @@ -# A [section.subsection] header is case-insensitive -[section.SuBsection] - var = hello diff --git a/vendor/libgit2/tests/resources/config/config4 b/vendor/libgit2/tests/resources/config/config4 deleted file mode 100644 index 741fa0ffd..000000000 --- a/vendor/libgit2/tests/resources/config/config4 +++ /dev/null @@ -1,3 +0,0 @@ -# A variable name on its own is valid -[some.section] - variable diff --git a/vendor/libgit2/tests/resources/config/config5 b/vendor/libgit2/tests/resources/config/config5 deleted file mode 100644 index 8ab60ccec..000000000 --- a/vendor/libgit2/tests/resources/config/config5 +++ /dev/null @@ -1,9 +0,0 @@ -# Test for number suffixes -[number] - simple = 1 - k = 1k - kk = 1K - m = 1m - mm = 1M - g = 1g - gg = 1G diff --git a/vendor/libgit2/tests/resources/config/config6 b/vendor/libgit2/tests/resources/config/config6 deleted file mode 100644 index 0f8f90ac9..000000000 --- a/vendor/libgit2/tests/resources/config/config6 +++ /dev/null @@ -1,5 +0,0 @@ -[valid "subsection"] - something = true - -[something "else"] - something = false diff --git a/vendor/libgit2/tests/resources/config/config7 b/vendor/libgit2/tests/resources/config/config7 deleted file mode 100644 index 6af6fcf25..000000000 --- a/vendor/libgit2/tests/resources/config/config7 +++ /dev/null @@ -1,5 +0,0 @@ -[valid "subsection"] - something = a -; we don't allow anything after closing " -[sec "subsec"x] - bleh = blah diff --git a/vendor/libgit2/tests/resources/config/config8 b/vendor/libgit2/tests/resources/config/config8 deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/config/config9 b/vendor/libgit2/tests/resources/config/config9 deleted file mode 100644 index 34fdc07a5..000000000 --- a/vendor/libgit2/tests/resources/config/config9 +++ /dev/null @@ -1,3 +0,0 @@ -[core] - dummy2 = 42 - dummy = 1 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/HEAD b/vendor/libgit2/tests/resources/empty_bare.git/HEAD deleted file mode 100644 index cb089cd89..000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/empty_bare.git/config b/vendor/libgit2/tests/resources/empty_bare.git/config deleted file mode 100644 index 90e16477b..000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/config +++ /dev/null @@ -1,7 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/empty_bare.git/description b/vendor/libgit2/tests/resources/empty_bare.git/description deleted file mode 100644 index 498b267a8..000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/empty_bare.git/info/exclude b/vendor/libgit2/tests/resources/empty_bare.git/info/exclude deleted file mode 100644 index a5196d1be..000000000 --- a/vendor/libgit2/tests/resources/empty_bare.git/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ diff --git a/vendor/libgit2/tests/resources/empty_bare.git/objects/info/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/objects/info/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/objects/pack/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/objects/pack/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/refs/heads/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/refs/heads/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_bare.git/refs/tags/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_bare.git/refs/tags/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD deleted file mode 100644 index cb089cd89..000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config deleted file mode 100644 index 78387c50b..000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = false - bare = false - logallrefupdates = true - symlinks = false - ignorecase = true - hideDotFiles = dotGitOnly diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description deleted file mode 100644 index 498b267a8..000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude deleted file mode 100644 index a5196d1be..000000000 --- a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/info/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/info/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/pack/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/objects/pack/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/heads/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/heads/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/tags/dummy-marker.txt b/vendor/libgit2/tests/resources/empty_standard_repo/.gitted/refs/tags/dummy-marker.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/libgit2/tests/resources/gitgit.index b/vendor/libgit2/tests/resources/gitgit.index deleted file mode 100644 index 215da649e1c68079fb03f4f9bc0f196cca9855c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134799 zcma%^30zFw8^`ao@B5y1L^Ul+La2z6LQ)YjO;e3lv$W8n2vL!gQW6PClwD+(l4J=L z6463MBt`PxnYp)_(>r&{=l}UUulN7|e}B(;&U5y2&n$3soex0}9|Q>=a!9Lpg#Q^r zEd>3Aa9LIFASnJAgj@a{g5-C?|FwBw?#8t`FC0QviOjnstmtqZqo!t<9dTjl7o2&-J#5FBeD?y_%7P32?UzRoM{!8KC5*7P`?J9i$MuppF34L=R4lac)GEvv6(R~63z_PAC!+;L?;E*5fvyUe3Jg= zwN73~{k-A_n*%OMDXm6h=u8`jPAaG)G_`h_bmq-hbEhOml&<+ZY#tM5n0Rdr9rJPM z>;ZLfkB7e&zN_!~)R#W=Lsautvuv>K(%WO`Sd2qwFQ~&u=;@k6eWE6HnDEXouw<9R zu|B=|yT;I&J`SBUPzU$%mbPMv_iNP^C2Gk(OS@lvjTZQGdJG-Qap>$DrSrjG?73m0 ze{%W`(F@TtUOqg1ZQYHjW9ZBnhfX@EhF^%%7;h)QZ^B6kgX*UN!9rKQ+Zc9qo;lTZi z_EeVGc^)Wkoo{`RXFemnG@8e#Me;cZV4V&3D0s& z8&^K(f;u9T`e)ADwZG4;@7KjgUKggsU-C05`8S5nc=GuWsKY;@

wmy64a1;2V{ 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 diff --git a/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG b/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG deleted file mode 100644 index ff887ba13..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -add subdir diff --git a/vendor/libgit2/tests/resources/status/.gitted/HEAD b/vendor/libgit2/tests/resources/status/.gitted/HEAD deleted file mode 100644 index cb089cd89..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD b/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD deleted file mode 100644 index c2805f422..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -0017bd4ab1ec30440b17bae1680cff124ab5f1f6 diff --git a/vendor/libgit2/tests/resources/status/.gitted/config b/vendor/libgit2/tests/resources/status/.gitted/config deleted file mode 100644 index af107929f..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/vendor/libgit2/tests/resources/status/.gitted/description b/vendor/libgit2/tests/resources/status/.gitted/description deleted file mode 100644 index 498b267a8..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/vendor/libgit2/tests/resources/status/.gitted/index b/vendor/libgit2/tests/resources/status/.gitted/index deleted file mode 100644 index 5c4b18841c44de70476e5789a71db949eefbe01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmZ?q402{*U|<4b9zRxoe;~~OqxnGMl0I1s42??|7#P0-r9^<3cfq|nu0sq*I*-Ui z-d`yo>Q$iTm&d@9Tv}9=npYB^mYI_ZGKGP`_q&q^G7UCQ-Tx8FZdaFK<31!q~@fSqylw7%>la)XfBwBng_HE#eICPdQL7|FEro%;Kp@c z?o7$;x#t&3G4ST*r(~vOrlueq2=gb5hWa-b%{;l#%VH;Y6?D%0II(Y9`32cO>oSk+ zWZ)|fTGbTsp=CgeRYl=t`4xO-YFzJE^u@9PDZRxrq*nU5J9 z@OVcHj{-FF1%hUYy?CBa)vXEgKW-m+;j z@A&rl&T0J>g5tYUCrt7CxtBo}&AsuM0Rjw%T9ElL8f?C#PZgT^BEf4OTs$M_y7bFG z|B8ie%b1cS*^L>5i%XMIGK=&vvjxb!KB&218ftD0y15b^Cs<9Q7o~1^H^p;Ddv!ue zq(TJTTxiZf3J#FDEl_j8G}PQ`G;>9lNlG>q%r40d3wUXxb>8HC$wN^V1`()xF@u32 a^V{R^hlF0QySVD(DQ|;{J+u0!o&^Aj5irC6 diff --git a/vendor/libgit2/tests/resources/status/.gitted/info/exclude b/vendor/libgit2/tests/resources/status/.gitted/info/exclude deleted file mode 100644 index a5196d1be..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ diff --git a/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD b/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD deleted file mode 100644 index e876bd80b..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 0017bd4ab1ec30440b17bae1680cff124ab5f1f6 Jason Penny 1308050070 -0400 commit (initial): initial -0017bd4ab1ec30440b17bae1680cff124ab5f1f6 735b6a258cd196a8f7c9428419b02c1dca93fd75 Jason Penny 1308954538 -0400 commit: add subdir diff --git a/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master b/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master deleted file mode 100644 index e876bd80b..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 0017bd4ab1ec30440b17bae1680cff124ab5f1f6 Jason Penny 1308050070 -0400 commit (initial): initial -0017bd4ab1ec30440b17bae1680cff124ab5f1f6 735b6a258cd196a8f7c9428419b02c1dca93fd75 Jason Penny 1308954538 -0400 commit: add subdir diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 b/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 deleted file mode 100644 index b256d95a3..000000000 --- a/vendor/libgit2/tests/resources/status/.gitted/objects/00/17bd4ab1ec30440b17bae1680cff124ab5f1f6 +++ /dev/null @@ -1,2 +0,0 @@ -xA E]sй€fh)‰1]»ò -#SÀTºðö¶Wp÷ßK^~¨9§šÜ¡-"àC'Ø…)FvõbƒvÉ Þ"¶wŽŽ¼EÅk{Ö®ü©nRÊίÞû6ã#sšO¡æ 舄pDƒ¨6»6ù3W©¤–xV?¨Å9é \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 b/vendor/libgit2/tests/resources/status/.gitted/objects/06/1d42a44cacde5726057b67558821d95db96f19 deleted file mode 100644 index 82e02cb0e0fda076e0929858a5c7b56e75be70fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 zcmb!i*lf6ud?x}LtB{-@7)K4oI)V&>ch0RCqU&j0`b diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 b/vendor/libgit2/tests/resources/status/.gitted/objects/19/d9cc8584ac2c7dcf57d2680375e80f099dc481 deleted file mode 100644 index 2d5e711b97ec5874dbc18b2ad235530c86652706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22 dcmb!i*le?46-ud~{n{-@7)K4oI)Ud{Oo0QpJ|NdN!< diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f b/vendor/libgit2/tests/resources/status/.gitted/objects/54/52d32f1dd538eb0405e8a83cc185f79e25e80f deleted file mode 100644 index a72dff646b20ab48a518cc175462fdaabe794fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29 kcmbiQ^texKq}F2E(aNh>WK98n>%;f|A?{+u(P O5^Q@&b7Nmdl1VU_L{01f diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea b/vendor/libgit2/tests/resources/status/.gitted/objects/75/6e27627e67bfbc048d01ece5819c6de733d7ea deleted file mode 100644 index 8f3fa89e5bb2ca0906ce05d583e51f763179aed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+|>0V^p=O;s>4G-EI{FfcPQQAjQ=DoV{OiBHSSNo81Yua4^w!;#J-GLiRJ z3W$0YsQKkV)q&*WQ&MwMOHxx9LV_;q%U-p3&BFR(h0Vd%@AFh&@I%$*=BH$)Wu~S; z40P3Va@l&J`R)fduJdwdN^Z|RzfcOQu(%{K9jGihBQY;MwV1&uz`LlpDMWuh$2^t4 zw~jt4fIy+RG$|#sh+&obGDp`84+Z|)^))khnf+KWRihjLBsHeBni!R! diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 b/vendor/libgit2/tests/resources/status/.gitted/objects/90/6ee7711f4f4928ddcb2a5f8fbc500deba0d2a8 deleted file mode 100644 index bb732b08e00e261d2c586ef82bbc5a351fc2714d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 zcmV+}0MY+=0ZYosPf{?oU??t0OixXTPtHipOHVD1&&^NCOv?lcq-Ex$a^aN(05gdg E-^4%@-v9sr diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 b/vendor/libgit2/tests/resources/status/.gitted/objects/90/b8c29d8ba39434d1c63e1b093daaa26e5bd972 deleted file mode 100644 index 7a96618ff102eba85f7faea1f60823ea0024b72e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41 xcmbLmr~m0Qo==$=e6O<`005$93d{fi diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 b/vendor/libgit2/tests/resources/status/.gitted/objects/a6/191982709b746d5650e93c2acf34ef74e11504 deleted file mode 100644 index cc1f377b30ef420dc1a3eda12a85774b729c6504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37 tcmb!i-5^Jo1}`keOh?esr=#`7r?!<5flssJkl5G()y diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b b/vendor/libgit2/tests/resources/status/.gitted/objects/a6/be623522ce87a1d862128ac42672604f7b468b deleted file mode 100644 index c47298347d7c1f469623d8ce4caddd8794e40027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 zcmb7GGs6`FfcPQQAjQ=DoV{OiBHSSNo5FL^WfqcLD!{U{`prd zY+J^ZEXi&RRhN>QlUkCR0#PT?ae~z(dQs|zcT+rfv{xsjL@Go;)#c`=WTs`p6fTpL aY$}*tk{cHA(njmN$@`LrqAUOlPB4dZg)}q( diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 b/vendor/libgit2/tests/resources/status/.gitted/objects/da/bc8af9bd6e9f5bbe96a176f1a24baf3d1f8916 deleted file mode 100644 index 3e3c03c96f7b3d38932ddaac9efadd916e4c352d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 ycmbZC&ODsUReNf+YxvG diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca b/vendor/libgit2/tests/resources/status/.gitted/objects/e9/b9107f290627c04d097733a10055af941f6bca deleted file mode 100644 index 1266d3eac711499057f4a9a42b34b130bbc48fa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37 tcmb{)$KSWp-}9`eu4k|R=`)_Kn}T;R+?V0m1ONwH4y^zH diff --git a/vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd b/vendor/libgit2/tests/resources/status/.gitted/objects/ed/062903b8f6f3dccb2fa81117ba6590944ef9bd deleted file mode 100644 index 8fa8c170741c62e1169b35b5eecd7f1dcafaceb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 ycmb75U>zSTy|!su9BdjQ4~S3VApA@OBWUaORz;_18mqkU~jP_ zil|48K~Rq^Q{Q)H(kD1P2mk;}?pI7m zKpMHH)dqEn5LjL1CdI`i2e*4htPB;LPz>N_oNk z&&P$-R-_l6+PLoe&(#q>EPPqNxeZ_!6gGHNaA-gCx>iX!ZkP9r_|-D{-0@~@9$&x~ z=A`!dt7KF)U_XeAV%3^xE=n;j(dy&Nl5#BV2KnwU`?!DVP@joV%{`~da_Z%?Nq`d> zukmBzQc@?eu}#OfTFP@=WgmI?KMT7LO{)KsnKsZ%zNvKd@xg!#mwvtkaxzIfIW8g5 ze4J~fJmC4<`Z@KpUIpHt+AE^(UhPho>C-k}1DZ!`C=RFei>LiGfis?wcEkfH5P%(UZ^zw=a=sOWew0WF@aW4(Q$N?JaIA!Dfl0Lv@UXyCt5vsgOqD| ze)!VJm(P-e@&`VRbfm7VA>7)vPczM(+!S}ClxyAP@bfKu3Q~u-Us+Hye#)Tc3hYFf zHQ=Pvo0v?-`w29&_1+}q*=kFoi)y4mE;?)H;idDZ#SEufi>7Z(%5m0d_9&yneQ zIxFyY+Ddu$!?Dk7Nf&6yq4X8^k5>9NG+bIu-I4J00gLqzt-dZ>r97*BUlv?WxHK<1 z!uRDAj~E}DhP>mq&NTAkV#NfC9MS4|+oU{))xj-SPAd-bmV1P~@VQykCwdz(TLZM< z<7L=rEh#7Co^}Ov;o|Q6qaZ&k8?{gi`&1gQ)%H>^KoAkc&|K?3L$K!UW z;U2a8>#S$M{)8b8OQ+Qy8I^x6C3f~rG6rza>C+@|!HRlBtJjqyUtV zikRX~pYO@W2mjdp4yb1Y09C8Q2N1Y?HyRc z`&!o=xzHzq)#;mf^{tfG+>LQL^|^nG&7Og+pL;R`yHvPQk2QcZA1A;6_)!)Vh6I@8 zy_51Rzi%8ze}WZwdp)JRX1imM*Pf5|bnDS}@y(yk4bHKZr^{LcuDm{Ou`0Mlz|Ss+6m^MK zuWyf(XJ74Wd$%IiWy7Ah*`LdN%j|bODU@HA@`PCvIil6`_DXq{Z2G3apB~&se69?f z6E>{9%>FIbIyGne69%QeMlkBTp)su`6e}7CLUa=a=R^q`p-+DAa@J#W9qAv50YsRv+(vDbJ;Q zgTMCpNLeje(uSDW?e>T%LHS2l81OVq)4T&xo>Qx7yX1ZLg&%gWKtFw#JvgiC&AcK| z*ekrg1a@jN86CwjMO~uR>pLjrS=V%G>HhXW%#G$T%*>P3c<%l7cZPNYT8aIlot(gu zj66xJiB1%Ra{GR}NK_hd40vbY7!&dCue&obojl(QpFX&CTzdGYJg#|6~Nu(urz zc)}2Ki3+A)Q~!@oR74ejxO;{`lp1 zP#=LOSb?`7TFSF__X4&DMV45Hf7I+$g;a%o+MQRq(2yqz6#GTA`o1|Ta*$NX@wTy5~!dEZ?T;^lXO*?YlBDaZ0m_Lx~c7hkk1 zENkd??focpm9}Hc{*4^7bDJmSIPY>Q3_txQK51%Y%?hYZmfhveo9edeIowV$t0!N| zu{rZHvhDXbe;!X_1E$Rz{QTYJ*s|WQg}I84rwuO5Vtz!c&(mos&(bG;)fCs_KGC7R zF7qQM{_|sw+ts4wMm$}si5$`Dd1s`&c5ba(y!!CWqw+?OMbvn=1?t1ezu4CZbrkh+ z)^8}+7befgc2b_(vVOP6TPM8_@gDLitjFN=9#c;FznLbS7u@cQqas;axY}~M9_#x} zX9aybqNF^Vows8a(V5pvlx|Dc?DFtB{;2b4*?VIiAF!Ewvb~fiTY8h4_W0?IAx@0v ztT;;;^@%!iG)Xuw#NGb&`NfpJ7%9)9ytDI(iv{^FAHCgE?o%5#y1SDzTOs8MlP}gm zwEB9Sm-4K;j-TW6E_&ND;DRClJOi!iT}vqD@?=H~T+lxv@3wd&+dFZsLt z8Sf(3%{e}FXXfmPgC@9wSY19%*4s}A~< zWT4aJxi(D7vnayhzG@_%Dc5%0Xq}qZ=hcj|K2HpI2Kr2%YnP=wtGC%6`<)i;30`*R zX2FIBd3*iih?-5pyd=eHQWX3$)oB##B3gZY{*dzQ#?H&>n6~6uz`Lt;$ND_@wArcn zUf*&-AAg8{^IW?k<=GCNa&22_hl2cs(-}h+=dM-#F8e89vH|Z~@fI2JhS;v_eSYt) z@~Um6Ro9E1M=Tv%v2TblFUgu%SgByRrx`wAF;3CyaTyUok?dK_?V z;*{I9X{e!2u`r@O z(duwQ3$wd*+gxk!tgDY$PulccU{VJ?C0yd zf6-5N143AK^QV1Xp$QMa99si83%tg+MP}o@A>~HGe5e&gKdk*ydqW*gw%$W_V{ST!AM@P5MN9F|JC z&6dnvd+~X8{qrj8{(I*qJo`<(x20U06|o!tZn1Gi-U{3kO89m1;^1tT5q|(O zQ7^>h_kX&_mPxsu8w1E45mpC-0P1>X#@UL>Ie#u*^$ciX$c=02esM?2bLezL5s>IT z$-!pA^aEpx1604Y3!(Nl<`n{!a_-R8rpB}SP7w1cT76#cO1b_ibKSh3oS&Zmef%Wm z6`k0zWoA^>LPIXha}81;@=KG0$v)%!PZ@II|Bd@l${p~_kv`3wUY>aEkauiMPyfvC zdTj{accXEBVJ;8J2^y_fHD0gD_ka#kuIF<9$PkD3Nv*Fr24lmKVDHG9`U$V?Q8VpE0bK z&Bj3z(Y@k%Hb$NBapE^PRI_vhv{n4w{<5BcjTXm|TURWN@x5Kyg*b^xia4Wvo ztwZIqke;WiGf!35efC*ZFnT8Nqu389mj~f8ny7$a1%axS7(%Kk93@eVL@AcW5hVgs ztcrp$oFWmL1POhHPXB;cp(D5Qs~R?ca8C^l8#()A6aE>s z8YLKl#4r$rlng?^N)|^zHKtM$1m~WhX{IUvFO2-lW@Hyv5ANmocSV%%7azyzFD5u$ z^fv7uK^2sW;BpOP6b{oMP7n;OqA8lfF`A+XP)*|$1)@#HUuEQf%fg|@itFcZS1lhj zu31%DX~(U>pYNOTPb!q4l7bP8^P;9ehQe938m851mV#*$bYimyH8u{{5}D%_D1jDw76S-(XZ-Prv2lnf=e#LAP|IbHK%D3VsI2>K$2x4 z48ds?2-6e>l1=%qHS!;>SRWPp_YkQ8mZrVQqDG-8CkzC0XtrB*OFOt6F+S7A8c{|wEt3;}U@hq>k_Foa-PZY?$C|8FDzm+MB(&&ogH<^MM0 zLYgmDlI{z8PBZPFL=+^>xg=0pjll$tuqpz^I!oO4wG5eDUs0|>!X5H|~|Ci9p-*0H zk!k-drcg1gQbkcp24XO7)G2~esz?^+PGg3kl`KNgD6E2-$bYVtk^gY3WCzXeR_~hk zUVaJgmC;gBINiIgY5!_W0fM*+ga``55SH74DwuQ69Rey8RnY{aV!7j)V4C!AW8}Y0 zi>_;K`c9dCvO}@<`G?naP}%*yu4ep`3PeSLIIhCEX@f`xCHU(A3aXVPj;gtNY3Q)xzF=`xCff$6N++_npF&3k_ z)yHy21Hq{waIC5GFW2ZEYF)PS{H1m|-M8PI>KU5Z`|!Lw`APfM0|QLmzv4+cO2Pk- zGdRtSpjyQp0Wd_UK?EWY?r4M%ggcE?B#Dz;D?$|Nr(ty8>iC3+&jq3t?ytE<-?1#J zw3iyfdayGmMh*Z%7QmB&?KU`<0|Wn`^ziC+)zRJ4b>D5o`>&v9SCF(m_NQuxVxQ_u z-oM>4CTvj4&c0#3+nJii=S%*6s{7C+T&9IMXY1qDS$&+bQmzyJA;ZaIMYJk)s%*M_ zuV%5}*%{>q?*&lqo~|XSXv61PcuxVMoVhR#ZgMnTCmD8t?xo z2n*b=|KoyK57FxNa>npGmgDxHx2^A0KBDlq2}P}P)~zalGW*w;e|>)E-rh`@%tptv z-}-Kz>mudaAMEbX#+&H)Gx8+G&0?9-KTW%832c(9f5Rr~6s=ybtCZ_7+Oy*054D#L zIc8sq@h){;$#}i@&lle_@!d3m|5C z)*);Ei^pjcIil6`WKy2p=ActSz5KR+K3N?#U}u-9=QDo3UX}3m{Q|EqhSbEGeXh=R zlkxzxVPn>~v%M}Zs4m=FQ#CrZ?V%95m!ZByzr>{YcmN3RJDlrrfE2%MieH8y5af?8 zsaYZ$-^#7G-5C`FfcPQQ3!H%bn$g%SfOmF@NI2De~WFK%%kl}eMcVO zI|fyeRFs&PoDrXvnUktlQc=R-y0dwo*>)TDjyrSqY|q)<@TYo1I8Fm*0&IVk`D diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/vendor/libgit2/tests/resources/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50400af7e36b25ff200a7be95f0bc61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 acmb -öF- \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/vendor/libgit2/tests/resources/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f82efa00eeac6cae9e8b2abccc8566ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmV--0Eqv10V^p=O;s>7G-5C`FfcPQQ3!H%bn$g%5N`dHvVMD1*wTH+ot*d0HmhE8 ziUX=5sVFfoIU_zTGbdHAq@skub!YQFv+XwQ9e3vJ*`Bkz;ZOC3aH!I})N-(rU!EJv Zrz=lf8^K%<@M(E`$>VgnNdSzWFYprfIFkSX diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 b/vendor/libgit2/tests/resources/testrepo.git/objects/7b/4384978d2493e851f9cca7858815fac9b10980 deleted file mode 100644 index 23c462f3415e0b02832cb2445dc66bde8daa9ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmV;C0B-+y0WFL{4uUWc06q5=dp99n3hj~@;|IJM@1-nQr9fac;rG_WWDawg5kCOd z_As|k4g%b0Lful=8zvnpG+m=jZw=bY1c#Q$p`lL6zA%J2r6@}B;~)Nf;1%vM@FZ~c zt3)`7pXS&5G9(|zB1dPylCXAUY6nMMYOU1m5jV(q`0%>J7Sl2^RiSaIAE^xQ@?_ml44FkiJ(R)*{ z(H(TH6>PFd5&0~h#n$X!k{LPpBqYvbW+w8_Xyl{wSm9BID%@u&V}Z+7esG(*wD+lu geg*3yQ9w!oju;WmZug_se_Eq;)3!|J3!n-%%(!(uEdT%j diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xŽ[ -Â0EýÎ*fÊäÕ¤ "¸W0“‡-ØFâtÿÝ—çpS[–YÀ˜x^ -Díb CLhutɉ}¥8X*4Zí¬sY½¨—UÀ‘AÃÖ ÌX3‡R«Mµ¶) s6è¼¢M¦ÖážšÜ&Jm…ó;}Çõ±Ðü<¥¶\@›à‚ÑÞpÄ€¨vº?”ò«jÛºLð«¨Ø?Hå \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696b..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -x;j1DëmdÓú·À˜ÇŽ|M«µ3`ŒV{ >€³âQ¯ ¸·vL0I?Í!š4–Z=Ê! ×¦8²F¢Ã’!rÖsQßyÈ9]$DŽ&„l6AÇ>jFWüÒµ IKNiûë§Z¢%¡SˆŒ‘ -‹Ò ­ÅʉøU~̽øä>'¼ï™û ¯wþ ×[ËÇ× ÷öÚDGÚ¡±ðŒQ-ºMù«>dܶ‘OÞáÒò}í\à8g_ШÂoYr \ No newline at end of file diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd b/vendor/libgit2/tests/resources/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd deleted file mode 100644 index d0d7e736e536a41bcb885005f8bf258c61cad682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28 kcmbBQQQ6W+Sv9;eTEK4oHX{LN+y0Ic;3tpET3 diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 b/vendor/libgit2/tests/resources/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 deleted file mode 100644 index 18a7f61c29ea8c5c9a48e3b30bead7f058d06293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26 icmb=Z5m>$`jW{Fc$=TS{`5WI9+ZM01*fsdfR&>4gdfE diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 b/vendor/libgit2/tests/resources/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 deleted file mode 100644 index 112998d425717bb922ce74e8f6f0f831d8dc4510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24 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 rcaKYLMm*}NJR{E;Zd?;1?Rz=-Xf;gsm+2PX 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

&SG& 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�eTY#b?LX)(ib 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

oIQ4YOXU$0Mi5i`Sf+bbJ=L9 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ǧ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 z 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

buibo}hicx6&l@gJNcsJI;tJeTH?p}*-9#Ii z@3706gDGL2Hg}@!j5ElkxtG8o`A&fNTHKigV?Ae#^La0ar2fE1v!ai3$O0s_2`(ic z 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«< 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 Ly^wf#eqsC{v)m?j diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.idx b/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.idx deleted file mode 100644 index 94c3c71da52ca3d4761c4e9041b384d9bc75ad9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 zcmexg;-AdGz`z8=qW}^Pps*kZGXwPvCCmbJ??}b0K);VP%m(x`PVCs+bpPZ39eaPT zF#d95_t~f2a`oYw4{Y+*Z5}2Csyees*{;KHB55dV&?dF#`kRGN5~TfOsX4T@J*P yfLQIszKM4h+|MXn`snRCm0er%Quq9yFn5~doV&qSCs?ySKaj$-^Vag-Df$4qg=3fi diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack b/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack deleted file mode 100644 index 74c7fe4f3a657d606a4a004c87336749079c0edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmWG=boORoU|<4bwrPA7bLRHNavd@dXt`h9wYOo@&ulXVr3x1R33=PLWk|2oj=R6e z{6ngQ-HiT=p)71gtxNdtSc@#my7+iQ>e4qWip{2_EIvQCa!ROJYez<`n&YvUtTcI* z9TTeiTBZe0nUf^pW%6`sa`eMPzM|)nA8tGF@Z|lXUFTAFz2AA(eS_Z5b4eUxWitfM zx;^&{{dY4@|EHR09p8m=V|lCdF3HolfsX5m=3+ABVfbI&731*Idp5t|LFI}jHQzg~ zyQiAoi@zxS!<^^L4J{_ighMw%nza;7mv(7p=6M|PE%R{fdiLnm>17)awYE#nS$-B0AgjUCm@D?V9#TFX)~ z$JoTcz}PU*66+=E@hWo`*7*&jWecg0;xw=p8Q#< znGm{LIG-cz>zd?K^@r5dt1_-_DeboX%y8$7^v#Wo6?0bm=)z13@;H6Q^C=U9)d4m= z>xwzr=RI@+K|))fGcic~WZt)&iFo@NUWM`6pV&9?&Vu_Hg-aj3U8k~ZOJ3@p{}TZ5 CmFm|3 diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.idx b/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.idx deleted file mode 100644 index 555cfa977d92b199d541285af6997543062dbb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 zcmexg;-AdGz`z8=Fu(|8jAF{d02H2-U}m6xVlWF(-6*Ck3|N6-I8-nj(5*DVOle|P zo{t)ie0?j&@$0PFqP>OL=Y#(kT`Ve_JpcH-3(;%WeY(v#lR+%mtR?&EiC&|hR!?hN z(wd)1Z9Qs`dw%x!5V?meVL>yD15}(ow=(kB?z_;%ZLnQyuGiaosUIg!3HkM=?0m@~ zu;ad6!x7<|%-;-CYzi~lg?rcd+wO~5?(_a%q=V;#6!|H$|2e3=YcE{|%zhz2tPI5a zfqq^Fr2Bw0kGu4gOS9IUbq@E_@MF5DBm1P@&x?V@nN22yqrhMG{sG3n*SE{>v{(-S DZ%AIa diff --git a/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.pack b/vendor/libgit2/tests/resources/testrepo.git/objects/pack/pack-d85f5d483273108c9d8dd0e4728ccf0b2982423a.pack deleted file mode 100644 index 4d539ed0a554c2b1b03e38f5eb389b515fc37792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmWG=boORoU|<4bwh4R{bLO6LB2ZL-fLMnU}tes`9ibm`tURpR~n zN4$6HD)yU)CWLQZoTPkI!7rVgzg+9v``Z_ETFHpbhKWQbKFLPm4J!}4hZ-;;1 za#iqhJ1^nhV_bNmPxbulr)SmY-soaD~5%da!2C_U9Y#XivXB zA!=`fYW_quaW@M^#aa1lT|@sZc&3)$dY@s6GLb^dz-uTluNVLoplcP)9_=us3ZHN-p>mFO;6gd diff --git a/vendor/libgit2/tests/resources/testrepo.git/packed-refs b/vendor/libgit2/tests/resources/testrepo.git/packed-refs deleted file mode 100644 index 52f5e876f..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/packed-refs +++ /dev/null @@ -1,3 +0,0 @@ -# pack-refs with: peeled -41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9 refs/heads/packed -5b5b025afb0b4c913b4c338a42934a3863bf3644 refs/heads/packed-test diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/br2 b/vendor/libgit2/tests/resources/testrepo.git/refs/heads/br2 deleted file mode 100644 index aab87e5e7..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/br2 +++ /dev/null @@ -1 +0,0 @@ -a4a7dce85cf63874e984719f4fdd239f5145052f diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/master b/vendor/libgit2/tests/resources/testrepo.git/refs/heads/master deleted file mode 100644 index 9536ad89c..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -be3563ae3f795b2b4353bcce3a527ad0a4f7f644 diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/packed-test b/vendor/libgit2/tests/resources/testrepo.git/refs/heads/packed-test deleted file mode 100644 index f2c14ad83..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/packed-test +++ /dev/null @@ -1 +0,0 @@ -4a202b346bb0fb0db7eff3cffeb3c70babbd2045 diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/test b/vendor/libgit2/tests/resources/testrepo.git/refs/heads/test deleted file mode 100644 index 399c4c73e..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -e90810b8df3e80c413d903f631643c716887138d diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/e90810b b/vendor/libgit2/tests/resources/testrepo.git/refs/tags/e90810b deleted file mode 100644 index 584495d3c..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/e90810b +++ /dev/null @@ -1 +0,0 @@ -7b4384978d2493e851f9cca7858815fac9b10980 diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/point_to_blob b/vendor/libgit2/tests/resources/testrepo.git/refs/tags/point_to_blob deleted file mode 100644 index f874a3ffc..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/point_to_blob +++ /dev/null @@ -1 +0,0 @@ -1385f264afb75a56a5bec74243be9b367ba4ca08 diff --git a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/test b/vendor/libgit2/tests/resources/testrepo.git/refs/tags/test deleted file mode 100644 index 6ee952a03..000000000 --- a/vendor/libgit2/tests/resources/testrepo.git/refs/tags/test +++ /dev/null @@ -1 +0,0 @@ -b25fa35b38051e4ae45d4222e795f9df2e43f1d1 diff --git a/vendor/libgit2/tests/t00-core.c b/vendor/libgit2/tests/t00-core.c deleted file mode 100644 index 6d63d1ce1..000000000 --- a/vendor/libgit2/tests/t00-core.c +++ /dev/null @@ -1,584 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" - -#include "vector.h" -#include "fileops.h" -#include "filebuf.h" - -BEGIN_TEST(string0, "compare prefixes") - must_be_true(git__prefixcmp("", "") == 0); - must_be_true(git__prefixcmp("a", "") == 0); - must_be_true(git__prefixcmp("", "a") < 0); - must_be_true(git__prefixcmp("a", "b") < 0); - must_be_true(git__prefixcmp("b", "a") > 0); - must_be_true(git__prefixcmp("ab", "a") == 0); - must_be_true(git__prefixcmp("ab", "ac") < 0); - must_be_true(git__prefixcmp("ab", "aa") > 0); -END_TEST - -BEGIN_TEST(string1, "compare suffixes") - must_be_true(git__suffixcmp("", "") == 0); - must_be_true(git__suffixcmp("a", "") == 0); - must_be_true(git__suffixcmp("", "a") < 0); - must_be_true(git__suffixcmp("a", "b") < 0); - must_be_true(git__suffixcmp("b", "a") > 0); - must_be_true(git__suffixcmp("ba", "a") == 0); - must_be_true(git__suffixcmp("zaa", "ac") < 0); - must_be_true(git__suffixcmp("zaz", "ac") > 0); -END_TEST - - -BEGIN_TEST(vector0, "initial size of 1 would cause writing past array bounds") - git_vector x; - int i; - git_vector_init(&x, 1, NULL); - for (i = 0; i < 10; ++i) { - git_vector_insert(&x, (void*) 0xabc); - } - git_vector_free(&x); -END_TEST - -BEGIN_TEST(vector1, "don't read past array bounds on remove()") - git_vector x; - // make initial capacity exact for our insertions. - git_vector_init(&x, 3, NULL); - git_vector_insert(&x, (void*) 0xabc); - git_vector_insert(&x, (void*) 0xdef); - git_vector_insert(&x, (void*) 0x123); - - git_vector_remove(&x, 0); // used to read past array bounds. - git_vector_free(&x); -END_TEST - -static int test_cmp(const void *a, const void *b) -{ - return *(const int *)a - *(const int *)b; -} - -BEGIN_TEST(vector2, "remove duplicates") - git_vector x; - int *ptrs[2]; - - ptrs[0] = git__malloc(sizeof(int)); - ptrs[1] = git__malloc(sizeof(int)); - - *ptrs[0] = 2; - *ptrs[1] = 1; - - must_pass(git_vector_init(&x, 5, test_cmp)); - must_pass(git_vector_insert(&x, ptrs[0])); - must_pass(git_vector_insert(&x, ptrs[1])); - must_pass(git_vector_insert(&x, ptrs[1])); - must_pass(git_vector_insert(&x, ptrs[0])); - must_pass(git_vector_insert(&x, ptrs[1])); - must_be_true(x.length == 5); - git_vector_uniq(&x); - must_be_true(x.length == 2); - git_vector_free(&x); - - free(ptrs[0]); - free(ptrs[1]); -END_TEST - - -BEGIN_TEST(path0, "get the dirname of a path") - char dir[64], *dir2; - -#define DIRNAME_TEST(A, B) { \ - must_be_true(git_path_dirname_r(dir, sizeof(dir), A) >= 0); \ - must_be_true(strcmp(dir, B) == 0); \ - must_be_true((dir2 = git_path_dirname(A)) != NULL); \ - must_be_true(strcmp(dir2, B) == 0); \ - free(dir2); \ -} - - DIRNAME_TEST(NULL, "."); - DIRNAME_TEST("", "."); - DIRNAME_TEST("a", "."); - DIRNAME_TEST("/", "/"); - DIRNAME_TEST("/usr", "/"); - DIRNAME_TEST("/usr/", "/"); - DIRNAME_TEST("/usr/lib", "/usr"); - DIRNAME_TEST("/usr/lib/", "/usr"); - DIRNAME_TEST("/usr/lib//", "/usr"); - DIRNAME_TEST("usr/lib", "usr"); - DIRNAME_TEST("usr/lib/", "usr"); - DIRNAME_TEST("usr/lib//", "usr"); - DIRNAME_TEST(".git/", "."); - -#undef DIRNAME_TEST - -END_TEST - -BEGIN_TEST(path1, "get the base name of a path") - char base[64], *base2; - -#define BASENAME_TEST(A, B) { \ - must_be_true(git_path_basename_r(base, sizeof(base), A) >= 0); \ - must_be_true(strcmp(base, B) == 0); \ - must_be_true((base2 = git_path_basename(A)) != NULL); \ - must_be_true(strcmp(base2, B) == 0); \ - free(base2); \ -} - - BASENAME_TEST(NULL, "."); - BASENAME_TEST("", "."); - BASENAME_TEST("a", "a"); - BASENAME_TEST("/", "/"); - BASENAME_TEST("/usr", "usr"); - BASENAME_TEST("/usr/", "usr"); - BASENAME_TEST("/usr/lib", "lib"); - BASENAME_TEST("/usr/lib//", "lib"); - BASENAME_TEST("usr/lib", "lib"); - -#undef BASENAME_TEST - -END_TEST - -BEGIN_TEST(path2, "get the latest component in a path") - const char *dir; - -#define TOPDIR_TEST(A, B) { \ - must_be_true((dir = git_path_topdir(A)) != NULL); \ - must_be_true(strcmp(dir, B) == 0); \ -} - - TOPDIR_TEST(".git/", ".git/"); - TOPDIR_TEST("/.git/", ".git/"); - TOPDIR_TEST("usr/local/.git/", ".git/"); - TOPDIR_TEST("./.git/", ".git/"); - TOPDIR_TEST("/usr/.git/", ".git/"); - TOPDIR_TEST("/", "/"); - TOPDIR_TEST("a/", "a/"); - - must_be_true(git_path_topdir("/usr/.git") == NULL); - must_be_true(git_path_topdir(".") == NULL); - must_be_true(git_path_topdir("") == NULL); - must_be_true(git_path_topdir("a") == NULL); - -#undef TOPDIR_TEST -END_TEST - -static int ensure_joinpath(const char *path_a, const char *path_b, const char *expected_path) -{ - char joined_path[GIT_PATH_MAX]; - git_path_join(joined_path, path_a, path_b); - return strcmp(joined_path, expected_path) == 0 ? GIT_SUCCESS : GIT_ERROR; -} - -BEGIN_TEST(path5, "properly join path components") - must_pass(ensure_joinpath("", "", "")); - must_pass(ensure_joinpath("", "a", "a")); - must_pass(ensure_joinpath("", "/a", "/a")); - must_pass(ensure_joinpath("a", "", "a/")); - must_pass(ensure_joinpath("a", "/", "a/")); - must_pass(ensure_joinpath("a", "b", "a/b")); - must_pass(ensure_joinpath("/", "a", "/a")); - must_pass(ensure_joinpath("/", "", "/")); - must_pass(ensure_joinpath("/a", "/b", "/a/b")); - must_pass(ensure_joinpath("/a", "/b/", "/a/b/")); - must_pass(ensure_joinpath("/a/", "b/", "/a/b/")); - must_pass(ensure_joinpath("/a/", "/b/", "/a/b/")); -END_TEST - -static int ensure_joinpath_n(const char *path_a, const char *path_b, const char *path_c, const char *path_d, const char *expected_path) -{ - char joined_path[GIT_PATH_MAX]; - git_path_join_n(joined_path, 4, path_a, path_b, path_c, path_d); - return strcmp(joined_path, expected_path) == 0 ? GIT_SUCCESS : GIT_ERROR; -} - -BEGIN_TEST(path6, "properly join path components for more than one path") - must_pass(ensure_joinpath_n("", "", "", "", "")); - must_pass(ensure_joinpath_n("", "a", "", "", "a/")); - must_pass(ensure_joinpath_n("a", "", "", "", "a/")); - must_pass(ensure_joinpath_n("", "", "", "a", "a")); - must_pass(ensure_joinpath_n("a", "b", "", "/c/d/", "a/b/c/d/")); - must_pass(ensure_joinpath_n("a", "b", "", "/c/d", "a/b/c/d")); -END_TEST - -typedef struct name_data { - int count; /* return count */ - char *name; /* filename */ -} name_data; - -typedef struct walk_data { - char *sub; /* sub-directory name */ - name_data *names; /* name state data */ -} walk_data; - - -static char path_buffer[GIT_PATH_MAX]; -static char *top_dir = "dir-walk"; -static walk_data *state_loc; - -static int error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fprintf(stderr, "\n"); - return -1; -} - -static int setup(walk_data *d) -{ - name_data *n; - - if (p_mkdir(top_dir, 0755) < 0) - return error("can't mkdir(\"%s\")", top_dir); - - if (p_chdir(top_dir) < 0) - return error("can't chdir(\"%s\")", top_dir); - - if (strcmp(d->sub, ".") != 0) - if (p_mkdir(d->sub, 0755) < 0) - return error("can't mkdir(\"%s\")", d->sub); - - strcpy(path_buffer, d->sub); - state_loc = d; - - for (n = d->names; n->name; n++) { - git_file fd = p_creat(n->name, 0600); - if (fd < 0) - return GIT_ERROR; - p_close(fd); - n->count = 0; - } - - return 0; -} - -static int knockdown(walk_data *d) -{ - name_data *n; - - for (n = d->names; n->name; n++) { - if (p_unlink(n->name) < 0) - return error("can't unlink(\"%s\")", n->name); - } - - if (strcmp(d->sub, ".") != 0) - if (p_rmdir(d->sub) < 0) - return error("can't rmdir(\"%s\")", d->sub); - - if (p_chdir("..") < 0) - return error("can't chdir(\"..\")"); - - if (p_rmdir(top_dir) < 0) - return error("can't rmdir(\"%s\")", top_dir); - - return 0; -} - -static int check_counts(walk_data *d) -{ - int ret = 0; - name_data *n; - - for (n = d->names; n->name; n++) { - if (n->count != 1) - ret = error("count (%d, %s)", n->count, n->name); - } - return ret; -} - -static int one_entry(void *state, char *path) -{ - walk_data *d = (walk_data *) state; - name_data *n; - - if (state != state_loc) - return GIT_ERROR; - - if (path != path_buffer) - return GIT_ERROR; - - for (n = d->names; n->name; n++) { - if (!strcmp(n->name, path)) { - n->count++; - return 0; - } - } - - return GIT_ERROR; -} - - -static name_data dot_names[] = { - { 0, "./a" }, - { 0, "./asdf" }, - { 0, "./pack-foo.pack" }, - { 0, NULL } -}; -static walk_data dot = { - ".", - dot_names -}; - -BEGIN_TEST(dirent0, "make sure that the '.' folder is not traversed") - - must_pass(setup(&dot)); - - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - one_entry, - &dot)); - - must_pass(check_counts(&dot)); - - must_pass(knockdown(&dot)); -END_TEST - -static name_data sub_names[] = { - { 0, "sub/a" }, - { 0, "sub/asdf" }, - { 0, "sub/pack-foo.pack" }, - { 0, NULL } -}; -static walk_data sub = { - "sub", - sub_names -}; - -BEGIN_TEST(dirent1, "traverse a subfolder") - - must_pass(setup(&sub)); - - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - one_entry, - &sub)); - - must_pass(check_counts(&sub)); - - must_pass(knockdown(&sub)); -END_TEST - -static walk_data sub_slash = { - "sub/", - sub_names -}; - -BEGIN_TEST(dirent2, "traverse a slash-terminated subfolder") - - must_pass(setup(&sub_slash)); - - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - one_entry, - &sub_slash)); - - must_pass(check_counts(&sub_slash)); - - must_pass(knockdown(&sub_slash)); -END_TEST - -static name_data empty_names[] = { - { 0, NULL } -}; -static walk_data empty = { - "empty", - empty_names -}; - -static int dont_call_me(void *GIT_UNUSED(state), char *GIT_UNUSED(path)) -{ - GIT_UNUSED_ARG(state) - GIT_UNUSED_ARG(path) - return GIT_ERROR; -} - -BEGIN_TEST(dirent3, "make sure that empty folders are not traversed") - - must_pass(setup(&empty)); - - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - one_entry, - &empty)); - - must_pass(check_counts(&empty)); - - /* make sure callback not called */ - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - dont_call_me, - &empty)); - - must_pass(knockdown(&empty)); -END_TEST - -static name_data odd_names[] = { - { 0, "odd/.a" }, - { 0, "odd/..c" }, - /* the following don't work on cygwin/win32 */ - /* { 0, "odd/.b." }, */ - /* { 0, "odd/..d.." }, */ - { 0, NULL } -}; -static walk_data odd = { - "odd", - odd_names -}; - -BEGIN_TEST(dirent4, "make sure that strange looking filenames ('..c') are traversed") - - must_pass(setup(&odd)); - - must_pass(git_futils_direach(path_buffer, - sizeof(path_buffer), - one_entry, - &odd)); - - must_pass(check_counts(&odd)); - - must_pass(knockdown(&odd)); -END_TEST - -BEGIN_TEST(filebuf0, "make sure git_filebuf_open doesn't delete an existing lock") - git_filebuf file; - int fd; - char test[] = "test", testlock[] = "test.lock"; - - fd = p_creat(testlock, 0744); - must_pass(fd); - must_pass(p_close(fd)); - must_fail(git_filebuf_open(&file, test, 0)); - must_pass(git_futils_exists(testlock)); - must_pass(p_unlink(testlock)); -END_TEST - -BEGIN_TEST(filebuf1, "make sure GIT_FILEBUF_APPEND works as expected") - git_filebuf file; - int fd; - char test[] = "test"; - - fd = p_creat(test, 0644); - must_pass(fd); - must_pass(p_write(fd, "libgit2 rocks\n", 14)); - must_pass(p_close(fd)); - - must_pass(git_filebuf_open(&file, test, GIT_FILEBUF_APPEND)); - must_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks")); - must_pass(git_filebuf_commit(&file)); - - must_pass(p_unlink(test)); -END_TEST - -BEGIN_TEST(filebuf2, "make sure git_filebuf_write writes large buffer correctly") - git_filebuf file; - char test[] = "test"; - unsigned char buf[4096 * 4]; /* 2 * WRITE_BUFFER_SIZE */ - - memset(buf, 0xfe, sizeof(buf)); - must_pass(git_filebuf_open(&file, test, 0)); - must_pass(git_filebuf_write(&file, buf, sizeof(buf))); - must_pass(git_filebuf_commit(&file)); - - must_pass(p_unlink(test)); -END_TEST - -static char *empty_tmp_dir = "test_gitfo_rmdir_recurs_test"; - -static int setup_empty_tmp_dir() -{ - char path[GIT_PATH_MAX]; - - if (p_mkdir(empty_tmp_dir, 0755)) - return -1; - - git_path_join(path, empty_tmp_dir, "/one"); - if (p_mkdir(path, 0755)) - return -1; - - git_path_join(path, empty_tmp_dir, "/one/two_one"); - if (p_mkdir(path, 0755)) - return -1; - - git_path_join(path, empty_tmp_dir, "/one/two_two"); - if (p_mkdir(path, 0755)) - return -1; - - git_path_join(path, empty_tmp_dir, "/one/two_two/three"); - if (p_mkdir(path, 0755)) - return -1; - - git_path_join(path, empty_tmp_dir, "/two"); - if (p_mkdir(path, 0755)) - return -1; - - return 0; -} - -BEGIN_TEST(rmdir0, "make sure empty dir can be deleted recusively") - must_pass(setup_empty_tmp_dir()); - must_pass(git_futils_rmdir_r(empty_tmp_dir, 0)); -END_TEST - -BEGIN_TEST(rmdir1, "make sure non-empty dir cannot be deleted recusively") - char file[GIT_PATH_MAX]; - int fd; - - must_pass(setup_empty_tmp_dir()); - git_path_join(file, empty_tmp_dir, "/two/file.txt"); - fd = p_creat(file, 0755); - must_pass(fd); - must_pass(p_close(fd)); - must_fail(git_futils_rmdir_r(empty_tmp_dir, 0)); - must_pass(p_unlink(file)); - must_pass(git_futils_rmdir_r(empty_tmp_dir, 0)); -END_TEST - -BEGIN_SUITE(core) - ADD_TEST(string0); - ADD_TEST(string1); - - ADD_TEST(vector0); - ADD_TEST(vector1); - ADD_TEST(vector2); - - ADD_TEST(path0); - ADD_TEST(path1); - ADD_TEST(path2); - ADD_TEST(path5); - ADD_TEST(path6); - - ADD_TEST(dirent0); - ADD_TEST(dirent1); - ADD_TEST(dirent2); - ADD_TEST(dirent3); - ADD_TEST(dirent4); - - ADD_TEST(filebuf0); - ADD_TEST(filebuf1); - ADD_TEST(filebuf2); - - ADD_TEST(rmdir0); - ADD_TEST(rmdir1); -END_SUITE diff --git a/vendor/libgit2/tests/t01-data.h b/vendor/libgit2/tests/t01-data.h deleted file mode 100644 index 268269d69..000000000 --- a/vendor/libgit2/tests/t01-data.h +++ /dev/null @@ -1,322 +0,0 @@ - -/* - * Raw data - */ -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -static unsigned char zero_data[] = { - 0x00 /* dummy data */ -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -/* - * Sha1 IDS - */ -static char *commit_id = "3d7f8a6af076c8c3f20071a8935cdbe8228594d1"; -static char *tree_id = "dff2da90b254e1beb889d1f1f1288be1803782df"; -static char *tag_id = "09d373e1dfdc16b129ceec6dd649739911541e05"; -static char *zero_id = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"; -static char *one_id = "8b137891791fe96927ad78e64b0aad7bded08bdc"; -static char *two_id = "78981922613b2afb6025042ff6bd878ac1994e85"; -static char *some_id = "fd8430bc864cfcd5f10e5590f8a447e01b942bfe"; - -/* - * In memory objects - */ -static git_rawobj tree_obj = { - tree_data, - sizeof(tree_data), - GIT_OBJ_TREE -}; - -static git_rawobj tag_obj = { - tag_data, - sizeof(tag_data), - GIT_OBJ_TAG -}; - -static git_rawobj zero_obj = { - zero_data, - 0, - GIT_OBJ_BLOB -}; - -static git_rawobj one_obj = { - one_data, - sizeof(one_data), - GIT_OBJ_BLOB -}; - -static git_rawobj two_obj = { - two_data, - sizeof(two_data), - GIT_OBJ_BLOB -}; - -static git_rawobj commit_obj = { - commit_data, - sizeof(commit_data), - GIT_OBJ_COMMIT -}; - -static git_rawobj some_obj = { - some_data, - sizeof(some_data), - GIT_OBJ_BLOB -}; - -static git_rawobj junk_obj = { - NULL, - 0, - GIT_OBJ_BAD -}; - - diff --git a/vendor/libgit2/tests/t01-rawobj.c b/vendor/libgit2/tests/t01-rawobj.c deleted file mode 100644 index 255208532..000000000 --- a/vendor/libgit2/tests/t01-rawobj.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" - -#include "odb.h" -#include "hash.h" - -#include "t01-data.h" - -static int hash_object(git_oid *oid, git_rawobj *obj) -{ - return git_odb_hash(oid, obj->data, obj->len, obj->type); -} - -BEGIN_TEST(oid0, "validate size of oid objects") - git_oid out; - must_be_true(20 == GIT_OID_RAWSZ); - must_be_true(40 == GIT_OID_HEXSZ); - must_be_true(sizeof(out) == GIT_OID_RAWSZ); - must_be_true(sizeof(out.id) == GIT_OID_RAWSZ); -END_TEST - -BEGIN_TEST(oid1, "fail when parsing an empty string as oid") - git_oid out; - must_fail(git_oid_fromstr(&out, "")); -END_TEST - -BEGIN_TEST(oid2, "fail when parsing an invalid string as oid") - git_oid out; - must_fail(git_oid_fromstr(&out, "moo")); -END_TEST - -static int from_hex(unsigned int i) -{ - if (i >= '0' && i <= '9') - return i - '0'; - if (i >= 'a' && i <= 'f') - return 10 + (i - 'a'); - if (i >= 'A' && i <= 'F') - return 10 + (i - 'A'); - return -1; -} - -BEGIN_TEST(oid3, "find all invalid characters when parsing an oid") - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - char in[41] = "16a67770b7d8d72317c4b775213c23a8bd74f5e0"; - unsigned int i; - - for (i = 0; i < 256; i++) { - in[38] = (char)i; - - if (from_hex(i) >= 0) { - exp[19] = (unsigned char)(from_hex(i) << 4); - must_pass(git_oid_fromstr(&out, in)); - must_be_true(memcmp(out.id, exp, sizeof(out.id)) == 0); - } else { - must_fail(git_oid_fromstr(&out, in)); - } - } -END_TEST - -BEGIN_TEST(oid4, "fail when parsing an invalid oid string") - git_oid out; - must_fail(git_oid_fromstr(&out, "16a67770b7d8d72317c4b775213c23a8bd74f5ez")); -END_TEST - -BEGIN_TEST(oid5, "succeed when parsing a valid oid string") - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - - must_pass(git_oid_fromstr(&out, "16a67770b7d8d72317c4b775213c23a8bd74f5e0")); - must_pass(memcmp(out.id, exp, sizeof(out.id))); - - must_pass(git_oid_fromstr(&out, "16A67770B7D8D72317C4b775213C23A8BD74F5E0")); - must_pass(memcmp(out.id, exp, sizeof(out.id))); -END_TEST - -BEGIN_TEST(oid6, "build a valid oid from raw bytes") - git_oid out; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - - git_oid_fromraw(&out, exp); - must_pass(memcmp(out.id, exp, sizeof(out.id))); -END_TEST - -BEGIN_TEST(oid7, "properly copy an oid to another") - git_oid a, b; - unsigned char exp[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - - memset(&b, 0, sizeof(b)); - git_oid_fromraw(&a, exp); - git_oid_cpy(&b, &a); - must_pass(memcmp(a.id, exp, sizeof(a.id))); -END_TEST - -BEGIN_TEST(oid8, "compare two oids (lesser than)") - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - unsigned char b_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xf0, - }; - - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, b_in); - must_be_true(git_oid_cmp(&a, &b) < 0); -END_TEST - -BEGIN_TEST(oid9, "compare two oids (equal)") - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, a_in); - must_be_true(git_oid_cmp(&a, &b) == 0); -END_TEST - -BEGIN_TEST(oid10, "compare two oids (greater than)") - git_oid a, b; - unsigned char a_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xe0, - }; - unsigned char b_in[] = { - 0x16, 0xa6, 0x77, 0x70, 0xb7, - 0xd8, 0xd7, 0x23, 0x17, 0xc4, - 0xb7, 0x75, 0x21, 0x3c, 0x23, - 0xa8, 0xbd, 0x74, 0xf5, 0xd0, - }; - - git_oid_fromraw(&a, a_in); - git_oid_fromraw(&b, b_in); - must_be_true(git_oid_cmp(&a, &b) > 0); -END_TEST - -BEGIN_TEST(oid11, "compare formated oids") - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 1]; - - must_pass(git_oid_fromstr(&in, exp)); - - /* Format doesn't touch the last byte */ - out[GIT_OID_HEXSZ] = 'Z'; - git_oid_fmt(out, &in); - must_be_true(out[GIT_OID_HEXSZ] == 'Z'); - - /* Format produced the right result */ - out[GIT_OID_HEXSZ] = '\0'; - must_be_true(strcmp(exp, out) == 0); -END_TEST - -BEGIN_TEST(oid12, "compare oids (allocate + format)") - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char *out; - - must_pass(git_oid_fromstr(&in, exp)); - - out = git_oid_allocfmt(&in); - must_be_true(out); - must_be_true(strcmp(exp, out) == 0); - free(out); -END_TEST - -BEGIN_TEST(oid13, "compare oids (path format)") - const char *exp1 = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - const char *exp2 = "16/a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 2]; - - must_pass(git_oid_fromstr(&in, exp1)); - - /* Format doesn't touch the last byte */ - out[GIT_OID_HEXSZ + 1] = 'Z'; - git_oid_pathfmt(out, &in); - must_be_true(out[GIT_OID_HEXSZ + 1] == 'Z'); - - /* Format produced the right result */ - out[GIT_OID_HEXSZ + 1] = '\0'; - must_be_true(strcmp(exp2, out) == 0); -END_TEST - -BEGIN_TEST(oid14, "convert raw oid to string") - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char out[GIT_OID_HEXSZ + 1]; - char *str; - int i; - - must_pass(git_oid_fromstr(&in, exp)); - - /* NULL buffer pointer, returns static empty string */ - str = git_oid_to_string(NULL, sizeof(out), &in); - must_be_true(str && *str == '\0' && str != out); - - /* zero buffer size, returns static empty string */ - str = git_oid_to_string(out, 0, &in); - must_be_true(str && *str == '\0' && str != out); - - /* NULL oid pointer, returns static empty string */ - str = git_oid_to_string(out, sizeof(out), NULL); - must_be_true(str && *str == '\0' && str != out); - - /* n == 1, returns out as an empty string */ - str = git_oid_to_string(out, 1, &in); - must_be_true(str && *str == '\0' && str == out); - - for (i = 1; i < GIT_OID_HEXSZ; i++) { - out[i+1] = 'Z'; - str = git_oid_to_string(out, i+1, &in); - /* returns out containing c-string */ - must_be_true(str && str == out); - /* must be '\0' terminated */ - must_be_true(*(str+i) == '\0'); - /* must not touch bytes past end of string */ - must_be_true(*(str+(i+1)) == 'Z'); - /* i == n-1 charaters of string */ - must_pass(strncmp(exp, out, i)); - } - - /* returns out as hex formatted c-string */ - str = git_oid_to_string(out, sizeof(out), &in); - must_be_true(str && str == out && *(str+GIT_OID_HEXSZ) == '\0'); - must_be_true(strcmp(exp, out) == 0); -END_TEST - -BEGIN_TEST(oid15, "convert raw oid to string (big)") - const char *exp = "16a0123456789abcdef4b775213c23a8bd74f5e0"; - git_oid in; - char big[GIT_OID_HEXSZ + 1 + 3]; /* note + 4 => big buffer */ - char *str; - - must_pass(git_oid_fromstr(&in, exp)); - - /* place some tail material */ - big[GIT_OID_HEXSZ+0] = 'W'; /* should be '\0' afterwards */ - big[GIT_OID_HEXSZ+1] = 'X'; /* should remain untouched */ - big[GIT_OID_HEXSZ+2] = 'Y'; /* ditto */ - big[GIT_OID_HEXSZ+3] = 'Z'; /* ditto */ - - /* returns big as hex formatted c-string */ - str = git_oid_to_string(big, sizeof(big), &in); - must_be_true(str && str == big && *(str+GIT_OID_HEXSZ) == '\0'); - must_be_true(strcmp(exp, big) == 0); - - /* check tail material is untouched */ - must_be_true(str && str == big && *(str+GIT_OID_HEXSZ+1) == 'X'); - must_be_true(str && str == big && *(str+GIT_OID_HEXSZ+2) == 'Y'); - must_be_true(str && str == big && *(str+GIT_OID_HEXSZ+3) == 'Z'); -END_TEST - - -BEGIN_TEST(oid16, "make sure the OID shortener doesn't choke on duplicate sha1s") - - git_oid_shorten *os; - int min_len; - - os = git_oid_shorten_new(0); - must_be_true(os != NULL); - - git_oid_shorten_add(os, "22596363b3de40b06f981fb85d82312e8c0ed511"); - git_oid_shorten_add(os, "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"); - git_oid_shorten_add(os, "16a0123456789abcdef4b775213c23a8bd74f5e0"); - min_len = git_oid_shorten_add(os, "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"); - - must_be_true(min_len == GIT_OID_HEXSZ + 1); - - git_oid_shorten_free(os); -END_TEST - -BEGIN_TEST(oid17, "stress test for the git_oid_shorten object") - -#define MAX_OIDS 1000 - - git_oid_shorten *os; - char *oids[MAX_OIDS]; - char number_buffer[16]; - git_oid oid; - size_t i, j; - - int min_len = 0, found_collision; - - os = git_oid_shorten_new(0); - must_be_true(os != NULL); - - /* - * Insert in the shortener 1000 unique SHA1 ids - */ - for (i = 0; i < MAX_OIDS; ++i) { - char *oid_text; - - sprintf(number_buffer, "%u", (unsigned int)i); - git_hash_buf(&oid, number_buffer, strlen(number_buffer)); - - oid_text = git__malloc(GIT_OID_HEXSZ + 1); - git_oid_fmt(oid_text, &oid); - oid_text[GIT_OID_HEXSZ] = 0; - - min_len = git_oid_shorten_add(os, oid_text); - must_be_true(min_len >= 0); - - oids[i] = oid_text; - } - - /* - * Compare the first `min_char - 1` characters of each - * SHA1 OID. If the minimizer worked, we should find at - * least one collision - */ - found_collision = 0; - for (i = 0; i < MAX_OIDS; ++i) { - for (j = 0; j < MAX_OIDS; ++j) { - if (i != j && memcmp(oids[i], oids[j], min_len - 1) == 0) - found_collision = 1; - } - } - must_be_true(found_collision == 1); - - /* - * Compare the first `min_char` characters of each - * SHA1 OID. If the minimizer worked, every single preffix - * should be unique. - */ - found_collision = 0; - for (i = 0; i < MAX_OIDS; ++i) { - for (j = 0; j < MAX_OIDS; ++j) { - if (i != j && memcmp(oids[i], oids[j], min_len) == 0) - found_collision = 1; - } - } - must_be_true(found_collision == 0); - - /* cleanup */ - for (i = 0; i < MAX_OIDS; ++i) - free(oids[i]); - - git_oid_shorten_free(os); - -#undef MAX_OIDS -END_TEST - -static char *hello_id = "22596363b3de40b06f981fb85d82312e8c0ed511"; -static char *hello_text = "hello world\n"; - -static char *bye_id = "ce08fe4884650f067bd5703b6a59a8b3b3c99a09"; -static char *bye_text = "bye world\n"; - -BEGIN_TEST(hash0, "normal hash by blocks") - git_hash_ctx *ctx; - git_oid id1, id2; - - must_be_true((ctx = git_hash_new_ctx()) != NULL); - - /* should already be init'd */ - git_hash_update(ctx, hello_text, strlen(hello_text)); - git_hash_final(&id2, ctx); - must_pass(git_oid_fromstr(&id1, hello_id)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - - /* reinit should permit reuse */ - git_hash_init(ctx); - git_hash_update(ctx, bye_text, strlen(bye_text)); - git_hash_final(&id2, ctx); - must_pass(git_oid_fromstr(&id1, bye_id)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - - git_hash_free_ctx(ctx); -END_TEST - -BEGIN_TEST(hash1, "hash whole buffer in a single call") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, hello_id)); - - git_hash_buf(&id2, hello_text, strlen(hello_text)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(hash2, "hash a vector") - git_oid id1, id2; - git_buf_vec vec[2]; - - must_pass(git_oid_fromstr(&id1, hello_id)); - - vec[0].data = hello_text; - vec[0].len = 4; - vec[1].data = hello_text+4; - vec[1].len = strlen(hello_text)-4; - - git_hash_vec(&id2, vec, 2); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objtype0, "convert type to string") - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_BAD), "")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ__EXT1), "")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_COMMIT), "commit")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_TREE), "tree")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_BLOB), "blob")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_TAG), "tag")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ__EXT2), "")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_OFS_DELTA), "OFS_DELTA")); - must_be_true(!strcmp(git_object_type2string(GIT_OBJ_REF_DELTA), "REF_DELTA")); - - must_be_true(!strcmp(git_object_type2string(-2), "")); - must_be_true(!strcmp(git_object_type2string(8), "")); - must_be_true(!strcmp(git_object_type2string(1234), "")); -END_TEST - -BEGIN_TEST(objtype1, "convert string to type") - must_be_true(git_object_string2type(NULL) == GIT_OBJ_BAD); - must_be_true(git_object_string2type("") == GIT_OBJ_BAD); - must_be_true(git_object_string2type("commit") == GIT_OBJ_COMMIT); - must_be_true(git_object_string2type("tree") == GIT_OBJ_TREE); - must_be_true(git_object_string2type("blob") == GIT_OBJ_BLOB); - must_be_true(git_object_string2type("tag") == GIT_OBJ_TAG); - must_be_true(git_object_string2type("OFS_DELTA") == GIT_OBJ_OFS_DELTA); - must_be_true(git_object_string2type("REF_DELTA") == GIT_OBJ_REF_DELTA); - - must_be_true(git_object_string2type("CoMmIt") == GIT_OBJ_BAD); - must_be_true(git_object_string2type("hohoho") == GIT_OBJ_BAD); -END_TEST - -BEGIN_TEST(objtype2, "check if an object type is loose") - must_be_true(git_object_typeisloose(GIT_OBJ_BAD) == 0); - must_be_true(git_object_typeisloose(GIT_OBJ__EXT1) == 0); - must_be_true(git_object_typeisloose(GIT_OBJ_COMMIT) == 1); - must_be_true(git_object_typeisloose(GIT_OBJ_TREE) == 1); - must_be_true(git_object_typeisloose(GIT_OBJ_BLOB) == 1); - must_be_true(git_object_typeisloose(GIT_OBJ_TAG) == 1); - must_be_true(git_object_typeisloose(GIT_OBJ__EXT2) == 0); - must_be_true(git_object_typeisloose(GIT_OBJ_OFS_DELTA) == 0); - must_be_true(git_object_typeisloose(GIT_OBJ_REF_DELTA) == 0); - - must_be_true(git_object_typeisloose(-2) == 0); - must_be_true(git_object_typeisloose(8) == 0); - must_be_true(git_object_typeisloose(1234) == 0); -END_TEST - -BEGIN_TEST(objhash0, "hash junk data") - git_oid id, id_zero; - - must_pass(git_oid_fromstr(&id_zero, zero_id)); - - /* invalid types: */ - junk_obj.data = some_data; - must_fail(hash_object(&id, &junk_obj)); - - junk_obj.type = GIT_OBJ__EXT1; - must_fail(hash_object(&id, &junk_obj)); - - junk_obj.type = GIT_OBJ__EXT2; - must_fail(hash_object(&id, &junk_obj)); - - junk_obj.type = GIT_OBJ_OFS_DELTA; - must_fail(hash_object(&id, &junk_obj)); - - junk_obj.type = GIT_OBJ_REF_DELTA; - must_fail(hash_object(&id, &junk_obj)); - - /* data can be NULL only if len is zero: */ - junk_obj.type = GIT_OBJ_BLOB; - junk_obj.data = NULL; - must_pass(hash_object(&id, &junk_obj)); - must_be_true(git_oid_cmp(&id, &id_zero) == 0); - - junk_obj.len = 1; - must_fail(hash_object(&id, &junk_obj)); -END_TEST - -BEGIN_TEST(objhash1, "hash a commit object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, commit_id)); - - must_pass(hash_object(&id2, &commit_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash2, "hash a tree object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, tree_id)); - - must_pass(hash_object(&id2, &tree_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash3, "hash a tag object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, tag_id)); - - must_pass(hash_object(&id2, &tag_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash4, "hash a zero-length object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, zero_id)); - - must_pass(hash_object(&id2, &zero_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash5, "hash an one-byte long object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, one_id)); - - must_pass(hash_object(&id2, &one_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash6, "hash a two-byte long object") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, two_id)); - - must_pass(hash_object(&id2, &two_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_TEST(objhash7, "hash an object several bytes long") - git_oid id1, id2; - - must_pass(git_oid_fromstr(&id1, some_id)); - - must_pass(hash_object(&id2, &some_obj)); - - must_be_true(git_oid_cmp(&id1, &id2) == 0); -END_TEST - -BEGIN_SUITE(rawobjects) - ADD_TEST(oid0); - ADD_TEST(oid1); - ADD_TEST(oid2); - ADD_TEST(oid3); - ADD_TEST(oid4); - ADD_TEST(oid5); - ADD_TEST(oid6); - ADD_TEST(oid7); - ADD_TEST(oid8); - ADD_TEST(oid9); - ADD_TEST(oid10); - ADD_TEST(oid11); - ADD_TEST(oid12); - ADD_TEST(oid13); - ADD_TEST(oid14); - ADD_TEST(oid15); - ADD_TEST(oid16); - ADD_TEST(oid17); - - ADD_TEST(hash0); - ADD_TEST(hash1); - ADD_TEST(hash2); - - ADD_TEST(objtype0); - ADD_TEST(objtype1); - ADD_TEST(objtype2); - - ADD_TEST(objhash0); - ADD_TEST(objhash1); - ADD_TEST(objhash2); - ADD_TEST(objhash3); - ADD_TEST(objhash4); - ADD_TEST(objhash5); - ADD_TEST(objhash6); - ADD_TEST(objhash7); -END_SUITE - diff --git a/vendor/libgit2/tests/t02-data.h b/vendor/libgit2/tests/t02-data.h deleted file mode 100644 index 705a2d7af..000000000 --- a/vendor/libgit2/tests/t02-data.h +++ /dev/null @@ -1,515 +0,0 @@ - -static char *odb_dir = "test-objects"; - -/* one == 8b137891791fe96927ad78e64b0aad7bded08bdc */ -static unsigned char one_bytes[] = { - 0x31, 0x78, 0x9c, 0xe3, 0x02, 0x00, 0x00, 0x0b, - 0x00, 0x0b, -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static object_data one = { - one_bytes, - sizeof(one_bytes), - "8b137891791fe96927ad78e64b0aad7bded08bdc", - "blob", - "test-objects/8b", - "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc", - one_data, - sizeof(one_data), -}; - - -/* commit == 3d7f8a6af076c8c3f20071a8935cdbe8228594d1 */ -static unsigned char commit_bytes[] = { - 0x78, 0x01, 0x85, 0x50, 0xc1, 0x6a, 0xc3, 0x30, - 0x0c, 0xdd, 0xd9, 0x5f, 0xa1, 0xfb, 0x96, 0x12, - 0xbb, 0x29, 0x71, 0x46, 0x19, 0x2b, 0x3d, 0x97, - 0x1d, 0xd6, 0x7d, 0x80, 0x1d, 0xcb, 0x89, 0x21, - 0xb6, 0x82, 0xed, 0x40, 0xf3, 0xf7, 0xf3, 0x48, - 0x29, 0x3b, 0x6d, 0xd2, 0xe5, 0xbd, 0x27, 0xbd, - 0x27, 0x50, 0x4f, 0xde, 0xbb, 0x0c, 0xfb, 0x43, - 0xf3, 0x94, 0x23, 0x22, 0x18, 0x6b, 0x85, 0x51, - 0x5d, 0xad, 0xc5, 0xa1, 0x41, 0xae, 0x51, 0x4b, - 0xd9, 0x19, 0x6e, 0x4b, 0x0b, 0x29, 0x35, 0x72, - 0x59, 0xef, 0x5b, 0x29, 0x8c, 0x65, 0x6a, 0xc9, - 0x23, 0x45, 0x38, 0xc1, 0x17, 0x5c, 0x7f, 0xc0, - 0x71, 0x13, 0xde, 0xf1, 0xa6, 0xfc, 0x3c, 0xe1, - 0xae, 0x27, 0xff, 0x06, 0x5c, 0x88, 0x56, 0xf2, - 0x46, 0x74, 0x2d, 0x3c, 0xd7, 0xa5, 0x58, 0x51, - 0xcb, 0xb9, 0x8c, 0x11, 0xce, 0xf0, 0x01, 0x97, - 0x0d, 0x1e, 0x1f, 0xea, 0x3f, 0x6e, 0x76, 0x02, - 0x0a, 0x58, 0x4d, 0x2e, 0x20, 0x6c, 0x1e, 0x48, - 0x8b, 0xf7, 0x2a, 0xae, 0x8c, 0x5d, 0x47, 0x04, - 0x4d, 0x66, 0x05, 0xb2, 0x90, 0x0b, 0xbe, 0xcf, - 0x3d, 0xa6, 0xa4, 0x06, 0x7c, 0x29, 0x3c, 0x64, - 0xe5, 0x82, 0x0b, 0x03, 0xd8, 0x25, 0x96, 0x8d, - 0x08, 0x78, 0x9b, 0x27, 0x15, 0x54, 0x76, 0x14, - 0xd8, 0xdd, 0x35, 0x2f, 0x71, 0xa6, 0x84, 0x8f, - 0x90, 0x51, 0x85, 0x01, 0x13, 0xb8, 0x90, 0x23, - 0x99, 0xa5, 0x47, 0x03, 0x7a, 0xfd, 0x15, 0xbf, - 0x63, 0xec, 0xd3, 0x0d, 0x01, 0x4d, 0x45, 0xb6, - 0xd2, 0xeb, 0xeb, 0xdf, 0xef, 0x60, 0xdf, 0xef, - 0x1f, 0x78, 0x35, -}; - -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - -static object_data commit = { - commit_bytes, - sizeof(commit_bytes), - "3d7f8a6af076c8c3f20071a8935cdbe8228594d1", - "commit", - "test-objects/3d", - "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1", - commit_data, - sizeof(commit_data), -}; - -/* tree == dff2da90b254e1beb889d1f1f1288be1803782df */ -static unsigned char tree_bytes[] = { - 0x78, 0x01, 0x2b, 0x29, 0x4a, 0x4d, 0x55, 0x30, - 0x34, 0x32, 0x63, 0x30, 0x34, 0x30, 0x30, 0x33, - 0x31, 0x51, 0xc8, 0xcf, 0x4b, 0x65, 0xe8, 0x16, - 0xae, 0x98, 0x58, 0x29, 0xff, 0x32, 0x53, 0x7d, - 0x6d, 0xc5, 0x33, 0x6f, 0xae, 0xb5, 0xd5, 0xf7, - 0x2e, 0x74, 0xdf, 0x81, 0x4a, 0x17, 0xe7, 0xe7, - 0xa6, 0x32, 0xfc, 0x6d, 0x31, 0xd8, 0xd3, 0xe6, - 0xf3, 0xe7, 0xea, 0x47, 0xbe, 0xd0, 0x09, 0x3f, - 0x96, 0xb8, 0x3f, 0x90, 0x9e, 0xa2, 0xfd, 0x0f, - 0x2a, 0x5f, 0x52, 0x9e, 0xcf, 0x50, 0x31, 0x43, - 0x52, 0x29, 0xd1, 0x5a, 0xeb, 0x77, 0x82, 0x2a, - 0x8b, 0xfe, 0xb7, 0xbd, 0xed, 0x5d, 0x07, 0x67, - 0xfa, 0xb5, 0x42, 0xa5, 0xab, 0x52, 0x8b, 0xf2, - 0x19, 0x9e, 0xcd, 0x7d, 0x34, 0x7b, 0xd3, 0xc5, - 0x6b, 0xce, 0xde, 0xdd, 0x9a, 0xeb, 0xca, 0xa3, - 0x6e, 0x1c, 0x7a, 0xd2, 0x13, 0x3c, 0x11, 0x00, - 0xe2, 0xaa, 0x38, 0x57, -}; - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static object_data tree = { - tree_bytes, - sizeof(tree_bytes), - "dff2da90b254e1beb889d1f1f1288be1803782df", - "tree", - "test-objects/df", - "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df", - tree_data, - sizeof(tree_data), -}; - -/* tag == 09d373e1dfdc16b129ceec6dd649739911541e05 */ -static unsigned char tag_bytes[] = { - 0x78, 0x01, 0x35, 0x4e, 0xcb, 0x0a, 0xc2, 0x40, - 0x10, 0xf3, 0xbc, 0x5f, 0x31, 0x77, 0xa1, 0xec, - 0xa3, 0xed, 0x6e, 0x41, 0x44, 0xf0, 0x2c, 0x5e, - 0xfc, 0x81, 0xe9, 0x76, 0xb6, 0xad, 0xb4, 0xb4, - 0x6c, 0x07, 0xd1, 0xbf, 0x77, 0x44, 0x0d, 0x39, - 0x84, 0x10, 0x92, 0x30, 0xf6, 0x60, 0xbc, 0xdb, - 0x2d, 0xed, 0x9d, 0x22, 0x83, 0xeb, 0x7c, 0x0a, - 0x58, 0x63, 0xd2, 0xbe, 0x8e, 0x21, 0xba, 0x64, - 0xb5, 0xf6, 0x06, 0x43, 0xe3, 0xaa, 0xd8, 0xb5, - 0x14, 0xac, 0x0d, 0x55, 0x53, 0x76, 0x46, 0xf1, - 0x6b, 0x25, 0x88, 0xcb, 0x3c, 0x8f, 0xac, 0x58, - 0x3a, 0x1e, 0xba, 0xd0, 0x85, 0xd8, 0xd8, 0xf7, - 0x94, 0xe1, 0x0c, 0x57, 0xb8, 0x8c, 0xcc, 0x22, - 0x0f, 0xdf, 0x90, 0xc8, 0x13, 0x3d, 0x71, 0x5e, - 0x27, 0x2a, 0xc4, 0x39, 0x82, 0xb1, 0xd6, 0x07, - 0x53, 0xda, 0xc6, 0xc3, 0x5e, 0x0b, 0x94, 0xba, - 0x0d, 0xe3, 0x06, 0x42, 0x1e, 0x08, 0x3e, 0x95, - 0xbf, 0x4b, 0x69, 0xc9, 0x90, 0x69, 0x22, 0xdc, - 0xe8, 0xbf, 0xf2, 0x06, 0x42, 0x9a, 0x36, 0xb1, -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -static object_data tag = { - tag_bytes, - sizeof(tag_bytes), - "09d373e1dfdc16b129ceec6dd649739911541e05", - "tag", - "test-objects/09", - "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05", - tag_data, - sizeof(tag_data), -}; - -/* zero == e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 */ -static unsigned char zero_bytes[] = { - 0x78, 0x01, 0x4b, 0xca, 0xc9, 0x4f, 0x52, 0x30, - 0x60, 0x00, 0x00, 0x09, 0xb0, 0x01, 0xf0, -}; - -static unsigned char zero_data[] = { - 0x00 /* dummy data */ -}; - -static object_data zero = { - zero_bytes, - sizeof(zero_bytes), - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "blob", - "test-objects/e6", - "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", - zero_data, - 0, -}; - -/* two == 78981922613b2afb6025042ff6bd878ac1994e85 */ -static unsigned char two_bytes[] = { - 0x78, 0x01, 0x4b, 0xca, 0xc9, 0x4f, 0x52, 0x30, - 0x62, 0x48, 0xe4, 0x02, 0x00, 0x0e, 0x64, 0x02, - 0x5d, -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static object_data two = { - two_bytes, - sizeof(two_bytes), - "78981922613b2afb6025042ff6bd878ac1994e85", - "blob", - "test-objects/78", - "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85", - two_data, - sizeof(two_data), -}; - -/* some == fd8430bc864cfcd5f10e5590f8a447e01b942bfe */ -static unsigned char some_bytes[] = { - 0x78, 0x01, 0x7d, 0x54, 0xc1, 0x4e, 0xe3, 0x30, - 0x10, 0xdd, 0x33, 0x5f, 0x31, 0xc7, 0x5d, 0x94, - 0xa5, 0x84, 0xd5, 0x22, 0xad, 0x7a, 0x0a, 0x15, - 0x85, 0x48, 0xd0, 0x56, 0x49, 0x2a, 0xd4, 0xa3, - 0x13, 0x4f, 0x88, 0x85, 0x63, 0x47, 0xb6, 0x43, - 0xc9, 0xdf, 0xef, 0x8c, 0x69, 0x17, 0x56, 0x0b, - 0x7b, 0xaa, 0x62, 0x7b, 0xde, 0xbc, 0xf7, 0xe6, - 0x4d, 0x6b, 0x6d, 0x6b, 0x48, 0xd3, 0xcb, 0x5f, - 0x5f, 0x66, 0xa7, 0x27, 0x70, 0x0a, 0x55, 0xa7, - 0x3c, 0xb4, 0x4a, 0x23, 0xf0, 0xaf, 0x43, 0x04, - 0x6f, 0xdb, 0xb0, 0x17, 0x0e, 0xe7, 0x30, 0xd9, - 0x11, 0x1a, 0x61, 0xc0, 0xa1, 0x54, 0x3e, 0x38, - 0x55, 0x8f, 0x81, 0x9e, 0x05, 0x10, 0x46, 0xce, - 0xac, 0x83, 0xde, 0x4a, 0xd5, 0x4e, 0x0c, 0x42, - 0x67, 0xa3, 0x91, 0xe8, 0x20, 0x74, 0x08, 0x01, - 0x5d, 0xef, 0xc1, 0xb6, 0xf1, 0xe3, 0x66, 0xb5, - 0x85, 0x1b, 0x34, 0xe8, 0x84, 0x86, 0xcd, 0x58, - 0x6b, 0xd5, 0xc0, 0x9d, 0x6a, 0xd0, 0x78, 0x4c, - 0xe0, 0x19, 0x9d, 0x57, 0xd6, 0xc0, 0x45, 0xc2, - 0x18, 0xc2, 0xc3, 0xc0, 0x0f, 0x7c, 0x87, 0x12, - 0xea, 0x29, 0x56, 0x2f, 0x99, 0x4f, 0x79, 0xe0, - 0x03, 0x4b, 0x4b, 0x4d, 0x44, 0xa0, 0x92, 0x33, - 0x2a, 0xe0, 0x9a, 0xdc, 0x80, 0x90, 0x52, 0xf1, - 0x11, 0x04, 0x1b, 0x4b, 0x06, 0xea, 0xae, 0x3c, - 0xe3, 0x7a, 0x50, 0x74, 0x4a, 0x84, 0xfe, 0xc3, - 0x81, 0x41, 0xf8, 0x89, 0x18, 0x43, 0x67, 0x9d, - 0x87, 0x47, 0xf5, 0x8c, 0x51, 0xf6, 0x68, 0xb4, - 0xea, 0x55, 0x20, 0x2a, 0x6f, 0x80, 0xdc, 0x42, - 0x2b, 0xf3, 0x14, 0x2b, 0x1a, 0xdb, 0x0f, 0xe4, - 0x9a, 0x64, 0x84, 0xa3, 0x90, 0xa8, 0xf9, 0x8f, - 0x9d, 0x86, 0x9e, 0xd3, 0xab, 0x5a, 0x99, 0xc8, - 0xd9, 0xc3, 0x5e, 0x85, 0x0e, 0x2c, 0xb5, 0x73, - 0x30, 0x38, 0xfb, 0xe8, 0x44, 0xef, 0x5f, 0x95, - 0x1b, 0xc9, 0xd0, 0xef, 0x3c, 0x26, 0x32, 0x1e, - 0xff, 0x2d, 0xb6, 0x23, 0x7b, 0x3f, 0xd1, 0x3c, - 0x78, 0x1a, 0x0d, 0xcb, 0xe6, 0xf6, 0xd4, 0x44, - 0x99, 0x47, 0x1a, 0x9e, 0xed, 0x23, 0xb5, 0x91, - 0x6a, 0xdf, 0x53, 0x39, 0x03, 0xf8, 0x5a, 0xb1, - 0x0f, 0x1f, 0xce, 0x81, 0x11, 0xde, 0x01, 0x7a, - 0x90, 0x16, 0xc4, 0x30, 0xe8, 0x89, 0xed, 0x7b, - 0x65, 0x4b, 0xd7, 0x03, 0x36, 0xc1, 0xcf, 0xa1, - 0xa5, 0xb1, 0xe3, 0x8b, 0xe8, 0x07, 0x4d, 0xf3, - 0x23, 0x25, 0x13, 0x35, 0x27, 0xf5, 0x8c, 0x11, - 0xd3, 0xa0, 0x9a, 0xa8, 0xf5, 0x38, 0x7d, 0xce, - 0x55, 0xc2, 0x71, 0x79, 0x13, 0xc7, 0xa3, 0xda, - 0x77, 0x68, 0xc0, 0xd8, 0x10, 0xdd, 0x24, 0x8b, - 0x15, 0x59, 0xc5, 0x10, 0xe2, 0x20, 0x99, 0x8e, - 0xf0, 0x05, 0x9b, 0x31, 0x88, 0x5a, 0xe3, 0xd9, - 0x37, 0xba, 0xe2, 0xdb, 0xbf, 0x92, 0xfa, 0x66, - 0x16, 0x97, 0x47, 0xd9, 0x9d, 0x1d, 0x28, 0x7c, - 0x9d, 0x08, 0x1c, 0xc7, 0xbd, 0xd2, 0x1a, 0x6a, - 0x04, 0xf2, 0xa2, 0x1d, 0x75, 0x02, 0x14, 0x5d, - 0xc6, 0x78, 0xc8, 0xab, 0xdb, 0xf5, 0xb6, 0x82, - 0x6c, 0xb5, 0x83, 0x87, 0xac, 0x28, 0xb2, 0x55, - 0xb5, 0x9b, 0xc7, 0xc1, 0xb0, 0xb7, 0xf8, 0x4c, - 0xbc, 0x38, 0x0e, 0x8a, 0x04, 0x2a, 0x62, 0x41, - 0x6b, 0xe0, 0x84, 0x09, 0x13, 0xe9, 0xe1, 0xea, - 0xfb, 0xeb, 0x62, 0x71, 0x4b, 0x25, 0xd9, 0x55, - 0x7e, 0x97, 0x57, 0x3b, 0x20, 0x33, 0x96, 0x79, - 0xb5, 0xba, 0x2e, 0x4b, 0x58, 0xae, 0x0b, 0xc8, - 0x60, 0x93, 0x15, 0x55, 0xbe, 0xd8, 0xde, 0x65, - 0x05, 0x6c, 0xb6, 0xc5, 0x66, 0x5d, 0x5e, 0x93, - 0xf7, 0x25, 0x65, 0x98, 0x41, 0x29, 0x86, 0x0c, - 0xf2, 0xf1, 0x14, 0xa2, 0xb3, 0xbd, 0x75, 0x08, - 0x12, 0x83, 0x50, 0xda, 0x1f, 0x23, 0xbe, 0xa3, - 0x1d, 0xf4, 0x9d, 0x1d, 0xb5, 0x84, 0x4e, 0x50, - 0x38, 0x1d, 0x36, 0x48, 0x21, 0x95, 0xd1, 0xac, - 0x81, 0x99, 0x1d, 0xc1, 0x3f, 0x41, 0xe6, 0x9e, - 0x42, 0x5b, 0x0a, 0x48, 0xcc, 0x5f, 0xe0, 0x7d, - 0x3f, 0xc4, 0x6f, 0x0e, 0xfe, 0xc0, 0x2d, 0xfe, - 0x01, 0x2c, 0xd6, 0x9b, 0x5d, 0xbe, 0xba, 0x21, - 0xca, 0x79, 0xcb, 0xe3, 0x49, 0x60, 0xef, 0x68, - 0x05, 0x28, 0x9b, 0x8c, 0xc1, 0x12, 0x3e, 0xdb, - 0xc7, 0x04, 0x7e, 0xa6, 0x74, 0x29, 0xcc, 0x13, - 0xed, 0x07, 0x94, 0x81, 0xd6, 0x96, 0xaa, 0x97, - 0xaa, 0xa5, 0xc0, 0x2f, 0xb5, 0xb5, 0x2e, 0xe6, - 0xfc, 0xca, 0xfa, 0x60, 0x4d, 0x02, 0xf7, 0x19, - 0x9c, 0x5f, 0xa4, 0xe9, 0xf9, 0xf7, 0xf4, 0xc7, - 0x79, 0x9a, 0xc0, 0xb6, 0xcc, 0x58, 0xec, 0xec, - 0xe4, 0x37, 0x22, 0xfa, 0x8b, 0x53, -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -static object_data some = { - some_bytes, - sizeof(some_bytes), - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "blob", - "test-objects/fd", - "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe", - some_data, - sizeof(some_data), -}; - diff --git a/vendor/libgit2/tests/t02-objread.c b/vendor/libgit2/tests/t02-objread.c deleted file mode 100644 index 4bcff2742..000000000 --- a/vendor/libgit2/tests/t02-objread.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" -#include "odb.h" - -#include "t02-data.h" -#include "t02-oids.h" - - -BEGIN_TEST(existsloose0, "check if a loose object exists on the odb") - git_odb *db; - git_oid id, id2; - - must_pass(write_object_files(odb_dir, &one)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, one.id)); - - must_be_true(git_odb_exists(db, &id)); - - /* Test for a non-existant object */ - must_pass(git_oid_fromstr(&id2, "8b137891791fe96927ad78e64b0aad7bded08baa")); - must_be_true(0 == git_odb_exists(db, &id2)); - - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &one)); -END_TEST - -BEGIN_TEST(readloose0, "read a loose commit") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &commit)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, commit.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects((git_rawobj *)&obj->raw, &commit)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &commit)); -END_TEST - -BEGIN_TEST(readloose1, "read a loose tree") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &tree)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, tree.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects((git_rawobj *)&obj->raw, &tree)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &tree)); -END_TEST - -BEGIN_TEST(readloose2, "read a loose tag") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &tag)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, tag.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects((git_rawobj *)&obj->raw, &tag)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &tag)); -END_TEST - -BEGIN_TEST(readloose3, "read a loose zero-bytes object") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &zero)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, zero.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects((git_rawobj *)&obj->raw, &zero)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &zero)); -END_TEST - -BEGIN_TEST(readloose4, "read a one-byte long loose object") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &one)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, one.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects(&obj->raw, &one)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &one)); -END_TEST - -BEGIN_TEST(readloose5, "read a two-bytes long loose object") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &two)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, two.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects(&obj->raw, &two)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &two)); -END_TEST - -BEGIN_TEST(readloose6, "read a loose object which is several bytes long") - git_odb *db; - git_oid id; - git_odb_object *obj; - - must_pass(write_object_files(odb_dir, &some)); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id, some.id)); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(cmp_objects(&obj->raw, &some)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(odb_dir, &some)); -END_TEST - -BEGIN_TEST(readpack0, "read several packed objects") - unsigned int i; - git_odb *db; - - must_pass(git_odb_open(&db, ODB_FOLDER)); - - for (i = 0; i < ARRAY_SIZE(packed_objects); ++i) { - git_oid id; - git_odb_object *obj; - - must_pass(git_oid_fromstr(&id, packed_objects[i])); - must_be_true(git_odb_exists(db, &id) == 1); - must_pass(git_odb_read(&obj, db, &id)); - - git_odb_object_close(obj); - } - - git_odb_close(db); -END_TEST - -BEGIN_TEST(readheader0, "read only the header of several packed objects") - unsigned int i; - git_odb *db; - - must_pass(git_odb_open(&db, ODB_FOLDER)); - - for (i = 0; i < ARRAY_SIZE(packed_objects); ++i) { - git_oid id; - git_odb_object *obj; - size_t len; - git_otype type; - - must_pass(git_oid_fromstr(&id, packed_objects[i])); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(git_odb_read_header(&len, &type, db, &id)); - - must_be_true(obj->raw.len == len); - must_be_true(obj->raw.type == type); - - git_odb_object_close(obj); - } - - git_odb_close(db); -END_TEST - -BEGIN_TEST(readheader1, "read only the header of several loose objects") - unsigned int i; - git_odb *db; - - must_pass(git_odb_open(&db, ODB_FOLDER)); - - for (i = 0; i < ARRAY_SIZE(loose_objects); ++i) { - git_oid id; - git_odb_object *obj; - size_t len; - git_otype type; - - must_pass(git_oid_fromstr(&id, loose_objects[i])); - - must_be_true(git_odb_exists(db, &id) == 1); - - must_pass(git_odb_read(&obj, db, &id)); - must_pass(git_odb_read_header(&len, &type, db, &id)); - - must_be_true(obj->raw.len == len); - must_be_true(obj->raw.type == type); - - git_odb_object_close(obj); - } - - git_odb_close(db); -END_TEST - -BEGIN_SUITE(objread) - ADD_TEST(existsloose0); - - ADD_TEST(readloose0); - ADD_TEST(readloose1); - ADD_TEST(readloose2); - ADD_TEST(readloose3); - ADD_TEST(readloose4); - ADD_TEST(readloose5); - ADD_TEST(readloose6); - -/* - ADD_TEST(readloose_enc0); - ADD_TEST(readloose_enc1); - ADD_TEST(readloose_enc2); - ADD_TEST(readloose_enc3); - ADD_TEST(readloose_enc4); - ADD_TEST(readloose_enc5); - ADD_TEST(readloose_enc6); -*/ - - ADD_TEST(readpack0); - - ADD_TEST(readheader0); - ADD_TEST(readheader1); -END_SUITE diff --git a/vendor/libgit2/tests/t02-oids.h b/vendor/libgit2/tests/t02-oids.h deleted file mode 100644 index 1a5ed5df0..000000000 --- a/vendor/libgit2/tests/t02-oids.h +++ /dev/null @@ -1,152 +0,0 @@ - -static const char *packed_objects[] = { - "0266163a49e280c4f5ed1e08facd36a2bd716bcf", - "53fc32d17276939fc79ed05badaef2db09990016", - "6336846bd5c88d32f93ae57d846683e61ab5c530", - "6dcf9bf7541ee10456529833502442f385010c3d", - "bed08a0b30b72a9d4aed7f1af8c8ca124e8d64b9", - "e90810b8df3e80c413d903f631643c716887138d", - "fc3c3a2083e9f6f89e6bd53e9420e70d1e357c9b", - "fc58168adf502d0c0ef614c3111a7038fc8c09c8", - "fd0ec0333948dfe23265ac46be0205a436a8c3a5", - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "fd899f45951c15c1c5f7c34b1c864e91bd6556c6", - "fda23b974899e7e1f938619099280bfda13bdca9", - "fdbec189efb657c8325962b494875987881a356b", - "fe1ca6bd22b5d8353ce6c2f3aba80805c438a7a5", - "fe3a6a42c87ff1239370c741a265f3997add87c1", - "deb106bfd2d36ecf9f0079224c12022201a39ad1", - "dec93efc79e60f2680de3e666755d335967eec30", - "def425bf8568b9c1e20879bf5be6f9c52b7361c4", - "df48000ac4f48570054e3a71a81916357997b680", - "dfae6ed8f6dd8acc3b40a31811ea316239223559", - "dff79e27d3d2cdc09790ded80fe2ea8ff5d61034", - "e00e46abe4c542e17c8bc83d72cf5be8018d7b0e", - "e01b107b4f77f8f98645adac0206a504f2d29d7c", - "e032d863f512c47b479bd984f8b6c8061f66b7d4", - "e044baa468a1c74f9f9da36805445f6888358b49", - "e04529998989ba8ae3419538dd57969af819b241", - "e0637ddfbea67c8d7f557c709e095af8906e9176", - "e0743ad4031231e71700abdc6fdbe94f189d20e5", - "cf33ac7a3d8b2b8f6bb266518aadbf59de397608", - "cf5f7235b9c9689b133f6ea12015720b411329bd", - "cf6cccf1297284833a9a03138a1f5738fa1c6c94", - "cf7992bde17ce7a79cab5f0c1fcbe8a0108721ed", - "cfe3a027ab12506d4144ee8a35669ae8fc4b7ab1", - "cfe96f31dfad7bab49977aa1df7302f7fafcb025", - "cff54d138945ef4de384e9d2759291d0c13ea90a", - "d01f7573ac34c2f502bd1cf18cde73480c741151", - "d03f567593f346a1ca96a57f8191def098d126e3", - "d047b47aadf88501238f36f5c17dd0a50dc62087", - "d0a0d63086fae3b0682af7261df21f7d0f7f066d", - "d0a44bd6ed0be21b725a96c0891bbc79bc1a540c", - "d0d7e736e536a41bcb885005f8bf258c61cad682", - "d0e7959d4b95ffec6198df6f5a7ae259b23a5f50", - "bf2fe2acca17d13356ce802ba9dc8343f710dfb7", - "bf55f407d6d9418e51f42ea7a3a6aadf17388349", - "bf92206f8b633b88a66dca4a911777630b06fbac", - "bfaf8c42eb8842abe206179fee864cfba87e3ca9", - "bfe05675d4e8f6b59d50932add8790f1a06b10ee", - "bff8618112330763327cfa6ce6e914db84f51ddf", - "bff873e9853ed99fed52c25f7ad29f78b27dcec2", - "c01c3fae7251098d7af1b459bcd0786e81d4616d", - "c0220fca67f48b8a5d4163d53b1486224be3a198", - "c02d0b160b82ee72469c269f13de4c26a7ea09cb", - "c059510ad1b45ab58390e042d7dee1ac46703854", - "c07204a1897aeeaa3c248d29dbfa9b033baf9755", - "c073337a4dd7276931b4b3fdbc3f0040e9441793", - "0fd7e4bfba5b3a82be88d1057757ca8b2c5e6d26", - "100746511cc45c9f1ad6721c4ef5be49222fee4d", - "1088490171d9b984d68b8b9be9ca003f4eafff59", - "1093c8ff4cb78fcf5f79dbbeedcb6e824bd4e253", - "10aa3fa72afab7ee31e116ae06442fe0f7b79df2", - "10b759e734e8299aa0dca08be935d95d886127b6", - "111d5ccf0bb010c4e8d7af3eedfa12ef4c5e265b", - "11261fbff21758444d426356ff6327ee01e90752", - "112998d425717bb922ce74e8f6f0f831d8dc4510", - "2ef4e5d838b6507bd61d457cf6466662b791c5c0", - "2ef4faa0f82efa00eeac6cae9e8b2abccc8566ee", - "2f06098183b0d7be350acbe39cdbaccff2df0c4a", - "2f1c5d509ac5bffb3c62f710a1c2c542e126dfd1", - "2f205b20fc16423c42b3ba51b2ea78d7b9ff3578", - "2f9b6b6e3d9250ba09360734aa47973a993b59d1", - "30c62a2d5a8d644f1311d4f7fe3f6a788e4c8188", - "31438e245492d85fd6da4d1406eba0fbde8332a4", - "3184a3abdfea231992254929ff4e275898e5bbf6", - "3188ffdbb3a3d52e0f78f30c484533899224436e", - "32581d0093429770d044a60eb0e9cc0462bedb13", - "32679a9544d83e5403202c4d5efb61ad02492847", - "4e7e9f60b7e2049b7f5697daf133161a18ef688f", - "4e8cda27ddc8be7db875ceb0f360c37734724c6d", - "4ea481c61c59ab55169b7cbaae536ad50b49d6f0", - "4f0adcd0e61eabe06fe32be66b16559537124b7a", - "4f1355c91100d12f9e7202f91b245df0c110867c", - "4f6eadeb08b9d0d1e8b1b3eac8a34940adf29a2d", - "4f9339df943c53117a5fc8e86e2f38716ff3a668", - "4fc3874b118752e40de556b1c3e7b4a9f1737d00", - "4ff1dd0992dd6baafdb5e166be6f9f23b59bdf87", - "5018a35e0b7e2eec7ce5050baf9c7343f3f74164", - "50298f44a45eda3a29dae82dbe911b5aa176ac07", - "502acd164fb115768d723144da2e7bb5a24891bb", - "50330c02bd4fd95c9db1fcf2f97f4218e42b7226", - "5052bf355d9f8c52446561a39733a8767bf31e37", - "6f2cd729ae42988c1dd43588d3a6661ba48ad7a0", - "6f4e2c42d9138bfbf3e0f908f1308828cc6f2178", - "6f6a17db05a83620cef4572761831c20a70ba9b9", - "6faad60901e36538634f0d8b8ff3f21f83503c71", - "6fc72e46de3df0c3842dab302bbacf697a63abab", - "6fdccd49f442a7204399ca9b418f017322dbded8", - "6fe7568fc3861c334cb008fd85d57d9647249ef5", - "700f55d91d7b55665594676a4bada1f1457a0598", - "702bd70595a7b19afc48a1f784a6505be68469d4", - "7033f9ee0e52b08cb5679cd49b7b7999eaf9eaf8", - "70957110ce446c4e250f865760fb3da513cdcc92", - "8ec696a4734f16479d091bc70574d23dd9fe7443", - "8ed341c55ed4d6f4cdc8bf4f0ca18a08c93f6962", - "8edc2805f1f11b63e44bf81f4557f8b473612b69", - "8ef9060a954118a698fc10e20acdc430566a100f", - "8f0c4b543f4bb6eb1518ecfc3d4699e43108d393", - "8fac94df3035405c2e60b3799153ce7c428af6b9", - "904c0ac12b23548de524adae712241b423d765a3", - "90bbaa9a809c3a768d873a9cc7d52b4f3bf3d1b9", - "90d4d2f0fc362beabbbf76b4ffda0828229c198d", - "90f9ff6755330b685feff6c3d81782ee3592ab04", - "91822c50ebe4f9bf5bbb8308ecf9f6557062775c", - "91d973263a55708fa8255867b3202d81ef9c2868", - "af292c99c6148d772af3315a1c74e83330e7ead7", - "af3b99d5be330dbbce0b9250c3a5fb05911908cc", - "af55d0cdeb280af2db8697e5afa506e081012719", - "af795e498d411142ddb073e8ca2c5447c3295a4c", - "afadc73a392f8cc8e2cc77dd62a7433dd3bafa8c", - "affd84ed8ec7ce67612fe3c12a80f8164b101f6a", - "b0941f9c70ffe67f0387a827b338e64ecf3190f0", - "b0a3077f9ef6e093f8d9869bdb0c07095bd722cb", - "b0a8568a7614806378a54db5706ee3b06ae58693", - "b0fb7372f242233d1d35ce7d8e74d3990cbc5841", - "b10489944b9ead17427551759d180d10203e06ba", - "b196a807b323f2748ffc6b1d42cd0812d04c9a40", - "b1bb1d888f0c5e19278536d49fa77db035fac7ae" -}; - -static const char *loose_objects[] = { - "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", - "a8233120f6ad708f843d861ce2b7228ec4e3dec6", - "fd093bff70906175335656e6ce6ae05783708765", - "c47800c7266a2be04c571c04d5a6614691ea99bd", - "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd", - "8496071c1b46c854b31185ea97743be6a8774479", - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "814889a078c031f61ed08ab5fa863aea9314344d", - "5b5b025afb0b4c913b4c338a42934a3863bf3644", - "1385f264afb75a56a5bec74243be9b367ba4ca08", - "f60079018b664e4e79329a7ef9559c8d9e0378d1", - "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", - "75057dd4114e74cca1d750d0aee1647c903cb60a", - "fa49b077972391ad58037050f2a75f74e3671e92", - "9fd738e8f7967c078dceed8190330fc8648ee56a", - "1810dff58d8a660512d4832e740f692884338ccd", - "181037049a54a1eb5fab404658a3a250b44335d7", - "a4a7dce85cf63874e984719f4fdd239f5145052f", - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" -}; - diff --git a/vendor/libgit2/tests/t03-data.h b/vendor/libgit2/tests/t03-data.h deleted file mode 100644 index a4b73fec3..000000000 --- a/vendor/libgit2/tests/t03-data.h +++ /dev/null @@ -1,344 +0,0 @@ - -typedef struct object_data { - char *id; /* object id (sha1) */ - char *dir; /* object store (fan-out) directory name */ - char *file; /* object store filename */ -} object_data; - -static object_data commit = { - "3d7f8a6af076c8c3f20071a8935cdbe8228594d1", - "test-objects/3d", - "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1", -}; - -static unsigned char commit_data[] = { - 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66, - 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35, - 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38, - 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32, - 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33, - 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55, - 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, - 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, - 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65, - 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d, - 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20, - 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x3e, 0x0a, -}; - -static git_rawobj commit_obj = { - commit_data, - sizeof(commit_data), - GIT_OBJ_COMMIT -}; - -static object_data tree = { - "dff2da90b254e1beb889d1f1f1288be1803782df", - "test-objects/df", - "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df", -}; - -static unsigned char tree_data[] = { - 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f, - 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79, - 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b, - 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86, - 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8, - 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31, - 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77, - 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b, - 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd, - 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30, - 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72, - 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, - 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a, - 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91, -}; - -static git_rawobj tree_obj = { - tree_data, - sizeof(tree_data), - GIT_OBJ_TREE -}; - -static object_data tag = { - "09d373e1dfdc16b129ceec6dd649739911541e05", - "test-objects/09", - "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05", -}; - -static unsigned char tag_data[] = { - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33, - 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66, - 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66, - 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39, - 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32, - 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20, - 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20, - 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e, - 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34, - 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30, - 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x0a, -}; - -static git_rawobj tag_obj = { - tag_data, - sizeof(tag_data), - GIT_OBJ_TAG -}; - -static object_data zero = { - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - "test-objects/e6", - "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", -}; - -static unsigned char zero_data[] = { - 0x00 /* dummy data */ -}; - -static git_rawobj zero_obj = { - zero_data, - 0, - GIT_OBJ_BLOB -}; - -static object_data one = { - "8b137891791fe96927ad78e64b0aad7bded08bdc", - "test-objects/8b", - "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc", -}; - -static unsigned char one_data[] = { - 0x0a, -}; - -static git_rawobj one_obj = { - one_data, - sizeof(one_data), - GIT_OBJ_BLOB -}; - -static object_data two = { - "78981922613b2afb6025042ff6bd878ac1994e85", - "test-objects/78", - "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85", -}; - -static unsigned char two_data[] = { - 0x61, 0x0a, -}; - -static git_rawobj two_obj = { - two_data, - sizeof(two_data), - GIT_OBJ_BLOB -}; - -static object_data some = { - "fd8430bc864cfcd5f10e5590f8a447e01b942bfe", - "test-objects/fd", - "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe", -}; - -static unsigned char some_data[] = { - 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, - 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, - 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, - 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, - 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, - 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, - 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, - 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, - 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, - 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, - 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, - 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, - 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47, - 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, - 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20, - 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, - 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, - 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, - 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a, - 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, - 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31, - 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, - 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, - 0x0a, -}; - -static git_rawobj some_obj = { - some_data, - sizeof(some_data), - GIT_OBJ_BLOB -}; diff --git a/vendor/libgit2/tests/t03-objwrite.c b/vendor/libgit2/tests/t03-objwrite.c deleted file mode 100644 index 31f611a5c..000000000 --- a/vendor/libgit2/tests/t03-objwrite.c +++ /dev/null @@ -1,255 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "fileops.h" -#include "odb.h" - -static char *odb_dir = "test-objects"; -#include "t03-data.h" - -static int make_odb_dir(void) -{ - if (p_mkdir(odb_dir, 0755) < 0) { - int err = errno; - fprintf(stderr, "can't make directory \"%s\"", odb_dir); - if (err == EEXIST) - fprintf(stderr, " (already exists)"); - fprintf(stderr, "\n"); - return -1; - } - return 0; -} - -static int check_object_files(object_data *d) -{ - if (git_futils_exists(d->dir) < 0) - return -1; - if (git_futils_exists(d->file) < 0) - return -1; - return 0; -} - -static int cmp_objects(git_rawobj *o1, git_rawobj *o2) -{ - if (o1->type != o2->type) - return -1; - if (o1->len != o2->len) - return -1; - if ((o1->len > 0) && (memcmp(o1->data, o2->data, o1->len) != 0)) - return -1; - return 0; -} - -static int remove_object_files(object_data *d) -{ - if (p_unlink(d->file) < 0) { - fprintf(stderr, "can't delete object file \"%s\"\n", d->file); - return -1; - } - if ((p_rmdir(d->dir) < 0) && (errno != ENOTEMPTY)) { - fprintf(stderr, "can't remove directory \"%s\"\n", d->dir); - return -1; - } - - if (p_rmdir(odb_dir) < 0) { - fprintf(stderr, "can't remove directory \"%s\"\n", odb_dir); - return -1; - } - - return 0; -} - -static int streaming_write(git_oid *oid, git_odb *odb, git_rawobj *raw) -{ - git_odb_stream *stream; - int error; - - if ((error = git_odb_open_wstream(&stream, odb, raw->len, raw->type)) < GIT_SUCCESS) - return error; - - stream->write(stream, raw->data, raw->len); - - error = stream->finalize_write(oid, stream); - stream->free(stream); - - return error; -} - -BEGIN_TEST(write0, "write loose commit object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, commit.id)); - - must_pass(streaming_write(&id2, db, &commit_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&commit)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &commit_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&commit)); -END_TEST - -BEGIN_TEST(write1, "write loose tree object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, tree.id)); - - must_pass(streaming_write(&id2, db, &tree_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&tree)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &tree_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&tree)); -END_TEST - -BEGIN_TEST(write2, "write loose tag object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, tag.id)); - - must_pass(streaming_write(&id2, db, &tag_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&tag)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &tag_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&tag)); -END_TEST - -BEGIN_TEST(write3, "write zero-length object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, zero.id)); - - must_pass(streaming_write(&id2, db, &zero_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&zero)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &zero_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&zero)); -END_TEST - -BEGIN_TEST(write4, "write one-byte long object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, one.id)); - - must_pass(streaming_write(&id2, db, &one_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&one)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &one_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&one)); -END_TEST - -BEGIN_TEST(write5, "write two-byte long object") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, two.id)); - - must_pass(streaming_write(&id2, db, &two_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&two)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &two_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&two)); -END_TEST - -BEGIN_TEST(write6, "write an object which is several bytes long") - git_odb *db; - git_oid id1, id2; - git_odb_object *obj; - - must_pass(make_odb_dir()); - must_pass(git_odb_open(&db, odb_dir)); - must_pass(git_oid_fromstr(&id1, some.id)); - - must_pass(streaming_write(&id2, db, &some_obj)); - must_be_true(git_oid_cmp(&id1, &id2) == 0); - must_pass(check_object_files(&some)); - - must_pass(git_odb_read(&obj, db, &id1)); - must_pass(cmp_objects(&obj->raw, &some_obj)); - - git_odb_object_close(obj); - git_odb_close(db); - must_pass(remove_object_files(&some)); -END_TEST - -BEGIN_SUITE(objwrite) - ADD_TEST(write0); - ADD_TEST(write1); - ADD_TEST(write2); - ADD_TEST(write3); - ADD_TEST(write4); - ADD_TEST(write5); - ADD_TEST(write6); -END_SUITE diff --git a/vendor/libgit2/tests/t04-commit.c b/vendor/libgit2/tests/t04-commit.c deleted file mode 100644 index a8617ed6a..000000000 --- a/vendor/libgit2/tests/t04-commit.c +++ /dev/null @@ -1,775 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "commit.h" -#include "signature.h" - -static char *test_commits_broken[] = { - -/* empty commit */ -"", - -/* random garbage */ -"asd97sa9du902e9a0jdsuusad09as9du098709aweu8987sd\n", - -/* broken endlines 1 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\r\n\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\r\n\ -author Vicent Marti 1273848544 +0200\r\n\ -committer Vicent Marti 1273848544 +0200\r\n\ -\r\n\ -a test commit with broken endlines\r\n", - -/* broken endlines 2 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\ -author Vicent Marti 1273848544 +0200\ -committer Vicent Marti 1273848544 +0200\ -\ -another test commit with broken endlines", - -/* starting endlines */ -"\ntree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a test commit with a starting endline\n", - -/* corrupted commit 1 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent 05452d6349abcd67aa396df", - -/* corrupted commit 2 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent ", - -/* corrupted commit 3 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -parent ", - -/* corrupted commit 4 */ -"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\ -par", - -}; - - -static char *test_commits_working[] = { -/* simple commit with no message */ -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n", - -/* simple commit, no parent */ -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works\n", - -/* simple commit, no parent, no newline in message */ -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works", - -/* simple commit, 1 parent */ -"tree 1810dff58d8a660512d4832e740f692884338ccd\n\ -parent e90810b8df3e80c413d903f631643c716887138d\n\ -author Vicent Marti 1273848544 +0200\n\ -committer Vicent Marti 1273848544 +0200\n\ -\n\ -a simple commit which works\n", -}; - -BEGIN_TEST(parse0, "parse the OID line in a commit") - - git_oid oid; - -#define TEST_OID_PASS(string, header) { \ - const char *ptr = string;\ - const char *ptr_original = ptr;\ - size_t len = strlen(ptr);\ - must_pass(git_oid__parse(&oid, &ptr, ptr + len, header));\ - must_be_true(ptr == ptr_original + len);\ -} - -#define TEST_OID_FAIL(string, header) { \ - const char *ptr = string;\ - size_t len = strlen(ptr);\ - must_fail(git_oid__parse(&oid, &ptr, ptr + len, header));\ -} - - TEST_OID_PASS("parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent "); - TEST_OID_PASS("tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree "); - TEST_OID_PASS("random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading "); - TEST_OID_PASS("stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading"); - TEST_OID_PASS("tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree "); - TEST_OID_PASS("tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree "); - TEST_OID_PASS("tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree "); - TEST_OID_PASS("tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree "); - - TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent "); - TEST_OID_FAIL("05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree "); - TEST_OID_FAIL("parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent "); - TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent "); - TEST_OID_FAIL("tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree "); - TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent "); - TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent "); - TEST_OID_FAIL("", "tree "); - TEST_OID_FAIL("", ""); - -#undef TEST_OID_PASS -#undef TEST_OID_FAIL - -END_TEST - -BEGIN_TEST(parse1, "parse the signature line in a commit") - -#define TEST_SIGNATURE_PASS(_string, _header, _name, _email, _time, _offset) { \ - const char *ptr = _string; \ - size_t len = strlen(_string);\ - git_signature person = {NULL, NULL, {0, 0}}; \ - must_pass(git_signature__parse(&person, &ptr, ptr + len, _header, '\n'));\ - must_be_true(strcmp(_name, person.name) == 0);\ - must_be_true(strcmp(_email, person.email) == 0);\ - must_be_true(_time == person.when.time);\ - must_be_true(_offset == person.when.offset);\ - free(person.name); free(person.email);\ -} - -#define TEST_SIGNATURE_FAIL(_string, _header) { \ - const char *ptr = _string; \ - size_t len = strlen(_string);\ - git_signature person = {NULL, NULL, {0, 0}}; \ - must_fail(git_signature__parse(&person, &ptr, ptr + len, _header, '\n'));\ - free(person.name); free(person.email);\ -} - - TEST_SIGNATURE_PASS( - "author Vicent Marti 12345 \n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 12345, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti <> 12345 \n", - "author ", - "Vicent Marti", - "", - 12345, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti 231301 +1020\n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 231301, - 620); - - TEST_SIGNATURE_PASS( - "author Vicent Marti with an outrageously long name \ - which will probably overflow the buffer 12345 \n", - "author ", - "Vicent Marti with an outrageously long name \ - which will probably overflow the buffer", - "tanoku@gmail.com", - 12345, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti 12345 \n", - "author ", - "Vicent Marti", - "tanokuwithaveryveryverylongemail\ - whichwillprobablyvoverflowtheemailbuffer@gmail.com", - 12345, - 0); - - TEST_SIGNATURE_PASS( - "committer Vicent Marti 123456 +0000 \n", - "committer ", - "Vicent Marti", - "tanoku@gmail.com", - 123456, - 0); - - TEST_SIGNATURE_PASS( - "committer Vicent Marti 123456 +0100 \n", - "committer ", - "Vicent Marti", - "tanoku@gmail.com", - 123456, - 60); - - TEST_SIGNATURE_PASS( - "committer Vicent Marti 123456 -0100 \n", - "committer ", - "Vicent Marti", - "tanoku@gmail.com", - 123456, - -60); - - /* Parse a signature without an author field */ - TEST_SIGNATURE_PASS( - "committer 123456 -0100 \n", - "committer ", - "", - "tanoku@gmail.com", - 123456, - -60); - - /* Parse a signature without an author field */ - TEST_SIGNATURE_PASS( - "committer 123456 -0100 \n", - "committer ", - "", - "tanoku@gmail.com", - 123456, - -60); - - /* Parse a signature with an empty author field */ - TEST_SIGNATURE_PASS( - "committer 123456 -0100 \n", - "committer ", - "", - "tanoku@gmail.com", - 123456, - -60); - - /* Parse a signature with an empty email field */ - TEST_SIGNATURE_PASS( - "committer Vicent Marti <> 123456 -0100 \n", - "committer ", - "Vicent Marti", - "", - 123456, - -60); - - /* Parse a signature with an empty email field */ - TEST_SIGNATURE_PASS( - "committer Vicent Marti < > 123456 -0100 \n", - "committer ", - "Vicent Marti", - "", - 123456, - -60); - - /* Parse a signature with empty name and email */ - TEST_SIGNATURE_PASS( - "committer <> 123456 -0100 \n", - "committer ", - "", - "", - 123456, - -60); - - /* Parse a signature with empty name and email */ - TEST_SIGNATURE_PASS( - "committer <> 123456 -0100 \n", - "committer ", - "", - "", - 123456, - -60); - - /* Parse a signature with empty name and email */ - TEST_SIGNATURE_PASS( - "committer < > 123456 -0100 \n", - "committer ", - "", - "", - 123456, - -60); - - /* Parse an obviously invalid signature */ - TEST_SIGNATURE_PASS( - "committer foo<@bar> 123456 -0100 \n", - "committer ", - "foo", - "@bar", - 123456, - -60); - - /* Parse an obviously invalid signature */ - TEST_SIGNATURE_PASS( - "committer foo<@bar>123456 -0100 \n", - "committer ", - "foo", - "@bar", - 123456, - -60); - - /* Parse an obviously invalid signature */ - TEST_SIGNATURE_PASS( - "committer <>\n", - "committer ", - "", - "", - 0, - 0); - - TEST_SIGNATURE_PASS( - "committer Vicent Marti 123456 -1500 \n", - "committer ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "committer Vicent Marti 123456 +0163 \n", - "committer ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti notime \n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti 123456 notimezone \n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti notime +0100\n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "author Vicent Marti \n", - "author ", - "Vicent Marti", - "tanoku@gmail.com", - 0, - 0); - - TEST_SIGNATURE_PASS( - "author A U Thor , C O. Miter 1234567890 -0700\n", - "author ", - "A U Thor", - "author@example.com", - 1234567890, - -420); - - TEST_SIGNATURE_PASS( - "author A U Thor and others 1234567890 -0700\n", - "author ", - "A U Thor", - "author@example.com", - 1234567890, - -420); - - TEST_SIGNATURE_PASS( - "author A U Thor and others 1234567890\n", - "author ", - "A U Thor", - "author@example.com", - 1234567890, - 0); - - TEST_SIGNATURE_FAIL( - "committer Vicent Marti tanoku@gmail.com> 123456 -0100 \n", - "committer "); - - TEST_SIGNATURE_FAIL( - "author Vicent Marti 12345 \n", - "author "); - - TEST_SIGNATURE_FAIL( - "author Vicent Marti 12345 \n", - "committer "); - - TEST_SIGNATURE_FAIL( - "author Vicent Marti 12345 \n", - "author "); - - TEST_SIGNATURE_FAIL( - "author Vicent Marti <\n", - "committer "); - - TEST_SIGNATURE_FAIL( - "author ", - "author "); - -#undef TEST_SIGNATURE_PASS -#undef TEST_SIGNATURE_FAIL - -END_TEST - -static int try_build_signature(const char *name, const char *email, git_time_t time, int offset) -{ - git_signature *sign; - int error = GIT_SUCCESS; - - if ((error = git_signature_new(&sign, name, email, time, offset)) < GIT_SUCCESS) - return error; - - git_signature_free((git_signature *)sign); - - return error; -} - -BEGIN_TEST(signature0, "creating a signature trims leading and trailing spaces") - git_signature *sign; - must_pass(git_signature_new(&sign, " nulltoken ", " emeric.fermas@gmail.com ", 1234567890, 60)); - must_be_true(strcmp(sign->name, "nulltoken") == 0); - must_be_true(strcmp(sign->email, "emeric.fermas@gmail.com") == 0); - git_signature_free((git_signature *)sign); -END_TEST - -BEGIN_TEST(signature1, "can not create a signature with empty name or email") - must_pass(try_build_signature("nulltoken", "emeric.fermas@gmail.com", 1234567890, 60)); - - must_fail(try_build_signature("", "emeric.fermas@gmail.com", 1234567890, 60)); - must_fail(try_build_signature(" ", "emeric.fermas@gmail.com", 1234567890, 60)); - must_fail(try_build_signature("nulltoken", "", 1234567890, 60)); - must_fail(try_build_signature("nulltoken", " ", 1234567890, 60)); -END_TEST - -BEGIN_TEST(signature2, "creating a one character signature") - git_signature *sign; - must_pass(git_signature_new(&sign, "x", "foo@bar.baz", 1234567890, 60)); - must_be_true(strcmp(sign->name, "x") == 0); - must_be_true(strcmp(sign->email, "foo@bar.baz") == 0); - git_signature_free((git_signature *)sign); -END_TEST - -BEGIN_TEST(signature3, "creating a two character signature") - git_signature *sign; - must_pass(git_signature_new(&sign, "xx", "x@y.z", 1234567890, 60)); - must_be_true(strcmp(sign->name, "xx") == 0); - must_be_true(strcmp(sign->email, "x@y.z") == 0); - git_signature_free((git_signature *)sign); -END_TEST - -BEGIN_TEST(signature4, "creating a zero character signature") - git_signature *sign; - must_fail(git_signature_new(&sign, "", "x@y.z", 1234567890, 60)); - must_be_true(sign == NULL); -END_TEST - - -/* External declaration for testing the buffer parsing method */ -int commit_parse_buffer(git_commit *commit, void *data, size_t len); - -BEGIN_TEST(parse2, "parse a whole commit buffer") - const int broken_commit_count = sizeof(test_commits_broken) / sizeof(*test_commits_broken); - const int working_commit_count = sizeof(test_commits_working) / sizeof(*test_commits_working); - - int i; - git_repository *repo; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - for (i = 0; i < broken_commit_count; ++i) { - git_commit *commit; - commit = git__malloc(sizeof(git_commit)); - memset(commit, 0x0, sizeof(git_commit)); - commit->object.repo = repo; - - must_fail(commit_parse_buffer( - commit, - test_commits_broken[i], - strlen(test_commits_broken[i])) - ); - - git_commit__free(commit); - } - - for (i = 0; i < working_commit_count; ++i) { - git_commit *commit; - - commit = git__malloc(sizeof(git_commit)); - memset(commit, 0x0, sizeof(git_commit)); - commit->object.repo = repo; - - must_pass(commit_parse_buffer( - commit, - test_commits_working[i], - strlen(test_commits_working[i])) - ); - - git_commit__free(commit); - - commit = git__malloc(sizeof(git_commit)); - memset(commit, 0x0, sizeof(git_commit)); - commit->object.repo = repo; - - must_pass(commit_parse_buffer( - commit, - test_commits_working[i], - strlen(test_commits_working[i])) - ); - - git_commit__free(commit); - } - - git_repository_free(repo); -END_TEST - -static const char *commit_ids[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ -}; - -BEGIN_TEST(details0, "query the details on a parsed commit") - const size_t commit_count = sizeof(commit_ids) / sizeof(const char *); - - unsigned int i; - git_repository *repo; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - for (i = 0; i < commit_count; ++i) { - git_oid id; - git_commit *commit; - - const git_signature *author, *committer; - const char *message; - git_time_t commit_time; - unsigned int parents, p; - git_commit *parent = NULL, *old_parent = NULL; - - git_oid_fromstr(&id, commit_ids[i]); - - must_pass(git_commit_lookup(&commit, repo, &id)); - - message = git_commit_message(commit); - author = git_commit_author(commit); - committer = git_commit_committer(commit); - commit_time = git_commit_time(commit); - parents = git_commit_parentcount(commit); - - must_be_true(strcmp(author->name, "Scott Chacon") == 0); - must_be_true(strcmp(author->email, "schacon@gmail.com") == 0); - must_be_true(strcmp(committer->name, "Scott Chacon") == 0); - must_be_true(strcmp(committer->email, "schacon@gmail.com") == 0); - must_be_true(strchr(message, '\n') != NULL); - must_be_true(commit_time > 0); - must_be_true(parents <= 2); - for (p = 0;p < parents;p++) { - if (old_parent != NULL) - git_commit_close(old_parent); - - old_parent = parent; - must_pass(git_commit_parent(&parent, commit, p)); - must_be_true(parent != NULL); - must_be_true(git_commit_author(parent) != NULL); // is it really a commit? - } - git_commit_close(old_parent); - git_commit_close(parent); - - must_fail(git_commit_parent(&parent, commit, parents)); - git_commit_close(commit); - } - - git_repository_free(repo); -END_TEST - -#define COMMITTER_NAME "Vicent Marti" -#define COMMITTER_EMAIL "vicent@github.com" -#define COMMIT_MESSAGE "This commit has been created in memory\n\ -This is a commit created in memory and it will be written back to disk\n" - -static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; - -BEGIN_TEST(write0, "write a new commit object from memory to disk") - git_repository *repo; - git_commit *commit; - git_oid tree_id, parent_id, commit_id; - git_signature *author, *committer; - const git_signature *author1, *committer1; - git_commit *parent; - git_tree *tree; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&tree_id, tree_oid); - must_pass(git_tree_lookup(&tree, repo, &tree_id)); - - git_oid_fromstr(&parent_id, commit_ids[4]); - must_pass(git_commit_lookup(&parent, repo, &parent_id)); - - /* create signatures */ - must_pass(git_signature_new(&committer, COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60)); - must_pass(git_signature_new(&author, COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90)); - - must_pass(git_commit_create_v( - &commit_id, /* out id */ - repo, - NULL, /* do not update the HEAD */ - author, - committer, - NULL, - COMMIT_MESSAGE, - tree, - 1, parent)); - - git_object_close((git_object *)parent); - git_object_close((git_object *)tree); - - git_signature_free(committer); - git_signature_free(author); - - must_pass(git_commit_lookup(&commit, repo, &commit_id)); - - /* Check attributes were set correctly */ - author1 = git_commit_author(commit); - must_be_true(author1 != NULL); - must_be_true(strcmp(author1->name, COMMITTER_NAME) == 0); - must_be_true(strcmp(author1->email, COMMITTER_EMAIL) == 0); - must_be_true(author1->when.time == 987654321); - must_be_true(author1->when.offset == 90); - - committer1 = git_commit_committer(commit); - must_be_true(committer1 != NULL); - must_be_true(strcmp(committer1->name, COMMITTER_NAME) == 0); - must_be_true(strcmp(committer1->email, COMMITTER_EMAIL) == 0); - must_be_true(committer1->when.time == 123456789); - must_be_true(committer1->when.offset == 60); - - must_be_true(strcmp(git_commit_message(commit), COMMIT_MESSAGE) == 0); - - must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit)); - - git_commit_close(commit); - git_repository_free(repo); -END_TEST - -#define ROOT_COMMIT_MESSAGE "This is a root commit\n\ -This is a root commit and should be the only one in this branch\n" - -BEGIN_TEST(root0, "create a root commit") - git_repository *repo; - git_commit *commit; - git_oid tree_id, commit_id; - const git_oid *branch_oid; - git_signature *author, *committer; - const char *branch_name = "refs/heads/root-commit-branch"; - git_reference *head, *branch; - char *head_old; - git_tree *tree; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&tree_id, tree_oid); - must_pass(git_tree_lookup(&tree, repo, &tree_id)); - - /* create signatures */ - must_pass(git_signature_new(&committer, COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60)); - must_pass(git_signature_new(&author, COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90)); - - /* First we need to update HEAD so it points to our non-existant branch */ - must_pass(git_reference_lookup(&head, repo, "HEAD")); - must_be_true(git_reference_type(head) == GIT_REF_SYMBOLIC); - head_old = git__strdup(git_reference_target(head)); - must_be_true(head_old != NULL); - - must_pass(git_reference_set_target(head, branch_name)); - - must_pass(git_commit_create_v( - &commit_id, /* out id */ - repo, - "HEAD", - author, - committer, - NULL, - ROOT_COMMIT_MESSAGE, - tree, - 0)); - - git_object_close((git_object *)tree); - git_signature_free(committer); - git_signature_free(author); - - /* - * The fact that creating a commit works has already been - * tested. Here we just make sure it's our commit and that it was - * written as a root commit. - */ - must_pass(git_commit_lookup(&commit, repo, &commit_id)); - must_be_true(git_commit_parentcount(commit) == 0); - must_pass(git_reference_lookup(&branch, repo, branch_name)); - branch_oid = git_reference_oid(branch); - must_pass(git_oid_cmp(branch_oid, &commit_id)); - must_be_true(!strcmp(git_commit_message(commit), ROOT_COMMIT_MESSAGE)); - - /* Remove the data we just added to the repo */ - must_pass(git_reference_lookup(&head, repo, "HEAD")); - must_pass(git_reference_set_target(head, head_old)); - must_pass(git_reference_delete(branch)); - must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit)); - free(head_old); - git_commit_close(commit); - git_repository_free(repo); -END_TEST - -BEGIN_SUITE(commit) - ADD_TEST(parse0); - ADD_TEST(parse1); - ADD_TEST(parse2); - ADD_TEST(details0); - - ADD_TEST(write0); - - ADD_TEST(root0); - - ADD_TEST(signature0); - ADD_TEST(signature1); - ADD_TEST(signature2); - ADD_TEST(signature3); - ADD_TEST(signature4); -END_SUITE diff --git a/vendor/libgit2/tests/t05-revwalk.c b/vendor/libgit2/tests/t05-revwalk.c deleted file mode 100644 index ab509ab94..000000000 --- a/vendor/libgit2/tests/t05-revwalk.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -/* - $ git log --oneline --graph --decorate - * a4a7dce (HEAD, br2) Merge branch 'master' into br2 - |\ - | * 9fd738e (master) a fourth commit - | * 4a202b3 a third commit - * | c47800c branch commit one - |/ - * 5b5b025 another commit - * 8496071 testing -*/ -static const char *commit_head = "a4a7dce85cf63874e984719f4fdd239f5145052f"; - -static const char *commit_ids[] = { - "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */ - "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */ - "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */ - "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */ - "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */ - "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */ -}; - -/* Careful: there are two possible topological sorts */ -static const int commit_sorting_topo[][6] = { - {0, 1, 2, 3, 5, 4}, {0, 3, 1, 2, 5, 4} -}; - -static const int commit_sorting_time[][6] = { - {0, 3, 1, 2, 5, 4} -}; - -static const int commit_sorting_topo_reverse[][6] = { - {4, 5, 3, 2, 1, 0}, {4, 5, 2, 1, 3, 0} -}; - -static const int commit_sorting_time_reverse[][6] = { - {4, 5, 2, 1, 3, 0} -}; - -#define commit_count 6 -static const int result_bytes = 24; - - -static int get_commit_index(git_oid *raw_oid) -{ - int i; - char oid[40]; - - git_oid_fmt(oid, raw_oid); - - for (i = 0; i < commit_count; ++i) - if (memcmp(oid, commit_ids[i], 40) == 0) - return i; - - return -1; -} - -static int test_walk(git_revwalk *walk, const git_oid *root, - int flags, const int possible_results[][6], int results_count) -{ - git_oid oid; - - int i; - int result_array[commit_count]; - - git_revwalk_sorting(walk, flags); - git_revwalk_push(walk, root); - - for (i = 0; i < commit_count; ++i) - result_array[i] = -1; - - i = 0; - - while (git_revwalk_next(&oid, walk) == GIT_SUCCESS) { - result_array[i++] = get_commit_index(&oid); - /*{ - char str[41]; - git_oid_fmt(str, &oid); - str[40] = 0; - printf(" %d) %s\n", i, str); - }*/ - } - - for (i = 0; i < results_count; ++i) - if (memcmp(possible_results[i], - result_array, result_bytes) == 0) - return GIT_SUCCESS; - - return GIT_ERROR; -} - -BEGIN_TEST(walk0, "do a simple walk on a repo with different sorting modes") - git_oid id; - git_repository *repo; - git_revwalk *walk; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_revwalk_new(&walk, repo)); - - git_oid_fromstr(&id, commit_head); - - must_pass(test_walk(walk, &id, GIT_SORT_TIME, commit_sorting_time, 1)); - must_pass(test_walk(walk, &id, GIT_SORT_TOPOLOGICAL, commit_sorting_topo, 2)); - must_pass(test_walk(walk, &id, GIT_SORT_TIME | GIT_SORT_REVERSE, commit_sorting_time_reverse, 1)); - must_pass(test_walk(walk, &id, GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE, commit_sorting_topo_reverse, 2)); - - git_revwalk_free(walk); - git_repository_free(repo); -END_TEST - -BEGIN_SUITE(revwalk) - ADD_TEST(walk0); -END_SUITE diff --git a/vendor/libgit2/tests/t06-index.c b/vendor/libgit2/tests/t06-index.c deleted file mode 100644 index 621e742b3..000000000 --- a/vendor/libgit2/tests/t06-index.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "index.h" - -#define TEST_INDEX_ENTRY_COUNT 109 -#define TEST_INDEX2_ENTRY_COUNT 1437 - -struct test_entry { - unsigned int index; - char path[128]; - git_off_t file_size; - git_time_t mtime; -}; - -struct test_entry TEST_ENTRIES[] = { - {4, "Makefile", 5064, 0x4C3F7F33}, - {62, "tests/Makefile", 2631, 0x4C3F7F33}, - {36, "src/index.c", 10014, 0x4C43368D}, - {6, "git.git-authors", 2709, 0x4C3F7F33}, - {48, "src/revobject.h", 1448, 0x4C3F7FE2} -}; - -BEGIN_TEST(read0, "load an empty index") - git_index *index; - - must_pass(git_index_open(&index, "in-memory-index")); - must_be_true(index->on_disk == 0); - - must_be_true(git_index_entrycount(index) == 0); - must_be_true(index->entries.sorted); - - git_index_free(index); -END_TEST - -BEGIN_TEST(read1, "load a standard index (default test index)") - git_index *index; - unsigned int i; - git_index_entry **entries; - - must_pass(git_index_open(&index, TEST_INDEX_PATH)); - must_be_true(index->on_disk); - - must_be_true(git_index_entrycount(index) == TEST_INDEX_ENTRY_COUNT); - must_be_true(index->entries.sorted); - - entries = (git_index_entry **)index->entries.contents; - - for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) { - git_index_entry *e = entries[TEST_ENTRIES[i].index]; - - must_be_true(strcmp(e->path, TEST_ENTRIES[i].path) == 0); - must_be_true(e->mtime.seconds == TEST_ENTRIES[i].mtime); - must_be_true(e->file_size == TEST_ENTRIES[i].file_size); - } - - git_index_free(index); -END_TEST - -BEGIN_TEST(read2, "load a standard index (git.git index)") - git_index *index; - - must_pass(git_index_open(&index, TEST_INDEX2_PATH)); - must_be_true(index->on_disk); - - must_be_true(git_index_entrycount(index) == TEST_INDEX2_ENTRY_COUNT); - must_be_true(index->entries.sorted); - must_be_true(index->tree != NULL); - - git_index_free(index); -END_TEST - -BEGIN_TEST(find0, "find an entry on an index") - git_index *index; - unsigned int i; - - must_pass(git_index_open(&index, TEST_INDEX_PATH)); - - for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) { - int idx = git_index_find(index, TEST_ENTRIES[i].path); - must_be_true((unsigned int)idx == TEST_ENTRIES[i].index); - } - - git_index_free(index); -END_TEST - -BEGIN_TEST(find1, "find an entry in an empty index") - git_index *index; - unsigned int i; - - must_pass(git_index_open(&index, "fake-index")); - - for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) { - int idx = git_index_find(index, TEST_ENTRIES[i].path); - must_be_true(idx == GIT_ENOTFOUND); - } - - git_index_free(index); -END_TEST - -BEGIN_TEST(write0, "write an index back to disk") - git_index *index; - - must_pass(copy_file(TEST_INDEXBIG_PATH, "index_rewrite")); - - must_pass(git_index_open(&index, "index_rewrite")); - must_be_true(index->on_disk); - - must_pass(git_index_write(index)); - must_pass(cmp_files(TEST_INDEXBIG_PATH, "index_rewrite")); - - git_index_free(index); - - p_unlink("index_rewrite"); -END_TEST - -BEGIN_TEST(sort0, "sort the entires in an index") - /* - * TODO: This no longer applies: - * index sorting in Git uses some specific changes to the way - * directories are sorted. - * - * We need to specificially check for this by creating a new - * index, adding entries in random order and then - * checking for consistency - */ -END_TEST - -BEGIN_TEST(sort1, "sort the entires in an empty index") - git_index *index; - - must_pass(git_index_open(&index, "fake-index")); - - /* FIXME: this test is slightly dumb */ - must_be_true(index->entries.sorted); - - git_index_free(index); -END_TEST - -BEGIN_TEST(add0, "add a new file to the index") - git_index *index; - git_filebuf file; - git_repository *repo; - git_index_entry *entry; - git_oid id1; - - /* Intialize a new repository */ - must_pass(git_repository_init(&repo, TEMP_REPO_FOLDER "myrepo", 0)); - - /* Ensure we're the only guy in the room */ - must_pass(git_repository_index(&index, repo)); - must_pass(git_index_entrycount(index) == 0); - - /* Create a new file in the working directory */ - must_pass(git_futils_mkpath2file(TEMP_REPO_FOLDER "myrepo/test.txt")); - must_pass(git_filebuf_open(&file, TEMP_REPO_FOLDER "myrepo/test.txt", 0)); - must_pass(git_filebuf_write(&file, "hey there\n", 10)); - must_pass(git_filebuf_commit(&file)); - - /* Store the expected hash of the file/blob - * This has been generated by executing the following - * $ echo "hey there" | git hash-object --stdin - */ - must_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); - - /* Add the new file to the index */ - must_pass(git_index_add(index, "test.txt", 0)); - - /* Wow... it worked! */ - must_pass(git_index_entrycount(index) == 1); - entry = git_index_get(index, 0); - - /* And the built-in hashing mechanism worked as expected */ - must_be_true(git_oid_cmp(&id1, &entry->oid) == 0); - - git_index_free(index); - git_repository_free(repo); - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); -END_TEST - -BEGIN_SUITE(index) - ADD_TEST(read0); - ADD_TEST(read1); - ADD_TEST(read2); - - ADD_TEST(find0); - ADD_TEST(find1); - - ADD_TEST(write0); - - ADD_TEST(sort0); - ADD_TEST(sort1); - - ADD_TEST(add0); -END_SUITE diff --git a/vendor/libgit2/tests/t07-hashtable.c b/vendor/libgit2/tests/t07-hashtable.c deleted file mode 100644 index 7313f2cc9..000000000 --- a/vendor/libgit2/tests/t07-hashtable.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "hashtable.h" -#include "hash.h" - -typedef struct _aux_object { - int __bulk; - git_oid id; - int visited; -} table_item; - -uint32_t hash_func(const void *key, int hash_id) -{ - uint32_t r; - const git_oid *id = key; - - memcpy(&r, id->id + (hash_id * sizeof(uint32_t)), sizeof(r)); - return r; -} - -int hash_cmpkey(const void *a, const void *b) -{ - return git_oid_cmp(a, b); -} - -BEGIN_TEST(table0, "create a new hashtable") - - git_hashtable *table = NULL; - - table = git_hashtable_alloc(55, hash_func, hash_cmpkey); - must_be_true(table != NULL); - must_be_true(table->size_mask + 1 == 64); - - git_hashtable_free(table); - -END_TEST - -BEGIN_TEST(table1, "fill the hashtable with random entries") - - const int objects_n = 32; - int i; - - table_item *objects; - git_hashtable *table = NULL; - - table = git_hashtable_alloc(objects_n * 2, hash_func, hash_cmpkey); - must_be_true(table != NULL); - - objects = git__malloc(objects_n * sizeof(table_item)); - memset(objects, 0x0, objects_n * sizeof(table_item)); - - /* populate the hash table */ - for (i = 0; i < objects_n; ++i) { - git_hash_buf(&(objects[i].id), &i, sizeof(int)); - must_pass(git_hashtable_insert(table, &(objects[i].id), &(objects[i]))); - } - - /* make sure all the inserted objects can be found */ - for (i = 0; i < objects_n; ++i) { - git_oid id; - table_item *ob; - - git_hash_buf(&id, &i, sizeof(int)); - ob = (table_item *)git_hashtable_lookup(table, &id); - - must_be_true(ob != NULL); - must_be_true(ob == &(objects[i])); - } - - /* make sure we cannot find inexisting objects */ - for (i = 0; i < 50; ++i) { - int hash_id; - git_oid id; - - hash_id = (rand() % 50000) + objects_n; - git_hash_buf(&id, &hash_id, sizeof(int)); - must_be_true(git_hashtable_lookup(table, &id) == NULL); - } - - git_hashtable_free(table); - free(objects); - -END_TEST - - -BEGIN_TEST(table2, "make sure the table resizes automatically") - - const int objects_n = 64; - int i; - unsigned int old_size; - table_item *objects; - git_hashtable *table = NULL; - - table = git_hashtable_alloc(objects_n, hash_func, hash_cmpkey); - must_be_true(table != NULL); - - objects = git__malloc(objects_n * sizeof(table_item)); - memset(objects, 0x0, objects_n * sizeof(table_item)); - - old_size = table->size_mask + 1; - - /* populate the hash table -- should be automatically resized */ - for (i = 0; i < objects_n; ++i) { - git_hash_buf(&(objects[i].id), &i, sizeof(int)); - must_pass(git_hashtable_insert(table, &(objects[i].id), &(objects[i]))); - } - - must_be_true(table->size_mask > old_size); - - /* make sure all the inserted objects can be found */ - for (i = 0; i < objects_n; ++i) { - git_oid id; - table_item *ob; - - git_hash_buf(&id, &i, sizeof(int)); - ob = (table_item *)git_hashtable_lookup(table, &id); - - must_be_true(ob != NULL); - must_be_true(ob == &(objects[i])); - } - - git_hashtable_free(table); - free(objects); - -END_TEST - -BEGIN_TEST(tableit0, "iterate through all the contents of the table") - - const int objects_n = 32; - int i; - table_item *objects, *ob; - const void *GIT_UNUSED(_unused); - - git_hashtable *table = NULL; - - table = git_hashtable_alloc(objects_n * 2, hash_func, hash_cmpkey); - must_be_true(table != NULL); - - objects = git__malloc(objects_n * sizeof(table_item)); - memset(objects, 0x0, objects_n * sizeof(table_item)); - - /* populate the hash table */ - for (i = 0; i < objects_n; ++i) { - git_hash_buf(&(objects[i].id), &i, sizeof(int)); - must_pass(git_hashtable_insert(table, &(objects[i].id), &(objects[i]))); - } - - GIT_HASHTABLE_FOREACH(table, _unused, ob, - ob->visited = 1; - ); - - /* make sure all nodes have been visited */ - for (i = 0; i < objects_n; ++i) - must_be_true(objects[i].visited); - - git_hashtable_free(table); - free(objects); -END_TEST - - -BEGIN_SUITE(hashtable) - ADD_TEST(table0); - ADD_TEST(table1); - ADD_TEST(table2); - ADD_TEST(tableit0); -END_SUITE - diff --git a/vendor/libgit2/tests/t08-tag.c b/vendor/libgit2/tests/t08-tag.c deleted file mode 100644 index b0d4af87b..000000000 --- a/vendor/libgit2/tests/t08-tag.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "tag.h" - -static const char *tag1_id = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"; -static const char *tag2_id = "7b4384978d2493e851f9cca7858815fac9b10980"; -static const char *tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; - -BEGIN_TEST(read0, "read and parse a tag from the repository") - git_repository *repo; - git_tag *tag1, *tag2; - git_commit *commit; - git_oid id1, id2, id_commit; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&id1, tag1_id); - git_oid_fromstr(&id2, tag2_id); - git_oid_fromstr(&id_commit, tagged_commit); - - must_pass(git_tag_lookup(&tag1, repo, &id1)); - - must_be_true(strcmp(git_tag_name(tag1), "test") == 0); - must_be_true(git_tag_type(tag1) == GIT_OBJ_TAG); - - must_pass(git_tag_target((git_object **)&tag2, tag1)); - must_be_true(tag2 != NULL); - - must_be_true(git_oid_cmp(&id2, git_tag_id(tag2)) == 0); - - must_pass(git_tag_target((git_object **)&commit, tag2)); - must_be_true(commit != NULL); - - must_be_true(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0); - - git_tag_close(tag1); - git_tag_close(tag2); - git_commit_close(commit); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(read1, "list all tag names from the repository") - git_repository *repo; - git_strarray tag_list; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_tag_list(&tag_list, repo)); - - must_be_true(tag_list.count == 3); - - git_strarray_free(&tag_list); - git_repository_free(repo); -END_TEST - -static int ensure_tag_pattern_match(git_repository *repo, const char *pattern, const size_t expected_matches) -{ - git_strarray tag_list; - int error = GIT_SUCCESS; - - if ((error = git_tag_list_match(&tag_list, pattern, repo)) < GIT_SUCCESS) - goto exit; - - if (tag_list.count != expected_matches) - error = GIT_ERROR; - -exit: - git_strarray_free(&tag_list); - return error; -} - -BEGIN_TEST(read2, "list all tag names from the repository matching a specified pattern") - git_repository *repo; - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(ensure_tag_pattern_match(repo, "", 3)); - must_pass(ensure_tag_pattern_match(repo, "*", 3)); - must_pass(ensure_tag_pattern_match(repo, "t*", 1)); - must_pass(ensure_tag_pattern_match(repo, "*b", 2)); - must_pass(ensure_tag_pattern_match(repo, "e", 0)); - must_pass(ensure_tag_pattern_match(repo, "e90810b", 1)); - must_pass(ensure_tag_pattern_match(repo, "e90810[ab]", 1)); - git_repository_free(repo); -END_TEST - - -#define TAGGER_NAME "Vicent Marti" -#define TAGGER_EMAIL "vicent@github.com" -#define TAGGER_MESSAGE "This is my tag.\n\nThere are many tags, but this one is mine\n" - -BEGIN_TEST(write0, "write a tag to the repository and read it again") - git_repository *repo; - git_tag *tag; - git_oid target_id, tag_id; - git_signature *tagger; - const git_signature *tagger1; - git_reference *ref_tag; - git_object *target; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&target_id, tagged_commit); - must_pass(git_object_lookup(&target, repo, &target_id, GIT_OBJ_COMMIT)); - - /* create signature */ - must_pass(git_signature_new(&tagger, TAGGER_NAME, TAGGER_EMAIL, 123456789, 60)); - - must_pass(git_tag_create( - &tag_id, /* out id */ - repo, - "the-tag", - target, - tagger, - TAGGER_MESSAGE, - 0)); - - git_object_close(target); - git_signature_free(tagger); - - must_pass(git_tag_lookup(&tag, repo, &tag_id)); - must_be_true(git_oid_cmp(git_tag_target_oid(tag), &target_id) == 0); - - /* Check attributes were set correctly */ - tagger1 = git_tag_tagger(tag); - must_be_true(tagger1 != NULL); - must_be_true(strcmp(tagger1->name, TAGGER_NAME) == 0); - must_be_true(strcmp(tagger1->email, TAGGER_EMAIL) == 0); - must_be_true(tagger1->when.time == 123456789); - must_be_true(tagger1->when.offset == 60); - - must_be_true(strcmp(git_tag_message(tag), TAGGER_MESSAGE) == 0); - - must_pass(git_reference_lookup(&ref_tag, repo, "refs/tags/the-tag")); - must_be_true(git_oid_cmp(git_reference_oid(ref_tag), &tag_id) == 0); - must_pass(git_reference_delete(ref_tag)); - - must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)tag)); - - git_tag_close(tag); - git_repository_free(repo); - -END_TEST - -BEGIN_TEST(write2, "Attempt to write a tag bearing the same name than an already existing tag") - git_repository *repo; - git_oid target_id, tag_id; - git_signature *tagger; - git_object *target; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&target_id, tagged_commit); - must_pass(git_object_lookup(&target, repo, &target_id, GIT_OBJ_COMMIT)); - - /* create signature */ - must_pass(git_signature_new(&tagger, TAGGER_NAME, TAGGER_EMAIL, 123456789, 60)); - - must_fail(git_tag_create( - &tag_id, /* out id */ - repo, - "e90810b", - target, - tagger, - TAGGER_MESSAGE, - 0)); - - git_object_close(target); - git_signature_free(tagger); - - git_repository_free(repo); - -END_TEST - -BEGIN_TEST(write3, "Replace an already existing tag") - git_repository *repo; - git_oid target_id, tag_id, old_tag_id; - git_signature *tagger; - git_reference *ref_tag; - git_object *target; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&target_id, tagged_commit); - must_pass(git_object_lookup(&target, repo, &target_id, GIT_OBJ_COMMIT)); - - must_pass(git_reference_lookup(&ref_tag, repo, "refs/tags/e90810b")); - git_oid_cpy(&old_tag_id, git_reference_oid(ref_tag)); - - /* create signature */ - must_pass(git_signature_new(&tagger, TAGGER_NAME, TAGGER_EMAIL, 123456789, 60)); - - must_pass(git_tag_create( - &tag_id, /* out id */ - repo, - "e90810b", - target, - tagger, - TAGGER_MESSAGE, - 1)); - - git_object_close(target); - git_signature_free(tagger); - - must_pass(git_reference_lookup(&ref_tag, repo, "refs/tags/e90810b")); - must_be_true(git_oid_cmp(git_reference_oid(ref_tag), &tag_id) == 0); - must_be_true(git_oid_cmp(git_reference_oid(ref_tag), &old_tag_id) != 0); - - close_temp_repo(repo); - -END_TEST - -BEGIN_TEST(write4, "write a lightweight tag to the repository and read it again") - git_repository *repo; - git_oid target_id, object_id; - git_reference *ref_tag; - git_object *target; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&target_id, tagged_commit); - must_pass(git_object_lookup(&target, repo, &target_id, GIT_OBJ_COMMIT)); - - must_pass(git_tag_create_lightweight( - &object_id, - repo, - "light-tag", - target, - 0)); - - git_object_close(target); - - must_be_true(git_oid_cmp(&object_id, &target_id) == 0); - - must_pass(git_reference_lookup(&ref_tag, repo, "refs/tags/light-tag")); - must_be_true(git_oid_cmp(git_reference_oid(ref_tag), &target_id) == 0); - - must_pass(git_tag_delete(repo, "light-tag")); - - git_repository_free(repo); -END_TEST - -BEGIN_TEST(write5, "Attempt to write a lightweight tag bearing the same name than an already existing tag") - git_repository *repo; - git_oid target_id, object_id, existing_object_id; - git_object *target; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&target_id, tagged_commit); - must_pass(git_object_lookup(&target, repo, &target_id, GIT_OBJ_COMMIT)); - - must_fail(git_tag_create_lightweight( - &object_id, - repo, - "e90810b", - target, - 0)); - - git_oid_fromstr(&existing_object_id, tag2_id); - must_be_true(git_oid_cmp(&object_id, &existing_object_id) == 0); - - git_object_close(target); - - git_repository_free(repo); -END_TEST - -BEGIN_TEST(delete0, "Delete an already existing tag") - git_repository *repo; - git_reference *ref_tag; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_tag_delete(repo, "e90810b")); - - must_fail(git_reference_lookup(&ref_tag, repo, "refs/tags/e90810b")); - - close_temp_repo(repo); -END_TEST - -BEGIN_SUITE(tag) - ADD_TEST(read0); - ADD_TEST(read1); - ADD_TEST(read2); - - ADD_TEST(write0); - ADD_TEST(write2); - ADD_TEST(write3); - ADD_TEST(write4); - ADD_TEST(write5); - - ADD_TEST(delete0); - -END_SUITE diff --git a/vendor/libgit2/tests/t09-tree.c b/vendor/libgit2/tests/t09-tree.c deleted file mode 100644 index 543aea8d4..000000000 --- a/vendor/libgit2/tests/t09-tree.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "tree.h" - -static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; - -static const char *blob_oid = "fa49b077972391ad58037050f2a75f74e3671e92"; -static const char *first_tree = "181037049a54a1eb5fab404658a3a250b44335d7"; -static const char *second_tree = "f60079018b664e4e79329a7ef9559c8d9e0378d1"; -static const char *third_tree = "eb86d8b81d6adbd5290a935d6c9976882de98488"; - -#if 0 -static int print_tree(git_repository *repo, const git_oid *tree_oid, int depth) -{ - static const char *indent = " "; - git_tree *tree; - unsigned int i; - - if (git_tree_lookup(&tree, repo, tree_oid) < GIT_SUCCESS) - return GIT_ERROR; - - for (i = 0; i < git_tree_entrycount(tree); ++i) { - const git_tree_entry *entry = git_tree_entry_byindex(tree, i); - char entry_oid[40]; - - git_oid_fmt(entry_oid, &entry->oid); - printf("%.*s%o [%.*s] %s\n", depth*2, indent, entry->attr, 40, entry_oid, entry->filename); - - if (entry->attr == S_IFDIR) { - if (print_tree(repo, &entry->oid, depth + 1) < GIT_SUCCESS) { - git_tree_close(tree); - return GIT_ERROR; - } - } - } - - git_tree_close(tree); - return GIT_SUCCESS; -} -#endif - -BEGIN_TEST(read0, "acces randomly the entries on a loaded tree") - git_oid id; - git_repository *repo; - git_tree *tree; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&id, tree_oid); - - must_pass(git_tree_lookup(&tree, repo, &id)); - - must_be_true(git_tree_entry_byname(tree, "README") != NULL); - must_be_true(git_tree_entry_byname(tree, "NOTEXISTS") == NULL); - must_be_true(git_tree_entry_byname(tree, "") == NULL); - must_be_true(git_tree_entry_byindex(tree, 0) != NULL); - must_be_true(git_tree_entry_byindex(tree, 2) != NULL); - must_be_true(git_tree_entry_byindex(tree, 3) == NULL); - must_be_true(git_tree_entry_byindex(tree, (unsigned int)-1) == NULL); - - git_tree_close(tree); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(read1, "read a tree from the repository") - git_oid id; - git_repository *repo; - git_tree *tree; - const git_tree_entry *entry; - git_object *obj; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - git_oid_fromstr(&id, tree_oid); - - must_pass(git_tree_lookup(&tree, repo, &id)); - - must_be_true(git_tree_entrycount(tree) == 3); - - /* GH-86: git_object_lookup() should also check the type if the object comes from the cache */ - must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_TREE) == 0); - must_be_true(obj != NULL); - git_object_close(obj); - obj = NULL; - must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_BLOB) == GIT_EINVALIDTYPE); - must_be_true(obj == NULL); - - entry = git_tree_entry_byname(tree, "README"); - must_be_true(entry != NULL); - - must_be_true(strcmp(git_tree_entry_name(entry), "README") == 0); - - must_pass(git_tree_entry_2object(&obj, repo, entry)); - must_be_true(obj != NULL); - - git_object_close(obj); - git_tree_close(tree); - git_repository_free(repo); -END_TEST - -#if 0 -BEGIN_TEST(write0, "write a tree from an index") - git_repository *repo; - git_index *index; - git_oid tree_oid; - - must_pass(git_repository_open(&repo, "/tmp/redtmp/.git")); - must_pass(git_repository_index(&index, repo)); - - must_pass(git_tree_create_fromindex(&tree_oid, index)); - must_pass(print_tree(repo, &tree_oid, 0)); - - git_repository_free(repo); -END_TEST -#endif - -BEGIN_TEST(write2, "write a tree from a memory") - git_repository *repo; - git_treebuilder *builder; - git_tree *tree; - git_oid id, bid, rid, id2; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - git_oid_fromstr(&id, first_tree); - git_oid_fromstr(&id2, second_tree); - git_oid_fromstr(&bid, blob_oid); - - //create a second tree from first tree using `git_treebuilder_insert` on REPOSITORY_FOLDER. - must_pass(git_tree_lookup(&tree, repo, &id)); - must_pass(git_treebuilder_create(&builder, tree)); - - must_fail(git_treebuilder_insert(NULL, builder, "", &bid, 0100644)); - must_fail(git_treebuilder_insert(NULL, builder, "/", &bid, 0100644)); - must_fail(git_treebuilder_insert(NULL, builder, "folder/new.txt", &bid, 0100644)); - - must_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644)); - must_pass(git_treebuilder_write(&rid,repo,builder)); - - must_be_true(git_oid_cmp(&rid, &id2) == 0); - - git_treebuilder_free(builder); - git_tree_close(tree); - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(write3, "write a hierarchical tree from a memory") - git_repository *repo; - git_treebuilder *builder; - git_tree *tree; - git_oid id, bid, subtree_id, id2, id3; - git_oid id_hiearar; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - git_oid_fromstr(&id, first_tree); - git_oid_fromstr(&id2, second_tree); - git_oid_fromstr(&id3, third_tree); - git_oid_fromstr(&bid, blob_oid); - - //create subtree - must_pass(git_treebuilder_create(&builder, NULL)); - must_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644)); - must_pass(git_treebuilder_write(&subtree_id,repo,builder)); - git_treebuilder_free(builder); - - // create parent tree - must_pass(git_tree_lookup(&tree, repo, &id)); - must_pass(git_treebuilder_create(&builder, tree)); - must_pass(git_treebuilder_insert(NULL,builder,"new",&subtree_id,040000)); - must_pass(git_treebuilder_write(&id_hiearar,repo,builder)); - git_treebuilder_free(builder); - git_tree_close(tree); - - must_be_true(git_oid_cmp(&id_hiearar, &id3) == 0); - - // check data is correct - must_pass(git_tree_lookup(&tree, repo, &id_hiearar)); - must_be_true(2 == git_tree_entrycount(tree)); - git_tree_close(tree); - - close_temp_repo(repo); - -END_TEST - -BEGIN_SUITE(tree) - //ADD_TEST(print0); - ADD_TEST(read0); - ADD_TEST(read1); - //ADD_TEST(write0); - //ADD_TEST(write1); - ADD_TEST(write2); - ADD_TEST(write3); -END_SUITE - diff --git a/vendor/libgit2/tests/t10-refs.c b/vendor/libgit2/tests/t10-refs.c deleted file mode 100644 index 65fbdd69f..000000000 --- a/vendor/libgit2/tests/t10-refs.c +++ /dev/null @@ -1,1152 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "repository.h" - -#include "git2/reflog.h" -#include "reflog.h" - -static const char *loose_tag_ref_name = "refs/tags/e90810b"; -static const char *non_existing_tag_ref_name = "refs/tags/i-do-not-exist"; - -BEGIN_TEST(readtag0, "lookup a loose tag reference") - git_repository *repo; - git_reference *reference; - git_object *object; - char ref_name_from_tag_name[GIT_REFNAME_MAX]; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&reference, repo, loose_tag_ref_name)); - must_be_true(reference->type & GIT_REF_OID); - must_be_true((reference->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(reference->name, loose_tag_ref_name) == 0); - - must_pass(git_object_lookup(&object, repo, git_reference_oid(reference), GIT_OBJ_ANY)); - must_be_true(object != NULL); - must_be_true(git_object_type(object) == GIT_OBJ_TAG); - - /* Ensure the name of the tag matches the name of the reference */ - git_path_join(ref_name_from_tag_name, GIT_REFS_TAGS_DIR, git_tag_name((git_tag *)object)); - must_be_true(strcmp(ref_name_from_tag_name, loose_tag_ref_name) == 0); - - git_object_close(object); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(readtag1, "lookup a loose tag reference that doesn't exist") - git_repository *repo; - git_reference *reference; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_fail(git_reference_lookup(&reference, repo, non_existing_tag_ref_name)); - - git_repository_free(repo); -END_TEST - -static const char *head_tracker_sym_ref_name = "head-tracker"; -static const char *current_head_target = "refs/heads/master"; -static const char *current_master_tip = "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"; - -BEGIN_TEST(readsym0, "lookup a symbolic reference") - git_repository *repo; - git_reference *reference, *resolved_ref; - git_object *object; - git_oid id; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&reference, repo, GIT_HEAD_FILE)); - must_be_true(reference->type & GIT_REF_SYMBOLIC); - must_be_true((reference->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(reference->name, GIT_HEAD_FILE) == 0); - - must_pass(git_reference_resolve(&resolved_ref, reference)); - must_be_true(resolved_ref->type == GIT_REF_OID); - - must_pass(git_object_lookup(&object, repo, git_reference_oid(resolved_ref), GIT_OBJ_ANY)); - must_be_true(object != NULL); - must_be_true(git_object_type(object) == GIT_OBJ_COMMIT); - - git_oid_fromstr(&id, current_master_tip); - must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0); - - git_object_close(object); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(readsym1, "lookup a nested symbolic reference") - git_repository *repo; - git_reference *reference, *resolved_ref; - git_object *object; - git_oid id; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&reference, repo, head_tracker_sym_ref_name)); - must_be_true(reference->type & GIT_REF_SYMBOLIC); - must_be_true((reference->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(reference->name, head_tracker_sym_ref_name) == 0); - - must_pass(git_reference_resolve(&resolved_ref, reference)); - must_be_true(resolved_ref->type == GIT_REF_OID); - - must_pass(git_object_lookup(&object, repo, git_reference_oid(resolved_ref), GIT_OBJ_ANY)); - must_be_true(object != NULL); - must_be_true(git_object_type(object) == GIT_OBJ_COMMIT); - - git_oid_fromstr(&id, current_master_tip); - must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0); - - git_object_close(object); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(readsym2, "lookup the HEAD and resolve the master branch") - git_repository *repo; - git_reference *reference, *resolved_ref, *comp_base_ref; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&reference, repo, head_tracker_sym_ref_name)); - must_pass(git_reference_resolve(&resolved_ref, reference)); - comp_base_ref = resolved_ref; - - must_pass(git_reference_lookup(&reference, repo, GIT_HEAD_FILE)); - must_pass(git_reference_resolve(&resolved_ref, reference)); - must_pass(git_oid_cmp(git_reference_oid(comp_base_ref), git_reference_oid(resolved_ref))); - - must_pass(git_reference_lookup(&reference, repo, current_head_target)); - must_pass(git_reference_resolve(&resolved_ref, reference)); - must_pass(git_oid_cmp(git_reference_oid(comp_base_ref), git_reference_oid(resolved_ref))); - - git_repository_free(repo); -END_TEST - -BEGIN_TEST(readsym3, "lookup the master branch and then the HEAD") - git_repository *repo; - git_reference *reference, *master_ref, *resolved_ref; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&master_ref, repo, current_head_target)); - must_pass(git_reference_lookup(&reference, repo, GIT_HEAD_FILE)); - - must_pass(git_reference_resolve(&resolved_ref, reference)); - must_pass(git_oid_cmp(git_reference_oid(master_ref), git_reference_oid(resolved_ref))); - - git_repository_free(repo); -END_TEST - -static const char *packed_head_name = "refs/heads/packed"; -static const char *packed_test_head_name = "refs/heads/packed-test"; - -BEGIN_TEST(readpacked0, "lookup a packed reference") - git_repository *repo; - git_reference *reference; - git_object *object; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&reference, repo, packed_head_name)); - must_be_true(reference->type & GIT_REF_OID); - must_be_true((reference->type & GIT_REF_PACKED) != 0); - must_be_true(strcmp(reference->name, packed_head_name) == 0); - - must_pass(git_object_lookup(&object, repo, git_reference_oid(reference), GIT_OBJ_ANY)); - must_be_true(object != NULL); - must_be_true(git_object_type(object) == GIT_OBJ_COMMIT); - - git_object_close(object); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(readpacked1, "assure that a loose reference is looked up before a packed reference") - git_repository *repo; - git_reference *reference; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_reference_lookup(&reference, repo, packed_head_name)); - must_pass(git_reference_lookup(&reference, repo, packed_test_head_name)); - must_be_true(reference->type & GIT_REF_OID); - must_be_true((reference->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(reference->name, packed_test_head_name) == 0); - - git_repository_free(repo); -END_TEST - -BEGIN_TEST(create0, "create a new symbolic reference") - git_reference *new_reference, *looked_up_ref, *resolved_ref; - git_repository *repo, *repo2; - git_oid id; - char ref_path[GIT_PATH_MAX]; - - const char *new_head_tracker = "another-head-tracker"; - - git_oid_fromstr(&id, current_master_tip); - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Retrieve the physical path to the symbolic ref for further cleaning */ - git_path_join(ref_path, repo->path_repository, new_head_tracker); - - /* Create and write the new symbolic reference */ - must_pass(git_reference_create_symbolic(&new_reference, repo, new_head_tracker, current_head_target, 0)); - - /* Ensure the reference can be looked-up... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, new_head_tracker)); - must_be_true(looked_up_ref->type & GIT_REF_SYMBOLIC); - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(looked_up_ref->name, new_head_tracker) == 0); - - /* ...peeled.. */ - must_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - must_be_true(resolved_ref->type == GIT_REF_OID); - - /* ...and that it points to the current master tip */ - must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0); - - git_repository_free(repo); - - /* Similar test with a fresh new repository */ - must_pass(git_repository_open(&repo2, TEMP_REPO_FOLDER)); - - must_pass(git_reference_lookup(&looked_up_ref, repo2, new_head_tracker)); - must_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0); - - close_temp_repo(repo2); -END_TEST - -BEGIN_TEST(create1, "create a deep symbolic reference") - git_reference *new_reference, *looked_up_ref, *resolved_ref; - git_repository *repo; - git_oid id; - char ref_path[GIT_PATH_MAX]; - - const char *new_head_tracker = "deep/rooted/tracker"; - - git_oid_fromstr(&id, current_master_tip); - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - git_path_join(ref_path, repo->path_repository, new_head_tracker); - must_pass(git_reference_create_symbolic(&new_reference, repo, new_head_tracker, current_head_target, 0)); - must_pass(git_reference_lookup(&looked_up_ref, repo, new_head_tracker)); - must_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); - must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(create2, "create a new OID reference") - git_reference *new_reference, *looked_up_ref; - git_repository *repo, *repo2; - git_oid id; - char ref_path[GIT_PATH_MAX]; - - const char *new_head = "refs/heads/new-head"; - - git_oid_fromstr(&id, current_master_tip); - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Retrieve the physical path to the symbolic ref for further cleaning */ - git_path_join(ref_path, repo->path_repository, new_head); - - /* Create and write the new object id reference */ - must_pass(git_reference_create_oid(&new_reference, repo, new_head, &id, 0)); - - /* Ensure the reference can be looked-up... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, new_head)); - must_be_true(looked_up_ref->type & GIT_REF_OID); - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(looked_up_ref->name, new_head) == 0); - - /* ...and that it points to the current master tip */ - must_be_true(git_oid_cmp(&id, git_reference_oid(looked_up_ref)) == 0); - - git_repository_free(repo); - - /* Similar test with a fresh new repository */ - must_pass(git_repository_open(&repo2, TEMP_REPO_FOLDER)); - - must_pass(git_reference_lookup(&looked_up_ref, repo2, new_head)); - must_be_true(git_oid_cmp(&id, git_reference_oid(looked_up_ref)) == 0); - - close_temp_repo(repo2); -END_TEST - -BEGIN_TEST(create3, "Can not create a new OID reference which targets at an unknown id") - git_reference *new_reference, *looked_up_ref; - git_repository *repo; - git_oid id; - - const char *new_head = "refs/heads/new-head"; - - git_oid_fromstr(&id, "deadbeef3f795b2b4353bcce3a527ad0a4f7f644"); - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - /* Create and write the new object id reference */ - must_fail(git_reference_create_oid(&new_reference, repo, new_head, &id, 0)); - - /* Ensure the reference can't be looked-up... */ - must_fail(git_reference_lookup(&looked_up_ref, repo, new_head)); - - git_repository_free(repo); -END_TEST - -static const char *ref_name = "refs/heads/other"; -static const char *ref_master_name = "refs/heads/master"; -static const char *ref_branch_name = "refs/heads/branch"; -static const char *ref_test_name = "refs/heads/test"; -BEGIN_TEST(overwrite0, "Overwrite an existing symbolic reference") - git_reference *ref, *branch_ref; - git_repository *repo; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* The target needds to exist and we need to check the name has changed */ - must_pass(git_reference_create_symbolic(&branch_ref, repo, ref_branch_name, ref_master_name, 0)); - must_pass(git_reference_create_symbolic(&ref, repo, ref_name, ref_branch_name, 0)); - /* Ensure it points to the right place*/ - must_pass(git_reference_lookup(&ref, repo, ref_name)); - must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC); - must_be_true(!strcmp(git_reference_target(ref), ref_branch_name)); - - /* Ensure we can't create it unless we force it to */ - must_fail(git_reference_create_symbolic(&ref, repo, ref_name, ref_master_name, 0)); - must_pass(git_reference_create_symbolic(&ref, repo, ref_name, ref_master_name, 1)); - - /* Ensure it points to the right place */ - must_pass(git_reference_lookup(&ref, repo, ref_name)); - must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC); - must_be_true(!strcmp(git_reference_target(ref), ref_master_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(overwrite1, "Overwrite an existing object id reference") - git_reference *ref; - git_repository *repo; - git_oid id; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&ref, repo, ref_master_name)); - must_be_true(ref->type & GIT_REF_OID); - git_oid_cpy(&id, git_reference_oid(ref)); - - /* Create it */ - must_pass(git_reference_create_oid(&ref, repo, ref_name, &id, 0)); - - must_pass(git_reference_lookup(&ref, repo, ref_test_name)); - must_be_true(ref->type & GIT_REF_OID); - git_oid_cpy(&id, git_reference_oid(ref)); - - /* Ensure we can't overwrite unless we force it */ - must_fail(git_reference_create_oid(&ref, repo, ref_name, &id, 0)); - must_pass(git_reference_create_oid(&ref, repo, ref_name, &id, 1)); - - /* Ensure it has been overwritten */ - must_pass(git_reference_lookup(&ref, repo, ref_name)); - must_be_true(!git_oid_cmp(&id, git_reference_oid(ref))); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symbolic one") - git_reference *ref; - git_repository *repo; - git_oid id; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&ref, repo, ref_master_name)); - must_be_true(ref->type & GIT_REF_OID); - git_oid_cpy(&id, git_reference_oid(ref)); - - must_pass(git_reference_create_oid(&ref, repo, ref_name, &id, 0)); - must_fail(git_reference_create_symbolic(&ref, repo, ref_name, ref_master_name, 0)); - must_pass(git_reference_create_symbolic(&ref, repo, ref_name, ref_master_name, 1)); - - /* Ensure it points to the right place */ - must_pass(git_reference_lookup(&ref, repo, ref_name)); - must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC); - must_be_true(!strcmp(git_reference_target(ref), ref_master_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object id one") - git_reference *ref; - git_repository *repo; - git_oid id; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&ref, repo, ref_master_name)); - must_be_true(ref->type & GIT_REF_OID); - git_oid_cpy(&id, git_reference_oid(ref)); - - /* Create the symbolic ref */ - must_pass(git_reference_create_symbolic(&ref, repo, ref_name, ref_master_name, 0)); - /* It shouldn't overwrite unless we tell it to */ - must_fail(git_reference_create_oid(&ref, repo, ref_name, &id, 0)); - must_pass(git_reference_create_oid(&ref, repo, ref_name, &id, 1)); - - /* Ensure it points to the right place */ - must_pass(git_reference_lookup(&ref, repo, ref_name)); - must_be_true(git_reference_type(ref) & GIT_REF_OID); - must_be_true(!git_oid_cmp(git_reference_oid(ref), &id)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(pack0, "create a packfile for an empty folder") - git_repository *repo; - char temp_path[GIT_PATH_MAX]; - const int mode = 0755; /* or 0777 ? */ - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - git_path_join_n(temp_path, 3, repo->path_repository, GIT_REFS_HEADS_DIR, "empty_dir"); - must_pass(git_futils_mkdir_r(temp_path, mode)); - - must_pass(git_reference_packall(repo)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(pack1, "create a packfile from all the loose rn a repo") - git_repository *repo; - git_reference *reference; - char temp_path[GIT_PATH_MAX]; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Ensure a known loose ref can be looked up */ - must_pass(git_reference_lookup(&reference, repo, loose_tag_ref_name)); - must_be_true((reference->type & GIT_REF_PACKED) == 0); - must_be_true(strcmp(reference->name, loose_tag_ref_name) == 0); - - /* - * We are now trying to pack also a loose reference - * called `points_to_blob`, to make sure we can properly - * pack weak tags - */ - must_pass(git_reference_packall(repo)); - - /* Ensure the packed-refs file exists */ - git_path_join(temp_path, repo->path_repository, GIT_PACKEDREFS_FILE); - must_pass(git_futils_exists(temp_path)); - - /* Ensure the known ref can still be looked up but is now packed */ - must_pass(git_reference_lookup(&reference, repo, loose_tag_ref_name)); - must_be_true((reference->type & GIT_REF_PACKED) != 0); - must_be_true(strcmp(reference->name, loose_tag_ref_name) == 0); - - /* Ensure the known ref has been removed from the loose folder structure */ - git_path_join(temp_path, repo->path_repository, loose_tag_ref_name); - must_pass(!git_futils_exists(temp_path)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename0, "rename a loose reference") - git_reference *looked_up_ref, *another_looked_up_ref; - git_repository *repo; - char temp_path[GIT_PATH_MAX]; - const char *new_name = "refs/tags/Nemo/knows/refs.kung-fu"; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Ensure the ref doesn't exist on the file system */ - git_path_join(temp_path, repo->path_repository, new_name); - must_pass(!git_futils_exists(temp_path)); - - /* Retrieval of the reference to rename */ - must_pass(git_reference_lookup(&looked_up_ref, repo, loose_tag_ref_name)); - - /* ... which is indeed loose */ - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* Now that the reference is renamed... */ - must_pass(git_reference_rename(looked_up_ref, new_name, 0)); - must_be_true(!strcmp(looked_up_ref->name, new_name)); - - /* ...It can't be looked-up with the old name... */ - must_fail(git_reference_lookup(&another_looked_up_ref, repo, loose_tag_ref_name)); - - /* ...but the new name works ok... */ - must_pass(git_reference_lookup(&another_looked_up_ref, repo, new_name)); - must_be_true(!strcmp(another_looked_up_ref->name, new_name)); - - /* .. the ref is still loose... */ - must_be_true((another_looked_up_ref->type & GIT_REF_PACKED) == 0); - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* ...and the ref can be found in the file system */ - git_path_join(temp_path, repo->path_repository, new_name); - must_pass(git_futils_exists(temp_path)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename1, "rename a packed reference (should make it loose)") - git_reference *looked_up_ref, *another_looked_up_ref; - git_repository *repo; - char temp_path[GIT_PATH_MAX]; - const char *brand_new_name = "refs/heads/brand_new_name"; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Ensure the ref doesn't exist on the file system */ - git_path_join(temp_path, repo->path_repository, packed_head_name); - must_pass(!git_futils_exists(temp_path)); - - /* The reference can however be looked-up... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - - /* .. and it's packed */ - must_be_true((looked_up_ref->type & GIT_REF_PACKED) != 0); - - /* Now that the reference is renamed... */ - must_pass(git_reference_rename(looked_up_ref, brand_new_name, 0)); - must_be_true(!strcmp(looked_up_ref->name, brand_new_name)); - - /* ...It can't be looked-up with the old name... */ - must_fail(git_reference_lookup(&another_looked_up_ref, repo, packed_head_name)); - - /* ...but the new name works ok... */ - must_pass(git_reference_lookup(&another_looked_up_ref, repo, brand_new_name)); - must_be_true(!strcmp(another_looked_up_ref->name, brand_new_name)); - - /* .. the ref is no longer packed... */ - must_be_true((another_looked_up_ref->type & GIT_REF_PACKED) == 0); - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* ...and the ref now happily lives in the file system */ - git_path_join(temp_path, repo->path_repository, brand_new_name); - must_pass(git_futils_exists(temp_path)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename2, "renaming a packed reference does not pack another reference which happens to be in both loose and pack state") - git_reference *looked_up_ref, *another_looked_up_ref; - git_repository *repo; - char temp_path[GIT_PATH_MAX]; - const char *brand_new_name = "refs/heads/brand_new_name"; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Ensure the other reference exists on the file system */ - git_path_join(temp_path, repo->path_repository, packed_test_head_name); - must_pass(git_futils_exists(temp_path)); - - /* Lookup the other reference */ - must_pass(git_reference_lookup(&another_looked_up_ref, repo, packed_test_head_name)); - - /* Ensure it's loose */ - must_be_true((another_looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* Lookup the reference to rename */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - - /* Ensure it's packed */ - must_be_true((looked_up_ref->type & GIT_REF_PACKED) != 0); - - /* Now that the reference is renamed... */ - must_pass(git_reference_rename(looked_up_ref, brand_new_name, 0)); - - /* Lookup the other reference */ - must_pass(git_reference_lookup(&another_looked_up_ref, repo, packed_test_head_name)); - - /* Ensure it's loose */ - must_be_true((another_looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* Ensure the other ref still exists on the file system */ - must_pass(git_futils_exists(temp_path)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename3, "can not rename a reference with the name of an existing reference") - git_reference *looked_up_ref; - git_repository *repo; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* An existing reference... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - - /* Can not be renamed to the name of another existing reference. */ - must_fail(git_reference_rename(looked_up_ref, packed_test_head_name, 0)); - - /* Failure to rename it hasn't corrupted its state */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - must_be_true(!strcmp(looked_up_ref->name, packed_head_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename4, "can not rename a reference with an invalid name") - git_reference *looked_up_ref; - git_repository *repo; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* An existing oid reference... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_test_head_name)); - - /* Can not be renamed with an invalid name. */ - must_fail(git_reference_rename(looked_up_ref, "Hello! I'm a very invalid name.", 0)); - - /* Can not be renamed outside of the refs hierarchy. */ - must_fail(git_reference_rename(looked_up_ref, "i-will-sudo-you", 0)); - - /* Failure to rename it hasn't corrupted its state */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_test_head_name)); - must_be_true(!strcmp(looked_up_ref->name, packed_test_head_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename5, "can force-rename a packed reference with the name of an existing loose and packed reference") - git_reference *looked_up_ref; - git_repository *repo; - git_oid oid; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* An existing reference... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - git_oid_cpy(&oid, git_reference_oid(looked_up_ref)); - - /* Can be force-renamed to the name of another existing reference. */ - must_pass(git_reference_rename(looked_up_ref, packed_test_head_name, 1)); - - /* Check we actually renamed it */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_test_head_name)); - must_be_true(!strcmp(looked_up_ref->name, packed_test_head_name)); - must_be_true(!git_oid_cmp(&oid, git_reference_oid(looked_up_ref))); - - /* And that the previous one doesn't exist any longer */ - must_fail(git_reference_lookup(&looked_up_ref, repo, packed_head_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(rename6, "can force-rename a loose reference with the name of an existing loose reference") - git_reference *looked_up_ref; - git_repository *repo; - git_oid oid; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* An existing reference... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, "refs/heads/br2")); - git_oid_cpy(&oid, git_reference_oid(looked_up_ref)); - - /* Can be force-renamed to the name of another existing reference. */ - must_pass(git_reference_rename(looked_up_ref, "refs/heads/test", 1)); - - /* Check we actually renamed it */ - must_pass(git_reference_lookup(&looked_up_ref, repo, "refs/heads/test")); - must_be_true(!strcmp(looked_up_ref->name, "refs/heads/test")); - must_be_true(!git_oid_cmp(&oid, git_reference_oid(looked_up_ref))); - - /* And that the previous one doesn't exist any longer */ - must_fail(git_reference_lookup(&looked_up_ref, repo, "refs/heads/br2")); - - close_temp_repo(repo); -END_TEST - -static const char *ref_one_name = "refs/heads/one/branch"; -static const char *ref_one_name_new = "refs/heads/two/branch"; -static const char *ref_two_name = "refs/heads/two"; - -BEGIN_TEST(rename7, "can not overwrite name of existing reference") - git_reference *ref, *ref_one, *ref_one_new, *ref_two; - git_repository *repo; - git_oid id; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&ref, repo, ref_master_name)); - must_be_true(ref->type & GIT_REF_OID); - - git_oid_cpy(&id, git_reference_oid(ref)); - - /* Create loose references */ - must_pass(git_reference_create_oid(&ref_one, repo, ref_one_name, &id, 0)); - must_pass(git_reference_create_oid(&ref_two, repo, ref_two_name, &id, 0)); - - /* Pack everything */ - must_pass(git_reference_packall(repo)); - - /* Attempt to create illegal reference */ - must_fail(git_reference_create_oid(&ref_one_new, repo, ref_one_name_new, &id, 0)); - - /* Illegal reference couldn't be created so this is supposed to fail */ - must_fail(git_reference_lookup(&ref_one_new, repo, ref_one_name_new)); - - close_temp_repo(repo); -END_TEST - -static const char *ref_two_name_new = "refs/heads/two/two"; - -BEGIN_TEST(rename8, "can be renamed to a new name prefixed with the old name") - git_reference *ref, *ref_two, *looked_up_ref; - git_repository *repo; - git_oid id; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - must_pass(git_reference_lookup(&ref, repo, ref_master_name)); - must_be_true(ref->type & GIT_REF_OID); - - git_oid_cpy(&id, git_reference_oid(ref)); - - /* Create loose references */ - must_pass(git_reference_create_oid(&ref_two, repo, ref_two_name, &id, 0)); - - /* An existing reference... */ - must_pass(git_reference_lookup(&looked_up_ref, repo, ref_two_name)); - - /* Can be rename to a new name starting with the old name. */ - must_pass(git_reference_rename(looked_up_ref, ref_two_name_new, 0)); - - /* Check we actually renamed it */ - must_pass(git_reference_lookup(&looked_up_ref, repo, ref_two_name_new)); - must_be_true(!strcmp(looked_up_ref->name, ref_two_name_new)); - must_fail(git_reference_lookup(&looked_up_ref, repo, ref_two_name)); - - close_temp_repo(repo); -END_TEST - -BEGIN_TEST(delete0, "deleting a ref which is both packed and loose should remove both tracks in the filesystem") - git_reference *looked_up_ref, *another_looked_up_ref; - git_repository *repo; - char temp_path[GIT_PATH_MAX]; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Ensure the loose reference exists on the file system */ - git_path_join(temp_path, repo->path_repository, packed_test_head_name); - must_pass(git_futils_exists(temp_path)); - - /* Lookup the reference */ - must_pass(git_reference_lookup(&looked_up_ref, repo, packed_test_head_name)); - - /* Ensure it's the loose version that has been found */ - must_be_true((looked_up_ref->type & GIT_REF_PACKED) == 0); - - /* Now that the reference is deleted... */ - must_pass(git_reference_delete(looked_up_ref)); - - /* Looking up the reference once again should not retrieve it */ - must_fail(git_reference_lookup(&another_looked_up_ref, repo, packed_test_head_name)); - - /* Ensure the loose reference doesn't exist any longer on the file system */ - must_pass(!git_futils_exists(temp_path)); - - close_temp_repo(repo); -END_TEST - -static int ensure_refname_normalized(int is_oid_ref, const char *input_refname, const char *expected_refname) -{ - int error = GIT_SUCCESS; - char buffer_out[GIT_REFNAME_MAX]; - - if (is_oid_ref) - error = git_reference__normalize_name_oid(buffer_out, sizeof(buffer_out), input_refname); - else - error = git_reference__normalize_name(buffer_out, sizeof(buffer_out), input_refname); - - if (error < GIT_SUCCESS) - return error; - - if (expected_refname == NULL) - return error; - - if (strcmp(buffer_out, expected_refname)) - error = GIT_ERROR; - - return error; -} - -#define OID_REF 1 -#define SYM_REF 0 - -BEGIN_TEST(normalize0, "normalize a direct (OID) reference name") - must_fail(ensure_refname_normalized(OID_REF, "a", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/a/", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/a.", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/a.lock", NULL)); - must_pass(ensure_refname_normalized(OID_REF, "refs/dummy/a", NULL)); - must_pass(ensure_refname_normalized(OID_REF, "refs/stash", NULL)); - must_pass(ensure_refname_normalized(OID_REF, "refs/tags/a", "refs/tags/a")); - must_pass(ensure_refname_normalized(OID_REF, "refs/heads/a/b", "refs/heads/a/b")); - must_pass(ensure_refname_normalized(OID_REF, "refs/heads/a./b", "refs/heads/a./b")); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/foo?bar", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads\foo", NULL)); - must_pass(ensure_refname_normalized(OID_REF, "refs/heads/v@ation", "refs/heads/v@ation")); - must_pass(ensure_refname_normalized(OID_REF, "refs///heads///a", "refs/heads/a")); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/.a/b", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/foo/../bar", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/foo..bar", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/./foo", NULL)); - must_fail(ensure_refname_normalized(OID_REF, "refs/heads/v@{ation", NULL)); -END_TEST - -BEGIN_TEST(normalize1, "normalize a symbolic reference name") - must_pass(ensure_refname_normalized(SYM_REF, "a", "a")); - must_pass(ensure_refname_normalized(SYM_REF, "a/b", "a/b")); - must_pass(ensure_refname_normalized(SYM_REF, "refs///heads///a", "refs/heads/a")); - must_fail(ensure_refname_normalized(SYM_REF, "", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "heads\foo", NULL)); -END_TEST - -/* Ported from JGit, BSD licence. - * See https://github.com/spearce/JGit/commit/e4bf8f6957bbb29362575d641d1e77a02d906739 */ -BEGIN_TEST(normalize2, "tests borrowed from JGit") - -/* EmptyString */ - must_fail(ensure_refname_normalized(SYM_REF, "", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "/", NULL)); - -/* MustHaveTwoComponents */ - must_fail(ensure_refname_normalized(OID_REF, "master", NULL)); - must_pass(ensure_refname_normalized(SYM_REF, "heads/master", "heads/master")); - -/* ValidHead */ - - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/master", "refs/heads/master")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/pu", "refs/heads/pu")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/z", "refs/heads/z")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/FoO", "refs/heads/FoO")); - -/* ValidTag */ - must_pass(ensure_refname_normalized(SYM_REF, "refs/tags/v1.0", "refs/tags/v1.0")); - -/* NoLockSuffix */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master.lock", NULL)); - -/* NoDirectorySuffix */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master/", NULL)); - -/* NoSpace */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/i haz space", NULL)); - -/* NoAsciiControlCharacters */ - { - char c; - char buffer[GIT_REFNAME_MAX]; - for (c = '\1'; c < ' '; c++) { - strncpy(buffer, "refs/heads/mast", 15); - strncpy(buffer + 15, (const char *)&c, 1); - strncpy(buffer + 16, "er", 2); - buffer[18 - 1] = '\0'; - must_fail(ensure_refname_normalized(SYM_REF, buffer, NULL)); - } - } - -/* NoBareDot */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/.", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/..", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/./master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/../master", NULL)); - -/* NoLeadingOrTrailingDot */ - must_fail(ensure_refname_normalized(SYM_REF, ".", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/.bar", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/..bar", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/bar.", NULL)); - -/* ContainsDot */ - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/m.a.s.t.e.r", "refs/heads/m.a.s.t.e.r")); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master..pu", NULL)); - -/* NoMagicRefCharacters */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master^", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/^master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "^refs/heads/master", NULL)); - - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master~", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/~master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "~refs/heads/master", NULL)); - - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master:", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/:master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, ":refs/heads/master", NULL)); - -/* ShellGlob */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master?", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/?master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "?refs/heads/master", NULL)); - - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master[", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/[master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "[refs/heads/master", NULL)); - - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master*", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/*master", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "*refs/heads/master", NULL)); - -/* ValidSpecialCharacters */ - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/!", "refs/heads/!")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/\"", "refs/heads/\"")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/#", "refs/heads/#")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/$", "refs/heads/$")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/%", "refs/heads/%")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/&", "refs/heads/&")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/'", "refs/heads/'")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/(", "refs/heads/(")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/)", "refs/heads/)")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/+", "refs/heads/+")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/,", "refs/heads/,")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/-", "refs/heads/-")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/;", "refs/heads/;")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/<", "refs/heads/<")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/=", "refs/heads/=")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/>", "refs/heads/>")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/@", "refs/heads/@")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/]", "refs/heads/]")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/_", "refs/heads/_")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/`", "refs/heads/`")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/{", "refs/heads/{")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/|", "refs/heads/|")); - must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/}", "refs/heads/}")); - - // This is valid on UNIX, but not on Windows - // hence we make in invalid due to non-portability - // - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/\\", NULL)); - -/* UnicodeNames */ - /* - * Currently this fails. - * must_pass(ensure_refname_normalized(SYM_REF, "refs/heads/\u00e5ngstr\u00f6m", "refs/heads/\u00e5ngstr\u00f6m")); - */ - -/* RefLogQueryIsValidRef */ - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master@{1}", NULL)); - must_fail(ensure_refname_normalized(SYM_REF, "refs/heads/master@{1.hour.ago}", NULL)); -END_TEST - -BEGIN_TEST(list0, "try to list all the references in our test repo") - git_repository *repo; - git_strarray ref_list; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_reference_listall(&ref_list, repo, GIT_REF_LISTALL)); - - /*{ - unsigned short i; - for (i = 0; i < ref_list.count; ++i) - printf("# %s\n", ref_list.strings[i]); - }*/ - - /* We have exactly 8 refs in total if we include the packed ones: - * there is a reference that exists both in the packfile and as - * loose, but we only list it once */ - must_be_true(ref_list.count == 8); - - git_strarray_free(&ref_list); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(list1, "try to list only the symbolic references") - git_repository *repo; - git_strarray ref_list; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_reference_listall(&ref_list, repo, GIT_REF_SYMBOLIC)); - must_be_true(ref_list.count == 0); /* no symrefs in the test repo */ - - git_strarray_free(&ref_list); - git_repository_free(repo); -END_TEST - -static const char *new_ref = "refs/heads/test-reflog"; -#define commit_msg "commit: bla bla" - -static int assert_signature(git_signature *expected, git_signature *actual) -{ - if (actual == NULL) - return GIT_ERROR; - - if (strcmp(expected->name, actual->name) != 0) - return GIT_ERROR; - - if (strcmp(expected->email, actual->email) != 0) - return GIT_ERROR; - - if (expected->when.offset != actual->when.offset) - return GIT_ERROR; - - if (expected->when.time != actual->when.time) - return GIT_ERROR; - - return GIT_SUCCESS; -} - -BEGIN_TEST(reflog0, "write a reflog for a given reference and ensure it can be read back") - git_repository *repo, *repo2; - git_reference *ref, *lookedup_ref; - git_oid oid; - git_signature *committer; - git_reflog *reflog; - git_reflog_entry *entry; - char oid_str[GIT_OID_HEXSZ+1]; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Create a new branch pointing at the HEAD */ - git_oid_fromstr(&oid, current_master_tip); - must_pass(git_reference_create_oid(&ref, repo, new_ref, &oid, 0)); - must_pass(git_reference_lookup(&ref, repo, new_ref)); - - must_pass(git_signature_now(&committer, "foo", "foo@bar")); - - must_pass(git_reflog_write(ref, NULL, committer, NULL)); - must_fail(git_reflog_write(ref, NULL, committer, "no ancestor NULL for an existing reflog")); - must_fail(git_reflog_write(ref, NULL, committer, "no\nnewline")); - must_pass(git_reflog_write(ref, &oid, committer, commit_msg)); - - git_repository_free(repo); - - /* Reopen a new instance of the repository */ - must_pass(git_repository_open(&repo2, TEMP_REPO_FOLDER)); - - /* Lookup the preivously created branch */ - must_pass(git_reference_lookup(&lookedup_ref, repo2, new_ref)); - - /* Read and parse the reflog for this branch */ - must_pass(git_reflog_read(&reflog, lookedup_ref)); - must_be_true(reflog->entries.length == 2); - - entry = (git_reflog_entry *)git_vector_get(&reflog->entries, 0); - must_pass(assert_signature(committer, entry->committer)); - git_oid_to_string(oid_str, GIT_OID_HEXSZ+1, &entry->oid_old); - must_be_true(strcmp("0000000000000000000000000000000000000000", oid_str) == 0); - git_oid_to_string(oid_str, GIT_OID_HEXSZ+1, &entry->oid_cur); - must_be_true(strcmp(current_master_tip, oid_str) == 0); - must_be_true(entry->msg == NULL); - - entry = (git_reflog_entry *)git_vector_get(&reflog->entries, 1); - must_pass(assert_signature(committer, entry->committer)); - git_oid_to_string(oid_str, GIT_OID_HEXSZ+1, &entry->oid_old); - must_be_true(strcmp(current_master_tip, oid_str) == 0); - git_oid_to_string(oid_str, GIT_OID_HEXSZ+1, &entry->oid_cur); - must_be_true(strcmp(current_master_tip, oid_str) == 0); - must_be_true(strcmp(commit_msg, entry->msg) == 0); - - git_signature_free(committer); - git_reflog_free(reflog); - close_temp_repo(repo2); -END_TEST - -BEGIN_TEST(reflog1, "avoid writing an obviously wrong reflog") - git_repository *repo; - git_reference *ref; - git_oid oid; - git_signature *committer; - - must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER)); - - /* Create a new branch pointing at the HEAD */ - git_oid_fromstr(&oid, current_master_tip); - must_pass(git_reference_create_oid(&ref, repo, new_ref, &oid, 0)); - must_pass(git_reference_lookup(&ref, repo, new_ref)); - - must_pass(git_signature_now(&committer, "foo", "foo@bar")); - - /* Write the reflog for the new branch */ - must_pass(git_reflog_write(ref, NULL, committer, NULL)); - - /* Try to update the reflog with wrong information: - * It's no new reference, so the ancestor OID cannot - * be NULL. */ - must_fail(git_reflog_write(ref, NULL, committer, NULL)); - - git_signature_free(committer); - - close_temp_repo(repo); -END_TEST - -BEGIN_SUITE(refs) - ADD_TEST(readtag0); - ADD_TEST(readtag1); - - ADD_TEST(readsym0); - ADD_TEST(readsym1); - ADD_TEST(readsym2); - ADD_TEST(readsym3); - - ADD_TEST(readpacked0); - ADD_TEST(readpacked1); - - ADD_TEST(create0); - ADD_TEST(create1); - ADD_TEST(create2); - ADD_TEST(create3); - - ADD_TEST(overwrite0); - ADD_TEST(overwrite1); - ADD_TEST(overwrite2); - ADD_TEST(overwrite3); - - ADD_TEST(normalize0); - ADD_TEST(normalize1); - ADD_TEST(normalize2); - - ADD_TEST(pack0); - ADD_TEST(pack1); - - ADD_TEST(rename0); - ADD_TEST(rename1); - ADD_TEST(rename2); - ADD_TEST(rename3); - ADD_TEST(rename4); - ADD_TEST(rename5); - ADD_TEST(rename6); - ADD_TEST(rename7); - ADD_TEST(rename8); - - ADD_TEST(delete0); - - ADD_TEST(list0); - ADD_TEST(list1); - - ADD_TEST(reflog0); - ADD_TEST(reflog1); -END_SUITE diff --git a/vendor/libgit2/tests/t11-sqlite.c b/vendor/libgit2/tests/t11-sqlite.c deleted file mode 100644 index 61ecf98ac..000000000 --- a/vendor/libgit2/tests/t11-sqlite.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "odb.h" - -#ifdef GIT2_SQLITE_BACKEND -#include "t03-data.h" -#include "fileops.h" -#include "git2/odb_backend.h" - - -static int cmp_objects(git_odb_object *odb_obj, git_rawobj *raw) -{ - if (raw->type != git_odb_object_type(odb_obj)) - return -1; - - if (raw->len != git_odb_object_size(odb_obj)) - return -1; - - if ((raw->len > 0) && (memcmp(raw->data, git_odb_object_data(odb_obj), raw->len) != 0)) - return -1; - - return 0; -} - -static git_odb *open_sqlite_odb(void) -{ - git_odb *odb; - git_odb_backend *sqlite; - - if (git_odb_new(&odb) < GIT_SUCCESS) - return NULL; - - if (git_odb_backend_sqlite(&sqlite, ":memory") < GIT_SUCCESS) - return NULL; - - if (git_odb_add_backend(odb, sqlite, 0) < GIT_SUCCESS) - return NULL; - - return odb; -} - -#define TEST_WRITE(PTR) {\ - git_odb *db; \ - git_oid id1, id2; \ - git_odb_object *obj; \ - db = open_sqlite_odb(); \ - must_be_true(db != NULL); \ - must_pass(git_oid_mkstr(&id1, PTR.id)); \ - must_pass(git_odb_write(&id2, db, PTR##_obj.data, PTR##_obj.len, PTR##_obj.type)); \ - must_be_true(git_oid_cmp(&id1, &id2) == 0); \ - must_pass(git_odb_read(&obj, db, &id1)); \ - must_pass(cmp_objects(obj, &PTR##_obj)); \ - git_odb_object_close(obj); \ - git_odb_close(db); \ -} - -BEGIN_TEST(sqlite0, "write a commit, read it back (sqlite backend)") - TEST_WRITE(commit); -END_TEST - -BEGIN_TEST(sqlite1, "write a tree, read it back (sqlite backend)") - TEST_WRITE(tree); -END_TEST - -BEGIN_TEST(sqlite2, "write a tag, read it back (sqlite backend)") - TEST_WRITE(tag); -END_TEST - -BEGIN_TEST(sqlite3, "write a zero-byte entry, read it back (sqlite backend)") - TEST_WRITE(zero); -END_TEST - -BEGIN_TEST(sqlite4, "write a one-byte entry, read it back (sqlite backend)") - TEST_WRITE(one); -END_TEST - -BEGIN_TEST(sqlite5, "write a two-byte entry, read it back (sqlite backend)") - TEST_WRITE(two); -END_TEST - -BEGIN_TEST(sqlite6, "write some bytes in an entry, read it back (sqlite backend)") - TEST_WRITE(some); -END_TEST - - -BEGIN_SUITE(sqlite) - ADD_TEST(sqlite0); - ADD_TEST(sqlite1); - ADD_TEST(sqlite2); - ADD_TEST(sqlite3); - ADD_TEST(sqlite4); - ADD_TEST(sqlite5); - ADD_TEST(sqlite6); -END_SUITE - -#else /* no sqlite builtin */ -BEGIN_SUITE(sqlite) - /* empty */ -END_SUITE -#endif - - - diff --git a/vendor/libgit2/tests/t12-repo.c b/vendor/libgit2/tests/t12-repo.c deleted file mode 100644 index cc8942f40..000000000 --- a/vendor/libgit2/tests/t12-repo.c +++ /dev/null @@ -1,463 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include "odb.h" -#include "git2/odb_backend.h" -#include "repository.h" - -typedef struct { - git_odb_backend base; - int position; -} fake_backend; - -git_odb_backend *new_backend(int position) -{ - fake_backend *b; - - b = git__malloc(sizeof(fake_backend)); - if (b == NULL) - return NULL; - - memset(b, 0x0, sizeof(fake_backend)); - b->position = position; - return (git_odb_backend *)b; -} - -int test_backend_sorting(git_odb *odb) -{ - unsigned int i; - - for (i = 0; i < odb->backends.length; ++i) { - fake_backend *internal = *((fake_backend **)git_vector_get(&odb->backends, i)); - - if (internal == NULL) - return GIT_ERROR; - - if (internal->position != (int)i) - return GIT_ERROR; - } - - return GIT_SUCCESS; -} - -BEGIN_TEST(odb0, "assure that ODB backends are properly sorted") - git_odb *odb; - must_pass(git_odb_new(&odb)); - must_pass(git_odb_add_backend(odb, new_backend(0), 5)); - must_pass(git_odb_add_backend(odb, new_backend(2), 3)); - must_pass(git_odb_add_backend(odb, new_backend(1), 4)); - must_pass(git_odb_add_backend(odb, new_backend(3), 1)); - must_pass(test_backend_sorting(odb)); - git_odb_close(odb); -END_TEST - -BEGIN_TEST(odb1, "assure that alternate backends are properly sorted") - git_odb *odb; - must_pass(git_odb_new(&odb)); - must_pass(git_odb_add_backend(odb, new_backend(0), 5)); - must_pass(git_odb_add_backend(odb, new_backend(2), 3)); - must_pass(git_odb_add_backend(odb, new_backend(1), 4)); - must_pass(git_odb_add_backend(odb, new_backend(3), 1)); - must_pass(git_odb_add_alternate(odb, new_backend(4), 5)); - must_pass(git_odb_add_alternate(odb, new_backend(6), 3)); - must_pass(git_odb_add_alternate(odb, new_backend(5), 4)); - must_pass(git_odb_add_alternate(odb, new_backend(7), 1)); - must_pass(test_backend_sorting(odb)); - git_odb_close(odb); -END_TEST - - -#define STANDARD_REPOSITORY 0 -#define BARE_REPOSITORY 1 - -static int ensure_repository_init( - const char *working_directory, - int repository_kind, - const char *expected_path_index, - const char *expected_path_repository, - const char *expected_working_directory) -{ - char path_odb[GIT_PATH_MAX]; - git_repository *repo; - - if (git_futils_isdir(working_directory) == GIT_SUCCESS) - return GIT_ERROR; - - git_path_join(path_odb, expected_path_repository, GIT_OBJECTS_DIR); - - if (git_repository_init(&repo, working_directory, repository_kind) < GIT_SUCCESS) - return GIT_ERROR; - - if (repo->path_workdir != NULL || expected_working_directory != NULL) { - if (git__suffixcmp(repo->path_workdir, expected_working_directory) != 0) - goto cleanup; - } - - if (git__suffixcmp(repo->path_odb, path_odb) != 0) - goto cleanup; - - if (git__suffixcmp(repo->path_repository, expected_path_repository) != 0) - goto cleanup; - - if (repo->path_index != NULL || expected_path_index != NULL) { - if (git__suffixcmp(repo->path_index, expected_path_index) != 0) - goto cleanup; - -#ifdef GIT_WIN32 - if ((GetFileAttributes(repo->path_repository) & FILE_ATTRIBUTE_HIDDEN) == 0) - goto cleanup; -#endif - - if (git_repository_is_bare(repo) == 1) - goto cleanup; - } else if (git_repository_is_bare(repo) == 0) - goto cleanup; - - if (git_repository_is_empty(repo) == 0) - goto cleanup; - - git_repository_free(repo); - git_futils_rmdir_r(working_directory, 1); - - return GIT_SUCCESS; - -cleanup: - git_repository_free(repo); - git_futils_rmdir_r(working_directory, 1); - return GIT_ERROR; -} - -BEGIN_TEST(init0, "initialize a standard repo") - char path_index[GIT_PATH_MAX], path_repository[GIT_PATH_MAX]; - - git_path_join(path_repository, TEMP_REPO_FOLDER, GIT_DIR); - git_path_join(path_index, path_repository, GIT_INDEX_FILE); - - must_pass(ensure_repository_init(TEMP_REPO_FOLDER, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); - must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); -END_TEST - -BEGIN_TEST(init1, "initialize a bare repo") - char path_repository[GIT_PATH_MAX]; - - git_path_join(path_repository, TEMP_REPO_FOLDER, ""); - - must_pass(ensure_repository_init(TEMP_REPO_FOLDER, BARE_REPOSITORY, NULL, path_repository, NULL)); - must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, BARE_REPOSITORY, NULL, path_repository, NULL)); -END_TEST - -BEGIN_TEST(init2, "Initialize and open a bare repo with a relative path escaping out of the current working directory") - char path_repository[GIT_PATH_MAX]; - char current_workdir[GIT_PATH_MAX]; - const int mode = 0755; /* or 0777 ? */ - git_repository* repo; - - must_pass(p_getcwd(current_workdir, sizeof(current_workdir))); - - git_path_join(path_repository, TEMP_REPO_FOLDER, "a/b/c/"); - must_pass(git_futils_mkdir_r(path_repository, mode)); - - must_pass(chdir(path_repository)); - - must_pass(git_repository_init(&repo, "../d/e.git", 1)); - must_pass(git__suffixcmp(repo->path_repository, "/a/b/d/e.git/")); - - git_repository_free(repo); - - must_pass(git_repository_open(&repo, "../d/e.git")); - - git_repository_free(repo); - - must_pass(chdir(current_workdir)); - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); -END_TEST - -#define EMPTY_BARE_REPOSITORY_FOLDER TEST_RESOURCES "/empty_bare.git/" - -BEGIN_TEST(open0, "Open a bare repository that has just been initialized by git") - git_repository *repo; - - must_pass(copydir_recurs(EMPTY_BARE_REPOSITORY_FOLDER, TEMP_REPO_FOLDER)); - must_pass(remove_placeholders(TEMP_REPO_FOLDER, "dummy-marker.txt")); - - must_pass(git_repository_open(&repo, TEMP_REPO_FOLDER)); - must_be_true(git_repository_path(repo, GIT_REPO_PATH) != NULL); - must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) == NULL); - - git_repository_free(repo); - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); -END_TEST - -#define EMPTY_REPOSITORY_FOLDER TEST_RESOURCES "/empty_standard_repo/.gitted/" - -BEGIN_TEST(open1, "Open a standard repository that has just been initialized by git") - git_repository *repo; - - must_pass(copydir_recurs(EMPTY_REPOSITORY_FOLDER, TEST_STD_REPO_FOLDER)); - must_pass(remove_placeholders(TEST_STD_REPO_FOLDER, "dummy-marker.txt")); - - must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); - must_be_true(git_repository_path(repo, GIT_REPO_PATH) != NULL); - must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) != NULL); - - git_repository_free(repo); - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); -END_TEST - - -BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of the current working directory") - char new_current_workdir[GIT_PATH_MAX]; - char current_workdir[GIT_PATH_MAX]; - char path_repository[GIT_PATH_MAX]; - - const int mode = 0755; /* or 0777 ? */ - git_repository* repo; - - /* Setup the repository to open */ - must_pass(p_getcwd(current_workdir, sizeof(current_workdir))); - strcpy(path_repository, current_workdir); - git_path_join_n(path_repository, 3, path_repository, TEMP_REPO_FOLDER, "a/d/e.git"); - must_pass(copydir_recurs(REPOSITORY_FOLDER, path_repository)); - - /* Change the current working directory */ - git_path_join(new_current_workdir, TEMP_REPO_FOLDER, "a/b/c/"); - must_pass(git_futils_mkdir_r(new_current_workdir, mode)); - must_pass(chdir(new_current_workdir)); - - must_pass(git_repository_open(&repo, "../../d/e.git")); - - git_repository_free(repo); - - must_pass(chdir(current_workdir)); - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); -END_TEST - -BEGIN_TEST(empty0, "test if a repository is empty or not") - - git_repository *repo_empty, *repo_normal; - - must_pass(git_repository_open(&repo_normal, REPOSITORY_FOLDER)); - must_be_true(git_repository_is_empty(repo_normal) == 0); - git_repository_free(repo_normal); - - must_pass(git_repository_open(&repo_empty, EMPTY_BARE_REPOSITORY_FOLDER)); - must_be_true(git_repository_is_empty(repo_empty) == 1); - git_repository_free(repo_empty); -END_TEST - -BEGIN_TEST(detached0, "test if HEAD is detached") - git_repository *repo; - git_reference *ref; - git_oid oid; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_be_true(git_repository_head_detached(repo) == 0); - - /* detach the HEAD */ - git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd"); - must_pass(git_reference_create_oid(&ref, repo, "HEAD", &oid, 1)); - must_be_true(git_repository_head_detached(repo) == 1); - - /* take the reop back to it's original state */ - must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); - must_be_true(git_repository_head_detached(repo) == 0); - - git_repository_free(repo); -END_TEST - -BEGIN_TEST(orphan0, "test if HEAD is orphan") - git_repository *repo; - git_reference *ref; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - - must_be_true(git_repository_head_orphan(repo) == 0); - - /* orphan HEAD */ - must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/orphan", 1)); - must_be_true(git_repository_head_orphan(repo) == 1); - - /* take the reop back to it's original state */ - must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); - must_be_true(git_repository_head_orphan(repo) == 0); - - git_repository_free(repo); -END_TEST - -#define DISCOVER_FOLDER TEMP_REPO_FOLDER "discover.git" - -#define SUB_REPOSITORY_FOLDER_NAME "sub_repo" -#define SUB_REPOSITORY_FOLDER DISCOVER_FOLDER "/" SUB_REPOSITORY_FOLDER_NAME -#define SUB_REPOSITORY_FOLDER_SUB SUB_REPOSITORY_FOLDER "/sub" -#define SUB_REPOSITORY_FOLDER_SUB_SUB SUB_REPOSITORY_FOLDER_SUB "/subsub" -#define SUB_REPOSITORY_FOLDER_SUB_SUB_SUB SUB_REPOSITORY_FOLDER_SUB_SUB "/subsubsub" - -#define REPOSITORY_ALTERNATE_FOLDER DISCOVER_FOLDER "/alternate_sub_repo" -#define REPOSITORY_ALTERNATE_FOLDER_SUB REPOSITORY_ALTERNATE_FOLDER "/sub" -#define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB "/subsub" -#define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/subsubsub" - -#define ALTERNATE_MALFORMED_FOLDER1 DISCOVER_FOLDER "/alternate_malformed_repo1" -#define ALTERNATE_MALFORMED_FOLDER2 DISCOVER_FOLDER "/alternate_malformed_repo2" -#define ALTERNATE_MALFORMED_FOLDER3 DISCOVER_FOLDER "/alternate_malformed_repo3" -#define ALTERNATE_NOT_FOUND_FOLDER DISCOVER_FOLDER "/alternate_not_found_repo" - -static int ensure_repository_discover(const char *start_path, const char *ceiling_dirs, const char *expected_path) -{ - int error; - char found_path[GIT_PATH_MAX]; - - error = git_repository_discover(found_path, sizeof(found_path), start_path, 0, ceiling_dirs); - //across_fs is always 0 as we can't automate the filesystem change tests - - if (error < GIT_SUCCESS) - return error; - - return strcmp(found_path, expected_path) ? GIT_ERROR : GIT_SUCCESS; -} - -static int write_file(const char *path, const char *content) -{ - int error; - git_file file; - - if (git_futils_exists(path) == GIT_SUCCESS) { - error = p_unlink(path); - - if (error < GIT_SUCCESS) - return error; - } - - file = git_futils_creat_withpath(path, 0644); - if (file < GIT_SUCCESS) - return file; - - error = p_write(file, content, strlen(content) * sizeof(char)); - - p_close(file); - - return error; -} - -//no check is performed on ceiling_dirs length, so be sure it's long enough -static int append_ceiling_dir(char *ceiling_dirs, const char *path) -{ - int len = strlen(ceiling_dirs); - int error; - - error = git_path_prettify_dir(ceiling_dirs + len + (len ? 1 : 0), path, NULL); - if (error < GIT_SUCCESS) - return git__rethrow(error, "Failed to append ceiling directory."); - - if (len) - ceiling_dirs[len] = GIT_PATH_LIST_SEPARATOR; - - return GIT_SUCCESS; -} - -BEGIN_TEST(discover0, "test discover") - git_repository *repo; - char ceiling_dirs[GIT_PATH_MAX * 2] = ""; - char repository_path[GIT_PATH_MAX]; - char sub_repository_path[GIT_PATH_MAX]; - char found_path[GIT_PATH_MAX]; - int mode = 0755; - - git_futils_mkdir_r(DISCOVER_FOLDER, mode); - must_pass(append_ceiling_dir(ceiling_dirs, TEMP_REPO_FOLDER)); - - must_be_true(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs) == GIT_ENOTAREPO); - - must_pass(git_repository_init(&repo, DISCOVER_FOLDER, 1)); - must_pass(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs)); - git_repository_free(repo); - - must_pass(git_repository_init(&repo, SUB_REPOSITORY_FOLDER, 0)); - must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); - must_pass(git_repository_discover(sub_repository_path, sizeof(sub_repository_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); - - must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); - must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, ceiling_dirs, sub_repository_path)); - - must_pass(git_futils_mkdir_r(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, mode)); - must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER "/" DOT_GIT, "gitdir: ../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); - must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/" DOT_GIT, "gitdir: ../../../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); - must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB "/" DOT_GIT, "gitdir: ../../../../")); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); - - must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER1, mode)); - must_pass(write_file(ALTERNATE_MALFORMED_FOLDER1 "/" DOT_GIT, "Anything but not gitdir:")); - must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER2, mode)); - must_pass(write_file(ALTERNATE_MALFORMED_FOLDER2 "/" DOT_GIT, "gitdir:")); - must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER3, mode)); - must_pass(write_file(ALTERNATE_MALFORMED_FOLDER3 "/" DOT_GIT, "gitdir: \n\n\n")); - must_pass(git_futils_mkdir_r(ALTERNATE_NOT_FOUND_FOLDER, mode)); - must_pass(write_file(ALTERNATE_NOT_FOUND_FOLDER "/" DOT_GIT, "gitdir: a_repository_that_surely_does_not_exist")); - must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER1, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER2, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER3, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_NOT_FOUND_FOLDER, 0, ceiling_dirs)); - - must_pass(append_ceiling_dir(ceiling_dirs, SUB_REPOSITORY_FOLDER)); - //this must pass as ceiling_directories cannot predent the current - //working directory to be checked - must_pass(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB, 0, ceiling_dirs)); - must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, 0, ceiling_dirs)); - - //.gitfile redirection should not be affected by ceiling directories - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); - must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); - - must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); - git_repository_free(repo); -END_TEST - -BEGIN_SUITE(repository) - ADD_TEST(odb0); - ADD_TEST(odb1); - ADD_TEST(init0); - ADD_TEST(init1); - ADD_TEST(init2); - ADD_TEST(open0); - ADD_TEST(open1); - ADD_TEST(open2); - ADD_TEST(empty0); - ADD_TEST(detached0); - ADD_TEST(orphan0); - ADD_TEST(discover0); -END_SUITE - diff --git a/vendor/libgit2/tests/t13-threads.c b/vendor/libgit2/tests/t13-threads.c deleted file mode 100644 index 3888b70ce..000000000 --- a/vendor/libgit2/tests/t13-threads.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" -#include "cache.h" - - -typedef struct { - git_cached_obj cached; - unsigned int __dummy; -} ttest_obj; - -BEGIN_TEST(cache0, "run several threads polling the cache at the same time") - -END_TEST - -BEGIN_SUITE(threads) - ADD_TEST(cache0); -END_SUITE diff --git a/vendor/libgit2/tests/t14-hiredis.c b/vendor/libgit2/tests/t14-hiredis.c deleted file mode 100644 index c743f7d48..000000000 --- a/vendor/libgit2/tests/t14-hiredis.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "odb.h" - -#ifdef GIT2_HIREDIS_BACKEND -#include "t03-data.h" -#include "fileops.h" -#include "git2/odb_backend.h" - - -static int cmp_objects(git_odb_object *odb_obj, git_rawobj *raw) -{ - if (raw->type != git_odb_object_type(odb_obj)) - return -1; - - if (raw->len != git_odb_object_size(odb_obj)) - return -1; - - if ((raw->len > 0) && (memcmp(raw->data, git_odb_object_data(odb_obj), raw->len) != 0)) - return -1; - - return 0; -} - -static git_odb *open_hiredis_odb(void) -{ - git_odb *odb; - git_odb_backend *hiredis; - - if (git_odb_new(&odb) < GIT_SUCCESS) - return NULL; - - if (git_odb_backend_hiredis(&hiredis, "127.0.0.1", 6379) < GIT_SUCCESS) - return NULL; - - if (git_odb_add_backend(odb, hiredis, 0) < GIT_SUCCESS) - return NULL; - - return odb; -} - -#define TEST_WRITE(PTR) {\ - git_odb *db; \ - git_oid id1, id2; \ - git_odb_object *obj; \ - db = open_hiredis_odb(); \ - must_be_true(db != NULL); \ - must_pass(git_oid_mkstr(&id1, PTR.id)); \ - must_pass(git_odb_write(&id2, db, PTR##_obj.data, PTR##_obj.len, PTR##_obj.type)); \ - must_be_true(git_oid_cmp(&id1, &id2) == 0); \ - must_pass(git_odb_read(&obj, db, &id1)); \ - must_pass(cmp_objects(obj, &PTR##_obj)); \ - git_odb_object_close(obj); \ - git_odb_close(db); \ -} - -BEGIN_TEST(hiredis0, "write a commit, read it back (hiredis backend)") - TEST_WRITE(commit); -END_TEST - -BEGIN_TEST(hiredis1, "write a tree, read it back (hiredis backend)") - TEST_WRITE(tree); -END_TEST - -BEGIN_TEST(hiredis2, "write a tag, read it back (hiredis backend)") - TEST_WRITE(tag); -END_TEST - -BEGIN_TEST(hiredis3, "write a zero-byte entry, read it back (hiredis backend)") - TEST_WRITE(zero); -END_TEST - -BEGIN_TEST(hiredis4, "write a one-byte entry, read it back (hiredis backend)") - TEST_WRITE(one); -END_TEST - -BEGIN_TEST(hiredis5, "write a two-byte entry, read it back (hiredis backend)") - TEST_WRITE(two); -END_TEST - -BEGIN_TEST(hiredis6, "write some bytes in an entry, read it back (hiredis backend)") - TEST_WRITE(some); -END_TEST - - -BEGIN_SUITE(hiredis) - ADD_TEST(hiredis0); - ADD_TEST(hiredis1); - ADD_TEST(hiredis2); - ADD_TEST(hiredis3); - ADD_TEST(hiredis4); - ADD_TEST(hiredis5); - ADD_TEST(hiredis6); -END_SUITE - -#else /* no hiredis builtin */ -BEGIN_SUITE(hiredis) - /* empty */ -END_SUITE -#endif diff --git a/vendor/libgit2/tests/t15-config.c b/vendor/libgit2/tests/t15-config.c deleted file mode 100644 index 05de25f8c..000000000 --- a/vendor/libgit2/tests/t15-config.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include -#include "filebuf.h" - -#define CONFIG_BASE TEST_RESOURCES "/config" - -/* - * This one is so we know the code isn't completely broken - */ -BEGIN_TEST(config0, "read a simple configuration") - git_config *cfg; - int i; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config0")); - must_pass(git_config_get_int(cfg, "core.repositoryformatversion", &i)); - must_be_true(i == 0); - must_pass(git_config_get_bool(cfg, "core.filemode", &i)); - must_be_true(i == 1); - must_pass(git_config_get_bool(cfg, "core.bare", &i)); - must_be_true(i == 0); - must_pass(git_config_get_bool(cfg, "core.logallrefupdates", &i)); - must_be_true(i == 1); - - git_config_free(cfg); -END_TEST - -/* - * [this "that"] and [this "That] are different namespaces. Make sure - * each returns the correct one. - */ -BEGIN_TEST(config1, "case sensitivity") - git_config *cfg; - int i; - const char *str; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config1")); - - must_pass(git_config_get_string(cfg, "this.that.other", &str)); - must_be_true(!strcmp(str, "true")); - must_pass(git_config_get_string(cfg, "this.That.other", &str)); - must_be_true(!strcmp(str, "yes")); - - must_pass(git_config_get_bool(cfg, "this.that.other", &i)); - must_be_true(i == 1); - must_pass(git_config_get_bool(cfg, "this.That.other", &i)); - must_be_true(i == 1); - - /* This one doesn't exist */ - must_fail(git_config_get_bool(cfg, "this.thaT.other", &i)); - - git_config_free(cfg); -END_TEST - -/* - * If \ is the last non-space character on the line, we read the next - * one, separating each line with SP. - */ -BEGIN_TEST(config2, "parse a multiline value") - git_config *cfg; - const char *str; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config2")); - - must_pass(git_config_get_string(cfg, "this.That.and", &str)); - must_be_true(!strcmp(str, "one one one two two three three")); - - git_config_free(cfg); -END_TEST - -/* - * This kind of subsection declaration is case-insensitive - */ -BEGIN_TEST(config3, "parse a [section.subsection] header") - git_config *cfg; - const char *str; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config3")); - - must_pass(git_config_get_string(cfg, "section.subsection.var", &str)); - must_be_true(!strcmp(str, "hello")); - - /* Avoid a false positive */ - str = "nohello"; - must_pass(git_config_get_string(cfg, "section.subSectIon.var", &str)); - must_be_true(!strcmp(str, "hello")); - - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config4, "a variable name on its own is valid") - git_config *cfg; -const char *str; -int i; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config4")); - - must_pass(git_config_get_string(cfg, "some.section.variable", &str)); - must_be_true(str == NULL); - - must_pass(git_config_get_bool(cfg, "some.section.variable", &i)); - must_be_true(i == 1); - - - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config5, "test number suffixes") - git_config *cfg; - long int i; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config5")); - - must_pass(git_config_get_long(cfg, "number.simple", &i)); - must_be_true(i == 1); - - must_pass(git_config_get_long(cfg, "number.k", &i)); - must_be_true(i == 1 * 1024); - - must_pass(git_config_get_long(cfg, "number.kk", &i)); - must_be_true(i == 1 * 1024); - - must_pass(git_config_get_long(cfg, "number.m", &i)); - must_be_true(i == 1 * 1024 * 1024); - - must_pass(git_config_get_long(cfg, "number.mm", &i)); - must_be_true(i == 1 * 1024 * 1024); - - must_pass(git_config_get_long(cfg, "number.g", &i)); - must_be_true(i == 1 * 1024 * 1024 * 1024); - - must_pass(git_config_get_long(cfg, "number.gg", &i)); - must_be_true(i == 1 * 1024 * 1024 * 1024); - - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config6, "test blank lines") - git_config *cfg; - int i; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config6")); - - must_pass(git_config_get_bool(cfg, "valid.subsection.something", &i)); - must_be_true(i == 1); - - must_pass(git_config_get_bool(cfg, "something.else.something", &i)); - must_be_true(i == 0); - - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config7, "test for invalid ext headers") - git_config *cfg; - - must_fail(git_config_open_ondisk(&cfg, CONFIG_BASE "/config7")); - -END_TEST - -BEGIN_TEST(config8, "don't fail on empty files") - git_config *cfg; - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config8")); - - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config9, "replace a value") - git_config *cfg; - int i; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_pass(git_config_set_int(cfg, "core.dummy", 5)); - git_config_free(cfg); - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_pass(git_config_get_int(cfg, "core.dummy", &i)); - must_be_true(i == 5); - git_config_free(cfg); - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_pass(git_config_set_int(cfg, "core.dummy", 1)); - git_config_free(cfg); - -END_TEST - -BEGIN_TEST(config10, "a repo's config overrides the global config") - git_repository *repo; - git_config *cfg; - int version; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, CONFIG_BASE "/.gitconfig", NULL)); - must_pass(git_config_get_int(cfg, "core.repositoryformatversion", &version)); - must_be_true(version == 0); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(config11, "fall back to the global config") - git_repository *repo; - git_config *cfg; - int num; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, CONFIG_BASE "/.gitconfig", NULL)); - must_pass(git_config_get_int(cfg, "core.something", &num)); - must_be_true(num == 2); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(config12, "delete a value") - git_config *cfg; - int i; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_pass(git_config_set_int(cfg, "core.dummy", 5)); - git_config_free(cfg); - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_pass(git_config_delete(cfg, "core.dummy")); - git_config_free(cfg); - - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_be_true(git_config_get_int(cfg, "core.dummy", &i) == GIT_ENOTFOUND); - must_pass(git_config_set_int(cfg, "core.dummy", 1)); - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config13, "can't delete a non-existent value") - git_config *cfg; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config9")); - must_be_true(git_config_delete(cfg, "core.imaginary") == GIT_ENOTFOUND); - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config14, "don't fail horribly if a section header is in the last line") - git_config *cfg; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config10")); - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config15, "add a variable in an existing section") - git_config *cfg; - int i; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config10")); - must_pass(git_config_set_int(cfg, "empty.tmp", 5)); - must_pass(git_config_get_int(cfg, "empty.tmp", &i)); - must_be_true(i == 5); - must_pass(git_config_delete(cfg, "empty.tmp")); - git_config_free(cfg); -END_TEST - -BEGIN_TEST(config16, "add a variable in a new section") - git_config *cfg; - int i; - git_filebuf buf; - - /* By freeing the config, we make sure we flush the values */ - must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config10")); - must_pass(git_config_set_int(cfg, "section.tmp", 5)); - must_pass(git_config_get_int(cfg, "section.tmp", &i)); - must_be_true(i == 5); - must_pass(git_config_delete(cfg, "section.tmp")); - git_config_free(cfg); - - /* As the section wasn't removed, owerwrite the file */ - must_pass(git_filebuf_open(&buf, CONFIG_BASE "/config10", 0)); - must_pass(git_filebuf_write(&buf, "[empty]\n", strlen("[empty]\n"))); - must_pass(git_filebuf_commit(&buf)); -END_TEST - -BEGIN_SUITE(config) - ADD_TEST(config0); - ADD_TEST(config1); - ADD_TEST(config2); - ADD_TEST(config3); - ADD_TEST(config4); - ADD_TEST(config5); - ADD_TEST(config6); - ADD_TEST(config7); - ADD_TEST(config8); - ADD_TEST(config9); - ADD_TEST(config10); - ADD_TEST(config11); - ADD_TEST(config12); - ADD_TEST(config13); - ADD_TEST(config14); - ADD_TEST(config15); - ADD_TEST(config16); -END_SUITE diff --git a/vendor/libgit2/tests/t16-remotes.c b/vendor/libgit2/tests/t16-remotes.c deleted file mode 100644 index 4bc2f55d7..000000000 --- a/vendor/libgit2/tests/t16-remotes.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include - -BEGIN_TEST(remotes0, "remote parsing works") - git_remote *remote; - git_repository *repo; - git_config *cfg; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, NULL, NULL)); - must_pass(git_remote_get(&remote, cfg, "test")); - must_be_true(!strcmp(git_remote_name(remote), "test")); - must_be_true(!strcmp(git_remote_url(remote), "git://github.com/libgit2/libgit2")); - - git_remote_free(remote); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(refspec0, "remote with refspec works") - git_remote *remote; - git_repository *repo; - git_config *cfg; - const git_refspec *refspec = NULL; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, NULL, NULL)); - must_pass(git_remote_get(&remote, cfg, "test")); - refspec = git_remote_fetchspec(remote); - must_be_true(refspec != NULL); - must_be_true(!strcmp(git_refspec_src(refspec), "refs/heads/*")); - must_be_true(!strcmp(git_refspec_dst(refspec), "refs/remotes/test/*")); - git_remote_free(remote); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(refspec1, "remote fnmatch works as expected") - git_remote *remote; - git_repository *repo; - git_config *cfg; - const git_refspec *refspec = NULL; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, NULL, NULL)); - must_pass(git_remote_get(&remote, cfg, "test")); - refspec = git_remote_fetchspec(remote); - must_be_true(refspec != NULL); - must_pass(git_refspec_src_match(refspec, "refs/heads/master")); - must_pass(git_refspec_src_match(refspec, "refs/heads/multi/level/branch")); - git_remote_free(remote); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_TEST(refspec2, "refspec transform") - git_remote *remote; - git_repository *repo; - git_config *cfg; - const git_refspec *refspec = NULL; - char ref[1024] = {0}; - - must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); - must_pass(git_repository_config(&cfg, repo, NULL, NULL)); - must_pass(git_remote_get(&remote, cfg, "test")); - refspec = git_remote_fetchspec(remote); - must_be_true(refspec != NULL); - must_pass(git_refspec_transform(ref, sizeof(ref), refspec, "refs/heads/master")); - must_be_true(!strcmp(ref, "refs/remotes/test/master")); - git_remote_free(remote); - git_config_free(cfg); - git_repository_free(repo); -END_TEST - -BEGIN_SUITE(remotes) - ADD_TEST(remotes0) - ADD_TEST(refspec0) - ADD_TEST(refspec1) - ADD_TEST(refspec2) -END_SUITE diff --git a/vendor/libgit2/tests/t17-bufs.c b/vendor/libgit2/tests/t17-bufs.c deleted file mode 100644 index 2cbd8c87a..000000000 --- a/vendor/libgit2/tests/t17-bufs.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include "test_lib.h" -#include "test_helpers.h" - -#include -#include "buffer.h" - -const char *test_string = "Have you seen that? Have you seeeen that??"; - -BEGIN_TEST(buf0, "check that resizing works properly") - git_buf buf = GIT_BUF_INIT; - git_buf_puts(&buf, test_string); - - must_be_true(git_buf_oom(&buf) == 0); - must_be_true(strcmp(git_buf_cstr(&buf), test_string) == 0); - - git_buf_puts(&buf, test_string); - must_be_true(strlen(git_buf_cstr(&buf)) == strlen(test_string) * 2); - git_buf_free(&buf); -END_TEST - -BEGIN_TEST(buf1, "check that printf works properly") - git_buf buf = GIT_BUF_INIT; - - git_buf_printf(&buf, "%s %s %d ", "shoop", "da", 23); - must_be_true(git_buf_oom(&buf) == 0); - must_be_true(strcmp(git_buf_cstr(&buf), "shoop da 23 ") == 0); - - git_buf_printf(&buf, "%s %d", "woop", 42); - must_be_true(git_buf_oom(&buf) == 0); - must_be_true(strcmp(git_buf_cstr(&buf), "shoop da 23 woop 42") == 0); - git_buf_free(&buf); -END_TEST - -BEGIN_SUITE(buffers) - ADD_TEST(buf0) - ADD_TEST(buf1) -END_SUITE diff --git a/vendor/libgit2/tests/t18-status.c b/vendor/libgit2/tests/t18-status.c deleted file mode 100644 index c30c541df..000000000 --- a/vendor/libgit2/tests/t18-status.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "test_lib.h" -#include "test_helpers.h" -#include "fileops.h" -#include "git2/status.h" - -static const char *test_blob_oid = "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a"; - -#define STATUS_WORKDIR_FOLDER TEST_RESOURCES "/status/" -#define STATUS_REPOSITORY_TEMP_FOLDER TEMP_REPO_FOLDER ".gitted/" - -BEGIN_TEST(file0, "test retrieving OID from a file apart from the ODB") - git_oid expected_id, actual_id; - char filename[] = "new_file"; - int fd; - - fd = p_creat(filename, 0644); - must_pass(fd); - must_pass(p_write(fd, "new_file\n", 9)); - must_pass(p_close(fd)); - - must_pass(git_odb_hashfile(&actual_id, filename, GIT_OBJ_BLOB)); - - must_pass(git_oid_fromstr(&expected_id, test_blob_oid)); - must_be_true(git_oid_cmp(&expected_id, &actual_id) == 0); - - must_pass(p_unlink(filename)); -END_TEST - -static const char *entry_paths[] = { - "current_file", - "file_deleted", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", -}; -static const unsigned int entry_statuses[] = { - GIT_STATUS_CURRENT, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED, - - GIT_STATUS_CURRENT, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, -}; -#define ENTRY_COUNT 16 - -static unsigned int get_expected_entry_status(const char *path) -{ - int i; - - for (i = 0; i < ENTRY_COUNT; ++i) - if (!strcmp(path, entry_paths[i])) - return entry_statuses[i]; - - return (unsigned int)-1; -} - -struct status_entry_counts { - int wrong_status_flags_count; - int entry_count; -}; - -static int status_cb(const char *path, unsigned int status_flags, void *payload) -{ - unsigned int expected_status_flags = get_expected_entry_status(path); - struct status_entry_counts *counts = (struct status_entry_counts *)payload; - - counts->entry_count++; - if (status_flags != expected_status_flags) - counts->wrong_status_flags_count++; - - return GIT_SUCCESS; -} - -BEGIN_TEST(statuscb0, "test retrieving status for worktree of repository") - git_repository *repo; - struct status_entry_counts counts; - - must_pass(copydir_recurs(STATUS_WORKDIR_FOLDER, TEMP_REPO_FOLDER)); - must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); - must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); - - memset(&counts, 0x0, sizeof(struct status_entry_counts)); - git_status_foreach(repo, status_cb, &counts); - must_be_true(counts.entry_count == ENTRY_COUNT); - must_be_true(counts.wrong_status_flags_count == 0); - - git_repository_free(repo); - - git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); -END_TEST - -BEGIN_TEST(singlestatus0, "test retrieving status for single file") - git_repository *repo; - unsigned int status_flags; - int i; - - must_pass(copydir_recurs(STATUS_WORKDIR_FOLDER, TEMP_REPO_FOLDER)); - must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); - must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); - - for (i = 0; i < ENTRY_COUNT; ++i) { - must_pass(git_status_file(&status_flags, repo, entry_paths[i])); - must_be_true(status_flags == entry_statuses[i]); - } - - git_repository_free(repo); - - git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); -END_TEST - -BEGIN_TEST(singlestatus1, "test retrieving status for nonexistent file") - git_repository *repo; - unsigned int status_flags; - int error; - - must_pass(copydir_recurs(STATUS_WORKDIR_FOLDER, TEMP_REPO_FOLDER)); - must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); - must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); - - // "nonexistent" does not exist in HEAD, Index or the worktree - error = git_status_file(&status_flags, repo, "nonexistent"); - must_be_true(error == GIT_ENOTFOUND); - - git_repository_free(repo); - - git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); -END_TEST - -BEGIN_SUITE(status) - ADD_TEST(file0); - - ADD_TEST(statuscb0); - - ADD_TEST(singlestatus0); - ADD_TEST(singlestatus1); -END_SUITE \ No newline at end of file diff --git a/vendor/libgit2/tests/test_helpers.c b/vendor/libgit2/tests/test_helpers.c deleted file mode 100644 index 0900430e1..000000000 --- a/vendor/libgit2/tests/test_helpers.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "common.h" -#include "test_helpers.h" -#include "fileops.h" - -int write_object_data(char *file, void *data, size_t len) -{ - git_file fd; - int ret; - - if ((fd = p_creat(file, S_IREAD | S_IWRITE)) < 0) - return -1; - ret = p_write(fd, data, len); - p_close(fd); - - return ret; -} - -int write_object_files(const char *odb_dir, object_data *d) -{ - if (p_mkdir(odb_dir, 0755) < 0) { - int err = errno; - fprintf(stderr, "can't make directory \"%s\"", odb_dir); - if (err == EEXIST) - fprintf(stderr, " (already exists)"); - fprintf(stderr, "\n"); - return -1; - } - - if ((p_mkdir(d->dir, 0755) < 0) && (errno != EEXIST)) { - fprintf(stderr, "can't make object directory \"%s\"\n", d->dir); - return -1; - } - if (write_object_data(d->file, d->bytes, d->blen) < 0) { - fprintf(stderr, "can't write object file \"%s\"\n", d->file); - return -1; - } - - return 0; -} - -int remove_object_files(const char *odb_dir, object_data *d) -{ - if (p_unlink(d->file) < 0) { - fprintf(stderr, "can't delete object file \"%s\"\n", d->file); - return -1; - } - if ((p_rmdir(d->dir) < 0) && (errno != ENOTEMPTY)) { - fprintf(stderr, "can't remove object directory \"%s\"\n", d->dir); - return -1; - } - - if (p_rmdir(odb_dir) < 0) { - fprintf(stderr, "can't remove directory \"%s\"\n", odb_dir); - return -1; - } - - return 0; -} - -int remove_loose_object(const char *repository_folder, git_object *object) -{ - static const char *objects_folder = "objects/"; - - char *ptr, *full_path, *top_folder; - int path_length, objects_length; - - assert(repository_folder && object); - - objects_length = strlen(objects_folder); - path_length = strlen(repository_folder); - ptr = full_path = git__malloc(path_length + objects_length + GIT_OID_HEXSZ + 3); - - strcpy(ptr, repository_folder); - strcpy(ptr + path_length, objects_folder); - - ptr = top_folder = ptr + path_length + objects_length; - *ptr++ = '/'; - git_oid_pathfmt(ptr, git_object_id(object)); - ptr += GIT_OID_HEXSZ + 1; - *ptr = 0; - - if (p_unlink(full_path) < 0) { - fprintf(stderr, "can't delete object file \"%s\"\n", full_path); - return -1; - } - - *top_folder = 0; - - if ((p_rmdir(full_path) < 0) && (errno != ENOTEMPTY)) { - fprintf(stderr, "can't remove object directory \"%s\"\n", full_path); - return -1; - } - - free(full_path); - - return GIT_SUCCESS; -} - -int cmp_objects(git_rawobj *o, object_data *d) -{ - if (o->type != git_object_string2type(d->type)) - return -1; - if (o->len != d->dlen) - return -1; - if ((o->len > 0) && (memcmp(o->data, d->data, o->len) != 0)) - return -1; - return 0; -} - -int copy_file(const char *src, const char *dst) -{ - git_fbuffer source_buf; - git_file dst_fd; - int error = GIT_ERROR; - - if (git_futils_readbuffer(&source_buf, src) < GIT_SUCCESS) - return GIT_ENOTFOUND; - - dst_fd = git_futils_creat_withpath(dst, 0644); - if (dst_fd < 0) - goto cleanup; - - error = p_write(dst_fd, source_buf.data, source_buf.len); - -cleanup: - git_futils_freebuffer(&source_buf); - p_close(dst_fd); - - return error; -} - -int cmp_files(const char *a, const char *b) -{ - git_fbuffer buf_a, buf_b; - int error = GIT_ERROR; - - if (git_futils_readbuffer(&buf_a, a) < GIT_SUCCESS) - return GIT_ERROR; - - if (git_futils_readbuffer(&buf_b, b) < GIT_SUCCESS) { - git_futils_freebuffer(&buf_a); - return GIT_ERROR; - } - - if (buf_a.len == buf_b.len && !memcmp(buf_a.data, buf_b.data, buf_a.len)) - error = GIT_SUCCESS; - - git_futils_freebuffer(&buf_a); - git_futils_freebuffer(&buf_b); - - return error; -} - -typedef struct { - size_t src_len, dst_len; - char *dst; -} copydir_data; - -static int copy_filesystem_element_recurs(void *_data, char *source) -{ - copydir_data *data = (copydir_data *)_data; - - data->dst[data->dst_len] = 0; - git_path_join(data->dst, data->dst, source + data->src_len); - - if (git_futils_isdir(source) == GIT_SUCCESS) - return git_futils_direach(source, GIT_PATH_MAX, copy_filesystem_element_recurs, _data); - - return copy_file(source, data->dst); -} - -int copydir_recurs(const char *source_directory_path, const char *destination_directory_path) -{ - char source_buffer[GIT_PATH_MAX]; - char dest_buffer[GIT_PATH_MAX]; - copydir_data data; - - /* Source has to exist, Destination hast to _not_ exist */ - if (git_futils_isdir(source_directory_path) != GIT_SUCCESS || - git_futils_isdir(destination_directory_path) == GIT_SUCCESS) - return GIT_EINVALIDPATH; - - git_path_join(source_buffer, source_directory_path, ""); - data.src_len = strlen(source_buffer); - - git_path_join(dest_buffer, destination_directory_path, ""); - data.dst = dest_buffer; - data.dst_len = strlen(dest_buffer); - - return copy_filesystem_element_recurs(&data, source_buffer); -} - -int open_temp_repo(git_repository **repo, const char *path) -{ - if (copydir_recurs(path, TEMP_REPO_FOLDER) < GIT_SUCCESS) { - printf("\nFailed to create temporary folder. Aborting test suite.\n"); - exit(-1); - } - - return git_repository_open(repo, TEMP_REPO_FOLDER); -} - -void close_temp_repo(git_repository *repo) -{ - git_repository_free(repo); - if (git_futils_rmdir_r(TEMP_REPO_FOLDER, 1) < GIT_SUCCESS) { - printf("\nFailed to remove temporary folder. Aborting test suite.\n"); - exit(-1); - } -} - -static int remove_placeholders_recurs(void *filename, char *path) -{ - char passed_filename[GIT_PATH_MAX]; - char *data = (char *)filename; - - if (!git_futils_isdir(path)) - return git_futils_direach(path, GIT_PATH_MAX, remove_placeholders_recurs, data); - - if (git_path_basename_r(passed_filename, sizeof(passed_filename), path) < GIT_SUCCESS) - return GIT_EINVALIDPATH; - - if (!strcmp(data, passed_filename)) - return p_unlink(path); - - return GIT_SUCCESS; -} - -int remove_placeholders(char *directory_path, char *filename) -{ - char buffer[GIT_PATH_MAX]; - - if (git_futils_isdir(directory_path)) - return GIT_EINVALIDPATH; - - strcpy(buffer, directory_path); - return remove_placeholders_recurs(filename, buffer); -} diff --git a/vendor/libgit2/tests/test_helpers.h b/vendor/libgit2/tests/test_helpers.h deleted file mode 100644 index 75027dd6f..000000000 --- a/vendor/libgit2/tests/test_helpers.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDE_test_helpers_h__ -#define INCLUDE_test_helpers_h__ - -#include "test_lib.h" -#include - -#include "odb.h" - -#define TEST_REPOSITORY_NAME "testrepo.git" -#define REPOSITORY_FOLDER TEST_RESOURCES "/" TEST_REPOSITORY_NAME "/" -#define ODB_FOLDER (REPOSITORY_FOLDER "objects/") -#define TEST_INDEX_PATH (REPOSITORY_FOLDER "index") -#define TEST_INDEX2_PATH (TEST_RESOURCES "/gitgit.index") -#define TEST_INDEXBIG_PATH (TEST_RESOURCES "/big.index") - -#define TEMP_FOLDER "" -#define TEMP_REPO_FOLDER TEMP_FOLDER TEST_REPOSITORY_NAME "/" -#define TEMP_REPO_FOLDER_NS TEMP_FOLDER TEST_REPOSITORY_NAME -#define TEST_STD_REPO_FOLDER TEMP_REPO_FOLDER ".git/" - -typedef struct object_data { - unsigned char *bytes; /* (compressed) bytes stored in object store */ - size_t blen; /* length of data in object store */ - char *id; /* object id (sha1) */ - char *type; /* object type */ - char *dir; /* object store (fan-out) directory name */ - char *file; /* object store filename */ - unsigned char *data; /* (uncompressed) object data */ - size_t dlen; /* length of (uncompressed) object data */ -} object_data; - -extern int write_object_data(char *file, void *data, size_t len); - -extern int write_object_files(const char *odb_dir, object_data *d); - -extern int remove_object_files(const char *odb_dir, object_data *d); - -extern int cmp_objects(git_rawobj *o, object_data *d); - -extern int remove_loose_object(const char *odb_dir, git_object *object); - -extern int cmp_files(const char *a, const char *b); -extern int copy_file(const char *source, const char *dest); -extern int rmdir_recurs(const char *directory_path); -extern int copydir_recurs(const char *source_directory_path, const char *destination_directory_path); -extern int remove_placeholders(char *directory_path, char *filename); - -extern int open_temp_repo(git_repository **repo, const char *path); -extern void close_temp_repo(git_repository *repo); - -#endif -/* INCLUDE_test_helpers_h__ */ diff --git a/vendor/libgit2/tests/test_lib.c b/vendor/libgit2/tests/test_lib.c deleted file mode 100755 index a4c39dfde..000000000 --- a/vendor/libgit2/tests/test_lib.c +++ /dev/null @@ -1,198 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "test_lib.h" - -#define DO_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) -#define GIT_MAX_TEST_CASES 64 - -struct git_test { - char *name; - char *message; - char *failed_pos; - char *description; - char *error_message; - - git_testfunc function; - unsigned failed:1, ran:1; - jmp_buf *jump; -}; - -struct git_testsuite { - char *name; - int count, fail_count; - git_test *list[GIT_MAX_TEST_CASES]; -}; - -static void test_free(git_test *t) -{ - if (t) { - free(t->name); - free(t->description); - free(t->failed_pos); - free(t->message); - free(t->error_message); - free(t); - } -} - -static void test_run(git_test *tc) -{ - jmp_buf buf; - tc->jump = &buf; - - if (setjmp(buf) == 0) { - tc->ran = 1; - (tc->function)(tc); - } - - tc->jump = 0; -} - -static git_test *create_test(git_testfunc function) -{ - git_test *t = DO_ALLOC(git_test); - - memset(t, 0x0, sizeof(git_test)); - t->function = function; - - return t; -} - -void git_test__init(git_test *t, const char *name, const char *description) -{ - t->name = strdup(name); - t->description = strdup(description); -} - - -/*-------------------------------------------------------------------------* - * Public assert methods - *-------------------------------------------------------------------------*/ - -static void fail_test(git_test *tc, const char *file, int line, const char *message) -{ - char buf[1024]; - const char *last_error = git_lasterror(); - - snprintf(buf, 1024, "%s:%d", file, line); - - tc->failed = 1; - tc->message = strdup(message); - tc->failed_pos = strdup(buf); - - if (last_error) - tc->error_message = strdup(last_error); - - if (tc->jump != 0) - longjmp(*(tc->jump), 0); -} - -void git_test__fail(git_test *tc, const char *file, int line, const char *message) -{ - fail_test(tc, file, line, message); -} - -void git_test__assert(git_test *tc, const char *file, int line, const char *message, int condition) -{ - if (condition == 0) - fail_test(tc, file, line, message); -} - -void git_test__assert_pass(git_test *tc, const char *file, int line, const char *message, int ret_value) -{ - if (ret_value < 0) - fail_test(tc, file, line, message); -} - -/*-------------------------------------------------------------------------* - * Test Suite - *-------------------------------------------------------------------------*/ - -static void testsuite_init(git_testsuite *ts) -{ - ts->count = 0; - ts->fail_count = 0; - memset(ts->list, 0, sizeof(ts->list)); -} - -git_testsuite *git_testsuite_new(const char *name) -{ - git_testsuite *ts = DO_ALLOC(git_testsuite); - testsuite_init(ts); - ts->name = strdup(name); - return ts; -} - -static void free_suite(git_testsuite *ts) -{ - unsigned int n; - - for (n = 0; n < GIT_MAX_TEST_CASES; n++) - if (ts->list[n]) - test_free(ts->list[n]); - - free(ts->name); - free(ts); -} - -void git_testsuite_add(git_testsuite *ts, git_testfunc test) -{ - assert(ts->count < GIT_MAX_TEST_CASES); - ts->list[ts->count++] = create_test(test); -} - -static void print_details(git_testsuite *ts) -{ - int i; - int failCount = 0; - - if (ts->fail_count == 0) { - const char *testWord = ts->count == 1 ? "test" : "tests"; - printf("OK (%d %s)\n", ts->count, testWord); - } else { - printf("Failed (%d failures):\n", ts->fail_count); - - for (i = 0 ; i < ts->count ; ++i) { - git_test *tc = ts->list[i]; - if (tc->failed) { - failCount++; - printf(" %d) \"%s\" [test %s @ %s]\n\t%s\n", - failCount, tc->description, tc->name, tc->failed_pos, tc->message); - if (tc->error_message) - printf("\tError: %s\n", tc->error_message); - } - } - } -} - -int git_testsuite_run(git_testsuite *ts) -{ - int i, fail_count; - - printf("Suite \"%s\": ", ts->name); - - for (i = 0 ; i < ts->count ; ++i) { - git_test *tc = ts->list[i]; - - test_run(tc); - if (tc->failed) { - ts->fail_count++; - putchar('F'); - } else - putchar('.'); - - fflush(stdout); - } - printf("\n "); - print_details(ts); - fail_count = ts->fail_count; - - free_suite(ts); - return fail_count; -} - diff --git a/vendor/libgit2/tests/test_lib.h b/vendor/libgit2/tests/test_lib.h deleted file mode 100755 index fc75ed771..000000000 --- a/vendor/libgit2/tests/test_lib.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef __LIBGIT2_TEST_H__ -#define __LIBGIT2_TEST_H__ - -#include -#include -#include -#include - -#include "common.h" -#include - -#define DECLARE_SUITE(SNAME) extern git_testsuite *libgit2_suite_##SNAME(void) -#define SUITE_NAME(SNAME) libgit2_suite_##SNAME - -#define BEGIN_SUITE(SNAME) \ - git_testsuite *libgit2_suite_##SNAME(void) {\ - git_testsuite *_gitsuite = git_testsuite_new(#SNAME); - -#define ADD_TEST(TNAME) \ - git_testsuite_add(_gitsuite, _gittest__##TNAME); - -#define END_SUITE \ - return _gitsuite;\ - } - -#define BEGIN_TEST(TNAME, DESC) \ - static void _gittest__##TNAME(git_test *_gittest) { \ - git_test__init(_gittest, #TNAME, DESC); \ - git_clearerror();\ - {\ - -#define END_TEST }} - -typedef struct git_test git_test; -typedef struct git_testsuite git_testsuite; -typedef void (*git_testfunc)(git_test *); -typedef git_testsuite *(*libgit2_suite)(void); - -void git_test__init(git_test *t, const char *name, const char *description); -void git_test__fail(git_test *tc, const char *file, int line, const char *message); -void git_test__assert(git_test *tc, const char *file, int line, const char *message, int condition); -void git_test__assert_pass(git_test *tc, const char *file, int line, const char *message, int ret_value); - -#define must_pass(expr) git_test__assert_pass(_gittest, __FILE__, __LINE__, "Method failed: " #expr, (expr)) -#define must_fail(expr) git_test__assert(_gittest, __FILE__, __LINE__, "Expected method to fail: " #expr, (expr) < 0) -#define must_be_true(expr) git_test__assert(_gittest, __FILE__, __LINE__, "Expression is not true: " #expr, !!(expr)) - -git_testsuite *git_testsuite_new(const char *name); -void git_testsuite_add(git_testsuite *ts, git_testfunc test); -int git_testsuite_run(git_testsuite *ts); - -#endif - diff --git a/vendor/libgit2/tests/test_main.c b/vendor/libgit2/tests/test_main.c deleted file mode 100644 index c9f8da3a4..000000000 --- a/vendor/libgit2/tests/test_main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, - * as published by the Free Software Foundation. - * - * In addition to the permissions in the GNU General Public License, - * the authors give you unlimited permission to link the compiled - * version of this file into combinations with other programs, - * and to distribute those combinations without any restriction - * coming from the use of this file. (The General Public License - * restrictions do apply in other respects; for example, they cover - * modification of the file, and distribution when not linked into - * a combined executable.) - * - * This file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include -#include - -#include "test_lib.h" -#include "test_helpers.h" - -DECLARE_SUITE(core); -DECLARE_SUITE(rawobjects); -DECLARE_SUITE(objread); -DECLARE_SUITE(objwrite); -DECLARE_SUITE(commit); -DECLARE_SUITE(revwalk); -DECLARE_SUITE(index); -DECLARE_SUITE(hashtable); -DECLARE_SUITE(tag); -DECLARE_SUITE(tree); -DECLARE_SUITE(refs); -DECLARE_SUITE(repository); -DECLARE_SUITE(threads); -DECLARE_SUITE(config); -DECLARE_SUITE(remotes); -DECLARE_SUITE(buffers); -DECLARE_SUITE(status); - -static libgit2_suite suite_methods[]= { - SUITE_NAME(core), - SUITE_NAME(rawobjects), - SUITE_NAME(objread), - SUITE_NAME(objwrite), - SUITE_NAME(commit), - SUITE_NAME(revwalk), - SUITE_NAME(index), - SUITE_NAME(hashtable), - SUITE_NAME(tag), - SUITE_NAME(tree), - SUITE_NAME(refs), - SUITE_NAME(repository), - SUITE_NAME(threads), - SUITE_NAME(config), - SUITE_NAME(remotes), - SUITE_NAME(buffers), - SUITE_NAME(status), -}; - -#define GIT_SUITE_COUNT (ARRAY_SIZE(suite_methods)) - -#ifdef GIT_WIN32 -int __cdecl -#else -int -#endif -main(int GIT_UNUSED(argc), char *GIT_UNUSED(argv[])) -{ - unsigned int i, failures; - - GIT_UNUSED_ARG(argc); - GIT_UNUSED_ARG(argv); - - failures = 0; - - for (i = 0; i < GIT_SUITE_COUNT; ++i) - failures += git_testsuite_run(suite_methods[i]()); - - return failures ? -1 : 0; -} - diff --git a/vendor/libgit2/tests/tests.supp b/vendor/libgit2/tests/tests.supp deleted file mode 100644 index fe9d965dc..000000000 --- a/vendor/libgit2/tests/tests.supp +++ /dev/null @@ -1,6 +0,0 @@ -{ - ignore-zlib-cond - Memcheck:Cond - obj:*libz.so* -} - diff --git a/vendor/libgit2/waf b/vendor/libgit2/waf deleted file mode 100755 index 18b9aa3e4b269b0d21966572baca4dec5b77f130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76176 zcmcG#cT`i~wgyTs%0NM+BO#$A7(*}8I|S*ymp~w)OF}OqohTqkS6b*;kRnx31OW>m zBGN%YDbhtis&5B9zjMyL_l@`0V?g%K+H1}7&2P;)cXojAi3H&MMNn8D5wuSr$S(ws z@%1?a0ik_dd|k0V?s6ccsiCZ_)YU6uz^EC<*V`EfGH`YefrG?FMWwEYi;9V!IRgfR z&zPWHu{gXx78QWU`uc#JeOy5SI5Y_B1H$~L92A7bV?e(C zr$^ra{26aRr5o18nIr%Xa`s1q{Lud1SUeu>3i9*!4aB+vCwPoA9(X|mLcF|ug8&;r zF1|jlSkfZg8PXzeG+yq^88HOtzfHn{eBJ(K3*a0uF93%J`J?g9fQ=-9&M4nNG$70` z#2@R9!Jh$vKt8^BtP2_rT*l%+UVwij8UI#y>eGMQ0)XJ+<&5=4`yz?GMN}UpIUZDT*ZZ04YE?KeP*p6~Hkns7jand+%xKm-5?a2YT{&D<1u3Juc0Ow+`~+{g@RXaGB-V`vFD57?** zEG5ND17v7$8a5!Jh9=e|p(G4WA%=r2bu@u-6B2BIS7s)vBrr_POpxlNsQohy&}U|7 zVg~xRk01k0Z9Sy6rh&R9$r?kF6icM3CJcxO60l4gfb>+Yr7EBk-~phQ#3{h4Kd1k} zJpf-IULd3vNL9lEkO7!{I{6F`VN>K^HULAW=IT0s;YOTh&ofwWKVN?!y#Q$u7lJ!; z2JqYzfI$%~hLA>x0qIo}kas#Db5 zfW4+b(Df9BgwCjoDGEUlz)>7H!iCPb1i69~0WAo3G#)sI!p?a30tw=D$j=#%L6F{_ zIRo%nOHnAu*-hw-E7}c&f(FCn&d>w7GQi&l6nq8?B+?KZ0)q|?MEjHWpps~?ged99 z4VdKE&Kg$uP#RU!MJ{6Ak_lJ6u!~+}L2M>h`*@;R>*j^R$*7W!H^_K$) z;7$iby@fymAa5A#3_VFVIv9(Giv1N4;N$1);^_$3>x%V<0)HfNZX~b#&^}PobZ39} zKwD9JxR5_e2$0|cToZEf_4g0(!vlrJ1p{Ou5LCbw2ACX#!Fr)VVt@pCFRTw5nCXV_ zM?1Tc-T*e!(*xd_5lF z|Bm|u<7WWLe~6630DXWLP&u9b-2glR$^Id7pg*Gse{Z}$8hsk5GxX?S7c>wBAO-%3 zx1Tc(_h&lb9ndL&f=MOJR>;iP*9#{E2MM8r@&3*@A^TIb04jSsdjh?OKMqRbE=edb z=P%T7P%w!w|3d{JmlQUzy0Z@{kbl@iiVhGH6rc>KTL9^N^hxaiY4mi&`Ly()olyWe z03B!-ysv)<7{HZ8H^6Ve5El$^{?{wKw;zdPcmyg`93T}bq^D#A#^FLirzF55NW}~d z1<)oTk8ttw#hvboQ>*|ZNsIpChxpgxf4m`iPr?*9kaPni$D_TWLZ|?rP^_Og=#OGx z_WvP92v6Drz=gjy0`~od=wH(QcmgDdKlA?ILiev_|1)@h@wEi7bNPcY3TO#VH!0c` z4syYuT|9wu4>WS9Q)6)fey7Ic@gV}>FpJqeS6adJ- z{CC3!`-O-D@Bf@2fWtrJI3-Jf50C&np+F1(fBqrQDdd0HPa+neGQbB*>Q?{q+8gD9 zBL(jdqvb&Vy;(?IlnXw@4~+x;H3R66UA?>jGya?)JkkC>XfFwIgee-Y1?)>z{GXN` zjkEltfs`fw3I|r5ia*WLcr*@wN^O85e`!Zz9neeuAKQ+!=l+%Mfmx@8#TkVo9sh2R z|Ggvst;!9s*%8=@P*OfTZ8H^50sfoA&(NcsfsXRuB@4ibGzOxY5S63BiTzr{1l@Q&Ru}0G0KR*MJTo0o;|-Us8dD0#o6jzuf~I^slx7P*2(?*wa+{w?BXj zk?#G3{v1TSd|jNqNN;@o@PBgaKlWn*h6{-R5fKpr&i*R?KOFiOJ|sz}1_H*NZWs~( zaL{QX2FeK@u*92Gri1`eN{9=c-bD!^gh)3D0Pg>#;vX9Tt$@b=fgqspPgXfY|G!&+ zfBF?*>6tS?Y=9$R(7)MrhSV6Gaue%=L;K^QqQEWb=`;XeK$D{*DZY-5AVt7bM@Mg< ziaRIuI08<=+ zROcV!=m!)oJQUdb{}H)=EFm=qXCP`en5$x{)`F(iCzh?P6nacIe*dl|#{;kb{9GkJ z5C6(cL55@^yUsuk3U&^=ALQFe_TN8O-_n$R8VN|Tj?)SlwQQRSvl-Xdfth;@dk(C9 zoVKu;^osM9*htNOGW^=*V+&Mj(sMm5)w$5QU{=NOUQn}~=d7pklOJ2bmtErAX@Q-E69B2lH)&mw$6hQX8@Z8H~lAqcr33oZ|8 z&--H-T0|vhTf~62NkNo2h2{!dVB5cs-LcHge~G?Yxf3& zdY?|u228EokJtzeEv4T50lkNUK@g@YMvCXWw>wt299}H#>`k1Hh-b1`d3wEA#hgx_ zlYDbYDk5L9?QJ{vc&fX(VZ%oIMmqvOS~O&{VHhA%Z_p!+ipy_8rE4R_o+5U(+N!2gUDA&IOH!Y(n?y*L}Sg`_}547-v1* z3q#uXBAVJad~Ms>+CqYq);DD29!D%T&rf%>Z-3i~at~?Q2pgS#U$ECUB zuw3-+*a*8e(<)FCRQu|?;-LIQ-{ipS!1>V{U%Rh6R~MTuX~8?+x5}XiQyK$#zW_&ncex8 z{DOYJP_gosrnaDGo{Ad=we!O(>u>gY8k?T_=dawIwqccd_Ol)T<<*o(Q`;hrV=HW7 zZ*o>B=yBMmsH)XhG`A-2`OuDz&d`E9OWJ%3TxKkZkFT#3%-kz-s(RliblI%n{$!Kf zPT1682#>@4!@3`-9S4ev;q7~)zLsrIc=m<|FD{7Fbd;3(K~k|NdJiKOqrA9sWZp{mQYl{++fmrAfSz%))WatK00jhsqM zGFMzoFt0$+?3lkFg1vO7Qyg2KYHDcuv3o}n1IQzz;7`xK@fb?ws^KZJ8}(7D3T8GsR>URKAOBsP7=w62PUF!<_we0W{yI@Yjx$)4 zb&RffkL;ckNQ0f9c5*LbaN{U9_3Wf+j$3);+fOU=%yOAnleFH-xZs-#at3B|g@^j# zslQg+qxwU^slwzG<@lVodKpx9yt5erauM}V!>l^<&6|O%77{k@1^0IbYHvMcaiQ*~ zOMhfLwtJ5)$>c{~dW*O`=)%F#4POUUvUIA;4qB)v9YO{uON_eItzs@rsOAKFq!Z|(g_EG=wsZIcC}o3Or-!= zCnr&dj3`J~o(|@RAd0He!RfhCc|^KOFmrTPEWx!p4_c+0RFz&Go8uu+R9RVGP6VTp zh=ll9Ffp1FTv=L;Dz65k_yvjSs6;RrC72UO)T&11RdNaw%JV8=gmQvTmReF#Wi*%% z3@s&c0v(H!ILpD{c>27ujP#0r=udO;|Zm=r`u2T+(OgCgcZu^2(uYT>Lz;>|49oGM{KFcF{&rVPdm zcJ(0WMCB0jDl?KifEZ$uC|v2%UBNk(iLk^f2qF*AUR@2gB32PmMf|MPR#i|F0M0C% zJe@o!ioH0?39wm^9z>|5z~o{00LR>Nz{nh7-d0m)VI3q900684rb!p5=0s6MgYP6k z5XGQ4a8j9Yx-KjpFb`E0?Uv4$WR+G*;1k3`^O$v=Jj!!nl{&>>dbhl)SPwdI5n!V`Rd|4L02?E5JT^p z7Y)rs6Db7mBo$eK!62R7#GAP}uF>&#bSM%tp_O0)2wJLx1hb+6sYDP4Q8r3% z&e9?n77AmfC!hdfD7s?d^7LpAETpVYY+|Bol`hO9U677EzDfWF<}52qf)ZVmU`dJK#KbBh zjH;R$om51KA`&UU!em5Hu}L0%9(!CVXLM3@E&&BpoSe#PPBKCcm_U)I20?K0u>&?F zf{Xcpt!0r>22KQ*=auKdIAIjA=@HM^#!m5sFbu&jgS~mw~G(;uEVVa?{dL7I#Xax|&cyD?#VHwDPRP zN{h0@JJC5%j9_u1jt7j6z{#3HAXuaU=AZ-t=b)83If5Cbzz5@;bRN1CAOI*`R4!mA z5oN)bXI?I#mT8jdag!6q3gy2;6wK4Aaw;b3>I&ovfGM1y#L8Uu=qjCbAeXA2fp2WfYTeEHv)9=0z>LWK4>$am-W zx2RsR&ax!8ps$syTJWVbf!S|(??>)6jvl3s4eqvAD6hC!-4DAuOLwD0i^n{4=o19N zSk&Jk)wX+kF22<1Uh8(J#fJ}Fw*rTT^2a3n7VEW`9`k#rV@I9&jWc5ddZZ-|0~xAC zU#5r;NO3&tzo0T9rg!gaEv%veZMT5C$~|6x!D#7r=IfJ;8#f9qvXk&uW*6n}_h)1%ymsQkU(3&x9J9*xX!(7{U&u?_6X7%+v<9t$I<;|J`Q(=+hH~}NIC%eFt zyUgDXl?ig?1O@3=X*pqMOBqwn8>{Th(%g8^ODmdt{h`0tE7Xa4@C5Cn^;T;tH)_Fx zl8Oq5;Cjltw=AFJLqZ+*6yvyBRqQ`CTZ?tELWN&xCXZaSb7f`W%r_u{t3eM1-X8ji z^cf}zi9geq`nEclW$C{+F8MB^4$^il%L3mQbx>tJe@%7bP0!Zy=3A~AnhO`wX?C2u zi<_lAxuX-OFt;0Ou3#Ei(gJmF_Zvy6GzbaAeEG)Z!d=kDrPr61b))r$(@8jk&aW0^ z88w&zbzcM4a4xgZJ~Q=Y!%o#Cv46sG#}!)}ng@QxWc5HDBl%*7MM3Kep)xVWVM;gt zA`PtKTEYd+ctwbWg zw1XMXU6#{$c6j+2Va(o*hUwGj%dPhgnw}YQq*&+t_7p1_bkodYe%0-yzw&O)Nh6c$ ztHRWRVzXbp=x^#1F7p)$#A=`Ct;=N@-sQZGuQ41Dmz}pmEZf| zcfZ#~D?Zh2F8Ug~;a>Yj$fmHkBfsgas|oj%BToK_UUVhYW$*S&pb?pK$a`1E!k-u& z^=!-E5cc+=YiiSB%f<{XX30h{hnSbA^g&y=UF;;oPra=`^J%?bH(94^+d^VY`3%ee1-hl`HYul(-Lq+0tp5Z6mlD))pI~ z4$y$(%8=s$?UD`dy>tPZnvO#`rwA|J3~2Aq^)^8RISo76>T`ZO!xZwL#hvoBq81sV ziyk+J1upQtgi2ng)Bf>v<;L_#z+uRiNzc?Wd1x(5Wk5A5VSIRL^}2eU#m?&LL)8NM zg>=^Vkn>++YMJZ&KV5U$Sx$WT<=(~>qmkT)kvk5!x(HvI<0+4Y8kF$QAHUtcNpP6` z0{=W~t^SddZK}94vr2JNNUJnY%GKhwJ^kaCk{OPp&)JN(vfHc?=L2HJ5#nq2?YF!4 z4KwupTk6UVDX3=6ls3A_Gs(9#poXho)qBRe9(>*H6%w%(U-bHBCAEEca8*XZc6i0hCd+5--tq&)BvE8l5k{ zna?wm>8<+XX{z4(as}7k^QDgiydHthKfcyKq2cO=AGh-Q`#R<+ zgeJoKq&AvaqjElcQySEJ{wKae4gmzZoNv= zC%4Gik(;G`aSzQIeDdHd7ud*$sYCxsXm zji2RPckievez2f(oQy6r8_9npZu)lD?e~WR=yGkY$oDqi+WaI@a4)&0W#)t}_KNkI zLCnr^yg~D?arGV~<>y0*&7sX&*IR3e`SR~;4&HCO-&_C1(KgeHGlanVe7c@UZLf~+ zXcpK$j*W1e;JG!UvTsu{8FU|0SRSm*HjdBN*O2hh(TeZ_S59uWdmG-+95KUN0u``4pS zKH&^~#KWW>&IPI-Impw+S2WE|S|x59^$iLa^;B(*zLyKzQB;;(RBC(JO9O#t?u$Ql zV1+XLd?OksUL8lxzAuA%cCNlyChxz0rNL`snz4!hbo+xTclvHcdwkG#c3V<=zvJ6s_Vtji$(*iotqrqYOE%=R z8MqVwEkaZ+j`!s=5e0d8`_uTT>L845Tftdq*_EkqZQBsh2#3|2ara30ly=*4%ZtwW z&=Ciyl(%W~Rr4LqtDb5`|N z6*}-by!xDVa5*yJ`ekA)`Uw+#-!t#%kAfOnmMq28#Ys;(`!uC89hcSP35rkB(ym{z zYfTZmcHb$3J$!@h9<^~(uWFUo$cL51fn6rWxz@)k(>g$_M^(D3n)LnS1E7nBzYhDV zzu|G#bJ5>P!@vgaM)PtzqDswl^h&SU#vrv5&jpiKm>X0EFGo+-~i`}HW=zD@jRZze{0x*qL}>e`((d;05WlgD50aSYUvA@fbS zwNvry%euDr(_2g(0|WIykzI_B)RZPfOfXCtgd*9%e6z{Mytx? z;pJ&W%7G{~XW91;&y`pkn?i0lcrN3#uKhHi3*R;)Vux8Zuef<6 z#0jsC&0S)?sNAx3i4E&KQztUvC|eQlK_5 z$^MdhkNgXUpG$bwu(R3^^1Zg)8a~7c(CO8r>L)zp&T;AT>5IY5{W9s;v}h&%zLs1k zReCVhd4B%YbL+WtvfWIg`SBbI{iO}dPHV)VxK`~X#?AbTr z4tn!Xxq03eU)kYv?ULX7HP6GLXI*Aa;mlAs(jbP&FwIZS9C=AkG`+oDPxW$0=UaJ? z)a$HS`KK3B@ysBkjW7C|B)dh?onQml`r6=52cp%;w~>0SpTo=q>~}%+sX4!~Ew@Ky zdwF|xS)$ZslhPjDk!tv-EU#-EucKDjSI+;GbM6#5&vM=Abr%1{N4d>?f#+{#J+fv+ zn41j2P~I^m$ON`<+h><<*k7}g{rU66hqiJuFd?*PP1f>8ed2E~x z;v~DCrh~M=S|P__>Ue$AUhv5X*<2A<$e~PO2rjUrINfPahpakExN1kj>$hR2$W#kg zf=T{&$@TYLlgu5qH7?P1+V>`pPrmOzy43HXDk(_2b1_g`V(J_|A!NS5WppBKNZ~V7 z1#z}=i|b%!PvwOo;`Y}g7wwU-T_^m)r^Nm?iZ?l`J z!a)(M1x8p2ek#M#8$*-u8%DWXO$8iP62k|V9nbn+^;j}n+I>^wmNvv8o?ozsTo%{S z5uRR}>3cP3!=gA7zG5$`{VhGGG#Yxd3{xDWpY~)qRdWHHni=v-@A?Oja=i@KLm{I* zcFn45=dQleaox-EHq(;)&T-89OrCjV?DX-#WmD) zr&Vkf`PXYzzIANiCIN2$IW1X-)UErM4SkIVW_VUhZTEpYQ@HbvIVHW#4+l>!`I$s- z2*Q4lt04cm#MLxL--{hrgIq2>b8Xw&#g-d5YKocLg-F`K$u&)&HO^y%-2{G~y_MxI zx*CT4nF~ppmrKtrcbjOeU#*MJ-r)JjAC5*$_{EtgZ0R$se|N#I3iOt~y<*^sneNg- z)ioC%?mf3l3EJQ4jQ-gkBB+B(4%rRlFTQA@Z>8&0WyJIf9IG%qc6h}|0sm>F^-U3X z%}@=8>0Aq5)jRq}j*LKZnLT>&Tja}MbnHA-VGzXCHS*4HqitHbKNn*!HLnD&ICn*+ z!IOs0ej3uHFv<|zx>(s_`_%JR#;p*k$qR-0cMEpfI%?{Z!b2OD&TYk|0{3>b+m-QU zWOS@_10T`UeOm1<9&@h1{1RIOB{IbZS4d% zyEyCW#M0e97a;I_L|eO}@kOo>C!4FrG@p3In^&4Il8;^=wLSUr1eN19x^Ca^$CdWV z-~mMf=XpkJaXF*QlMn=-vEZh6i{x|g;|Cj7ldB&mmBL;Vc9PyHTwq+l0Us#%UHgPC z&R72cfqy47SPFlywmjOK4NnVtiL$neGBeheYU+2`iY)KbDxRoOZ3PEaX5ytDdd6qp zfGAM6aN6i!%&}ptz0(+dj?WzRx%lR`e``hWYD$(xt~3O`hHrV~G&V>}dH4CO#G=in zeb&vMaBU0DMia|S@T*rK>V(`e(QxjemO%Hotx$5OI`eK0zIKHt3`Lg%cAEz2X1{K?^@zSG zaz}9xrDdgiYsT!_Z>uZ_{Au}5S*Ja}5v*)v$6Na0^3*qFPALgon%Xdx$(SC)^*PCJ zvWZPT5crq<_APEQ71|P|&-{iDrj$Am=N8o;EFaH4#SOFizyAu>+{s5mD*^`1caZ!} zkc*NhHhuc`4!n!gy>2y*lVx`+W1q1*2usOQQ62>cNnxJ5SUdS~P#7_+>)wd3Wz;!m z$OH>AGmklt*hi?ja!kK5Dc;hr5m8BukayBcc;kNc+EBgQtjBA`OYJR0Hs+G>9MSr5 z1+@-7PRX?I0j<$Yc;4Z$7mi9FrP$*6e8ib}*GKy=kmY4iZd80L^LXW;`P&hGrQ*de zpFxrOebGU(UisfGza!qE4ihO(bjBfYo96olJ=3y5mndl-&~;V?TWQKqXbkhR9TdjK zNdNvC{+n-?4RWt;-A~O-X{l5T0#6v8bKd8e!5?}YRe3Ou9AqequFhrATuo_~nOzS$ z;ND;RiS|4)!=82D@yNS=EYE(Go`TyhNw9HJ>FV1|&_%QI4^h;d@r+XtIKHP_f-<{4 z4fRDeu?H$f^;Lbky=~XCzuk0@EA@f5zSQfngF8);KNu(*>APhPYnCT7*!UqfgTEFF zTIiU~UO(pKTlVXhN5p>%=soE1P8!_Zcs>Js--q(i?T?MG`J?8~+Jt1E>p1z=xRce# zS6IqbICru-#v;hY7&OChA%Z*#dCW5&f78r8^*&YYT@@ONasiu#%?D&Jd~bNEWl!b4 z>XxsF(KcxpeM_UwtYw)I58-?CP_1kO%<#=TBl&%Lf-Nz;B3xM8&R-|-ac-ViJoB;Q zQz}n)qMNgFY`(-+|LV8z*CeLER$aT7smTj34S&0R!$D~|Kd+m|J9jWGsN}Y7V`O&y zZeqeoxT!OZr~CKEok?x6#m5`ihsE8~N44(NQoi#isr4>lfnDnfeX?pXH!SLtx>2m` z1n%-|!3e`^FvZo*?_g}$GQTnPbF-jdCAihQQ2}$}Py99C*YRetI=GtHni@s*_$8@^ z3@oH9zXXT)7&9|`e1YOYJ^bFh>|?7}yEd~N%fP@C-fwTAEF2Z;x;d$p(}nbHkyIg2 z+11~?7p`EzKgavMbn)7k_1U}ge(zfOu01YTe7@32b)_?E-^H$jk1jdx; z7UbkNB_y6m$rL{>xPXMsAoUu}67H9yQDb~rtaKr;Z*n`3Z$~lI?xXu)E}E`=ad*wF ztoeFV?%vSJrw40KshTtwI8^u~B9uDx2jhFgi>7C1gj8(!t(cp(pCg)YE1=s}9?x?X zcA52E)98XAcn5;+26OZ**>Y8Sntgblx-2mIRHJg>b&~oE%{KuF#)J`0EXD(>G0qNw zHwIpBG>*GV;hO$bQviZ6SG&u&03-0vK8l!Hab2{NUhL)dsdIJrk%AW+p~P5NhLnUd z=Q(=UFMNNLQL zHE3ceWm%IE-H>?r*wQ3Mb}DAMmM2VHGO%-bbTlqt_4ZHyT>MXzg-^tlcYOpAppO*s z=j2qd3%MEFFvY#c=zF!xCzzf_%wo|XT=*Ukv zq*5?5GhU5d!5|TnEkH_a&>iRAja+UFddWv4&ncbOHE+Om?ech)tawkJmrJg$VxGsR zV<9W+>M$Do?&Gb*;$zWQ5cs9Y3(QxPxksN46`vdSwR|REFBGvSt;V%9)4l!i!Rv|? zK_SI{=Y8&x8jiblJ@lxvoOPMzBE!+wnujkd%_3kQ&YSo^u|IC+8T2ugU|jHMz2qlfAD+K}x(u2v ztKE3kB~*BO%xPrfX@T)!&3u$1X58|UL?cz@*8H}>r;~!vhZA{4?^yMzkIUI}s7lvs z_ui!AkO$Wj*pr2yOkyB#%JYjZg>n7ojmeD; zmzmUD`Ia1Ifs+{EjP z^{EU;T#L1%=eIIm^Jg2YToIHq-keGrR`I^%2R^S9f)uQMBh*+Vhf3%9Rm>U$nMV z#d}k6!|jKQHR>Ho3J&zsvk|l4+}{>bO&bBTwy*VsK1z!Bc2?q{tKV+j8JTU(lJE{m z5ncQ_*7f1?k39u{f_K<>6z`<|a<(U=WuoDj_<<8s)@>vLx1(@_z$4|`rLIW5B$uAe zc+e#-Xp!*!^*rUC6oM$V8mFuwx2vqJ1-6Yp*Q;5*@#WD zzcAs%(_lug{~`jO%Z|gt5lQJ=zN14~iD2 z=ao&3eRKpA?#ZKj_g2C_xHMlAx%<81XeBacwlFo0WBS%lZm;Clt6E}4-9>V{ekr4v z3=upN2aXqCPiRv_Idct+;qKj(`#B>c;N2hydE{ZDK03Jc&FDqW@}wCAK16nx+d-_} zR*b=F&}9mi*CBLU!qiEDRyicuo!z_bDxE*Su-kU~umJhMb)YZdqEx)CdNeY~#aS6w zFBub^$(HCN&7CSM7Q3h`p@O4Lxdv;tFIy4hx}Q1Z7D`EebEh!2mwst*lOb##uf^9( zcO*t5uu^QqKs)gpA$pgunHmykm!HTbhe{s!Sz@R=ZJNyW_($zAoAB~)!M&E2_Qv^0 zm&8XZujL}S6YZYnfVc)0ST=W)N-f9P*0xKI(_HXfhi|j^1?qY7k2k)oMZO|CjBqGV z>CO+^p_vb!W2u!ivZacNyESgMmR{E5{tVhO^SfmrNH04_)U3BuFx1h0|aNX(qu)czNQ17p%pPh#MZ^R=iSZ{O3}u~ zgg5eAt}JX0_q~=PFkv`NS@DA-QKuKSJ|ZmcQzh3{Z-W5-RWZq=?PkrSG|^<$t9_8UBoO=eE$l9kxxRY3d^)$}yzpF&&(P!o zm)fHZP8wn9zG@~T(85E^!iODNcl60EQ0Ag-d4FMko-PWi%oO?jiy(5!4lm7caj*Hj zju%~<=E0bSr$>bD%I#c?gBb*IOIIhjIdE_N27xegn0hC{dt|!sOV*S3OplX2@-<|= z7&~A1Sz(=JG1%wYtIff;NBTVJbbo|rT@t|NTn5> zr?V@=JBdm)ES#S&7|!k=+BtgMSkl{n^FZFQ`TCUF^`DnTM`a=L2GXc$_5JN2$5ELSLAK(|ZEui~G-Dr<86P(5)#JMN0T#>Z0hKbn44Q|zmfkKgxsw-f^fL0paro~@e)4xl zziUC1xvw|HpApls?-TdvBZFJq+3VoKo~Eec#4hi`i^FE;a7^bXrVGZrFQpJF z$KpfPx+=s(51PYGiRqi|POh$+W-La2Ewp%%m+D5VF|M-LTC<|$F6c6H!MW-6Rl@0F zgnk}3XFmyv&Ph_{W8nt>@E+eQc?YM%3-4~&&oy-4Gv^JyJ2RG0V^X2`-PLuv z_+?o9FB)53=7{7je*!kMH{bv8w=O%|PX@oFq)kx;5ytWEcV<+Nsu9FA^MFndO$hHZ z+DBj2HXpJ--o2JQq^VMfcNH^!*z*-fPw(;k;w_~1_+W3l@4N(au~CqCx_a<=_pOp+ zKuUBysu?~RP&lfm;}91Dg-vDkMUSwYW$j6y~A7vN`RT@65ud-f=wxMA-T;V40@(yRPclSX26sWKH4Fn(+L{eZv zWc(wpOrbw<(?PgSG`r_r^0)O)k2^4Dl^KjBZ$)Kr)9r_NIi-Sf3iW?{{wkM2zE-_^ zUJQf}F}tDOIJT0otbDGFH>BfJ>KMN7+Iyr%`Jl|W;x9I@ApZBA-+*tP!Y&)&Ss<75 zWtMBM4Cc~rh8$sXZQSHp1W=#}C%PW~tG zQcCK8n{mX3zCM-F;^F%8U)vjBj$YVeF)>8uX*tGw{qNvtpM+> z9fTutI+=P-Q4SHIZ1d<#M2NePyhfPPji6|0_wR#txTmjujfbM*4kxDHW|Y((ia%KJ zYRu98%Amv>eaRiiyAcqnz!54eeeQ{8{qFkmVZ(u9$X5Bx@3)n{2@v?zC%krilMfuF zzKr6H-`iD>h2)RcFDy;35B#QWg)6H@7TPt+%9kbdR@Bh?pA%bSN&Hn4+163uaIaE; zeDy(sd6uEr*JnYP9p#UKV>f(K><(ubr_~M`t>pvlkH<~E)C2#J$z|KTwr!}9y{pu| z#~k5#O{knLRE&LJB+gHBQ=x%O(|$zc8|{KW7j} ze?})gAJ95KE44g?KDnpJX8Gh-Xm|fhnxz2 zZ1R^5TO#<_%-H0w2|xMvwHAq6kQ-?|o4cLA2K^nDHyF1e)Zfb7Rlen2?xlZZFU0nc z`|}gaflmh`=*ttDTS2?*t`?bYPcMUq5Sx31J%{x^gS?1Fmyu!L)%e*MruaKw9+Y%_-e=@hnr^n)Uq0%9z&no)Ba1Dq zCpyBQeIYfQ2kl(#b%&e07@i-M>^$gh**nM>(f3Gy#)s_3)R*KZVx-5fzKsg&Ti7VL zxtFR=heRnuwQiE#qA_!q~g+mChMqUTc7(f+@G*MYP$L(JU2{XO8hM% zHELHl+40)G;IUZEXYi3hjehfya>Dh7xI~R^9OE3VkjQ-34a=~>ONN8qGlgvln?KHd zd)pk*^_K6L@-BZ*)Va1C|5WXfp(hd3c@I`18Ch>14Q_V)7F}L*?2(-Hz1bSB)Ujt6 zBbyA5RDE$$L7vF_U@Ckn1WHl88?y{o8B0oGX<7ab+f6bM4TaB1 z#?Ya_^E_K62wc68HxG!@7LHEF`1|I2l!O9)zODZ#V?RGK z^5C3y$*TwCS2TQo{u~n12!SVa^{|(ZK6|^n>OHDr zCvoq!(0yB~(YJ$FLVIQlwQBTA?x&`@4Y+-BqTGU(^`3vWpz>2oEU@t`^Rv6(KP={W z2foHckNkQIdx_GAKoI(!n93gJ=KTzKDC-5*syeZ_epkn>E7mAnd+sNzOEfoUl!k3D zd5ud}yN#Yr8l}#+TR`<;nL;83viEym@4M)Fz4fq+w4BJDgD-)f)*)2<_DD&Ab(#8Ynk->$TBINOB~1Cn>))F1h^!MoKvEi47X7} zKX5#MC*T*`?O}H}POo_goM{Sz@O4MYoG*twmto1q6|Jg63bY%XKYwF02sgQlM0H0R| zqfXokKYRRtA|V|K$ivpr`eS9_^UYAYh|C+tR$r8Rgwus5lUwL6z0vAy5R38L7aA-} zluo_?w5OV9jWHK9oFMRYDhQqM`Li0v($eB}x2u_`ojw)7jgWl|R(GE=t9=xE0=rP4 zXoV|H95oxIa4b=-$`OVUweT$JJLXu1RvyeRoV?FQs2#t?-2U%Ke3OS#NmYDSNZR$2 zkE*)mG6^_b#CaTDdc7%~6N>KY!=#F~+Mhdi6)gv{tLM(==Z^K|Oscc1IjyN|Roh;M zI|~~VT?I^P(@i*NvwmYciyuY)elVmQ@kHLe`i*j)!u3xIE-{NQJod%5h8BOAb(p?> z&0haXquT$i+)HH*_t@v`axDP|$X~yeeg{FfY|ZBGlKN zXxwhO57o{+l~c-{{h=JBb;8Aaf0k%1D|+Nm6V^rB5p({_+|hGK!yuQFnT@Xbw3Tyw z8%w{H9#OV$26;m=7iW}tX&)?QOVaX=8yNUJw*7kHeuy%A2nc*3(WI_N4V)b~ zuaQe%94j{CE80T=z8Q$}cugo4i_!DA%+GbF7Qs)R4MEr-O_GINQphKkO zFaMzrb)Pbpzv;1h7N1S(-#|-Zl4aw&zZzk+@-Mq^6>D?i{p={-8OT(4R&kXoE?$CquExJN8OKfg8#LycEbMeKR60Rt; zP}QNt$D?}){U5+ztDhoRA8OQzR+@kE#)`MJ&TsmwUL(Guj{N6 z8I&IWo|+>MEO`Wqc9K3p$ytX2$Tt#v5%0K{;!CfvzWNq8>gN~cVh|GGxbD6YHg03O z`?~1v-kQ1eGIvsmzwoPr2@bnKzjIWw2`tba0dBJ*$7-IFfjuq9vmG@Lz7##|s40D3 z|NS^<@>pt4RR;p5ztH_wJ4N7fBr+|>Nm_D(Ml|{4_Wfrg@JGB>&YO42b5b|IJZO1f z%L;*OBuL!4J^ZN*S@oG_h~i&Scne%SKa2)?^er)8+6_R9yfO7mC!)_-q3hR=ybL8@UU~a zed*L>ge{km-wFDd9PO8TpJ>A(Qn;h4KVWBzdTjdXk-F1(Z49?l@3-b{IHB}9ox~*$ ze}(p^7;bj)C7J2r_}7_oIw}Hc!lf$wPr!=TM_&(qkY{S`*l-(^?C~Aq|EMZ>&cft{ z^ULRbo2OfQMgR#@%#sD+^zGkz5CS1wK9?r|Q>Z(Pt96z>{J#d2OeQohhny5IBsB z#*=RHovO@5*;kkyP5VYAQ2m82llxeNsFfw>%WhhzC3O#{aB&K#?K;D7gJ__EeLzUK z@BEFxA>_>*itZ;R604$4hmmb~FI?N&s)LXA%E81&_Q-p=%l+precWUZrn&GY=6&5I zi-;w=?DC|?9_6p0Fs^&@$XGXtnNV-HWbh#~?g1@m!UTH!NRHa<;w1qSd*jOK5r#JV z4H35nU(NSl3EFoO-buw7Q0eswm$`b&RvB|8FO^}uL_?hW9c(|f)*)&!U*qO2liA;L zxoN^Obh=%-tDrprQ(`NES&BwOZZeeS&N)LU9Q47Le$11G2XDR%yZ%_|RX`H0*@G#lNI2V9g5vd%pkg52okJ44n_%Ksk#uRu`0S|ctz?B?ajWFB?7iUVOIE`p4D zG6Yg9UgVLCtfG!Lmj7Sq&R!p|vy+{V98hO0`+Y9b%jouu<`LL(Mq>chJ?>%a1%aEN z7Uj0(A5!V`GlXjVUI!yAA~5O>H5pD*hrc1r50CSDdwFHtHV|ol%!gy+yZilSk|;x+ zTd(Ol(?ELyj27-|mB#jp zWy_JFYizt|q*iGwOCu~PAq-HDcGS}`iNe}g5R7n5tExIKIx|43(_)-U->IE@BN(sO z*L_Q2hjwejYC5Mgt>=XW(CdQ93OJ8!o9 z=r=pRMRIekLLY8sH*lj*?kX%(of{@XF1v3ucFTry3A}-^FOw=55W^{_?hM9f7&bRK z8{mvYGb1h1PB^3GyXc#W#-c-}!~>waeMn&4DXi(-s~Eap}IQ3 zZY5n5$0`*$(}&JDOX7FW`+H_1EI|3?MDf}ur#d-#i@EW`$8!RVbmPq~+05l-a+|}o zwQdMnTO5wsioRAA3A#et>l)%JT!**rc_G4od-tAjdJYWmI#s~IEzlcNsG5g z^v4jzRw1T5qEw{y7NCbMdDYJp+|Dx(bi}6Dy~*gku11kM45SDnE=HV|($$A7Yu&vJLb3tB*tEZmffPH3G zLIs+qBQE-^TfXN|7~oJhTCj%T4r$xFv!5Iy8@!pQI>kX1?eZ$asB#F$L#ri zTkptKdC^BiODyj!mIv0ETbYzF+vh7~`6~YWv`&bQEJe{DRqhUq4SYwXE&>IMIS~9I8E*zBv zQX-=PMF=2+@9*Z(_*9F5PK(V9LW>b zsxb^?QCw7cnR9%1xDm=~v;0MMIWC`e{f(bg#~zQI^-i9N?K8BLnQ>L!$HDze@qX`L zL|-yehdp5)CkxcGv~)P4*O$U{jAiqwKotb@w}wnw>u20)wv%rlm-p=bx2*dE(3F$Y zv0iDc>fDHEEOz(^S$U4!u#ixIA{~r-*udR*%yev?0lysnvY(TO^g47`bfffbK2<>@ z*}Qbwn5fJ3Nb$?JrA_p0Vk;zRk%CY1S6on(X5*u6BP>(S#$9o3^AmhC=l7Etb`zU_ z)WPrT$at~Ozeenl&sW%xK)ExLIk2AN^qfGDB--ih5&o&$G6T9LtT zpHuCQ8{DuPV_Nd$L`87B-O(~5boPyr7Mn+lJ#-LedtrmgM>BIhqec@AG zn;&GvEX)_OIWKh4kW=-M0~&~qDHo>K#ORW}9gv7~IYy2G!1n{>?q<~cC$O{f75+LG zSf@m2HHX@AQD@Q3H-YfE?b$>*6(cOVfhtYKCgaL;>dj}~U;BppdM2KO8t{uGa-*XB-xrKZB=a%mCZ>xqB3o}cI|jWaE~|i08zC(o)h+S(Uh!tbkj~*yDq!6vrtT&F_whfu)IXnHkwocGx~XV}$@1!WYr4CQllFNL<2$_(kP#YhgD z`tW$)-OmMLBO*%=g>x~U*-IGBTV3Cg8URJ$TZUVvY2V6gPn~FD59yFs|;=yGoB_% zSZMQ89xsy=WxMJf7m})eJ_Qt}&3HXXW!<3HeZ(50jJX;-({-MPyDV_jj*f8e*>}6~ zA=|=h=iv9};hDnScf>&KbngT#)8~zKu&tfU7bJ_b{1eGEa*Ff&@vr)cg9@Thyz=uRJ&~70AB+P9i&z-juw=031JTzPzD4?>Cc(_ zX3jlPlZVKMWb}%Jqln_H0)f+Ujv+^e3o-MsT3MmTMa^*N7;-t-JqKfNFDO{kawpF0 zwyE2ZSEp@aTQW@yAjGk;xr?n@knH{bxA9y0>f-XPB7#n`%qb zXXauZJLjcIFP{sRq1z0fsBTPGQ_LpxK3@s(2U6&@BVT2ob`PC1t|Kh=(`-L3MQ-n8 zEh2+t6$q|82?d>E#Uv{PRDl`~RH7GS2x-dJi>m}i$*9Ok$e}Hp5}LL_83_UfAlEWM zDED+Ga{mahjFAlP*djU_Kv3P>?G9g9Z+6{;+hYbL!jE;CYH9|Ki>VTdXGn5&EaaP- z0O6^-X(K4p0%MY`mTOkV*|1_wd(f8{;uE^*^1Du|wjzAJ=LsPYin-s2)g;@8ozt1` z(UN){OCJ4}v;T7D*2b^cx*=EHH(s$HBtC7rDVGB-muk@ZS0#P(dy}o5woD%Aww$3_ z{eqFhgevtaGMLIi#^+DFP=^B$ah48u?c-X#@>}w7ElbXrK{srDNN|vx*@QY2G(VsB z*(mFEhg$BOHS(BM%F()(E*MoOrE#3O-CJ-_)mKe!EJ2>dXI*O@#a=Y#*PT~qYoSTH zO7BQ7xPf|$u+ebkteHv4Kt6h-Q%x{BsBqkk>0 zZusXd4*VjYVlLKK$~$P`B-ejE?x#EO8O>vY$X?m4Fq|&7Ktj$YvE?n*pMk={BxZ52 zDg&Ok+8!5|E1i~Bw<)7Iv_oli3+_CuuDq>Ef(cH=9n9`yt?J;m+Bu!4h|`VPI%1Ny z9V5m)?Z1M&L>OE2@x)%Ud6;R-QHN)KJnIWdlJ_9q4C_KiPMYAQBh!4kQo6OdEvt4G zGpQTBdgk}`#CW1x$?wHceKg|eI*mhj|G{5}~N3Xgzvul3Z@5N=@w3l+e>|(8R8HMM3D=zSBw^bDA zdh0l;q3lhRp~X~>BQE3nb@9utPs>g$u&o$o%Z7+hN`ef$tmmw>Y$GhLO=_M+i~^8J zNTSPX$4>ayNfHO2HX|$!6Kp%zMc3RS6ce+Qz0 zRlThiI$B;wTmJ|=PxUmf77pK&u=c@r~Bomgv;=>OdMk8P@Ajxa-wXspBgox2p-@ zACrQIGviQ+JZI?|*t$Ly*5;YLc}1wI`eJ=+!gJO3sq@LS!9FxvBe>@4W&Nmhtvu^d zwIY<6H8}UywWL~hb#C}+kwmj~IYXIN^wY-|x_2-Q`|jvva|#9R8mj2BvU64B4yonRp^>ptLyo?-> zQMMUh2BY!EEwq-MUAkT}w;-IRZF=R&WE|6wK7DgS3JU}-r4;v=`7+HPJVK9m%eo)ESH9(?M3RhE2u&T$H@H8Au+c`3^dVW zw1vIEDKk;qwh}H7P9k?+?#KgLMY$i#ErPSxQqOdE7edm#*1Ss`Wx81J;i>r{{#s7z z9Vd;E<3r9axAmh1VSQHebEi=>o^e=&dZ*MrCTAGjRUTgxUH!4?+2`YaTAKS;u3g7- z_{sY8sHmdbVyteUi-CA+HrYA8*iG`Z(l^3=^_wS`*Nx8RItw3lct@TeqBryVVEO8f zeS2%9!F=m9VF2D&T>uWf^tjfx*`Av4t?w?n!M0QATWak}gdT@485P(!sOFf%Bg)hk z^lY1R*fYjij-9%hgcDB~^V%@E#70(8x2(P7to+?QLZC(Zc(BYr8Y3?F)FUiJBP_t# z(~Mm$&xYEpa~BV*nFR5)Z_4a@ONX#j#8}EZS#8iRQa~cvg>gY~cx6RrtD)HU#B9$T z_lyO=R+7QGj|$zcc>ysu3?cuohD$-@h6dW=*&6c|lY6Gu^=7kk?5pcp~) z5V%9C=SM2Z*dS823`Gl;`Fz2vzbCo|Wr$m0a$~9D8#K|>$^mS>UR*#r@q-|t57&j4 z9ab})IU(&(#1lT7<1*Igo9vQLR&Z`;#f_P=kignT!}kJegTe$;49DbDWck zt>tr?qh)JJG*P3KbBoXv<7bkaO^y~}Jw$CbI*rXKG#3XkTk7{0+|K2L*kEjGTa(ec zqad0stt6@_$3&d+_dS$S|2o1_3C!RzB70RwnCgno;pB6KNL`q(m^#9fj@T$yDRzOR z7S8P>EY+eN`U(CTZ}BP>2`a*w(v+Mqc*h(w<^ z3@#6}N+F7Nk*k@{#p3`(yPw$Mbb_R|<{aypoT}J%!%&179W0$2`(h;c=S%s4&$0p_ zOuqnV&#sAalJ}@+uz=42#UnC3yJtclU;u>{+Nhky5J0?|)gU9l$F~9SXtrXNasmSj zrLCSJVAKa`xPfa=kTtcC@|+VCt*ggd2yIYK=DIf1lao`Ur9mQ|l_M_XF}GbNu^Qr} z<7lf&$@1^CSt|ra-(9#!1aVTs9W2k)X0&s4Gx&Jp+P3Ezek7RdZj-@kJpM6?x zkivfA*iBO~<2t$ND(b*Z(e|^lb6zN3$w@QdV~lD;u#h7z3pl9~E}?dS{?Q8z5bJ5V z1mdtNc91At%_em7*&M}G#Fb1WeU9fIJtW%>7LL64tRc6=V38Sf#y0T@xlpL3NE95c zx#D`<+m&RZR8$N@X7)UkgOs9POsYJ`Fal-b<#D*kSg$-A=EP~Hk-b;R8^KInjKu&) z3CdmOB=>MfMCopyOjPL1vy|hpjr81$%9wa}p9qAts5pErowG(W<(QVvJJZ*6{U5$q zbPJ)@BW7E5kexHgCUgQQs_XJgH4$#=VxVelM`gG zl~h6^48*@>f?fQNj?l~Ol|+wp z0-!NcQIK^1Ew*gt#3*jPL;CDaHcrZO5FzidU(i+e<+EMU&;Zxz?^qq>;mg<1Ie`S( z6j#>T2Uc1Wth}0eOLHb0owv!vY}LE-vn}c`A!}9}1BHwuM(JC8Rx0S*%;98x=6$Y* zo4Ia(b?a_r8o&x;#IUHFgQEgJ=QKQ1b_|PLjc3ZKvif6qvTS}Wm z`**p<#Um~bcq<7UiDdwgI6Zy-8zIYz!`k~C12`(g4#)esQ?P^^eC?J`~FGlY5|0b&Q$s-4cS@72G2BeBM@sw;(ZKd|4C z_HWPBY{wPeNd%EdvIz*pP(~d{1os!V&JPbWw>oF9BP?C3@ec$llm61ryY&A5N%g~* zo}Z@f(NxHBu&~}r)23Qmgn1EIJZ3h~4zYt@j08xUjqdm zA_Da8mzHGB8b7P!ixdcf?miFkkFV2~JOiIcg}Lg0cq1&)3v>mpop*Fy0e>Afy)Gyg z;tyzxhmIbmA!F41V8E1vu;aU{V2v9`!HV_LO%irSwl>eZha)b%;O#Ss9wb2nrj4pJ zhGU?EWYCbxrHM|>pH8^qbS}jxFabejp3$&w$b4@e$?o8$%ID&|Z{vZ*eVzF*(4_KN z2Uoeam>sN;`;+-l^QkE)4s+icPp>f@r`3ptNyI0l2lQpz>4twi&Sd4;hsH><8aHK; z=Nh>|+HWwjn2<1-7?c|Z537*SI%ZN+o+Xbc>WCjmr;nF6apReW`{axu>_26#mgAj^ z7MsYuSJ8x6+SH7!I#c6kazJ_No?WnOVX*d9%j&)y zwrSCFjjfcCLPc5NP;a*4C4e@Hcc6|n64-gA=op1$Ay-|veFDkN>R*PP>^Dqhb~Dma zp(8G?+0`_S+}!UIyx(s#lKMRuQ`r)Exk;Zp8SLdRZ6>-?X19gh$lP|#wIQ!A(C8d?k=WHz!kxH$NG8$l!y<*Yg<*MEWv>{C?T;8}K=eEW?a2M!n1Xh87 zjUwXVGMT+n;bdG_jHKR^Wu@GQY~l2g6A}qCCH-~A()Hj+5%1v{A$+=`Fzj%|R7&519&DU zpK^De*ug{_J9K^_we2k@*r{Q-_;51&0rYfuJSvdQaTTdHBQCR*lmgis%rw80=okVL zh}vWxP?~$lq8;y}(rcTB7t16S@pd|_IOkC{Rc^@lR$Tbp4mi*#rU(Tvls+RY5V4x7 zzz7gQk*p&wipiUQXn`7mx%pf`yI;Af7&sjF2)1!Zq)JV!&yYeD?tLLy=Ob|m5HUw=xIXegyzF|;ZRMNh2Stk7XYR~d>4D_x z=ihE;K&15He$Jb^cjoNrFnY2qtK=xeW{of{4`8^5T^paHl!Iz;b7L7^Bu$9)fdN6j zBX$Tka$SB^;b$VQH*RXA$P5dd7tU2?;T+*4jFdHlsm3|zCY$xIC1>mYl%U(wuq$e?uvXNU!Y-GAO2)m?6V3_huQ6I@Ywb)T+S$7y3SZp4tO1W_+02Dkdi;T1B?&h6e;|a zflCkLg12Ag{#T=DZO85TSoMeDBP`*D9+=z=kAxTQxYQx!e0;q8JDq=R7S!n(BP<={ z8V_`O*2#J0Yn~~BN9D+o1Bl%@w^#CIJ^{GU9ZCKlPuOH41L}~93wj>J@{|eII!5<^ z=_4#$IOfq>;_foA&9YKM1U!BI;#AqN6Zmmql(8o*|vXFnQu zhtnF2Y@%!-l|D=w-WA2yd_!`+`-spnjBX1#t4 z`XBIl?X1>picf+cN*EbQ3=xy)qwD^Bd41}F^nLow!CqpNZ9lJx_||)Wh(CYkcS%2{ zk_(6js0;vS$x_LZ1{p%cJV*=Q?3+e*VZ0}(8YgOl z79hQiQHU6JL7_jIZO4W-%0n<%k0&7Lbi6=7d*~xBxK$2j+Z2V1M9?EFYUA=;wAY%g zApqz&Nx%bbcfqrcLv0|a@@Kfy_VT?DVm~?mT z+fzMe0SgNkBs!~g4pruyn&|DMD0&digB`XUvRqA)ANS`b__Y|#nGySqj2C4FSt=te zal#&;6;dCOw?xT5hO;M+vWJh)#W%HgNRxeA}JxcXh6ckd& zkDhyKi(Oi}OHV@MpswEWP7&^4VtyzH80Xb2o`?D9G=lSX_8fGTUz34eI}E}M4q+r7 zG0Zb6TB%A2p@|k2reLlUjrRK}N$evoswqVTN<#Zp+sDsiK;}{9^hZF-(a>B&LE^!% zHr*J0oIXS&EVhV@A#$&bp2#CC?OF&W@Ph1QSw=WnhXk)W3^Ap{yDrOP{CQaTYN!XHUkbLFTY5mTdPo6EXmTL|9U`tpKk zO-$9)KA?Pn>|pg}@yG`wEE`8%*6;{yBP=JU(^;)Hggmgbf>d7W-6JftfyIy_1@s6y z!=eSDVnw7zCCLmWbTRL@nZ2$6;y}bA(h1$v$)PEtssM^8k5Mk}!*AtiJxxYR-o}uq zh8ltI@16Ywi>rfDZ7OcdCPS|yL%vL$m@H`Q^D<}P&xXY2g{qQ*LyT!Wo>ol@?|nwJ zGa!qCaj6CbAkD-XKL|Fu+N*Z3?5Fh2ISRW%Ux)Dek_Uq}i*M)jgXUOW>2F@;x z5|YmT-IZm+7c_-)#K8gJAT0%y!-*bqU3&cTVYDA-!5?>f!U_r-4VEA*5{yw0YMj06e#cT;eId=}mBb90V2Y_m33+n+5Gdg=jbD{419=@eMb8s>O~ zS3|Q|sezJta3d^v)isjM!|0g6Zi;4Z4@ej%4(y5!e0*+_Wy8|wIW?MmdKmJ?H#N2= zz2MocD$$+VENi*z?Jzb^oL4?Z-Hd>lw;bCeg$#qozlLI4C4f{w4!6j^c40~B96qX{ z5ox7)z@!{7BQ6*!fxf9UMyi4$h^opcL_?U!T3Urpu1u?%0WmHhe=ZKE!7kjxG~Na*V37qrVPJk ztbjUJTp;_QnUA|RAgR9$`pWWuo;rtRFSHj>634fT>^?eN&V)VB0Zpi)M3_V>jYGa| zJVd|-1OTL?z+f2SElU#zwuo=~4Eiw@YB_JB(YNtdq1V5AguT_uQ8&&K7?+cEES>rs z`=vKw1#05UcOxt@EueXM$xkt;I6Yej0)W*& zjJqMj*R@;PoRaKnG8*Pi#Mwo034w@5AK#?4&I1$I-%HrXZGsUg&y9EO)a`spF~+a( zNi@pzh(|#P?Cq`_+RU322t857W&FHFup;^*wM#fkGpXJ6E#p8syY!%)Gcw70PP@_0 z;^)TZmgt?j!=1?kVqTXyx3`$GUp$Q<8NRu5nagKAhWV7*boyO<_vD$2!S;IRoz6sF z;N`|Wbx89-ddQtph!kZ(sD*&=0tHInoo`1R!0OI``8q|56yS@aO0gp>6Dvat62!v} zv0fmgJmxobv{YtgY|csIIuO$Jnh!akHW)*DF{btDF(@J--Tb0kM-rEwT{FM8x1~}g zu-VISA+qGq-NPd+wrj2(o+a=v7`YKV?jfMcQihvNsQ=Bg8JK|ZfFmrkp?1avhK3=^ ztXe?EVKE~vgRl-B&sP{|BQ8g0*FKHeG;I$qAR{bbfCNEB^b6w^)s1N0;fPOFH`+6<+ zOLtrN>jeZK>ir{7&IF59N=PWA)irR;Gd2DH>@lXj=aav8({ZW>ev_jNOfmbr?;-K6Q<`PZBQDfRXExGD>;2F3S6>Bt`P3l-Cs@!z0V<>Te`nw2 zZ^QVHso~$qeN6@Y=MeEPzF9_&fQ(ivNXz%ee~xB9;f9v2xNOQp1u9P^ zWc!b?D^2|pTBS)vdxYBC4`83S^Zfm}0+>V<)sU6Vb|2?(6`lRPw0I-EP!R5E%WkLg zp#%E}ETXCuB?%)ge3~EK%2kY7PwRO8ta$!T-_iKa3Htr*=JSGu2*E;&ieSz$x8#C2 z0DdJ)+KQ}hIlM)^L2Ph{eP}ci8hpYpnQEd5a*U&SBQC}1Bm`}`+FN_~#oq8^w!6A- zd9$mT5CA{syPgn$nOogHZ}PbnRXQ6#*$FatEAlE45g@^qRqd0)d?x6f+)0B_zAXex z(7MCvqp5Yt`Fs4}P2OjRlMAL5;n{1R)w~iy5D6Ix9nBti`A3-WK9no$60upu2K-hq zMl+8K&Ki=CR3Re(EXb6d>gFAvT5X_+278QbW%2fU z8qHlFPTqZ(&cky>3(wjf-D;STo88)|;mL0%-qF$9xUWD!;dIrxx#Bzi65&IkJ)aQPBggg#tuKk;7`ajf9?1Aqs@4P3lfIcFC3=t4@Cbk0J z_aG1C);(_EfF}_iBQAJxX`l%1I~{cjX1ckfk`PDgo;tY9W(R{Eo*1-ec(w{f-~gaPpC7 zyV=Ks$A=>>6U?fEe(q~V;De)tI0qsi3Mz;81A&oa=LQJ-?h090wOj&)|!(PoCupb0}qzGatJjqO*T-RQJ>>eIiqlZ~T z6vOyn^1P%(9*7dXwuLS`%rz$3E-mXdo48rYBqJ_z%@8E2XAe2D(TM?!$MpBjWcp#NOf)>8ND=Sq<-V6; zvX!rmZ8%;+zh#W)s`o*kOB^QZ-I(vR0c?X{`CFir$7u}Q29l!*IVc|F>2m={ z>Q+Ys7^C)+&fk01Q<{`-jr||W)k$MG3TG->8$I!1}38=ZqNGydvQ*7>Rf~C?O z(7a@sLVAp6V*b(19u6qbW}Bk5=ikuz3yP^17=@p0@wX{NUh*11G+yS=%JC^Jx7%c+ zxplJJXjFik#Zn~VQjJG= zdTuMKoL$96Uok82w&w>ya}d* zMmp7@=byKdjd^bPe$gBc`1gVd}%lb{td z&F^t9ErgVUB}sHl`MbxX-0YajmWlesX;Tzm`<}5Iceuq5!a5rT(<1AqVk43MiQ%#f zhT-V$Zp|k6ncN)Iky~J(-sNYW*pB69G8YBCV)qH&C`kuabJTWbyRWrH%w>43m*r1N z&=7L%=ke*kHGLd?t6MT2sXY6tr^+hcM-)1Juc1CBz4wdL9Il7e=0iAx)No8AgK`jK zZO1J*&ef)pcQ#O`uc3YK=WplW`{61C^E0#X%j1Wn^mxa4UeHB+-c!i-wEBj@^OwAUNgh(?m{ShuP~Z>b?4pARE0MiLW$dHBZypRUQ+dtAss6xzLyN!4SNz0UKM~tzu;*VI$7v|@)(YGQcIMAzZ;dHWvWwGgMTmv@+D!u3#|ePgGB_q#_`@cN{MrV)+;BP=O*80?S1SF`0F&hm`+vQGQ`<{E2^a*Sw8 zx%T27b^dLQtfo}Vgb?GmvZdeii1?wfjz{pRBP=bE2=EpWiI1#J36G!E_1>YG2tow2 zt=b3Hp|cY>_|=?k5X@|tV`+GIpM#7Wle{I5!N$}u=Nx9GsK=xSqW0%a>H3YxwZB2< z6~Z>)<1dQG7ec)Agoh|r&GKjCp#4rLgBC?ifJ1>kd~IkE@O;}7fM1{M_{%iKa>&BOvs z6q~9kBQBpKE)i(72Rl1TP~%Rp@Jprn7d0*38@4+2!He7J_f}b5rM$R3={Ik#Q5>Vy z7iFs%-WpaKN=~V0df|9@K|N@2PUZzBTJcJyy&4c0xtRpYTJQ0BrUL<8GPod`JxF(*b$r@5YLzREtw!(D z@xf9am~s-aj}})N+a@PAK^*>Cxo|dqF++Hp3Bf2wd8gIJb!Pi(uzJ4J_VEtAe*))- zmCM0v(c}!&DNB&*Xa5V)Kc5us>>74WJjjAt7khs`E>9DZ1bwdSjy5Ngsn4&o_wW5w z#W{EI890ahl+mC;7x6bcK^Q)ej=ZG5X2{7vfdYgl^`OVrfRC?;V3)W-1erz-(KHTm z7wTMZPltEEF(N@Ase1s7K-ep9&Ki7tzTrPMuQz_8kU=`CY6I&dF4se<3n4hCtjYoH zBjvEWPG21Jv_x|dpikqs0N!bZ=m7rK9YBp*a{=E1f=2Ce9)uuiEnuS2u@eVJn=?)H z2UleS`E`}g&9K=1QNm&$J?$}RQ*x=!+PYy71s*JvRN=sVE_}S8fHi#iOXhl?i#jGq z;d-Dt*D&Qm?J60-afkRgZX+&GauAnvbU0ie0tYD(4^$hkn_uhO*;=UaBk0BIOG1fQ0iC+;pfD{q|CYzxrVdw=zWV&{T zuytbZ&`Dzh5xx8hi_>+yt&dEK#H|PAkxjrs03{Egb;sS?%(+8ku(Fc!JPWgB+Y^u9XAV}_8S$TbT+d^KkNTynaDIAbYBZpu$1ECJbMwQh)h5r>z6MIZt;svyunW2hXBrNzW7RY7>^?Dq6ORTHS? z&6rO%>bE|=ab5399j4w@{a;#$R7tLLzo_}VzQN}0)(5l^erEPvhM;kW3<8(hE-FI}g;BP_S$t;>!f8c6gnXxid~z(^y5 zt{!Zo$4z&JwQQaR86@!*bAzy?Mvgn2DR9FEsH`0K2q`EdE|-vnYz3AjoCOTap9@z}Y+EP8Aisbz5y$$gx!MJRWN2s^ zBQ9yn@vi3@EmY^*I?ewaWtx?&M1<7|IG7Xie%(}P{>SZ2fOFEsOCv0}Ha?LMAIQGT z8rSISbSqa*+EuFR_4D@YjV7MDuuYmg*+Q+;XFVv_|rO_hP zI^Ha4vN^--#buT~VF4 zLsU`L#@|0@rrglVcD4QkV1ytyjMc(nLi#*>krNc*5b@2Pn?a!R+hxgOsN2(w0lEp; zFkc6ag9t!U(|jCWXWt`w)!{cy1@blcHw<|LH{W$6b7UpPpwe%=ypyR^jw1M6CItL8 z$FmvH@)RH@L?bMzqNCyv(DL{R(%j)C-rMfBkxrwI5QC9M!fY;Q2_!~Cr)9CkNKS+T zfJ42-f^=G-iU{g5zc-@TB01@i7t$B$*3<`Z&QA0~0^^F`5yQ&vM+b)0Cqq+Xty6O* zMKwZ~-4U{F&6v{hk8d8g+lKmSfx?>(cty8wLUoPg6jn#ZsNmOz0E{A?mqR4k98dx^V1VV6pIbzh5PQU| zJ1P`7<_2{0o1H3VUn|1ja+2DK8*E86&)F8f!3Ide)(^U34|VI<*hFdAb=Wz(G%DQa zU9FMLr&^1&ykbTy4&_n3V?a!R!&VOD8!b>AMCYEZpfK#a7FXWupEzblfuc#Fo)<$L z`RcQ)Orl@`u?rA6qpJ5?w*jVO2oeCbH#w2kuJI2GBQA@#JaGF9?HWXD=OJk2^nz6P z%xFG8e0$~4mHo`;L=&?++%6S#0U2Mi*F886GUXCq8)rVf!1J_VMhtN7KGtqejbF(* zmFW7$H3Syz+B&BMcp?*JAq)tQ1<$HlLFazqmoA7c*o*Wu#$4?3IXbB3cCR9+)DA(6 z0X37z<0CAr=ctyZlAfSSNqLumgC8)>1O~2A*jtk+LEx$3(3-$2uZ)hRI~ z5#H`-sFY`=$_DjBdaZ<71e`Z-q+v8Ykq-#8uw<1TSkJtc*ukyO4q`LfnvA%W>n^?? zHgslUlLF^l9O}C>4E=vW_{^#?nWP^i9j}<;8!?{$4vpWy%}=MdJe&YOo{b28CaX@E z#tZp%rk_8=x$OOtJF!{!RtDj7h>y@<>TkrCc{z96uS*Fi>-W1y&{*BxRy*%LT{|9g zpItzBCerSLg>61*z8zG8y;T?qYG0Dwkj3$S zBx^v20+j~C9@w}WM3Z!3h!wnJmf^Qu)XPkF*z>8f8f?<=6gs|aV)04z>|tyo z+qjMIrLTB}=A`eCj|3A@x##7Cg^&Y#Ni~dCwrow2em-(yl&e$%>buY2P&w3kGPd9gWMA%?dj{@;v=1@{_` zzHX2p{=1ij^-ybIYYvgT0#D)T*ZT zyXW8C`;qKBO$U-4p0(*C?V^5T@%*>lX~pP)B9jC8j+`~@T6@}F9wRKW`fE|#9{0PZWG)(=zyuV6e()^fpVud6W~1G-v(wS4&-{8(f&Xsp$Dj-Y3^}<2BP=)Q z3#d>qT@FqFNFIIg#No*+&c{>7xfceS&Zl}T?t5V7V`3C+f&T&(BPsH>WXI3M#jI*wt;rjf{(FLKZL zh9&?zp3F5U2XPYjtfZ6Q$M4M4n3<<=cmcd{5y1t1v_CL?T=WL8>Uixb4w-JIW)y&{ z_L@Um08o+p$O{!kS2y$lOTs$hH|E<_J0p)Pl8r5syU@xy>2gCXsun%gtYLUJgCj0h zBzgh$$Vfp2j}C?yHO2)@YTOTT ztSY(8%n4)o1`a8M;)iW~gKsZsaX071-D;ZX!piD`R{S%vV($Qo9~p!W3Ad^5n4@Y^~2>Phv2Ibhi;jJ?@^St01mjF3C2SbT> zZuztuL6MA*fgfT>zEeR%g9bqwz$3x=piZPDC?4axYP-U&?p&}4POau}md6HyO-Cax zm(S-m`g__%_VfC%uXZCW0q%#mpB0_n9ivgSZIz&YB^!P>e;y8n$wQ&j6+86oi)UC6 z6;&;qKf-`_@IXD_6bp!>TR8wdHi#Bvx3~1IBl+Cw4(TEs*`{q7w?-t^I0tb*^~dQ= zJ5v6S*}jCO?%k6E!ySka>SgPsl6jy`J~m&wI-xt@7E3EtBP>VwtPz+q79%cFf-X>W zXdx5F?brrGbtNl@2ifTf6WcxTEd$#C%ix-!*XTbSuHZT)q%)e!KB_3q(f2alJtW`= zgJm1ORbxnKeAnP_aXkH7gDd4BwB_)V^3ei{WXQz0aWI2@N*bS|;A`08W^F*AI)3Yw zR2u^T1VQ`0>~^IA{*m3O-cb;hP^wnwW%itGPG_LXO-S)19jOptYTIz(dC>(`Bt~jz zPVd$q0+@1CpVH2fg9yfO#fEa&8~7tEOvd{BJmB#8Y#*S(*pIyr?HuPKdrtY|HZ?^Q zQRH%>(q+ZM4td~WY9lTx5XXK zOf@bX7&I9maj=ad5D05DedUAGnG;xkgf|;BC~mt*h5{B0pI9*3hoXEp?_g4(jVK+G z8pHE$WP#!cP#q5QAV~tvb?_Fz0r+I?-d13Sr|?dzy3#|BXqOdLh|N7q(sqnD(N!1_ z@-!VxB1>NbP^EA;{EwG|_Ff$PF47>g#l|AD%%v^O{=-XRW$SQ+~| z-g74dHo4Ao6H$6H)>*OA>MS>6!&sIJ1|&XDTB$!`p{$= z_cS52DA5?)nwP%GK7Yn>j&MmGLyHF1+5Ly`G9}rX+b)%EL`IgIsAnX{200@vjn+%P z*6t!?n`iP<42|=tyG~7-vJr#UOdcDK^}?7!J~pN35owXrD<*8W_5Hy6C9+f~6Z6UW zxeP?8gV_d$pPY>n7IN=iPFQe3|&oo$2-`f6WZ3#4((D2-xh}_5&d!d(cOZ0b~_PQw&Y@{cfzRa3D1ypPdI5lo#U zETPh5rf|8hvjjDe0UcY`z^2G5YQj>dxUr&fh!d=M`(OYhp3-3Tv?3uyQ3yp>fe&ooa0!r`m@wjU~~{BPZo?hgO5hGK*U==BXrEbu?Y4>98`Dp*DF%uN zsy}r0FGnBBr=RzUcBFKIhJBeF>B#AJ0cJY82b4F&l0_SD^w91%NeW&ta&|nl# z+)?puocwba&16C6dz&C3Tyy`j2^eNO6 zWKi|_+N!>kHj4a5so*ThUK0fii4>+I-}WK&VJA`n*$<1vCsNvL1VtO0;oqu;+s{|u1J8z{p?NF*CF8M0X@YFC9 z=@2wwlU$O?RY|00=214+I#^J+Q`6JhNu0wZ@&Y0vnA)0rZQ)?-bv@?s;q@YCgAR9t z>rML0McBa(5n~Z{FbNQu8Xk;b$XG!Vc0Lc|c4lE^RhVXU>Kcs1>xWbH=cBm}fH@e4 z6YWyOHf!FC+^NXae;dL`YH1@bh@`}_93$^O zU|6uF$R|NL1(bv?CH^2;OhE1jzVru0 zadccyBP^#ApuY7s0f8UDQj@4R;{#X~P5IB-ZT$35cuo*Wfb!z=BP@|KHX*zWtZ)K# zBsgy#gS77R>$fM8Vb+HH27uf>BioyqpR+*@j+xLL;JGJFq+ele%lIB0hq)TrmasKx zg;f+4zTLv}Q~3k+dZa&n@uqxi^ZKO${dowQXS#krv&j7p5iI%-SbPA&SffS;(%Cf1 zS~lH1dFwRw^(DR;%R+~!P)dY>puopW=(30~;8oY>JP*6S41Xgf*-t!%%CXbBcYjuW zNTK%-Hr7T=w29Vn$U-MT6rRJI$ItSC`8by@NnLvP8Y#}u9cpjSqD?e<1_!h$iN5fi zo}oK`UN4l#L5uBl1b2tu*;q4>>OGkusD@o|VFOtsE-guYG*tEYW%E8^Kz-_+KW4mz ziTM6sw-`eSOXunK9DAlw5hr-XP*Yj610c>*yq(N`UKDc^0$M`LgeVYUVjf*pEN*bA zYnfF!O110~KS260Q^7l2JB~gjKj!Fqxw>ud9E8Z?1t1i#83E*`1Of-l9meM6&aFYY zA;cV0u@KPqhNGD7>I6!i6vqK&4`2j@D&U}7P?*^chU2XcFR|3Q%(|p4NLUc&XhOiv zKyb_dFwpY2eHu4rz z5QnqB_W0oXFSy%pzZowzlkMKZ+@a=`^d*7ZL;)A__()M%P#noXMo53-^@w6YF}Bqh zMYJ0z7|N)2`l}{h9aIq;g&($&*P7jy9sCiDxe)nE?$R%tl+}xiJWqe4u8l0-LeiZ< z&|_bqqjS&dWJKP+jg81P0if!T&^ZC;xRPMwX*P*>(2r@&$<0H)As`#fnNHCUp}tZW z_g~|sQmc+|K8X%H*dr_k#MtjL_-AYZ%TW`67ZrdxoyPd|Eu2jQ9w#Oh2!u$vfdF}( z`olk0jo>*whU5;1aqeu`fJ+p#(PvxHro(4Tf-)p9{PqCYeaDh&HC!+|R5Jswf?J!g z0|e8)AH`IjggwN`L^v2ImL~p)))*orBrMv(be3%Vj1xF2eZj}Gr=R;B!bL-n0PvDd ziTD42f+9dB-x5=h?-2dYp#$fi-^s(98mm_hspJB>4M&87@EIBK7;Dv z!|&FTrR!WHEc*X0AB}2A`d<3N_cIn+pJyFx(!BWT`jkP| z$BYuuW5XSgBiRlivVeTRpd5;a3&|)i$ADTo7aW2%6M@84r1wU_~r) z0d=rpAJgwa=?|C}6i>*)b)^b16!yw0bqCZICG?#`?731(vy3_z<2m= zv7v!QqqtSYW8QsWaW)1|LTdHy0MUbS8~}n~c!i6U1UCV(pd&1W;X6)%ELdyX;pyGg z>3iXIS%YYhmZ+14BBFE~gnm2WJ^b^=aa+W+H2v1jREQHg&NFSBaz!@dF>pwbBq3pi zF4luMxVn-HlqK;0QR%Tsza+=!4(YP!pU$0huv1|P;(+Mqn@4zTk%)*SihQ3S!lt0i zGxNw$JMZ2;@ZBDX*=tx^cK&m?Jw^sA-Xk8cxFZOA(!m2)i1d?Um>DYS^+@Ui$Cq~; zLE2zGrW;<|a$QUt6`102i`nZbEUbaY^Vbg_^%|YM<#n}>u99?09=N+fiioPPLBcQ= zneabTL@hsw-%60D3?nY3&%;Tb5@$;O9et%qW&D*>XVy|uR^4E^c(&jZ!*=~uF(JACkH)-L+hlXxG$4hO*g7ndbqe&C~5?`!4j zLipU@x*ij@-IAxE7swDMe=QFPNb7JX-3b_co?%Tx*SpoLd@sIVP0x8vVgkvQB|{od zEDXPPuCThk@mdUzWPG)7uM$Q&rB}pvQkMyQxkHLuB#Mh^*rd2~9$uf&|Vpax}yapc9PQphr;ZT@oAN)1^&CIxPmV z)QL&~#JVAJC~%UHXmtswOppYug(Ovhtv}#T`lgw$TsRq|U+kIAkeSCEr71zM(Y>2W zQiA-v3C^}tM^|Z*pTPr!o-NPjLL@oYL!9x419DRpZY4#SFwky8gBCl1SiS;5p(8G= z;tw$1ch+$_Q}AM3K;vd8VZ}=K>}ZlBE)uGq1w;B&Jdce&0q1PUADaM<1TwDBDZkQ` z`VaH#*Ms2yIUzzY?t)YFU+r7al@88CUT8nLX;;1Us2fcr_kQ=zY4W$EfSz9nDvCh3 zqcVg@RE10~*ZSOn^8rQ{Hc9+H57x+oV`7b>nn3l;OZT#(yR%f#=eubF+_o*gfJ&Vy)c4D=nm z8avs&d^OcO(i)|R_|-ca|Cg2`NogAKZ3ac%ZKi1go^}OhgBAtk_$b~cek#D?K*cdk94`ruH_NbpIxC(UQ4Z< zx$D%e2x9Dm(@clQNxGc)hi-k5pFAg9OLR$Alf&FKy;` zctfqz|9tPt;E##+Z=+L~-$~k>y-!%%-91xG;N4Dkf)JV`E{D`aw`ABe6U`$mXlCs1 z2+A;azpq-nK}0koEPFpqYTKNNr3VNW>86Mt=($5k-H6^TWNSt^YQ=GccNvjk4g~tO zr~!dM2^M8?hQdZ0+0aKAx#}-_-f>=01gJjmWx935xC#ijj`%?Jw`E>EdG>$h#CNu0dZvpjYHKdFTLF+yeB6fiBpDEyzl;r2f zVsJso$C8bVj2Jzm?OKP(Q7dh>R4!)o1a)JY+16(uz9#Ajp03lP?pq!=E=2K(QM2 z|Fg8Q{r%s*e`y4upuV6L-4C?Vn@z++^8Z~Z{EQ$^9p&= zh4472YnzgyF@Ym2zuf-FlgHnm=jtXzzJgpf7$WOEE(asUQ85!!YBs|*x@^H zc^wIQUu%WB1js*)Gm>p1EZb?H!43vPurWh+y#rt`6WGg8)u&2zdROK;|4%J}%kQG9 zDpeIziOO;;HmTvP(gFeF+9sN7**999Uk}0f_kNYJa?OGO-T_d)^LlL0nUY2ak1a=^ zz)m=sJND0sK!P?%TL||+Rv1rZB)r;{Gx#*c_7h<8U?DJt;Se05*lI^hIBP{ov$ej0~p{5utqa9W3HjOtAIUr~&BP^F;jgBS5HQTOB zCt||I(TGpfVfv0kZ@7q=h@0dOZ^OV2IHvsEoC36X5@eFA8wAJWqh0jI(dZy>Gohno zDD*DlO7#&h{h!UAH&|Y+d*#$d86sd66WN?vqMO0JyT%y z_{`4fw9y2+W>Km^Fy3Mh17mSy$ci(c|xbalrR*@X8(a4(3BCE3EQpS7vma z-duWiV|NVcbzIgcvofh3X6~buge|se+bG87v1Yl0{KnTXB4XwlPOo{X#P85YoH|Yu z&NH5p8VHv;iWZ%{U4=iMilo@P4Q+9aV2 znFT>$fE$KcZcq%ab=o7VWTq-ZsYy;$oY4s*4BtzyEo^kS(n}gZsx9PVA{bMdqSVZ} zoN01w7pXQTgFAye6=G7nsLXJA(NrF_$h$CFOX2)}kp=8}BP`T-ncJtUA`^@ zQ=HN1bR#S|W=iUTr5I9$pn~hPnutgufe{@#^@S>0}=V*H~@_0j97wGb?LVI|-VcjRGO4EIfNG;H7vcg7Wy2j)%C!iFO!vba;^! zCn6!l%|a*(Y%qF!ODNs4AvvABbqV74;?p#+hbWXCafZ(CHnBLMK*U7?kRvS6%@=E7 z5Qtv6swyKcgp#!IOb}Gu7C0b?$*6bFK45|?-Uejt+$0E;D$uz;^RvrkLIo5P46j9>mN!9FI}k)^Ij92SC@cRaI40Q4~d2q@H@5ej_X_ z#W*7@mgwwd&m}YG?T57g$})=Vjw>jdwT0!b7wqpw)0h&+)#llAD4XOZy_4g zLd~~aREr2mDahk&M#8=)9a^?F@EMu|ey1ZW5OzAHqZ1!+a%}b+Fg-I`G+vC-R7P1z zaYU{-?m}NHe?-W{K4qOt?Q%U%3_f34$Spd<>y7+`niK@WY@NZzG{v%TK!HgdFn+HWq#wRiGHZ~Z-BQ9YxLJ0=ALgX$3 z1jdVJbk2G-co{bKI18r68UoepIfBKJn<;6h#%Hy>6XQ5DY|bYe4uoa4L>`vPy<&x3 zj=;f@b%le1&`=w*%&AgUNfw@bgSo~s(}6^v4yJN;VeBV!$G$6XDEGwz(OGpIg2TB1 zjUy~!**zF@{J)PEnXy4^8-*@&Xlqr&jBXp*EKz%zGikMj1%oh%g8y8v8{8Xhn==ja-nI4ZvHGYN|2c!Gxqs!YI> zHz|3rH)iR4ix6x@NL%QM(w@*o*q(2EQY4C>*KK#hYo#5HxT9SP+SIBBXX zqy-6^eJd@@TPrn*Mkh3|x(Sq6Pd6Lzjxa#ggNzPvW|FTJiI>Mia(06Z@TO=`RFsN%9bnAUm6B$1=d3{B+R?(Cfu6h?y_ zWRsED9%w)dm;sB|VX?r-=1>f@F(WJ;J93cg=qWj+rm0afh~a1WtwF5KrhXlah-_Zx z*C~X9gkXKO`B^H+TV2n2nUvX*WK5dTqT|jMQni#U3o7vsSCMzhT!RU}CnMn+56y?- zP(amH5%%(lm!+)x^ddFEzQ{%nvbCu{<=&Sjs18c4{V-@@H*tgx%D+(?LbiXyHxeZ3Xs9n>4g!MVVNz8LTA&a< zT<3=b_U07>5#6;zIX}jKkMcwQL;TrTf1CW&NKj4-UQYPPDFFco-Y$H90D}C6d`pr; z8IqDFLlr-oA|7{od~y@SI_MprZ<9gVddhA`;&TXN*VvEkA4o|M#WO6dP!JT#YcYZb zNR|c>`coq;J}7twJzS}zUhTHrK&|U$G2|HL6(B1}Y!lcHETbbVtJ;!x^8+;hQGrXeQz=yMRt>L(A-kR@Va3MQbCXJ4Zas=78K;Uzqu|V$#C>p!W zToF^P7>V1Z_f6o4Wd-suBP_dxQ2kINE{z}$1gek(fxo%XC&S1u!CVWojhG_ERfL8bFg(EIQ*a;(N0=dI~%)_ewXk#jnj)fRT`aHSs6)(^~`fwgwak) z;Q^0qG+HpMu&~g&8J)HgrzF20N&}akhIU{o5kWgq0f0j^UEodLI5++9y z50AND+hOy5V?rPp_4m;`sA^V|ogXmjJL8)uVqH`pnTNdX&BFJ7h-;=+;SL;+uDfd* z@A>dIW_9L%azoxwlu=Y*WJBO>F~xs3$7I*AP+pJ$Pshm}c^7#`W)$LP9_KSoVMK*c zqKj2RiYT#7Y~StVddr~Vf$Kh=;%*)YdB_3Ta(^XKb1h3Y9kGkZnzU6CQhJ6Rf*b}0 z%%=wcI%L42LM6Jyj53FD)4vcql=>Dpa10C_zY!Dz0va04zdXdd-G@8Mp~bUYr{T_P z<*r_AD=iaIHg^B0&fL$N^z%HaKO1njUbY++B1GwT7q!;v1JoCH`kX@Odtd+^eJK;J zaD6+z?nMPGZvmTx-jqmrqT_T>ktECNW#BQEs;BP>WK zsDgV%g^7|90Ky|K9jN^yEX$2l7MN2xo%M>~!cLtju?bL^%Kkc0X{?1GUHTW@#a6RR zs1k>LVjih^8BQAQu z0vbci{u@!Aw=EtZRM37&oic|9e2^DQ7py62LMwpv0v!T@F+hB72;{laJMVVPJtHps zHzO?k)Fa>`#xGMAG>&5&G10NT;O1m(0t6FC($b+*7z5l4%3@>&3yKbm6iukArg@=C zlHfphYmEn1_y}ZC#~Yx^DFlMMAb0ekbiyMpB#V-{j@X1fA0sS^U0<0zK@ZIo6r@Uc zkw|2*5eO8-IVp@Z5d|YIe6YD7&<9`IefGJj_&jXnJP`G=0|8Jp02qRuN-3xdY0Mnm z|6jKwF23td6^x0Wu@Tt>@HfOZ%I-SE>9i6=Psal^?Dj$tg>v+e^?%RP{=c{D{a<(M z{{Q(k>x!?&9nd`|C}9Kxm8+&CkERm{GCoNHluUsGv(P2_of;t7BTNIrE~0r?R@uT= zE*8nv1>kCBA{yW-{^A}qQ(oNcsvi~z{qZnqm;Z4GGcS&*-#$*99)8d^4bSrws<_-zu(|> z{f>DFgIo@|$5eI*CMhE<#>K72X81?}Yy(S}x7S5YWO3ga^YsLRQhDV@4 zmx(aBuRvYJ5FhSY<@AvZQY>XgploSp%3LVhn6~kS z!UEhNVUt3=yb0iqA?#FU4M>2_h^YBnSZb z6x2jJgRSfPIv-FjAbRsf)0Ylv-;gJ>?)~xpAho4?kLJHnDWf>BOKiDORyObS_kqOj zL_+ymNXVL?h^k*-$Mx`{2ee0-aTh**aP05nzm4E{WkrbiDQ+V!tkMvHCl1=S096tv zuEu4}rezu&#v|`wZ!o8TJ}T=G0$*G~Ky;AdNmJsk-owZwnCj#qDxPxvj%nPf>OBW? zPh!`?`=Qaf(YjG_Vj&e4jd<<>>nch?On}CWPjhw1I@^^6j_VoVm_WZW9lOX7d#Ah| zy?R~m<5s4ltgf+?^Qks%@mqR4p71hre~~f09XU)Jbvsj;ISA4>lWwul&tCrVfFG(eZZY)tFF1%{k$xLiH$RN$^6}O<<^*n8j!7+Y$>$YFFi}~jPT4&z) zJdcZr`H%?x%HX1!NJT30{$Aod_(!CcL2(r?pZIq{K#&3EP#hM zjfNN)V$7LMvjNYZ9#=SVezJ}e>Eq@+4rG&vZ#3!4R-*e=mjgk`!IroI2fTMWfani^%9ZI)jng}B- zv*Zhm?-&8KRRJT769ll1XR_&5oE6VKwpVY2uNGr2Y|bMtm`xFKvB2YfaNk+=7k6Ak zcEQH?NgROh;K*{bE$jjz+s%w?eKICS35FLy-0dIZ@AvFLh#cLV`1EWrAr=X@kC#TR z+W-iiU33Rf@T@phF_FGhEub*~v^2#v6vV^@P#8{81QJ0-kgfzT&8-e(;h1KjvjHTv z7O+PHJ$(ht1;HpWVDuZzToW;N9$RgoSp^#eMF@-m!3>MLhX_C;BqFhdiUBtKySN8Z zlTpo%XPF%X-^c8auZ4O)S7+EK0-@=4Sc-tgG4QESV#^`&5$-A_gGyt8>`!6d3x;7L z2UIrPI{w?zVCJS!)+h7AKx9=6O*kl-`PQMul!00*aPOMyu1$O0wy9LLY_io=R;ra% zRaUB%a9k}Ls-+`acR*+DU}4VCX^mlo0Y?KLn)#DL-5s&zK~(2Oi8Oh_*E_P%_u@O4 zyV=df9JtrdoMh7F0ht&Ww5CCXSuQxZreId8G-YN*mVilw2^EV%VlI@l{U=$yxKWY7 z93uF=PgjvL6qGq4VE|CH2EPpYLI-yFBP^yU(JjUrCI{!Zs3I?LZ#TViNah(pMwq zCJu!Ub#xT+UX)Oup)HY&k50chgRY}|*pV6^S?A6mBP>79KM!Hi51oOh@8cy=wXLxo%z~8HKUOK&8x=h6)hw-}bhz_YTX*{PJyk>>UE+}!P-X!8Ku~%y zZ5{WddGL(`&55NU0w#4}5T(KugP*|mf_!V&iP5ZF{TLpa$vOpu%=$`Ros zOIohatQqbvZ0R#*J!6fPH1awS3&!yUs5=xBxII@E1(s1}0gC-?fV;um6l+wWm(pU) zOmhn)@~R1^iYdKNvV-*%*BMl-*)bz5M4}n-6%hz3lEEejlBxn-oR>2LOA%`NAxsEaA&u72oqx?pA`&j;{roppy~_2VqVhnT&XIC1rAdk?ia zdxk!2BQ7wpnsPhG3&^hTTfL?Q%N%%^+uh&a_4TiqI3e4?I!#9K;bW_TCf?ek1hh3W zBd2bt@3V-<)V#q-BYkhSVh~}3gp<3d{;-0OA)=f?c%j{sv)K+gc-mlkaG!1&BRVBK zjb76&?7n*=EYM~LwRz-m-gD{sJ>?@Vkw|k%Q5Zw2Y?l`;BQ8hhvWlF3ZZ9H}`YHHn2urDr8CD>M<1aZ4_MqIO7dSbm>Yt@yAOUDaV4Ij5oh&2j5A zPmCPdpz4Ol8iu4LrN&0sHfiauq&kx8L*abVG~F|ZTy$n3sAOxf<4D3Jrv^+wbnRC% zgdq76Fk&0P@^CdEb*>{U*$%p)ulR+ABsjl@l>3ih>Sq@Ai!c7xfnuCPO2j;)Rgsy+XlN}oXrIs z_KcTsXvU&Fr^;bL>YYTyEwcnsTfCfLxsla7nrElU25TtA@dWAz+Fcv(7rSA9U^am) z@iI0`kkd*@Qx&qhc^7Y~qj!E;V>7LgFE{b-LD1ixpczT21R!@Z6e7U%LQ7Aed9XFA zhRFhBU7w^oz+c(%8LZx1c;XuA7(vMTC~3X()jFABAtbzh{{nQ4 z-3%AGCacM&LU?V)9?8X~*Wnsdk;jfQritbpPkZ7~T)SL`Q$d@2sQ{^UUcmXbr%L1$ z@jx@7+}prLx1*c!a;)(aQ8r=j`fK(VMxl}pZQ>Ed@>9=%4RnTBH^vLh^m z1f{!V9UCJoG4I!D-Eq|Okj%ufV(5jE>lzW%U5y^UL?zh*@TKzMu9;z&0q+xQ6y zByjE@Zc0*P61g0p`(xgB-5IPO9M(RkWBPs~K1?Dof+PSidYTVDvWMxZ=tzCYstFMg zP@c*tED#|w2&O2dXb_=jLWEd>LXn^qC?Dyv3AjYms1zX*p+U&p^L%|Uc?cseh%oT4 zao>qjm^sF6Lzg*+w0L=GByo&n7!e1O&e%UG)X%v5$2cNLPZU^!swgOkRV0BGF%vTr zBP=USvl9>_ECmB3lT`$f5miJKQZq#z*@Z-e#SE}AK{NzKF(geg5ky3=-Lc4~iG~QO zC}treE(t1-q^K!~Y9WdynV_hO771C1hH8kSq8VkTBQ7Flsj7*Bgo2sli@f?J>DS8_ zk?12VMOVn60b1X`j_%_!@#{AuECKN)7|+r~!?HYVU5H3G8yTXIy?K^Dtan?iFci_t z&nER@3C(^x84^-a3nRuE|HoUgewia!l0@OC;mcXkzVU(9lvPvP+fM^##%#UKjitKH zh<9ZW2QdFv>Sj=+Mq`wEe!xlg@Qi}3>JPh}$JG@>* zUIbQE5d>}SSwVZ2Y%GZ&`yd>cYi&~2Ie;T9$FWW$EH|8#l>wdm3A234zGcz#MObf{W!dMVT^2t z4!CmLc2~6a_>OzTXic@Q=6Pz$YT`uu>lvdDF4Fbp4vx1cpIf*^jAx%7rpyZvqds6M zNNlVL8{EWrpCI8_5N+1xGLl2E-FAgn2#WJwqOu z<`nLDN9U*`ET4YD=pWQ0E{##&&0FiN{hp6EpkuQ!;ZlYk8z0nOd(Yh(#kR6ul@jc#>`B4;OJNqS`jd({q8Tc8RU?WgTc;{thu%qzK8_l$D*otD^*1Rz#3qbYL?*!aQzQL6W?rwBUo{7uGFJ!a;WB407GzO{Iu+glLs>=qJf znTDcWhH6_TBsP*d)2+52C+29-gGkzkjrPF#qX>SE#Tw3-Hz~!h(&J<(gHU9Gbc`Yd+6DtHvZ|n9 zBLsz{#T%(Me=qw7O5r|n<@fWlf(~%jjKs8bIH<2+&cRy!hI#s`|AE)&_O#PoV?CqjpfS|P2+OJrxGkfmDT8z);7=2K+C zb{)-d@+*9?39FL^FD^8|##;}{BL?hdIbktcy@MIBvMf%?Rn^Gi9dQgBLs7evou1=e z5}l=80V-CvL=qv^t>>G;Q8b$n1(S-P%a~-u;j)sBTbGqhsj`Bmqm2+7%cP62brBAe z6}Xw^v{dpVV)G>Hrs_CM36YC226%O+LgOPYA&j7t4oYVuEakHn+{5v3ea52?O8-j0 zUQ$eo)J!4LV`_O{g0x)J;pZvddEj`s=?7!w!HoG`TQUr+dtsQd`Rb3K7l7PRqm9ed zlTIg@n$2m@KApwzfB9O(QHQ z#>Ui5Y%IArZQ4<)Mlv=`GI!Or#>df%jtsn6W0i_F&LW0c7@*4`y=y}`G@*mTcO~7A zdYguAn8q|T@ek$}P*cy^{aF#9be zlo;h#Ufw%56?WtYy#t`}>Q+NEs$v_R$Z+3m$tJp$auSdf9#;{&s|nigo%hwtb7aiK z&CXsDHHC*GERT)!w1MQqO?sI+#I#N-7Be3FMYacqHX4&0VOrI> zaZOuk-P;u=MsUSiIu$fb3@zOO*h8pWq1Om?gfy7NBQ9E2k$Q4a5G$674z{gXCw10L zhjMOSlb3vNwhWrOTuU<0jrJXb^miva6DJ`|gytO( z=!iJ$1LJyKEM`Y$K?WVUI85qNVF)jfsNlvUE+!M%Dp&WkwHQc2;z2iY#j@Q!vM`qHKbBU5okcq6RMF}G=O$(S2X|PeFql+UfyGcrG2j$A1$q!F$w%UD)ar8! zn3p9JaFr2M#LBX`bcY`Uj5!)=T;hm=oo6E~wCQqAqoX9}#f@_l5QtI}2W9a7BP_9X#A#BZ`iQ6T z2I}>8rbUm%%%WHa@wpTych4g%f8`P|WXW5;TJN zrkz;d1Wk$qS}EI}z2k~u>?{wfKwaXW2yh6~>$PEWm`zb>Ed?45G0sC2#$Di^I_U?n zKUW#-W^00KxQwu@pBTxrP$F@yY$Cmc<;MlfPn$#O<_ zxQmfB>*I}LG@EE`_V2Y=+i8kH0d(f=ArSf(Xmu$&w<9hFBP@wkwIvA79Q`J_DS;Z6 zHiC_|jS*B*5=*L+Al2e`<{L0`F|=^V#dzSnJuz~^w6??b8;0E1-$?Mjz$sUc1nFxTfHxH!oW0f*XyeAibVXF2k-gbV@Byp%S7|22t20 z-*J#c>3G^_@`!b$2N_D-Dt;X!F1)HFBPN2&kS^{sw;S+^?3z}0_#k86uETVC#Y|El< zn&g?r6kOoJa{*V51Eu4Z7ng)D1!~C2$r$9~*0Np)0zw1FFpP_~7!IcyIFi2*yPd#> zB?UDmdIu#jHCBzB=;%nl+f-0$AmDU)HXLml$h9IF1{*9RET_vWbRkfjna1q))Pc&_ znZ}~uXsjzxHHph^LPl->#pE9K`^oU;u0e+?E!{*-rmDAzw=kF#X_*X-vS0cMIKPO z++jz`CO+;o4#MFbX+~C(u55{&jz3XQ7KT{r(3;srvYc(7ek6u8?GA*d_2cl=A1049 zHzNO11X>jzcrySbeG6v&0~he8_-Y;YOXqKH9uN|(BiwG zU_Y>9GcCtN?}I{@uiC|`>lm1mr!Y84zP$t$^}!CBH}>PL>M!xzJ_6?hdBr} zh_P+fmMn;grfNHt$wKBkh-}QloiwQN>MAB9F6noUUo!iq)Yll1!m|&y3x^n_Iy7GM zBEankg}ltjA{%ny659o0V=YiyZ}z?wWO;}vG{)-7TuX^%=QwD}dxuIlTkP`XxtwWDqMgwZxs}eXaSKYHK7n! zAfbq;gG_&8^c<`f$c&B*qku6e6w@$BNemG%OCv5)$jC`J5(W~4FhI!=GQgz~@%VV2 z9;c3C0+E?2A&Qk&Wu;+|W7og0$kP~gshFi|Db#`-mc}fR!Dyi%flK7!Qz+1B6+ro9 z^!XRIgb$~%pxbHU!=X3+Q&3VvmZWJN)44q|EQ-1@;={W4b=+Usz9iu}S14fVT?vxG@{u|wm($d`^B8YT% zw}60jNh<2|?Dfvsi+k>NfA<@ouY-<>yMJNiROB=d(>JwK=eIuOx>ykV92&IG$D7X@ zygD0i*j@E+3S)KxA(B$yIfSKzZ|am+OQ*9d^LGs(?xzXPS7j{stJ>_{*0Am(4XWRU zKiBc{@QsfgCsb}Hh!Eec;LE1j{J8W#)@S}o+FiNn!@cvLL_abmCrl_s7txjr1I zjxZb`QYWFnhE5of;~U1{YQca*01-+|tU^D-h(b?^+7K|nPDKqPH#Afx2Q0u_rqhvZ zh7|ZfZDMk;7DO;zaRP7rK3!!bo`Wp9Y#$;h##(_O3P3GE1YOZI_Hl!FmN+Wby@0Eq z6nEa}b|&pxaozMDXPs?MiUyDcVPP0@n((2$#hFPa&Y7|v7j2H3PFUXQ;O`yNm+3YY zvW0znHYsD(j^w$VUOAiDA@=OlIgn&le!Kgh*7dKi5eF5IgUy1f@ACCymO4wClY3Bc zSUl;lXQ+X6v_#S@({O!+{wi^x>$@E#pKt_I)oW6(LpeDiFLWn%T5&_D__+KA5fg6> z!`J^|yxVun9y-F$YFmceiD=@87Zw4{L(wuPx~3@1j}5|~KSO*cc%IrM&TS)bCNq^5 zd(wZ&EQXn2-|}d(*Zoxe^_@L_t~Q^ixtyZ`*8j**2?&p=GOO>&Z-&<2|Hx3nVkAr26xP4`Q6Qo28U3I-4 zMrsm^oe)hgf}R-f;yVrT!cX5W)}L|I?W6&mE`>n(Y|h5rb%Nh|T9mFjzXjUVv^6u$ z*fTXbGAls^Se}He(WVB4{{;>YJY>2>B;zEXvH`1_4=MZQoQcpEU!_6GnA^+(SRG zuSjr5N?b{s+ZojrBV1Kf*C@ZJBX|z8{|pAMq~E}7Rx+x4p9ut^J-qkVs6rl%Zh8sqC@rMT#kz|05!d0 z%^us^AoRJ=%FAbZ6#e`&6x+>KDQf6tY4ml$aJ5&WJU4T1 z2CF}kBlpobr}12dUjhq?6Dsa!|F~TFAltca`@8v?Vb5qM{9YX{rnEhzN-xub`?FL$ z{1xr(3dG{?s#6=&W<<1dOQ$L`TH`1xjfJ`CX=u`+bmkD-o;G z!2Nw!oGIxE*Uz4Umh{TvQdn-hTnsgldG=ywa>46^my8#WLnsoUVOGmvC5ForrIC@^ zUHKTH>vBBvGn9!gkF$0snh2<*G!3V9_`^K%a8VNEwSzIO3sye=2v#2bJ-vsY zrZvmmc_p{M!`^nL79V`$%soGKS}#W$=S*QYfI0gUV+~{Z%?|a2UKktbTOv0*Hck32LPN!$F=xd$3T&*t_#_c6iDwyyz&5u;H(|q z|M)fJwC^p2=N0P)`dc?IboRpZWXI8S0k1uOPK4$%J;@m?7wh!?ld;{_(Mz+&YJc~0 z-AB9Ydt{>@jcF5_h>Z|^ab_@P?v=X2xMY*_WSO~&hIHL_g}p9nTuU0_QPcEklK~6P zy6Sgxn)@*T98np{MkmM7Q9c5snksk{nisNZ!L7KTBhxD$>=_f^2~G&Hy&H&^uEnn_ zg=HV>q0S+l*~8hEZWT@X7;RiiZILB~#QA{%a0pIE)jz4T z?d#k$nF^xfX(2*BOEOzaW0ev^Aejn65(UqX})nUM@fOHq` zNqW7mxCsAYyGYIkgrfGazC_?YCD|RxDc0hP((SF3SuK2X9TtpuKmsKdI%>9r&m{C2R)Zp-6wLG@e+bEPFnPIo+ua{*#YZYq zUVt6Hep<{E!4_f1#aYl`DvQy->LP8Hp44Fnw^!)#Xl?I4D>>;3_TYl#X~~^(qt<^| z-UolC6(ysM_SKYJgL>B`K%JQxB8J$PvI+<$-pmuZxu_J8%suHG03#imO=(9F6NjD5 z!V>Ui+8f4H;evwhy!&29h~+kUP?N=dEsjpp5&iRtx#Eu|9q{C|6!$}R3Q1JhPz^F1 z88A(+|H_(h>J;522&kz846lI>yHhTvD~PpfHrRS?>CA_SDjSD2RVlD*$a*>AL3TDZ zWmH=xs#YS%NeHd7)MBIfXWaN9GvzK(N}K5+XT zjjt0{Y%6A~qaCkBm)do^(IeP?R?2LeM{SY8XrW2{C!XHR@{bEzf?G3_xdHlB0 z)+?U|mHp{MX^Sev95rt-Jfnx|K>!B=7)jo2=7aqw0V87uTG?!tQNl8a*%yG>6x?pA zA3anla&Y-HDiH8Sh~SwIj1?Uz4RA^qWc!K~FDoUM1IdmKj(oI?1uH9VrsZ@P=!>o34jcM`K9O3RmZ7Fd6I_g)J?vnrr z(wFnFe_y(a5^13hW8}i@zp&rNJHZvRBN0$1MP!^lRIkA|2Ry&@mM4$7gg zg;bD{*Kt^lJKzOq8TZ~u+@}9LInf`)JR&I?xKBhwP=C3M!0*w~Qbda5VN2cw6NCxk zT<&p5ndswYHV!X^ok)V+bBzv0_p^wD7?K8;V&KKo4Blu;%W!*ZV1a7-BXhr&(iD0& zF!0>#arO47>BDgNA3QoUarasUnZj351aBi0zLnlCDZ!Ok%vpc^k4&$7lIbOJZqyua z_a^jMx|5j^u$SfMF;=5f6B$v2TpT324tzWJDODC(TPl-j(WWjnBsDn zbn$Hv{~bN4A~g7yM7G|-PQZVw>S|GD#)-s#Z?lA-3#W=7>FTX}GypDuCVOMP8Q3eu z2Sq6@<0|dELjQsh){5k5@zgqvN~|fOa`Ie>6XE)l8TvScTlUE--jJ8>p5kI(eR(+B z!JArQVq(T+c-btrLidk<5!dg8W7eYlgX~KNZ4r1VhtnZky2d2QGiy^%M!16K5ZUk2 zC?cm7xDqa?y8iF@0VCC8S z+)6hUKwRl++jQr#zBz85RyR5e;n!>ao8F>@8sX`7d42rbN8i-bOK|kJ(l5#E4{Sg1 zb|Z(_{ey%;_zszs(l*uUoJhWg{T0yKs!Jm#rmD%QA+U!C#&Uwo((TMN2%^(-iOM41 zvGTCJ2y3A^9Km_$V%>PKA4Est5y#6wm z3T)V|I@XxAs+Gux|127oaXZ0=`XyWqihW{MUw>jwN3U#?)tmcYC1@@4RF>67?O=%g zG4PtWb5vzrc1zC*?r_n-+eR7zLYAOBmZd)yfoF5D&D?do6ZYuH$3zUZHQHA5P1;?l zLEHGmAScPW^jmpY@1c$oMDVG*6tWzL9_FPUQ=T-EPH=z}Bn$fm$>9`4_iyEjlRi5T zN#oKwK0jp+zDThV69tI@cEbQ&LB3PbQN&>UOZxvpQ}0|fASCV={wHsBHy-`BI`Nq+ zUeTTlHg7QoI$h4uQW9lz2EC)*-6genas1`sbq{5>_|>+_h_?nvw|76*Q2EO*ZEM{a zKOQh5lK6L9WFDrT$0jDGnsze!v}E=5_fLrzUhn!6^fxbAt1ZVob@9tTR?;Qj3D36D zA7Wb-!hCbcv3tOQjovv3RF)3u_R-RGU`P2SJR?R!1 z5ptjl$uLJy4m$wT|Bl>>^sqY1CQ6PDOfR=R8Rg?ZK7WbWf`H~nGd)+|c0%Q|nCYdy z4XL~)D!?k{KvI_es~284tatH#@PS#it?W*gE1it-!Je6ZS#zFw2Hy zo9wu;yucs%@xzI1mDm`cNot<5X;dd<+>X9J=$r1>|N8pBNcfa6`aJVPCuCQ@G%a~} zwr={N0Z!_ArS<2pec*?_pKw$1N42WHO>PZ;xlUUjdpnkhC)9x2hi5M;q28oGY49Qy zxv4m~#FV3`t*^yWUzju=>vA)Ge%{eW%_D~;*dA?b>zN(pQfp5aDpkP6sO4CV3d~!) z;Q2{W%isC6aa{L2P;5n%Ph;8ZKi_+~ix}Fc*sZ1P^9?qezl3!i`1vxQ5NE-m3kGaJ zgOOx0I{P_mqTi3U;TnI^izy8u{NJ7N;vI*PvWwPV`p1IGmK~Jc#+RBZh$0%o_<#HJ z8i>FBCj2DN3v2DpQ!^_~J!<5JuHG7$K=?6G%Jub49a2cx41_<6;|u?rraTD$Hy*B0 zO|wR2TCoBQ6LjyEip%BXB0QmTg!JtOLNe}v@L${CkYbKUjA(z*H^piotLB z-(;hS0*Gk}UlX!=REl!%xgOY5ZEVgoMF9!(D`2c6XKYkQhH z7Q&=vc->1Xul2Nwi>A1E4O}AkTR275gvK)MPmO~0;`_$_5YN4OpGttCK2SFyloWl( z@ZJJM^jYWaDC|!#ZnQd#V0311WD$4Tbb!C{+jtOAMyw(|yaF~%K7-skEBqgvde5!l zQaq0~*XX$BYdOjN+1DZ8-tV_6!<&BhBsGM0BQS&_Lbmw*nPxZkn^}+$)5qUQxbHJf z2uV0&D1FxzSBNaN$&w-b)-q8fj=sUK%)hEt3JnvE%lB@S{blc-9v(0d4Q6nUR87|e z!Ui(b>~n_W(=V_hDLJT0^ckRbAWcwyU#>rd_g^C zidl4+k{Hb@r{=W5Yf2M58i$6VI0knF|7!v7&5ROV1|QZ@RmvhlP;V5jmk883PrT8t z5#K>$D5&m-V?c6Eqey--wAGAG$9|tqnHgU|Yt%MX9Y@%+ifCzhF@T4fh^XEbjZVaI zi^T%0{w8{E#VF46{@AgzsA+bPGNLqmNx+4LPVSFFM7{fd-=bTe%D-7jz0Tc+kqwDE zLFHURq&!99d(>C_6QQtApWk>b-stHH;vft5XcH-T#|Jd@JE%mcu(X=H;g2d3QU}=S zRG;ZUBgD~EITR(LaH8usFoL}5ofBAMb<4>eQ(k;z0%>GWEU}bFgX0YaVO+L^7cCeUzw{gzPMrH==q`tK^WSc%nf>TYUm4H#F1y^s`4@4T zI&n*_!q@Z*Wyy}JSn=^zh6~JN0nGj)f~?vk2fu^He9c8NcJ~B+=*~nI_(8QJLQKWe z@W?9#RH%z`a5%;-S;|ZCgm`?r^?1!33hs|lewDdR?%n2&iP%zciV(pd2|iX?&#jft zc-p8BWo`ZI_BCc42^5ORP_^uu7aPOHw2rO6(ILAIq29%guD6YGvgu3bL3B6Cpirh{ zC;)PpdA;rbDe#b^%ZQnpyGo|JPyJjL|LQ09%@wus5xwMd=<=WOkV@sUxaLJVp9#(Q z`SLt-r1AUHm}(nCafRn(t>-tZK4bKf<*|F63$6z^PQU!YQD&m2{ddv_GwIw80Y6`E z6Xv3hyv{zkAe%oeMBer9f?3Dr=i-e}#dyqo0FZ1#0zv!6M`{c{5Px%PuIv9it#%pkiP`@eOBlv{nABx)}@n66DhUGwA!( znt+?jf2s_-pWJ4U`I(kVv#EL(U<%!~=az=0{I%@VJi83`>;7-*LMiVX?k}e2m`lDp zg6a5t6d$U%g9vSsP7A;ZLb{>z!ZImgTrnK*LNz?kHW|}wADxrL8P`Bkh~PvnTU2(e z6fjy?gb$C69ic&NiV?pJvP9~^H30k*O<{djMOOXDle>q|X8T4`|7 zxkbMc$o>(NjyT@cQ}-<3z{SUXoe}lCSOk9-J-`3nI4E@^zZQ1|Bp;0TxSQA_4IXq* zSKm)(w(^AtYTy*5hS)kj#_^VfZj-CcYZC&FVn0drGRCRQ-xGCe@+cK*@NmYW9pv+2 zbFYqXa z{!ctJjSo`47P7*!fBh)BW{EIf5lqlXSeUywJIOBKO}sy=k9ZRd&z$z{^y+eN{g}xT zJGB(;I#fZiM1l49o&Baiwz7thr=bF5h;V4*Iim0E&)Qw3+6hu8ks7vDPJo`JnJgTf+{B9}5fp=fD!MmbkiC>0J#|N`A zd>5DiBWLDNV=-VXC?w+2e@|SZzN2U!r976v zu?^C9bAjvVDC+K6_)4EiJs|7bkbKBKV!*$J-1DsDKqafM_({~&)txCa+|!h3XfkMk zbiwxiv%z-2aYFL4sZFYyXEb(H$n`r)gY%X3mydVCz3}Pi?LoRsGmG?DV!lnu2-0o; zUfz>ThN`!D|F}{u;grH)Eq43v-58`met|0JG$Ck7suTmXDLIr$=zbr(C@_I+Itzq ztMtYN#kn1kV^QIo58#|1m11qzYShCTIk@pjM3XhpT@&PWisOco{;woog`QTADt=aB z{7)=$Zv&Iq@EULLOZrq@dit&I{ow9ARarkM+=YrB5pkIH>zAT!1YwFjSlNnODf2_0 z*S762DXb?Gu`n#6Wnr%6v3snuDk{y;p{l=gi{vQgESGIIm>rFO>VU9QiyS@1g}BpBT!i9z?hazA0MU7{%BtORCtHfM|{Fmf`iUbKK2SI&A?b@$) zmt@dL=w}azcGVj%Sm$t_y$+Go*2hj#NFf;`WhOmpqg~

    `CU)El|uRI{lh8&rh={2NNL3WMyA~UDRQwocoZbNW?>7Ag3*gc&e_cU z5|emkIIB#(Y&R|Y1vYB+{C?f^s^^IEtF1Z(ZSUf5r7s3%l=>2jSbrIvTh9e9%pI}= z#>$zqp%o1DV>sjMn&!YMq6}47BFj)Ilp=;7v7q?F0h>I3O*@87Xg`RSxVGICz^{_K zNh<(U0e-SIBzWp&;AS6h8O6l>hr|d)sTWFo*iAJ=r~#3V={h_O%Cu)K2?&UwY3bFW zf#omBpEnawx`-z=2tSQRlq!Wi43C-)WG9s+swW{FY>wcJwXd%t2-Z;=Ds&yEK=4-R zYjg}nVFQquz`On+P>~8w4rSL+!bm~*aG0WjHW9pX_~*H!&Hpf?T3!dqb>G3-iEY)x3l*RgQOcH&)A+rSXK`*OG z8Bs7dEQ)7ZX4HJT^WsyfhzRegVB6@O0FlyZ0!Y|aLR=f4@)(yADkZ!o;-HjkuITj| z-K|Y$-oUyE!ng$vuZ^+ooJ`>$*KxCkVT}NUvzicps1;&>bjuI>&4TC26h{z*TC~G2S+#K0^D~FPI{`!+vT=S zY?H1Keq#m;-Tlz9 zvCCEo4Pv+rWQOb@BBi2*a>KGS9f3#YL3`ghsxu+{59O=g92M!~#7P98G#D^h+D_lJ zKg(8TGR_;SI^pZnk4u^$IB89GA{>lj-1_u}P$)Jw@;%wxhjz4xoxY%Yw7x#xJ~k>Bp{$JM7ND*%Ln%t>Y`YQPqCt*J%zAkE5XH(wK|nyi zAb^ELdqxW9@=Yc-SR0U)&kQ<|_`93vUo}iAf4%oeab&9}V#m&lbf)5MMcFE{b8`FM z*3xe>05aa%UU-Fy^I+qVkwg=-?vWA@Km@~SGdG)Y8a? z8zDj>QZwqXZ&qEdB#u?iw0_2_`9s2(Gj=YW@W9z{Iz)r|mw04c z8@7TwE0a<*zfvv+Oo5El$3W{_+pX$K_k@hCFHn8lcS#mGxqGi9!7S^Yo4d;np0hB=P; z-Iun;h(m$ca$&H2Z^3zKksbmE9(39c zNwpm__UbN&-x!KK{q!?3==B=ffnGYNvaJ{SDrudY_19JV3v}{H*qQ`dufHd86ASEV zW2u44;_v*Fk(<}0N6(9_zDVVyGDuoTk~TQ(t=?w^xxalmdF%UQv9l{jU!7iH|AsHv z;)ZrPKbd-v>q{gD2LBEt7Zm=jK{#AQ!CaS)yG3-z^QE5~$%7n6@~sB~g8zi$I-A?+ z4iWB?Q&M2j4h0qz_Lk{-;eUDR?Tb~5wSvJLaw7x;6}b=wq_$Do4iw~Pb_A}DZ=66W zS9H_l?c(LCEH;b`wD*Ms1DGoRW=*IOtW;ewDoM=&r2!qLm`D8J$usRjkwbi`dmUfn zGIqKGRSE1T`2^@dDh!OO=FZ%_Aeg;FHSCm&ypYn9FhkA{XdsNUqPuS=OaUAs;TqzF@8c)usv_J##!yU<<1?g5+1zPp+{oE>k`AbDIjD3x&eQU!b@9ptn}b7|dUl%#&sq9S{y-L2i?NQdXcrK@A6Z%wt)DO-ou1R;tA?J}n9hR8y;rjfm zf0###QV2gLm5;mQ9h?PM;urv?+P9WOa%p{drMwJu5%nb)y zFv*PMWp+(Cx^^5V{#~50qT@cPQih_cbHc}5Iw?n_UPiP#24Zt&sV*v>TcJ*q&Y@p} zHO@akP?0&@&y&ETt?C4|x83U>Pbh_Ma%XvRs_B z*a10-D&{Ef37TUomYE&J!#GnWMMFizPuFu+wA@KI_(93LCYHstXq?r553=nnWKOIx zOm8UjJ(E?*7X6no<)6`vA@vr+N<;9Pbi>bwU4YiUaij8O%p?BL;CcjEi+ zp)UFAuEqG^_$;bDe#pA9$r4iP@-Y0#7n3UrTosd zUPAH4Dani^x-st^B>)P_jvv(jtL!(TVw>=sEV-IEqH8Yueh~Z3m}m^P?`UFtd^}h` zTRJk*z720^ih3F5dZ0N)dYMaSq?wyr4|6t#^6p21D%QJ&hp+&&5J5WKx3=VSK^1rF zxxnx`?C5_Rr)S)z{n!}<^CoXQ2v+&2ez8paG0;0UUjqgvvNDn2X_&%MZt3bdtgfoq zInik@Y1>R4z1To0y+aDqcNAduM09)tJrGCbHTqipw*oxk-(A!Sn=&v1PlFO)M1)z(dI9`!D<;ZJ@~7Pv;ERsC#6{$2~U#~Dc*^XcC}B%f87v%UK7Sf_Mbq$De^y?D7TYVNl;{OD`*IH zfFbo^==ypYsMvVMD7ZAIDR$#k-# zsw1B3Bw5{1XdsoMjuI=HN{SGvH)$_F@a4t9XF7DQkm}RkXXP&7(e!BWRovs#zw&+A z!xwVPj};HFYN!vR55 z+yqk(@%Kp>RK_B#2_VpFX63~c4ISWe)H=M6w|{)o4H0bfeDnT|a^?Mh8_{Xegv)Va zsaa)3yRfeMV59;QTb0&fVk>r*PlW()qJyE55-(1fFo_8KgjBOObf#ULVqyd1Hvb1# z7sFvY`06HMmGo?PX>Tl$fVpiqUJ0biMa>3_kZ!e@c9thPR2RJB&DDa@zMt@yy$qCD z4Hka`5%fzW_^<{sqCT2kSUC9lrwg`FPw`j&_^3~zmM9sO`z4_47&|b7)O%E4{ZK%G z_;Sylxj4a($?Kl`gTP3b<$+RR7YB4`qMv`0Ez>NB>b(T1yv5Kd?2!fgw@-A|zD0Wb zenfHp51RvjmbTIRIpGkdaJfIfQA>{1-Q-p$rtN-&oz4UPYiM%7-5SBuJ& zF#hT<_soE8>Ng6%u6q9yTC(&N&I8HMsqzTS!gfuQ^S1eUD9ip&Z0SSYx?R=ch$t+R zN5CxBv4gU~vJkah6gB)+mv(%kWwS7VXUFwm_1t#pmmqD{>f_dwMi}d-ixn@^);=<= zQ?3=wfhvM{%o59O4MLwEtCXbYGq@HZNvsEb4HA&Zf1ReYEAF#j&Hi(~aV*v;t=Mz# zaH$~K?bGj#6x=MG<((Ej4uZ&{S_wFj;l&l_?QOf)>qvm`Wxs5^N&C5Wys60cxV|$G zWpBWW1CSf6!J|zkZJ#nL;xhSCx65F&xSHWj*VGE*7q91wwv+)%{SM(@YDr(7=?2~0 zo;ft8Rj_9fC=aE42cd0q*{U?JCD(M#ImRbH0(DuL)s{G9e3yDE%b%yD?JLIHm8#so zS8C98LGed{c$PMNAt-W%d=uX0cmF$jWJxnnGl*M}XW(FnJLez7BgR(#@+yPtl5m~j zuijJS|KJwxnDF*tJWfq|xpmu`;Thhetrux^`Pr)^-1d=MN`p0eyNkUq8M_-3$!~D& z9^5&ZVuHiq7=Htx0A!O=Wt&UWo{?~mF*U4w~Mf?lXWxHcgzLE;FNd?~^#={XG2BiCba z+xBy`POrm4d6EO(%1Fv{G1n!mhgGRHh*l#%DMmb71gP8OTa&qb{Dlzu^OLNkwYXn| zVTIOodvhB%@AI;l88i!53Ii=MH{$^<)%P?0|# z>mD`w7!2Vf`||5B{?lv40-|01G=bUBg^7O{Fk#Oz9G9E#d#?3aj5nR3e`@4t7A&9>|@!xTdb|gkcaCTBU z@-{h<`0*|~J#_1napZ&Cx5sClJLU_|^oZsn#a?Z;jr`|h8=yjUsoQTavzTwTUznD% z-w&Th)p@N0^?*d8ZEbQbOPjX2Shyg-{p93kwsiH6l6S%{H~3YVBGLA=nozOd0o-ZW z5=GtiA0+#V(VpfxZoF0Te<5Hks&;*B9Cd7bib(_#mnyrSE$ppqM_kl# z!fwe#gwY=}g!5O)tzUA?MHu5dD@R;QT^z0z!;jR)!zjvHt!ygVR4Q6jl;Z3e@L^?q z4#O4d7xnhxD=Jbud9oq+FxN<7_y6L|-K)a?r+&L72OeH8XRy;wj>ggZO^L&0Q$-1nKR{+F`1qk58}SCR9y?oy>?) zc!#&EJ@=Mi-r_G7^Vk%nNPN+L;VpF)LwatkNEgSS_w$*_d0$Syy!y~5ssz&#!#w+O zJyr@ZVWQK-UW{Vz0z?&)@9E_ck!5Pp2Ob^1rNc6L&hOv}hY7QILMi(VpWQHDfdL1r5 zqEnVCpb0}rX!9ls9MYOUFmp&z^wLzNqDF>HiyV9{LV8Zm&_X8GLQ%_wag?GnPIVo1 zn~6qF%L9TX=I9kqMUfj~){Dkl zVpX~<_{hj6731DJcUzs&3?=c3;v0-kDk<(vLE!09u7V}y!@ti!^AP@W`X!u=1~6uZ zN1c&j#+QIvjRE@Ek$Bx*w10}|bL(s*PwY>3(?J@e6xEhRPYQjGSR4@1Hw%CCDkp%h zWGO!*H92=&%{?iB{PD+RYnz!WBaYjRxgd$LT@}HPI>us&ZRhO>B?^g2Us8@uObLRI zET@5|j`v#ixvu8t=0_@861}QilFirQ?J60g`#X@V_x&fEiS|L?YnX)R-^5BGI%vU9 zKI^7XLTv_!lQx`}eo{mVmuf#mk~*56(1S74u4F#|$5vTZv=-Byv%^^9xis}f)j)mQ zYEr3S!V^oI`f0wy+P^0E4gt#q&h2~*jl2WvLw6d8{HRb(pA=a7#|EfX&j&YcFjb(daupdV#2JrG>E8O0_mHv}(7YVvCxzVP4hk9>7YpY8(_4O|gD={8n1V8i5W{@q( zhefUbyd`^UYichBV}}7^cdey&nRoREg9<`>IbgUeQ8YkjkSv3}1bL^Vg~aW{H%EP`}A~yPh7@?AyAc zrpDp(5@ntG{(F>IXZ!K*SkSA_!2+3`y+VBxOm#e|Yer_(LCzvFE0Szw=C6{9PDf-K zJ(xZ*Y{xV?MXyO3SUfI2`(nJQm21JK{Lg8V&ElVjnb&Z@*RnTRpRd$pEec;Hk#b#X z1b7SOm#}qMCyD6&RrszR$?7X%PWAimvp&impCB|8oqmZQyonXMBj-@89dm|#%bv59 zS#foFr7fTaLK!Nq4{Sv>Tn}$mQ14#IZ@>*~mm+#Y$2$Bp$>TtJxx%*5R0{W&-k|rb zN6w{@nxVRR52qE;4%u}y?29U5Rh-nB77#&Onk3QK{J(5=pG5X<<+`ncIR7Wf6$BQh zy*jf@Fc!&O2~s;EWm|w!eU+Wjwu>cae+?X$LN8YxQF;O0#W6KILRR1RNXPm7>{4z} z;viN#AqXdqU6kIO9&5T)ya87=Vo1@h!B2~|EZQ%$Sd3}hvFg$vy$u~cz;)}yJ;0MM z_3_;cQBVtDi`-&pO7+=BAiR~-zQxmjBfkIlKgNvKf#{%s^V7QhC&&D%1MeJLmSk(9 zXzV9er$^q1HXPd@gm*6#V;|Q`quNB`5fC~8Qmfmm_f}WZc*CvH_>K->RYAh3s}V9^ zFAiOwZpy5-QZ>Bz7$R2vsCW(v{&n^=KYH$f6H`KT(79R(GX<&T9We+7Zq_8Aq0AcA4F(w#|z?4>{8)FY(HWsb+Q-TIEFv zyUs{CrR)uS6kVPOC`Ku)1)_!JYQn4kub-oWQpBhs(6i4QpG+~6Y^S*q915+ zwWaC(&|n+P>gbot5Y6B+?^AB+YFV%y=>$ z{Qd&5WOZ!Bf#P!$r>9a>&A0(laaGs0Zv0)Usbj`|xd6Q$2Xzk2! z{)XURu~Da$cQ0k@JD-|CVuVqvUy+QbuSl5GbA)euu;By=_i3KV3Tck?upH?WZdBB` z)NoG~VO}D8&z9H4)>Nxxw`tse2!Q5KyYj-EN1vwq{m)hxM@}H8_GG*JcAm|*6EE?Q;F73L2tOWBDdy8qBRqLwJ6iW>gca{<{t+nG60`mOn~xm?;a9c|DKrQ< z@S1a+mII7lNTDBvpImIL)1SYy$ntOO+9DNg@MQxFL}u?TLC|27hFDx!voa-XL9eYk zQ_2T>)4kmR3w5m#3mH#(f4kX^!sRvXtJk(2f=%DlOZGIwQWlE;fo{Y9Y@F4|^g?N- zi;nAe8oeQDY5h4Id-QUDv~?Z1H|U8y;H`n)tLIqPnbl*Rhyh8#FX+Ly@`0;LUy%l52o=k+TVZ`jgb_ z{Bi84XJm@Cb&DJ7{o%z(}ysO?KoUwJDjV=C?oTlzLpM zvZh+D>$Z#oguNz;8RD^J;#}7C0IQ^%Kf6_s5Z1qd6#6L2!3WdKkx$hUo$D4KivSMz zTQps%EETa{HdYm>uP3EHv0b@DTHgtek$w`AtXwL(^Xy;P&p>?1Qk-z+EO2K`K9YEm zGj0q`eD85kso)nOQj}1CN0?<4YuF*S!-weZFx`CUax%_nqfz%fi`6>ma#9m-`n&e4 zN7v1U@%f#BcN0tTb=laFy-X0(&T#Qzj5v2pwK!pQMOZB0xNKL(a#|?|=e+Cybhf^E z2@&)vkH0_AtFc~G+VJerqU;E4liHCK65Kcm98qs9w2ol*TWbEXp{fUKR$Mc(!7(acLjGb26MY!h^>X-NGX zJ3(Rueuf#~Ha47WJCB%YU3As_a^oINOmmf`mUXW+9lQln-R#~-+#P>vHfVNA94vy# zlsme4ylETFrW!FRAOXQ2A*nmNsDoJLm1Ldz^RFU%ngAa%M~H)Ph6J-iu~y-&>JWhV z6WU^MG~kXr`okfe*>9hO03MrZXy^=U?*>Gd!(gkB_#*uGkFEAjya}LML!fNuPRquk$gyf%8WO(b2rx1h94{Z; z?`Cn4p0n!?xb?Qd5wTct+qm!McS^^|9QB$}vz6AA?cKw`G3KjL8FO=|h2u%9^8CbF z<#-|Q2OBtXO^C8o`shdXjcdT7JAfJOm!$5^PNh{ zwiuk}l|V7OzR~HQb>1ZUZDg>hqK?63+`Th67%Iejw&$RX^Z*qw2)hvZ7%4@cz|yPv z#;5EYyW3|btIPxCF_kd%2_d)4auu*uW zVbj)1j9ZvQZqO|HM7BvWAOXj2$55(Z+5vmHE_F#gmAuW=b%;Tsn5T>g+T0ufZkZ0fUt?kVW%Ruhw+Fl@j`2X}MBAJ!e=>KE{f5LHmmNVE?^SXykDlo0m zru^$vt)bDvlP`*b4(o0qNB>0i^Sz6BDnu*1kwC|PTED)S%nVkKH z|5eO`jwsh~;?6xI8aaw${9_Sfq` zy{Ze=pOA*ZyT_}Pd~u3gn4}swRb3P=!OAAVq{g*r+JA#hiz=HokjTg<-m{ zstF00b$nq=n6p&83E+c?+9H^C9Hv!Uc1j+IudQcwokWs%~LOIU_71EJ39j z&T4rKCV<)495oa;B^K~*q6A?^Hme5M+qa$FEh1`K*&E@5bmA8Rw<@Cn_A=wzYfuLMwvUIfI z!nSf+{RICBQB;C=~Xkz?kcO4$XS-KXtAu~ zTaH?2c)RUU`5b*ItJLpqGTuNRrc?IDjPFK;jsSN1-K?faP6 zGpj)b6@w^fT}v$SBP@FRf0*J>p+M1&2f!c3r4pYyK|mb@{C%rEaEGJC5Wl=9GF6XN zQ@*ERt!aR&W-1iH(8Ub);*i<8-B&->f(6%f+N3NSox3e{y9H>u9KL` zyJ2P7Wo{x7w%f8c#z`cDZITt%^(J_o*t}A;RaGh=gPh2jd22b}8I~MNCvchZe@Wtc7XBTABEX2CkwU1d znx>kOh$f*Jm6An*0SF=_2!diJC?SeMk|Qn&CLk&yCYT~(7GVg2VhJXa0Hmab0i`Br zsfHz@nt~Kl-e1aCRfn0dIcAt3Znv{^=4RawvTW=VTXRqw6;F%M>d#>GqB<@ZL)}KT zcZY-w0Oy35K-QvtLjv3Sf{9HwUzan7q!@7Hw)n=gjOZie0zw#HiLv6| zAG#mw1T%FPh^YY;5Eb}L)CMwOBSk5gc=BdqC=Y*ViNq&=+TW2dL^;4 zL5m$b#?VHPbZSwMYDg(S$cYZ83(MYperB}%91NUOgFglZBDaf#*dTMcD9Uhh*-{H5 zEI{KCM3PC888vB-ZkM6G>A!+Nd53$Y zA_ql8`{9EQuK~frY$13wBXkZ&lV3oQ1yV@hijS*bLCGEJ0hUh|Qk6nTqCWP3J*i3f zo?HFK4;=&L`BHvoq3!hU?3*v{0;Fs1?&$hA!HgBOBzyaX@|YaG$4N^hgsO4EF;40v zQlykoa^@XW)Scnt9m1Mx)K*Q-G8e#2v4HRQcJ}^dUn=D;uE48es$IU`1x0Z+&j)G36{ED6M-DqB8YoSAw7uESV(#k;cTON@Uqtq%!q*I z43rr&!W_uF7>BO@qP+CJ;JK2I=hc2aqxmWFV^) z8G3y(J@eCtp7d&E8l9gi^H33jBr_?bkxrVRLszOk(jtJ|(J$XKmX&J}Y8#v>hksiX7E&qJJT zbJ857g~0JKVlOZ>pj>D+n+41cdDFkrYgmx6e?$aCg7ga$G=j*w>|2!`3-L|&1cz*riIK|c@IV8zq|&HA0;0 z9cDQs$WZS_D)|Ehz%#eBvuskt83BS)6y0yBi#E<|F!eyyf)smdh~A94b3y;j)8*pzTN-eUa|V|ig-f|3^m$yT)8Te0CU&-Ex*IFW|2>cSOMUrp+f@(JV1VeW zVKeki(Z}i5_E%NquR|R0TLn8VEQeXvNVqAS;6n1c$=h5pC5YtUHy<*ILoJbAj!&_+GkQ&Lwhs?8s^w#>vg;r@iBhV8*pNP~3@4%c;H(n}1rvQiU= zXv3{GLm>k`9HVjP6zpp7#2q21&`G;$Af!wtQciTU$@xCVZC?+Dc5rpWr&F5t+Kk~? zoVArG*)vo*N;h|5P%JV!Zv3FeZOEi+mYq{dBP^B}lTyyHRITztz1^Q1wsA|FV>lx& za5OY1l$)JuVKB8T>fxoWMZs%4xt$*UFzcrK!)`vlRQ;ZQV*^u7?%}5^34PygaGs&IIYnQmNx?=}9+i&}GiB z!jvGgE17Ty2tpq#gX`eD^ye^D#&%b9@KWQ?SL&KChDkRh^sZ?mF4L^NngUI6z)vBL zTNyp%y{xg)Sw}br5UJ?p+paEOt#spxHv?#KdBjdd5#B9RD+Z5^17BUpx7J<8Nmz)u+=IcBQ6eQOjfC17b0g%M5?n$m$Ql(!V(N2IC9BTM;%!s zET?i?lySzIBP@ditqg|=Bra@VcQo*A1xeb16-U-#@qq4^`k|P=CO-RjR~fdiA}(8NUVz@& zW~&t1=e$gbxrd_(X<3DFm&C%4XzP;})=W4dggPN`uz|u(=uJtHlJ^!caCRdspFU~y z>9tn|pw}8N&oFdZV(TX;e6Xe34#6(cr@XWVvO8!J#gG;z7g*wYQG{&cbq0DTBP_I5 zcZTrH$X0h`0>IshL%p6XFA;PbW9UX}lWfS6e#yQb3$_f2gF6LZCKwx)L+nlhZbNZ{ zJz4`sTLhsY=FD9Ps}kBmBNpnE4kIqeL1%#6e4w)q_(2Je706bj$1S!^BP@MbJK+Mr z#urA7oq@to?Ib`?tGv^ols!^*ULK*htx3jZM9s+~ESO2kZBGExVZp>i7<36SAmQ1A zK}I$NLZVQOkqkNO?Rx4<+KDAZJ|hI zk+wl0%q9a)J2AN+n#Nc%N+T{{(IYN42_dZ{szchHdxMXuqvM+P)eeZkrJ|xM1}Cdm z6MiHe1>NJ(C!p&LxIA4#0SL(yGet*)Kprc)Av zoa{Dsp<2cpu^+(9)Y-wETh1@WRPDMM9!i+|R^h;b!#vy=*`FIMovpgR@O6VICqcL4 z=iea#*NnsP8y0^E!=h`hNI>ZJRa6sa-oVBvRRLi!%8e6|rC?!o_d4Ezl(I1EZ;qT$ zyNQQDhE*3GYBbJ`YN^xy1$s^x3>2kGgWu)|!x|Y`eL5-{Hqo62ABd@_vkB12fey1+rGe&>5%dA= z5Q{*hw!_f(3Akb(kX2bSmX%6 zsR*@&t

    b7XJ8{mTP#DF1LBNS~_=U`zYEX+!wMDO4Zr0L=#@#c~GKP1tc@4<_kh*U4)ffz>F2H_Z(wSr@J9E@nd z!y3?2WZoZCr^YChpvnkIEW$Z_LL7$)Rv}{I6C^26;FKa)Qa@)YiXiF}f_Gs-FB(3* zBIK@;6xd8aV#P>B9f~JZ6zhoTe;9{N7ZeZn=8NqV17~F0+sje9bX?|zRHt#S10axS zn2H9OfH?SjeTKkK$K&hS%8%}=0tf*ZC>?(Tg!W-JyWnGnecS_%--Z4uZG5?V$v4Lf zl5#3u#au?V0=el3{)uunq?^v zX@#T^eE{}%@|NLoy-d{Osc2coZTFr92ia6n~SC%6!Y( zm*Vhbf&3#bfP1hwNM%AurbcM00x5t*l2|0DXeD5$^2tD?Ne~V;6NDK7iv!}52VfU; z+#~>=siH;@v~9<2qP784LBTfh2rahW(T_JUAaU>rI1cV- z_4xC329HF(?jkQC9?(4xZP7&LBt?ozhmWs-r+MSYr+&V?&xga|x6zD+kk#2J9h{J^ zFE<`?5jXH!h+In*vRD#6cI0nnnW-}p#6pbc5*7$$0n6gpK?C~~0uPqzBQ8#S`11Eo7xlxhn|foa89OiUU}Bh?6KFl8QDA|I05}y; zAXC5FKF>ZA-E>cHg(#KHzi$vN8ltKpzULGrrKqUVRN35o5$t0H5~`GJ?$GN>jcUqW zhqOX#JgiU@7$GfS*;r4w|5-+fn0k7AbbL1S8ICD8D3iB(hGUzoYVV~%RqXy3+?V)r z>qg*-WtJ%;E=g2~NcIq>-c@^s7I1;cxWiMBA7R~ZtQ*-AG9xa$=%f()#W>Su#130> zRY}5-ie>5RAgjIi+EtvbY`gHZiG7vnDv%ESbI0khCK#BuhyI6blB|?Suo_ z2y`Ly`PY+48~I4k3EkcWFZL%nAj2aP2`GspE@22GE>)Idl&XlL{i_jJ2_hBs;4at( zPY^wtQ(OTb`8te_SsvoOMSFi%9b$F_M?Br;=kc9k^UV0{Y%TQz@^Q4b1IP1YK(GVN zLLm6U@EeiRbO4y;h9f*x!98}b)oP*uR1uJg4oyEwAD-oURt(^{+XjM`F@Vr#@lG2t zuAgKv2n2@G56)ptz1*(g#=yuOQXWtpfCm8er7;B|0Q5yE1#sv(ZtQVj7?&o@B}N3H zfdM2y6oMdvkdo)rUk=~jI$Y-aFL6}^`n|}W10oos383&IkAzSWR7OSz&%Yeb{z31} zfb?SZ&W1{&ipgsA$9`C&{D|s~T8v=1M8IuAO!9REP{$J^EJgy~qnxhECf}^4k1+)G zou9ZL_b3GiybqVNflN&)BP;~alz~VTC*+6O2BLr?E=WC?DVgms%+Tncc(`cNABa4- zLG0K@D6sO_d+^MNnz(i8Xjwot*dr`v&5Av}6XhKB?JXlL*|~s1|6nGN7fR9rNf0zF z5|mUz5iqZg9uQUPp60`L;^zsnL%38?gfXw#7DFsLIg0)&E@aB+3kEJLvMZ7A?Xr9kVP7Z9xs zL%dBwtG8pU?A%@$ZJono?DqXF?>|8jOID$zAVh?}FQiiZ_m-Lzzpt|x)mcI@u_>1Q z7FVq@syT3+sPrPmqOnz6$32`(CPhCz$pfCL8An(Nk!PnOo){|^Tlg6a?yLIC=7T%` zE%7^!hfjV=ORMhn2d4Hn;;FYIEVoQ0vJkq+_N8{391DeDn>{Xr-x0b_YzZmn?K5>o zh?{lrD5T3yCYPm=C2cTdvN(}9#Cfv9)+5_mo;PR6O@Df79Je*&V!IYNnD#wAb4+Pxs$ ze2&a0H5nRap2@+g{ycDU3^|r&WCcLhkuZIQJ+uIu2!a71^!+0)zyu=h!Gh{c>-adI!jbO&?2 zkR8<#N*UoQ2lrn_Kb2MyMO6_MNA&~xo@y9}gb*Lz!Ry>7n%0A5;Yk!;wEv5Ctk2*kTaA^q6QQ5%p(Tn!Mr@9F^s8bF*Eo|);ZWEIAM)C{MPqFH zsl~p?1DF2F$^Y_$I{tr_nG^GwT%YTK9(rJ8gfgnq7GjB-sWG&y&ALa%OxtXN+p?=vgyuoH9;oiQTLn z0O)FBFwkVThOkYSBhSjOMcDnxc{E7zX8rg~xrIbereT3ML2`o`4+IP347}8}k9!X49UUWFY%K z&HGI?RaSrgeI#6DjT@L?VJ{UAR~>XH_;lId(LGX7QlLo55K&ZxK~Pl!BP;+BG(`l2 z%%meOKtp^%doews?B7L1G>Cu45dU(aH*u_8Ydi_2hfpWZOS?s3nJ7pQh<%@WfPL%! z7@4Y1j$(b!qJC}hs{eJ`%KL6_#f-B1L_ANw+0n+-q0)(%NO7p^nZFM-%E>bSMM$43 z7cC^XsM*z&G3D=AmfDJ z1kn!J7uzA3j-RPM~5!Z=hoNu%Gr1dEl^JB){@tII(sVQy)}zI>WGskNf&8hC}7Gs}T`l$USh>NgRG(=uz@Ly3QbJJ~L>Y zq%HwA4%2tQ<^})V07wu(*6UYc*j6IFieVUnF(VWiP?<}Fr*-}bC4!TOLV@$i6HN<3 zr$@N+!0Y)xdcZ@W2=jA5@SR?Ay*#Ek;kcN$()OQRc7}&O0vJa}NJ1$ew5RF!AI>N& z=KEo2nu*?6$q?^|fAi-`|9-Ff3xDOGnjiK4fBfCDDF4^}p$H4t#%53aKD+#t_!|5V zXaB}*Y*D&1-*%h+C~7uK7GcM`aOz)x240q*UyZ$f{3XXiUH_Qzlpb%2Or1)oHDI5X zq~?^!WhnfI7A!yT|D*8V_iwoSXro8ErG)Ig*Yx?X-2c=2(5!#rj|&@L`3&O!4(mU? zqkoEUY~_eQ`gYZB?Pl#6GWga}WijzVtlS^tepO4klXGjVg2wz{nI{!{YXmi-*JIn| z&n&>3Ha{aQ2Stk7ttb6w@W!f94&(Y-6pGv5Zgq}OKYQC?@ g_qz-}zvBHLf+(N=#oUoj6eK^D?yi6eBRoAl3iz~uO#lD@ diff --git a/vendor/libgit2/wscript b/vendor/libgit2/wscript deleted file mode 100644 index f4f8da989..000000000 --- a/vendor/libgit2/wscript +++ /dev/null @@ -1,284 +0,0 @@ -from __future__ import with_statement -from waflib.Context import Context -from waflib.Build import BuildContext, CleanContext, \ - InstallContext, UninstallContext - -# Unix flags -CFLAGS_UNIX = ["-O2", "-Wall", "-Wextra", "-fPIC"] -CFLAGS_UNIX_DBG = ['-g', '-O0'] - -# Windows MSVC flags -CFLAGS_WIN32_COMMON = ['/TC', '/W4', '/WX', '/nologo', '/Zi'] -CFLAGS_WIN32_RELEASE = ['/O2', '/MD'] - -# Note: /RTC* cannot be used with optimization on. -CFLAGS_WIN32_DBG = ['/Od', '/RTC1', '/RTCc', '/DEBUG', '/MDd'] -CFLAGS_WIN32_L = ['/RELEASE'] # used for /both/ debug and release builds. - # sets the module's checksum in the header. -CFLAGS_WIN32_L_DBG = ['/DEBUG'] - -ALL_LIBS = ['crypto', 'pthread', 'sqlite3', 'hiredis'] - -def options(opt): - opt.load('compiler_c') - opt.add_option('--sha1', action='store', default='builtin', - help="Use the builtin SHA1 routines (builtin), the \ -PPC optimized version (ppc) or the SHA1 functions from OpenSSL (openssl)") - opt.add_option('--debug', action='store_true', default=False, - help='Compile with debug symbols') - opt.add_option('--msvc', action='store', default=None, - help='Force a specific MSVC++ version (7.1, 8.0, 9.0, 10.0), if more than one is installed') - opt.add_option('--arch', action='store', default='x86', - help='Select target architecture (ia64, x64, x86, x86_amd64, x86_ia64)') - opt.add_option('--with-sqlite', action='store_true', default=False, - dest='use_sqlite', help='Enable sqlite support') - opt.add_option('--with-hiredis', action='store_true', default=False, - dest='use_hiredis', help='Enable redis support using hiredis') - opt.add_option('--threadsafe', action='store_true', default=False, - help='Make libgit2 thread-safe (requires pthreads)') - -def configure(conf): - - # load the MSVC configuration flags - if conf.options.msvc: - conf.env['MSVC_VERSIONS'] = ['msvc ' + conf.options.msvc] - - conf.env['MSVC_TARGETS'] = [conf.options.arch] - - # default configuration for C programs - conf.load('compiler_c') - - dbg = conf.options.debug - - conf.env.CFLAGS = CFLAGS_UNIX + (CFLAGS_UNIX_DBG if dbg else []) - - if conf.env.DEST_OS == 'win32': - conf.env.PLATFORM = 'win32' - - if conf.env.CC_NAME == 'msvc': - conf.env.CFLAGS = CFLAGS_WIN32_COMMON + \ - (CFLAGS_WIN32_DBG if dbg else CFLAGS_WIN32_RELEASE) - conf.env.LINKFLAGS += CFLAGS_WIN32_L + \ - (CFLAGS_WIN32_L_DBG if dbg else []) - conf.env.DEFINES += ['WIN32', '_DEBUG', '_LIB'] - - else: - conf.env.PLATFORM = 'unix' - - if conf.env.DEST_OS == 'sunos': - conf.env.DEFINES += ['NO_VIZ'] - - if conf.options.threadsafe: - if conf.env.PLATFORM == 'unix': - conf.check_cc(lib='pthread', uselib_store='pthread') - conf.env.DEFINES += ['GIT_THREADS'] - - # check for sqlite3 - if conf.options.use_sqlite and conf.check_cc( - lib='sqlite3', uselib_store='sqlite3', install_path=None, mandatory=False): - conf.env.DEFINES += ['GIT2_SQLITE_BACKEND'] - - # check for hiredis - if conf.options.use_hiredis and conf.check_cc( - lib='hiredis', uselib_store='hiredis', install_path=None, mandatory=False): - conf.env.DEFINES += ['GIT2_HIREDIS_BACKEND'] - - - if conf.options.sha1 not in ['openssl', 'ppc', 'builtin']: - conf.fatal('Invalid SHA1 option') - - # check for libcrypto (openssl) if we are using its SHA1 functions - if conf.options.sha1 == 'openssl': - conf.check_cfg(package='libcrypto', args=['--cflags', '--libs'], uselib_store='crypto') - conf.env.DEFINES += ['OPENSSL_SHA1'] - - elif conf.options.sha1 == 'ppc': - conf.env.DEFINES += ['PPC_SHA1'] - - conf.env.sha1 = conf.options.sha1 - -def build(bld): - - # command '[build|clean|install|uninstall]-static' - if bld.variant == 'static': - build_library(bld, 'static') - - # command '[build|clean|install|uninstall]-shared' - elif bld.variant == 'shared': - build_library(bld, 'shared') - - # command '[build|clean]-tests' - elif bld.variant == 'test': - build_library(bld, 'objects') - build_test(bld) - - # command 'build|clean|install|uninstall': by default, run - # the same command for both the static and the shared lib - else: - from waflib import Options - Options.commands = [bld.cmd + '-shared', bld.cmd + '-static'] + Options.commands - -def get_libgit2_version(git2_h): - import re - line = None - - with open(git2_h) as f: - line = re.search(r'^#define LIBGIT2_VERSION "(\d+\.\d+\.\d+)"$', f.read(), re.MULTILINE) - - if line is None: - raise Exception("Failed to detect libgit2 version") - - return line.group(1) - - -def build_library(bld, build_type): - - BUILD = { - 'shared' : bld.shlib, - 'static' : bld.stlib, - 'objects' : bld.objects - } - - directory = bld.path - sources = directory.ant_glob('src/*.c') - - # Find the version of the library, from our header file - version = get_libgit2_version(directory.find_node("include/git2.h").abspath()) - - # Compile platform-dependant code - # E.g. src/unix/*.c - # src/win32/*.c - sources = sources + directory.ant_glob('src/%s/*.c' % bld.env.PLATFORM) - sources = sources + directory.ant_glob('src/backends/*.c') - sources = sources + directory.ant_glob('deps/zlib/*.c') - - # SHA1 methods source - if bld.env.sha1 == "ppc": - sources.append('src/ppc/sha1.c') - else: - sources.append('src/block-sha1/sha1.c') - #------------------------------ - # Build the main library - #------------------------------ - - # either as static or shared; - BUILD[build_type]( - source=sources, - target='git2', - includes=['src', 'include', 'deps/zlib'], - install_path='${LIBDIR}', - use=ALL_LIBS, - vnum=version, - ) - - # On Unix systems, build the Pkg-config entry file - if bld.env.PLATFORM == 'unix' and bld.is_install: - bld(rule="""sed -e 's#@prefix@#${PREFIX}#' -e 's#@libdir@#${LIBDIR}#' -e 's#@version@#%s#' < ${SRC} > ${TGT}""" % version, - source='libgit2.pc.in', - target='libgit2.pc', - install_path='${LIBDIR}/pkgconfig', - ) - - # Install headers - bld.install_files('${PREFIX}/include', directory.find_node('include/git2.h')) - bld.install_files('${PREFIX}/include/git2', directory.ant_glob('include/git2/*.h')) - - # On Unix systems, let them know about installation - if bld.env.PLATFORM == 'unix' and bld.cmd == 'install-shared': - bld.add_post_fun(call_ldconfig) - -def call_ldconfig(bld): - import distutils.spawn as s - ldconf = s.find_executable('ldconfig') - if ldconf: - bld.exec_command(ldconf) - -def build_test(bld): - directory = bld.path - resources_path = directory.find_node('tests/resources/').abspath().replace('\\', '/') - - sources = ['tests/test_lib.c', 'tests/test_helpers.c', 'tests/test_main.c'] - sources = sources + directory.ant_glob('tests/t??-*.c') - - bld.program( - source=sources, - target='libgit2_test', - includes=['src', 'tests', 'include'], - defines=['TEST_RESOURCES="%s"' % resources_path], - use=['git2'] + ALL_LIBS - ) - -class _test(BuildContext): - cmd = 'test' - fun = 'test' - -def test(bld): - from waflib import Options - Options.commands = ['build-test', 'run-test'] + Options.commands - -class _build_doc(Context): - cmd = 'doxygen' - fun = 'build_docs' - -def build_docs(ctx): - ctx.exec_command("doxygen api.doxygen") - ctx.exec_command("git stash") - ctx.exec_command("git checkout gh-pages") - ctx.exec_command("cp -Rf apidocs/html/* .") - ctx.exec_command("git add .") - ctx.exec_command("git commit -am 'generated docs'") - ctx.exec_command("git push origin gh-pages") - ctx.exec_command("git checkout master") - -class _run_test(Context): - cmd = 'run-test' - fun = 'run_test' - -def run_test(ctx): - import shutil, tempfile, sys - - failed = False - - test_path = 'build/test/libgit2_test' - if sys.platform == 'win32': - test_path += '.exe' - - test_folder = tempfile.mkdtemp() - test = ctx.path.find_node(test_path) - - if not test or ctx.exec_command(test.abspath(), cwd=test_folder) != 0: - failed = True - - shutil.rmtree(test_folder) - - if failed: - ctx.fatal('Test run failed') - - -CONTEXTS = { - 'build' : BuildContext, - 'clean' : CleanContext, - 'install' : InstallContext, - 'uninstall' : UninstallContext -} - -def build_command(command): - ctx, var = command.split('-') - class _gen_command(CONTEXTS[ctx]): - cmd = command - variant = var - -build_command('build-static') -build_command('build-shared') -build_command('build-test') - -build_command('clean-static') -build_command('clean-shared') -build_command('clean-test') - -build_command('install-static') -build_command('install-shared') - -build_command('uninstall-static') -build_command('uninstall-shared') - From ad860195cf730f2ce6d2a5215df1049faf44ddcd Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:17:23 +1300 Subject: [PATCH 18/63] Moved to libgit v0.15.0 --- .gitmodules | 3 +++ vendor/libgit2 | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/libgit2 diff --git a/.gitmodules b/.gitmodules index ca6a48f0b..c7bc5e0e7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ +[submodule "example/stress/jquery"] + path = example/stress/jquery + url = https://github.com/jquery/jquery.git [submodule "vendor/libgit2"] path = vendor/libgit2 url = git://github.com/libgit2/libgit2.git diff --git a/vendor/libgit2 b/vendor/libgit2 new file mode 160000 index 000000000..3eaf34f4c --- /dev/null +++ b/vendor/libgit2 @@ -0,0 +1 @@ +Subproject commit 3eaf34f4c602b9e155e2f4c6ae26c9250ac37d50 From 14103a1c9f89a7b59038965f37ca6265fc66588e Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:40:51 +1300 Subject: [PATCH 19/63] Added unit test 'conconvenience-tree', currently tests that 'end' isn't emitted until the tree has been recursively scanned. --- test/convenience-tree.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 test/convenience-tree.js diff --git a/test/convenience-tree.js b/test/convenience-tree.js new file mode 100644 index 000000000..3d0870031 --- /dev/null +++ b/test/convenience-tree.js @@ -0,0 +1,25 @@ +var git = require('../'); +var rimraf = require('rimraf'); +var fs = require('fs'); + +var sha = '5716e9757886eaf38d51c86b192258c960d9cfea'; +var fileCount = 513; + +exports.walk = function(test) { + test.expect(1); + + git.repo('../.git', function(error, repo) { + if(error) { throw error; } + // @todo assert repo is correct + repo.commit(sha, function(error, commit) { + if(error) { throw error; } + var entryCount = 0; + commit.tree().walk().on('entry', function(index, entry) { + entryCount++; + }).on('end', function() { + test.equals(entryCount, fileCount, 'The manual tree entry count and the "end" tree entry count do not match'); + test.done(); + }); + }); + }); +}; From 565ff402ce2e5ed6db46d72415401bbe9943c065 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:41:02 +1300 Subject: [PATCH 20/63] Updated readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a96edb711..e6311675e 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,8 @@ __Can keep track of current method coverage at: [http://bit.ly/tb_methods](http: ### v0.0.7: ### * Updated to work with Node ~0.8. * More unit tests + * Added convenience build script + * Locked libgit2 to version 0.15.0 ### v0.0.6: ### * Updated to work with Node ~0.6. From 977aa095996dec3d814b43624eb8f5dd23d13812 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:41:18 +1300 Subject: [PATCH 21/63] Added basic build script --- build.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..139134960 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +git submodule update --init +rm -rf "$DIR/vendor/libgit2/build" +./configure && \ + make From 588835380e07aab13f0a3078c31f76a926631995 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 22:52:15 +1300 Subject: [PATCH 22/63] Updated readme --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e6311675e..b8d014998 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,17 @@ Node.js libgit2 bindings Created by Tim Branyen [@tbranyen](http://twitter.com/tbranyen) -Currently under active development (and seeking contributions), `nodegit` provides asynchronous native bindings to the `libgit2` C API. +Currently under active development (and seeking contributions), `nodegit` provides asynchronous native bindings to the [`libgit2`](http://libgit2.github.com/libgit2/) C API. + + +Contributing +------------ + +Nodegit aims to eventually provide native asynchronous bindings for as much of libgit2 as possible, but we can't do it alone! + +We welcome pull requests, but please pay attention to the following: whether your lovely code fixes a bug or adds a new feature, please include unit tests that either prove the bug is fixed, or that your new feature works as expected. See [running tests](#running-tests) + +Unit tests are what makes the Node event loop go around. Building and installing ----------------------- From 7e680646c9c1acde0d6e6f02139e84824253ac69 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 23:09:40 +1300 Subject: [PATCH 23/63] Updated package.json --- package.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d13b25d19..fec407f64 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,15 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.0.6", + "version": "0.0.7", "homepage": "https://github.com/tbranyen/nodegit", + "keywords": [ + "libgit2", + "git2", + "git", + "native" + ], + "license": "GPLv2", "author": "Tim Branyen (http://twitter.com/tbranyen)", "contributors": [ { @@ -20,15 +27,15 @@ "lib": "./lib" }, "engines": { - "node": "~0.6" + "node": "~0.8" }, "devDependencies": { "nodeunit": "0.6.x", "rimraf": "1.0.x" }, "scripts": { - "preinstall": "./configure", - "install": "make", + "preinstall": "", + "install": "./build.sh", "test": "cd test && nodeunit *.js" } } From 30a3a71c00a8bea456724fad37b5929ae5de2eba Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 23:11:44 +1300 Subject: [PATCH 24/63] Execute build in preinstall --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fec407f64..a577ca22a 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "rimraf": "1.0.x" }, "scripts": { - "preinstall": "", - "install": "./build.sh", + "preinstall": "./build.sh", + "install": "", "test": "cd test && nodeunit *.js" } } From 52aa19a24a5bc6d4d5de3252af3de58fdbee9303 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 23:14:32 +1300 Subject: [PATCH 25/63] cd into $DIR before attempting to build --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index 139134960..bde89ea9e 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,6 @@ #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd $DIR git submodule update --init rm -rf "$DIR/vendor/libgit2/build" ./configure && \ From ecfd36c80a3e9081f200dfda2391acadb56dac27 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Feb 2013 23:39:50 +1300 Subject: [PATCH 26/63] Updated build script to handle npm install, i.e. when the .git folder is missing --- build.sh | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index bde89ea9e..2cc62c209 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,23 @@ #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $DIR -git submodule update --init -rm -rf "$DIR/vendor/libgit2/build" + +# Check for presence of .git directory, update submodules if present +if [ -d "$DIR/.git" ]; then + echo "Initializing & updating submoules" + git submodule init + git submodule update +else + echo "Cloning libgit2" + git clone git://github.com/libgit2/libgit2.git "$DIR/vendor/libgit2" + cd "$DIR/vendor/libgit2" + git checkout v0.15.0 + cd $DIR +fi + +if [ -d "$DIR/vendor/libgit2/build" ]; then + echo "Removing previous build directory" + rm -rf "$DIR/vendor/libgit2/build" +fi + ./configure && \ make From fce88902e66c72b5b93e75bdb5ae717038b221f6 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Feb 2013 13:54:44 +1300 Subject: [PATCH 27/63] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8d014998..b252f396b 100644 --- a/README.md +++ b/README.md @@ -264,4 +264,4 @@ Getting involved If you find this project of interest, please document all issues and fork if you feel you can provide a patch. Testing is of huge importance; by simply running the unit tests on your system and reporting issues you can contribute! -__Before submitting a pull request, please ensure both unit tests and lint checks pass.__ +__Before submitting a pull request, please ensure both that you've added unit tests to cover your shiny new code, and that all unit tests and lint checks pass.__ From 89bc6c7651e20a3f65a67385578a8cd7bd4e71ff Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 00:59:59 +1300 Subject: [PATCH 28/63] Normalised quotes --- test/convenience-commit.js | 116 +++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 test/convenience-commit.js diff --git a/test/convenience-commit.js b/test/convenience-commit.js new file mode 100644 index 000000000..7378e105a --- /dev/null +++ b/test/convenience-commit.js @@ -0,0 +1,116 @@ +var git = require( "../" ); +var rimraf = require("rimraf"); +var fs = require( "fs" ); + +// Helper functions +var helper = { + // Test if obj is a true function + testFunction: function(test, obj, label) { + // The object reports itself as a function + test(typeof obj, "function", label + " reports as a function."); + // This ensures the repo is actually a derivative of the Function [[Class]] + test(toString.call(obj), "[object Function]", label + " [[Class]] is of type function."); + }, + // Test code and handle exception thrown + testException: function(test, fun, label) { + try { + fun(); + test(false, label); + } + catch (ex) { + test(true, label); + } + } +}; + +/** + * Test that the commit object is present. + * + * @param {Object} test + */ +exports.method = function(test){ + test.expect(2); + + helper.testFunction(test.equals, git.commit, "Commmit"); + + test.done(); +}; + +var historyCountKnownSHA = 'fce88902e66c72b5b93e75bdb5ae717038b221f6'; + +/** + * Test that retreiving walking a given commit's history works as expected. + * + * @param {Object} test + */ +exports.history = function(test) { + test.expect(2); + git.repo('../.git', function(error, repository) { + + repository.commit(historyCountKnownSHA, function(error, commit) { + + test.equals(error, 0, 'Getting latest branch commit should not error'); + + var historyCount = 0; + var expectedHistoryCount = 364; + commit.history().on('commit', function(commit) { + historyCount++; + }).on('end', function(commits) { + + test.equals(historyCount, expectedHistoryCount, 'History count does not match expected'); + + test.done(); + }); + }); + }); +}; + +/** + * Test that retreiving master branch's HEAD commit works as expected. + * + * @param {Object} test + */ +exports.masterHead = function(test) { + test.expect(2); + git.repo('../.git', function(error, repository) { + repository.branch('master', function(error, branch) { + + test.equals(error, 0, 'Getting branch should not error'); + + repository.commit(branch.sha, function(error, commit) { + + test.equals(error, 0, 'Getting latest branch commit should not error'); + + test.done(); + }); + }); + }); +}; + +/** + * Test that retrieving and walking a commit's tree works as expected. + * + * @param {Object} test + */ +exports.tree = function(test) { + test.expect(3); + git.repo('../.git', function(error, repository) { + + repository.commit(historyCountKnownSHA, function(error, commit) { + + test.equals(error, 0, 'Getting latest branch commit should not error'); + + var commitTreeEntryCount = 0; + var expectedCommitTreeEntryCount = 200; + + commit.tree().walk().on('entry', function(commit) { + commitTreeEntryCount++; + }).on('end', function(commits) { + + test.equals(commitTreeEntryCount, expectedCommitTreeEntryCount, 'Commit tree entry count does not match expected'); + + test.done(); + }); + }); + }); +}; From 4cb6e2b898e73231b2fe625bc3a6cb9745578f4f Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 01:01:05 +1300 Subject: [PATCH 29/63] Normalised quotes --- test/convenience-commit.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/convenience-commit.js b/test/convenience-commit.js index 7378e105a..cc8cbb724 100644 --- a/test/convenience-commit.js +++ b/test/convenience-commit.js @@ -1,15 +1,15 @@ -var git = require( "../" ); -var rimraf = require("rimraf"); -var fs = require( "fs" ); +var git = require('../'); +var rimraf = require('rimraf'); +var fs = require( 'fs' ); // Helper functions var helper = { // Test if obj is a true function testFunction: function(test, obj, label) { // The object reports itself as a function - test(typeof obj, "function", label + " reports as a function."); + test(typeof obj, 'function', label + ' reports as a function.'); // This ensures the repo is actually a derivative of the Function [[Class]] - test(toString.call(obj), "[object Function]", label + " [[Class]] is of type function."); + test(toString.call(obj), '[object Function]', label + ' [[Class]] is of type function.'); }, // Test code and handle exception thrown testException: function(test, fun, label) { @@ -31,7 +31,7 @@ var helper = { exports.method = function(test){ test.expect(2); - helper.testFunction(test.equals, git.commit, "Commmit"); + helper.testFunction(test.equals, git.commit, 'Commmit'); test.done(); }; From dfd4963a5faa3d41350749162562fec5308d684f Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 01:04:08 +1300 Subject: [PATCH 30/63] Initial travis configuration --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..e3c513ce1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 +script: ./build.sh From ae792651f2bf005275670a23354d71eb8b9aa8cb Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 01:11:31 +1300 Subject: [PATCH 31/63] Updated travis yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e3c513ce1..baa0031d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ language: node_js node_js: - 0.8 -script: ./build.sh From 4eaa04e26a34313c83e0a858bb5ac6ddcbba9d93 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 01:37:22 +1300 Subject: [PATCH 32/63] Added test for improper commit sha --- test/convenience-commit.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/convenience-commit.js b/test/convenience-commit.js index cc8cbb724..bb72d4af8 100644 --- a/test/convenience-commit.js +++ b/test/convenience-commit.js @@ -36,6 +36,24 @@ exports.method = function(test){ test.done(); }; +/** + * Test that + * + * @param {Object} test + */ +exports.improperCommitId = function(test) { + test.expect(1); + git.repo('../.git', function(error, repository) { + + repository.commit('not a proper commit sha', function(error, commit) { + + test.equals(error, 'Object does not exist in the scope searched.', 'Attempting to get commit by invalid SHA should error'); + + test.done(); + }); + }); +}; + var historyCountKnownSHA = 'fce88902e66c72b5b93e75bdb5ae717038b221f6'; /** From 4211c8a450a2fb28da4c8955337688862538b1bd Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 01:43:20 +1300 Subject: [PATCH 33/63] Updated convenience-commit's tree tests --- test/convenience-commit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/convenience-commit.js b/test/convenience-commit.js index bb72d4af8..63ec60bc5 100644 --- a/test/convenience-commit.js +++ b/test/convenience-commit.js @@ -111,7 +111,7 @@ exports.masterHead = function(test) { * @param {Object} test */ exports.tree = function(test) { - test.expect(3); + test.expect(2); git.repo('../.git', function(error, repository) { repository.commit(historyCountKnownSHA, function(error, commit) { From 732b17504eb5e4429e14f2cb78816e98cc22993e Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Fri, 1 Mar 2013 02:03:34 +1300 Subject: [PATCH 34/63] Updated nodeunit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a577ca22a..90199705c 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "node": "~0.8" }, "devDependencies": { - "nodeunit": "0.6.x", + "nodeunit": "0.7.x", "rimraf": "1.0.x" }, "scripts": { From 64398c5d6d94022d939ec69c697549b4a150f52f Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 01:58:15 +1300 Subject: [PATCH 35/63] Removed old build scripts --- Makefile | 50 -------------------------------------------- build.sh | 23 --------------------- configure | 1 - wscript | 62 ------------------------------------------------------- 4 files changed, 136 deletions(-) delete mode 100644 Makefile delete mode 100755 build.sh delete mode 100755 configure delete mode 100755 wscript diff --git a/Makefile b/Makefile deleted file mode 100644 index 048feaeaa..000000000 --- a/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -NODE_JS = $(if $(shell test -f /usr/bin/nodejs && echo "true"),nodejs,node) -NODE_BLD = node-waf -NODE_LIB_PATH = ~/.node_modules - -BASE = . -INSTALL_PATH = $(NODE_LIB_PATH)/nodegit - -NATURAL_DOCS_PATH = $(BASE)/vendor/naturaldocs/ - -all: build - -update: clean config build uninstall install - -config: - @@$(BASE)/configure - -build: - @@$(NODE_BLD) build - -debug: - @@$(NODE_BLD) debug - -install: - @@mkdir -p $(INSTALL_PATH) - @@mkdir -p $(INSTALL_PATH)/build/Release - @@mkdir -p $(INSTALL_PATH)/lib - @@mkdir -p $(INSTALL_PATH)/vendor - - @@cp -f $(BASE)/build/Release/nodegit.node $(INSTALL_PATH)/build/Release/nodegit.node - @@cp -f $(BASE)/lib/* $(INSTALL_PATH)/lib/ - @@cp -rf $(BASE)/vendor/* $(INSTALL_PATH)/vendor/ - @@cp -f $(BASE)/package.json $(INSTALL_PATH)/ - - @@echo "Installed to $(INSTALL_PATH)" - -uninstall: - @@rm -rf $(INSTALL_PATH) - @@echo "Uninstalled from $(INSTALL_PATH)" - -clean: - @@rm -rf $(BASE)/build/ - @@rm -rf $(BASE)/vendor/libgit2/build/ - -lint: - @@$(NODE_JS) $(BASE)/util/hint-check.js - -doc: - @@$(NATURAL_DOCS_PATH)/NaturalDocs -i $(BASE)/include -o HTML $(BASE)/doc -p $(BASE)/doc -s Theme - -.PHONY: test build doc diff --git a/build.sh b/build.sh deleted file mode 100755 index 2cc62c209..000000000 --- a/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Check for presence of .git directory, update submodules if present -if [ -d "$DIR/.git" ]; then - echo "Initializing & updating submoules" - git submodule init - git submodule update -else - echo "Cloning libgit2" - git clone git://github.com/libgit2/libgit2.git "$DIR/vendor/libgit2" - cd "$DIR/vendor/libgit2" - git checkout v0.15.0 - cd $DIR -fi - -if [ -d "$DIR/vendor/libgit2/build" ]; then - echo "Removing previous build directory" - rm -rf "$DIR/vendor/libgit2/build" -fi - -./configure && \ - make diff --git a/configure b/configure deleted file mode 100755 index eee9a98ec..000000000 --- a/configure +++ /dev/null @@ -1 +0,0 @@ -node-waf configure diff --git a/wscript b/wscript deleted file mode 100755 index 04fc90b85..000000000 --- a/wscript +++ /dev/null @@ -1,62 +0,0 @@ -import Options, Utils -import os, shutil, platform -from os.path import exists, abspath -from subprocess import Popen - -# Ensure version is updated with each new release. -VERSION = '0.0.6' -# These constants shouldn't change, probably. -APPNAME = 'nodegit' -srcdir = '.' -blddir = 'build' - -def set_options(opt): - opt.tool_options('gcc') - opt.tool_options('compiler_cxx') - -def configure(conf): - import preproc - preproc.go_absolute = True - - conf.check_tool('gcc') - conf.check_tool('compiler_cxx') - conf.check_tool('node_addon') - - # Build libgit2, create necessary folders - os.mkdir('vendor/libgit2/build') - os.chdir('vendor/libgit2/build') - - Popen('cmake -DBUILD_TESTS=OFF -DTHREADSAFE=ON .. ', shell=True).wait() - - conf.env.append_value('LIBPATH_GIT2', abspath('.')) - conf.env.append_value('LIB_GIT2', 'git2') - -def build(bld): - try: os.chdir('vendor/libgit2/build') - except: pass - - Popen('cmake --build .', shell=True).wait() - - os.chdir('../../') - - main = bld.new_task_gen('cxx', 'shlib', 'node_addon') - main.target = 'nodegit' - main.source = ''' - src/base.cc - src/sig.cc - src/blob.cc - src/error.cc - src/object.cc - src/reference.cc - src/repo.cc - src/commit.cc - src/oid.cc - src/revwalk.cc - src/tree.cc - src/tree_entry.cc - ''' - - main.includes = './vendor/libgit2/include' - main.rpath = '$ORIGIN/../../vendor/libgit2/build' - main.uselib = 'GIT2' - From b07ea7e64b6d706ff1043f85e2fe8d21f7249a34 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 01:59:43 +1300 Subject: [PATCH 36/63] Build with node-gyp --- binding.gyp | 49 ++++++++++++++++++++++++++++++++++++++++ install.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 7 ++++-- 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 binding.gyp create mode 100644 install.js diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 000000000..7902aedd6 --- /dev/null +++ b/binding.gyp @@ -0,0 +1,49 @@ +{ + 'targets': [ + { + 'target_name': 'nodegit', + 'sources': [ + 'src/base.cc', + 'src/blob.cc', + 'src/commit.cc', + 'src/error.cc', + 'src/object.cc', + 'src/oid.cc', + 'src/reference.cc', + 'src/repo.cc', + 'src/revwalk.cc', + 'src/sig.cc', + 'src/tree.cc', + 'src/tree_entry.cc' + ], + 'todosources': [ + ], + + 'include_dirs': [ + 'vendor/libv8-convert', + 'vendor/libgit2/include' + ], + + 'libraries': [ + '-L= 0.1.21", + "node-gyp": "~0.8.2" + }, "devDependencies": { "nodeunit": "0.7.x", "rimraf": "1.0.x" }, "scripts": { - "preinstall": "./build.sh", - "install": "", + "install": "node install.js", "test": "cd test && nodeunit *.js" } } From db2e8730b928271914ab16a715c8f9148a98de1c Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:00:51 +1300 Subject: [PATCH 37/63] Added V8-Convert --- vendor/libv8-convert/cvv8/ClassCreator.hpp | 1286 ++++++ vendor/libv8-convert/cvv8/Makefile | 8 + vendor/libv8-convert/cvv8/NativeToJSMap.hpp | 183 + vendor/libv8-convert/cvv8/V8Shell.hpp | 650 +++ vendor/libv8-convert/cvv8/XTo.hpp | 281 ++ vendor/libv8-convert/cvv8/arguments.hpp | 817 ++++ vendor/libv8-convert/cvv8/convert.hpp | 66 + vendor/libv8-convert/cvv8/detail/Makefile | 2 + .../cvv8/detail/convert_core.hpp | 2054 ++++++++++ .../cvv8/detail/doxygen_hack.hpp | 28 + .../cvv8/detail/invocable_core.hpp | 2202 ++++++++++ .../cvv8/detail/invocable_generated.hpp | 3588 +++++++++++++++++ .../cvv8/detail/signature_core.hpp | 498 +++ .../cvv8/detail/signature_generated.hpp | 911 +++++ vendor/libv8-convert/cvv8/detail/tmp.hpp | 120 + .../cvv8/generator/Signature.hpp | 72 + vendor/libv8-convert/cvv8/invocable.hpp | 67 + vendor/libv8-convert/cvv8/properties.hpp | 730 ++++ vendor/libv8-convert/cvv8/signature.hpp | 70 + vendor/libv8-convert/cvv8/v8-convert.hpp | 169 + 20 files changed, 13802 insertions(+) create mode 100644 vendor/libv8-convert/cvv8/ClassCreator.hpp create mode 100644 vendor/libv8-convert/cvv8/Makefile create mode 100644 vendor/libv8-convert/cvv8/NativeToJSMap.hpp create mode 100644 vendor/libv8-convert/cvv8/V8Shell.hpp create mode 100644 vendor/libv8-convert/cvv8/XTo.hpp create mode 100644 vendor/libv8-convert/cvv8/arguments.hpp create mode 100644 vendor/libv8-convert/cvv8/convert.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/Makefile create mode 100644 vendor/libv8-convert/cvv8/detail/convert_core.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/doxygen_hack.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/invocable_core.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/invocable_generated.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/signature_core.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/signature_generated.hpp create mode 100644 vendor/libv8-convert/cvv8/detail/tmp.hpp create mode 100644 vendor/libv8-convert/cvv8/generator/Signature.hpp create mode 100644 vendor/libv8-convert/cvv8/invocable.hpp create mode 100644 vendor/libv8-convert/cvv8/properties.hpp create mode 100644 vendor/libv8-convert/cvv8/signature.hpp create mode 100644 vendor/libv8-convert/cvv8/v8-convert.hpp diff --git a/vendor/libv8-convert/cvv8/ClassCreator.hpp b/vendor/libv8-convert/cvv8/ClassCreator.hpp new file mode 100644 index 000000000..4a8b6d7d9 --- /dev/null +++ b/vendor/libv8-convert/cvv8/ClassCreator.hpp @@ -0,0 +1,1286 @@ +#if !defined(CODE_GOOGLE_COM_P_V8_CONVERT_CLASS_CREATOR_HPP_INCLUDED) +#define CODE_GOOGLE_COM_P_V8_CONVERT_CLASS_CREATOR_HPP_INCLUDED 1 +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ + +#include +#include +#include "convert.hpp" +//#include // only for debuggering +#include "NativeToJSMap.hpp" +namespace cvv8 { + + /** + Policy template used by ClassCreator for + instantiating T objects. + */ + template + class ClassCreator_Factory + { + public: + typedef T * ReturnType; + /** + Must instantiate a new T object based on the given + arguments. On error it should throw an exception (which the + binding framework will convert to a JS-side exception). It + may also return NULL on error, but the error message + probably won't be as clear for the user. + + Ownership of the object is passed to the caller (the + binding API internals), and eventually given to v8. + + jsSelf will be the newly-created JS-side 'this' object. It + is not normally required by this function but it is + sometimes useful when we need to bind supplementary + properties in the ctor, especially when binding a "pure + C++" class which has no native place to store such + properties. + + At the time this is called, jsSelf is not connected to the + native (because it hasn't yet been created). + Implementations must not perform the actual binding of the + returned native to jsSelf - ClassCreator will do that + immediately after Create() returns the new object. + + The default implementation simply return (new T). + */ + static ReturnType Create( v8::Persistent & jsSelf, v8::Arguments const & argv ) + { + return new T; + } + + /** + Must destroy obj using a mechanism complementary to its + construction via a prior call to Create(). + + The default implementation simply calls (delete obj). + */ + static void Delete( T * obj ) + { + delete obj; + } + }; + + /** + Base class for static ClassCreator options. + */ + template + struct Opt_ConstVal + { + typedef ValT Type; + const static Type Value = Val; + }; + + /** + Base class for static integer ClassCreator options. + */ + template + struct Opt_Int : Opt_ConstVal + {}; + + /** + Base class for static boolean ClassCreator options. + */ + template + struct Opt_Bool : Opt_ConstVal + {}; + + /** + A ClassCreator policy/option class responsible specifying whether + or not a ClassCreator-bound class should allow "Foo()" and "new + Foo()" to behave the same or not. If the Value member is false + (the default) then "Foo()" is not allowed to behave as a + constructor call (it will generate an error), otherwise it will + be treated exactly as if "new Foo()" had been called. + */ + template + struct ClassCreator_AllowCtorWithoutNew : Opt_Bool + {}; + + /** + ClassCreator policy which determines whether lookups for native + types in JS objects should walk through the prototype + chain. This can decrease the speed of JS-to-this operations and + is necessary only if bound types will be subclassed (either from + other bound native types or from JS classes). + + The default value is true for the sake of usability. If JS-side + subclassing will never be used, you can potentially optimize out a + few lookup operations by creating the specialization by subclassing + Opt_Bool. + */ + template + struct ClassCreator_SearchPrototypeForThis : Opt_Bool + {}; + + /** + ClassCreator policy type which defines a "type ID" value + for a type wrapped using ClassCreator. This is used + together with JSToNative_ObjectWithInternalFieldsTypeSafe + (type THAT 10 times fast) to provide a lightweight + (but highly effective) type check when extracting + natives from v8 (as void pointers). The default + implementation is fine for all cases i can think of, but i can + concieve of one or two uses for specializations (e.g. storing the + JS-side name of the class as the type ID). + + The type id must be unique per type except that subtypes may + (depending on various other binding options) may need use the same + value as the parent type. If multiple types share the same type ID, + the type-safety check can be bypassed, _potentially_ leading to an + illegal static_cast() and subsequent mis-use of the pointer. i + stress the word "potentially" because to get that condition one + would have to (A) abuse the object via the C++ API (which doesn't + happen via the binding process, and you're probably also not going + to do it) or (B) write some script code to confuse two bound native + types about who is really who when a particular member is called. + + In the case of subclassed bound types, the + ClassCreator_TypeID impl should subclass + ClassCreator_TypeID. Whether or not this is _required_ + for proper functionality depends at least in part on whether + (ClassCreator_InternalFields::TypeIDIndex>=0). If it is + negative, subclasses do not need to explicitly define this policy + because the type ID won't be used for purposes of validating a JS-held + pointer's native type. + + TODO: see if we can consolidate this type with TypeName<>. The problem + at the moment is that JSToNative_ObjectWithInternalFieldsTypeSafe + takes a (void const * &) and TypeName::Value is a (char const *), which + won't convert to (void const *) in the context of template parameters. + */ + template + struct ClassCreator_TypeID + { + const static void * Value; + }; + template + const void * ClassCreator_TypeID::Value = TypeName::Value; + + /** + Convenience base type for ClassCreator_InternalFields + implementations. + + See the member documentation for the meaning of + HowMany and Index. + + If any of the following conditions are met then + a compile-time assertion is triggered: + + - (ObjectIndex<0) + + - (ObjectIndex>=HowMany) + + - (TypeIndex>=HowMany). + + - (TypeIndex == ObjectIndex) + + TypeIndex may be negative, which indicates to ClassCreator that the + binding should not store type ID information. However, if it is + negative then T must not be used together with + JSToNative_ObjectWithInternalFieldsTypeSafe - doing so will trigger + a compile-time assertion. + */ + template + struct ClassCreator_InternalFields_Base + { + /** + Total number of internal fields assigned to JS-side T + objects. + */ + static const int Count = HowMany; + + /** + The internal field index at which ClassCreator policies should + expect the native object to be found in any given JS object. + It must be 0 or greater, and must be less than Value. + */ + static const int NativeIndex = ObjectIndex; + + /** + The internal field index at which ClassCreator policies + should expect a type identifier tag to be stored. + This can be used in conjunction with + JSToNative_ObjectWithInternalFieldsTypeSafe (or similar) + to provide an extra level of type safety at JS runtime. + + */ + static const int TypeIDIndex = TypeIndex; + private: + typedef char AssertFields[ + (HowMany > TypeIndex) + && (HowMany > ObjectIndex) + && (TypeIndex != ObjectIndex) + && (ObjectIndex >= 0) + ? 1 : -1]; + }; + + /** + The ClassCreator policy which sets the number of internal + fields reserved for JS objects and the internal field index + (0-based) at which the native object is stored . The Count + value must be greater than 0 and greater than the NativeIndex + member. Failing to meet these prerequisites will cause a + compile-time assertion to be triggered. + + ACHTUNG SUBCLASSERS: + + When using a heirarchy of native types, more than one of which + is compatible with CastFromJS(), conversions from subtype to + base type will fail unless all subtypes use the same internal + field placement as the parent type. If this code can detect a + mismatch then it will fail gracefully (e.g. a JS-side + exception), and if not then it might mis-cast an object and + cause Undefined Behaviour. + + If a given parent type uses a custom ClassCreator_InternalFields + specialization then to ensure that subclasses always have the + same placement, they "should" define their own policy like + this: + + @code + template <> + struct ClassCreator_InternalFields< SubType > + : ClassCreator_InternalFields< ParentType > + {}; + @endcode + + That prohibits special internal field handling in the subtypes, + but experience hasn't shown that subclasses need their own + internal fields. Normaly a single internal field is all we need + when binding native data. And when i say "normally", i mean + "almost always." + + This must-match requirement is partially a side-effect of the library + internally using the field count as a santiy check before trying to + extract data from internal fields. It also exists so that the + optional (but recommended) type-safety-check support (added in late + June 2011: see JSToNative_ObjectWithInternalFieldsTypeSafe) will + treat the subclasses as instances of the base class. + */ + template + struct ClassCreator_InternalFields : ClassCreator_InternalFields_Base + { + }; + + + /** + This policy is used by ClassCreator::SetupBindings() as the generic + interface for plugging in a bound class. Clients are not required to + specialise this, but see this class' Initialize() for what might + happen if they don't. + */ + template + struct ClassCreator_SetupBindings + { + /** + Specializations should perform any class/function-related binding + here, adding their functionality to the given object (which is + normally the logical global object but need not be). (Note that the + handle refererence is const but that object itself can be modified. + + The default implementation throws an exception deriving from + std::exception, so it must be specialized to be useful. A default + specialization exists because there are probably a few cases + out there which don't really need this. But most (if not all) + need a setup function, and this is the official one for + ClassCreator-wrapped types. Implementations may of course simply + forward the call to another, client-provided function. + + On error the binding should throw a NATIVE exception (ideally + deriving from std::exception because (A) it's portable practice + and (B) parts of the cvv8 API handles those explicitly). + + Several years of experience have shown that this function (or + similar implementations) should take some care to make sure + not to set up their bindings twice. We can do that by using the + following pattern: + + @code + typedef ClassCreator CC; + CC & cc( CC::Instance() ); + if( cc.IsSealed() ) { + cc.AddClassTo( "T", dest ); + return; + } + + // ... do your bindings here... + + // As the final step: + cc.AddClassTo( "T", dest ); + return; + @endcode + + If you do not actually want to add the class to the dest object, + you should call Seal() instead of AddClassTo() (or pass a different + destination object to AddClassTo(). + */ + static void Initialize( v8::Handle const & target ) + { + throw std::runtime_error("ClassCreator_SetupBindings MUST be specialized " + "in order to be useful!"); + } + }; + + /** + A concrete ClassCreator_SetupBindings implementation which forwards + the call to a user-defined function. + */ + template const &) > + struct ClassCreator_SetupBindings_ClientFunc + { + /** + Calls Func(target). + */ + static void Initialize( v8::Handle const & target ) + { + Func(target); + } + }; + + /** + The ClassCreator policy class responsible for doing optional + class-specific binding-related work as part of the JS/Native + object construction process. + + The default specialization does nothing (which is okay for the + general case) but defines the interface which specializations + must implement. + + Reminder to self: we could arguably benefit by splitting this policy + into 3 classes, but experience has shown that the metadata used by + the 3 functions are typically shared amongst the 3 implementations + (or 2 of them in most cases). + */ + template + struct ClassCreator_WeakWrap + { + typedef typename TypeInfo::NativeHandle NativeHandle; + + /** + Similar to Wrap(), but this is called before the native constructor is called. + It is rarely needed, but is necessary if one needs to manipulate the JS + "this" object before the native object is constructed, so that the native ctor + can access information stored in the JS-side internal fields. + + If this throws a native exception, construction of the + object will fail and Unwrap() is called, passed + (jsSelf,NULL), to clean up any data which this function might have + stored in jsSelf. + + The argv object is the arguments passed to the constructor. + + The default implementation does nothing. + */ + static void PreWrap( v8::Persistent const &, v8::Arguments const & ) + { + return; + } + + + /** + This operation is called one time from ClassCreator for each + new object, directly after the native has been connected to + a Persistent handle. + + Note that the ClassCreator code which calls this has already + taken care of connecting nativeSelf to jsSelf. Client + specializations of this policy may opt to add their own + binding mechanisms, e.g. to allow CastToJS() to work. + + Clients should do any bindings-related cleanup in + Factory::Destruct() or Unwrap(), as appropriate for their + case. + + Ownership of the objects is unchanged by calling this. + + On error, this function may throw a native exception. If + that happens, ClassCreator will call + Unwrap(jsSelf,nativeHandle) and + Factory::Destruct(nativeSelf) to clean up, and will then + propagate the exception. + + The default implementation does nothing. + */ + static void Wrap( v8::Persistent const &, NativeHandle ) + { + return; + } + + /** + This is called from the ClassCreator-generated destructor, + just before the native destructor is called. If nativeSelf + is NULL then it means that native construction failed, + but implementations must (if necessary) clean up any data + stored in jsSelf by the PreWrap() function. + + Specializations may use this to clean up data stored in + other internal fields of the object (_not_ the field used + to hold the native itself - that is removed by the + framework). Optionally, such cleanup may be done in the + corresponding Factory::Destruct() routine, and must be done + there if the dtor will need access to such data. + + Note that when this is called, jsSelf and nativeSelf are + about to be destroyed, so do not do anything crazy with the + contents of jsSelf and DO NOT destroy nativeSelf (that is + the job of the ClassCreator_Factory policy). + + Ownership of the objects is unchanged by calling this. + + Unwrap() is called during destruction or when construction + fails (via a native exception), so any cleanup required for + the jsSelf object can be delegated to this function, as + opposed to being performed (and possibly duplicated) in + PreWrap() and/or Wrap(). + + The default implementation does nothing. + */ + static void Unwrap( v8::Handle const &, NativeHandle ) + { + return; + } + }; + + +#if 0 + namespace Detail + { + template + struct SharedType : public Context + { + private: + SharedType(){} + public: + static SharedType & Instance() + { + static SharedType bob; + return bob; + } + }; + } +#endif + /** + A basic Native-to-JS class binding mechanism. This class does + not aim to be a monster framework, just something simple, + mainly for purposes of showing (and testing) what the core + cvv8 can do. + + The framework must know how to convert JS objects to T objects, + and for this to work client code must define a JSToNative + specialization in this manner: + + @code + template <> + struct JSToNative + : JSToNative_ClassCreator + {}; + @endcode + + If the internal field configuration must be customized then the + client must define the number of fields by + specializing/customizing the ClassCreator_InternalFields + policy class. Additionally, if the client does NOT use the + above JSToNative implementation then he should create his + implementation by subclassing + JSToNative_ObjectWithInternalFields, where (N,M) are the + number of internals fields and the index of the field where the + native object is to be stored. See JSToNative_ClassCreator + for an example. + + TODOs: + + - Certain operations may not work properly when inheriting + bound classes from JS space, and possibly not even when + inheriting bound natives from one another. That depends on + several factors too complex to summarize here. + + - See how much of the v8::juice::cw::ClassWrap + inheritance-related code we can salvage for re-use here. + + - There are known problems when trying to bind inherited methods + when the parent class has no bound them to JS. i'm not sure how + i can fix the templates to get this working. + */ + template + class ClassCreator + { + private: + typedef ClassCreator_InternalFields InternalFields; + typedef ClassCreator_WeakWrap WeakWrap; + typedef ClassCreator_TypeID TypeID; + v8::Persistent ctorTmpl; + v8::Handle protoTmpl; + bool isSealed; + typedef ClassCreator_Factory Factory; + + + /** + A utility function primarily intended to support various + ClassCreator policy implementations. + + This function tries to extract a native handle from jo by + looking in the internal field defined by + ClassCreator_InternalFields::NativeIndex. If a native is + found in that field and it is the same as nh, then jo is + returned. If none is found, jo's prototype object is searched, + recursively, until either nh is found in the prototype chain or + the end of the chain is reached. If a match is found, the JS + object in which the native was found is returned. This does no + casting - it only compares by address. + + If nh is not found anywhere in the chain, an empty handle is + returned. + + Note that T must be non-cv qualified, so it is generally + undesirable to allow the compiler to deduce its type from the + parameter. Thus the T template parameter should not be omitted + from calls to this function. + */ + static v8::Handle FindHolder( v8::Handle const & jo, + T const * nh ) + { + if( !nh || jo.IsEmpty() ) return v8::Handle(); + v8::Handle proto(jo); + void const * ext = NULL; + typedef ClassCreator_SearchPrototypeForThis SPFT; + while( !ext && !proto.IsEmpty() && proto->IsObject() ) + { + v8::Local const & obj( v8::Object::Cast( *proto ) ); + ext = (obj->InternalFieldCount() != InternalFields::Count) + ? NULL + : obj->GetPointerFromInternalField( InternalFields::NativeIndex ); + // FIXME: if InternalFields::TypeIDIndex>=0 then also do a check on that one. + /* + If !ext, there is no bound pointer. If (ext && + (ext!=nh)) then there is one, but it's not the droid + we're looking for. In either case, (possibly) check the + prototype... + */ + if( ext == nh ) return obj; + else if( !SPFT::Value ) break; + else proto = obj->GetPrototype(); + } + return v8::Handle(); + } + + static void weak_dtor( v8::Persistent< v8::Value > pv, void *nobj ) + { + using namespace v8; + //std::cerr << "Entering weak_dtor<>(native="<<(void const *)nobj<<")\n"; + Local jobj( Object::Cast(*pv) ); + typedef typename JSToNative::ResultType NT; + NT native = CastFromJS( pv ); + if( !native ) + { + /* see: http://code.google.com/p/v8-juice/issues/detail?id=27 + + When i call pv.Dispose(), this function is getting called twice, + and the second time won't work. i'm going to igore (return w/o + side-effects) this for now for the sake of avoiding a crash + which i'm seeing only on 64-bit platforms. + + However, even if i return here, v8 is crashing with a + !NEAR_DEATH assertion right after the second call is made. + + The extra pair of Dispose()/Clear() calls seems to eliminate that + crash, but the fact that this code block is hit AT ALL is a + sign of a problem - the dtor shouldn't be called twice! + */ + pv.Dispose(); + pv.Clear(); +#if 1 /* i believe this problem was fixed. If you are reading this b/c + you followed an assert() message, please report this as a bug. + */ + assert( 0 && "weak_dtor() got no native object!"); +#endif + return; + } + else + { + /** + Reminder: the FindHolder() bits are here to + assist when the bound native exists somewhere in the + prototype chain other than jobj itself. In that case, + jobj is valid but we cannot clear out the native handle + internal field on it because it has no internal fields + (or none that belong to us). + + To fix this properly we have to be able to know + _exactly_ which JS object in the prototype chain nh is + bound to. + */ + v8::Handle nholder = FindHolder( jobj, native ); +#if 1 /* reminder: i've never actually seen this error happen, i'm just pedantic about checking... */ + assert( ! nholder.IsEmpty() ); + WeakWrap::Unwrap( nholder /*jobj? subtle difference!*/, native ); + if( nholder.IsEmpty() || (nholder->InternalFieldCount() != InternalFields::Count) ) + { + StringBuffer msg; + msg << "SERIOUS INTERNAL ERROR:\n" + << "ClassCreator::weak_dtor() " + << "validated that the JS/Native belong together, but " + << "FindHolder() returned an " + << (nholder.IsEmpty() ? "empty" : "invalid") + << " handle!\n" + << "From JS=@"<<(void const *)nobj + << ", Converted to Native=@"<<(void const *)native + << ", nholder field count="<InternalFieldCount() + << ", jobj field count="<InternalFieldCount() + << "\nTHIS MAY LEAD TO A CRASH IF THIS JS HANDLE IS USED AGAIN!!!\n" + ; + Factory::Delete(native); + pv.Dispose(); pv.Clear(); /* see comments below!*/ + v8::ThrowException(msg.toError()); + return; + } + else + { + nholder->SetInternalField( InternalFields::NativeIndex, Null() ); + if( 0 <= InternalFields::TypeIDIndex ) + { + nholder->SetInternalField( InternalFields::TypeIDIndex, Null() ); + } + Factory::Delete(native); + } +#else + WeakWrap::Unwrap( nholder, native ); + nholder->SetInternalField( InternalFields::NativeIndex, Null() ); + if( 0 <= InternalFields::TypeIDIndex ) + { + nholder->SetInternalField( InternalFields::TypeIDIndex, Null() ); + } + Factory::Delete(native); +#endif + } + /* + According to the v8 gurus i need to call pv.Dispose() + instead of pv.Clear(), but if i do then this dtor is + being called twice. If i don't call it, v8 is crashing + sometime after this function with a !NEAR_DEATH + assertion. + */ + pv.Dispose(); + pv.Clear(); + } + + /** + Gets installed as the NewInstance() handler for T. + */ + static v8::Handle ctor_proxy( v8::Arguments const & argv ) + { + using namespace v8; + if(ClassCreator_AllowCtorWithoutNew::Value) + { + /** + Allow construction without 'new' by forcing this + function to be called in a ctor context... + */ + if (!argv.IsConstructCall()) + { + const int argc = argv.Length(); + Handle ctor( Function::Cast(*argv.Callee())); + std::vector< Handle > av(static_cast(argc),Undefined()); + for( int i = 0; i < argc; ++i ) av[i] = argv[i]; + return ctor->NewInstance( argc, &av[0] ); + } + } + else + { + /** + Why have this limitation? If we don't, v8 pukes + when the ctor is called, with + "v8::Object::SetInternalField() Writing internal + field out of bounds". + */ + if (!argv.IsConstructCall()) + { + return Toss("This constructor cannot be called as function!"); + } + } + Local const & jobj( argv.This() + /*CastToJS(*nobj) + + We are not yet far enough + along in the binding that + CastToJS() can work. And it + can't work for the generic + case, anyway. + */); + if( jobj.IsEmpty() ) return jobj /* assume exception*/; + Persistent self( Persistent::New(jobj) ); + T * nobj = NULL; + try + { + WeakWrap::PreWrap( self, argv ); + nobj = Factory::Create( self, argv ); + if( ! nobj ) + { + return CastToJS(std::runtime_error("Native constructor failed.")); + } + WeakWrap::Wrap( self, nobj ); + self.MakeWeak( nobj, weak_dtor ); + if( 0 <= InternalFields::TypeIDIndex ) + { + self->SetPointerInInternalField( InternalFields::TypeIDIndex, (void *)TypeID::Value ); + } + self->SetPointerInInternalField( InternalFields::NativeIndex, nobj ) + /* We do this after the call to Wrap() just in case the Wrap() impl + accidentally writes to this field. In that case we end up + losing the data they stored there. So this is just as evil as + adding the internal field before Wrap(), but only when the + client mis-uses the internal fields. + */ + ; + } + catch(std::exception const &ex) + { + WeakWrap::Unwrap( self, nobj ); + if( nobj ) Factory::Delete( nobj ); + self.Clear(); + return Toss(CastToJS(ex)); + } + catch(...) + { + WeakWrap::Unwrap( self, nobj ); + if( nobj ) Factory::Delete( nobj ); + self.Clear(); + return Toss("Native constructor threw an unknown exception!"); + } + return self; + } + + ClassCreator() + : ctorTmpl(v8::Persistent::New( v8::FunctionTemplate::New(ctor_proxy) )), + protoTmpl(v8::Persistent::New( ctorTmpl->PrototypeTemplate() )), + isSealed(false) + { + ctorTmpl->InstanceTemplate()->SetInternalFieldCount(InternalFields::Count); + } + public: + /** + The native type being bound to JS. + */ + typedef typename tmp::PlainType::Type Type; + + /** + Returns the shared instance of this class. + */ + static ClassCreator & Instance() + { + static ClassCreator bob; + return bob; + } + + /** + Returns this class' prototype object. + */ + inline v8::Handle Prototype() + { + return this->protoTmpl; + } + + /** + Returns this class' constructor template object. + */ + inline v8::Handle CtorTemplate() + { + return this->ctorTmpl; + } + + /** + Returns this class' constructor template. + + ACHTUNG: after this is called, changes made to the Prototype() + object might not have any effect. Thus this should only be + called after the prototype object has been fully set up. + (i have no idea why v8 behaves this way.) + + After calling this, IsSealed() will return true. + */ + inline v8::Handle CtorFunction() + { + // In my experience, if GetFunction() is called BEFORE setting up + // the Prototype object, v8 gets very unhappy (class member lookups don't work?). + this->isSealed = true; + return this->ctorTmpl->GetFunction(); + } + + /** + Returns true if CtorFunction() has been called. See that + function for why. + */ + inline bool IsSealed() const + { + return this->isSealed; + } + + /** + Creates a new instanced of the object via the JS API. It calls + ClassCreator_Factory::Create(), passing it argv, to + instantiate the object. On success a JS handle to the object is + returned (it is owned by v8), and the caller can get the native + pointer with: + + @code + T * t = CastFromJS(theHandle); + @endcode + */ + inline v8::Handle NewInstance( int argc, v8::Handle argv[] ) + { + return this->CtorFunction()->NewInstance(argc, argv); + } + + /** + A convenience form of NewInstance() which returns the JS version + of the object and assigns tgt to the native pointer (which will + be NULL on error). + + If tgt is NULL when this function returns, or + returnedObj.IsEmpty(), then we assume that a v8 exception is + propagating, and the caller should return to v8 as soon as + possible so the exception can be triggered JS-side (it is not + actually triggered until we return to v8). + + The returned object is owned by v8. + */ + v8::Handle NewInstance( int argc, v8::Handle argv[], T * & tgt ) + { + v8::Handle const & obj( this->CtorFunction()->NewInstance(argc, argv) ); + if( obj.IsEmpty() ) return obj /* assume exception is propagating. */; + else + { + tgt = CastFromJS(obj); + if( !tgt ) { + Toss(StringBuffer()<<"Internal error: NewInstance() returned a non-empty " + << "Handle but CastFromJS<"<::Value<<">() failed. " + << "This is either a serious cvv8 bug or the JSToNative specialization " + << "is not working properly."); + return v8::Handle(); + } + else return obj; + } + } + + /** + Convenience method to add the given property to the + prototype. Returns this object, for call chaining. + + CastToJS(val) must be valid or a compile-time + error will be triggered. + */ + template + inline ClassCreator & Set( char const * name, ValueT val ) + { + this->protoTmpl->Set(v8::String::New(name), CastToJS(val)); + return *this; + } + //! Not quite sure why i need this overload, but i do. + inline ClassCreator & Set( char const * name, v8::InvocationCallback val ) + { + this->protoTmpl->Set(v8::String::New(name), CastToJS(val)); + return *this; + } + /** + Equivalent to Set(). + */ + template + inline ClassCreator & operator()( char const * name, ValueT val ) + { + return this->Set(name, val); + } + /** + Overload to avoid an ambiguity. + */ + inline ClassCreator & operator()( char const * name, v8::InvocationCallback val ) + { + return this->Set(name, val); + } + + /** + Adds CtorFunction() to dest using the given property name. + This implicitly "seals" the class (see CtorFunction() for + details). + */ + inline void AddClassTo( char const * thisClassName, v8::Handle const & dest ) + { + dest->Set(v8::String::New(thisClassName), + this->CtorFunction()); + } + + /** + Destroys the given object by disconnecting its associated + native object and calling the native destructor function + for it. + + If jo cannot be converted to a T then false is + returned. Otherwise the true is returned and the native + object referenced by jo is no longer valid (it should not + be used by JS code). + + Native functions bound to that object should take care to + bail out with an exception once the native pointer is gone, + as opposed to blindly stepping on its null/dangling pointer + (which _might_ have been re-allocated to a different + object, even of a different type, in the mean time). + */ + static bool DestroyObject( v8::Handle const & jo ) + { + T * t = CastFromJS(jo); + if( ! t ) return false; + else + { + v8::Persistent p( v8::Persistent::New( jo ) ); + p.ClearWeak(); // avoid a second call to weak_dtor() via gc! + weak_dtor( p, t ); + return true; + } + } + /** + If jv is empty or !jv->IsObject() then false is returned, + otherwise it returns the result of + DestroyObject(Handle). + */ + static bool DestroyObject( v8::Handle const & jv ) + { + return (jv.IsEmpty() || !jv->IsObject()) + ? false + : DestroyObject( v8::Handle( v8::Object::Cast(*jv) ) ); + } + + /** + A v8::InvocationCallback implementation which calls + DestroyObject( argv.This() ). + + It is intended to be used as a "manual destructor" for + classes which need it. The canonical examples are + Stream.close() and Database.close(). + + This function is not called DestroyObject to avoid name + collisions during binding using Set(...,DestroyObjectCallback). + */ + static v8::Handle DestroyObjectCallback( v8::Arguments const & argv ) + { + return DestroyObject(argv.This()) ? v8::True() : v8::False(); + } + + /** + Tells v8 that this bound type inherits ParentType. + ParentType _must_ be a class wrapped by ClassCreator. + This function throws if + ClassCreator::Instance().IsSealed() returns + false). We require that the parent class be sealed to + avoid accidental mis-use caused by registering a + subclass of a class which has not yet been bound (and may + may never be bound). + */ + template + void Inherit() + { + typedef ClassCreator PT; + PT & p(PT::Instance()); + if( ! p.IsSealed() ) + { + throw std::runtime_error("ClassCreator has not been sealed yet!"); + } + this->CtorTemplate()->Inherit( p.CtorTemplate() ); + } + + /** + Simply runs ClassCreator_SetupBindings::Initialize( target ). + It is provided here to simplify the client-side interface. + */ + static void SetupBindings( v8::Handle const & target ) + { + ClassCreator_SetupBindings::Initialize( target ); + } + + }; + + /** + Intended to be the base class for JSToNative specializations + when T is JS-bound using ClassCreator. + + This particular implementation must be defined _after_ + any of the following policies are customized for T: + + - ClassCreator_InternalFields + - ClassCreator_SearchPrototypeForThis + - ClassCreator_TypeID (only if TypeSafe is true!) + + If the client will not specialize those types type then the order is + irrelevant, but when specializing any of them, they must come before + this JSToNative implementation is instantiated. + + If TypeSafe is true then this type is a proxy for + JSToNative_ObjectWithInternalFieldsTypeSafe, else it is a proxy for + JSToNative_ObjectWithInternalFields. Note that ClassCreator is + hard-wired to implant/deplant type id information if + ClassCreator_InternalFields::TypeIDIndex is not negative, with the + _hope_ that JSToNative will use it, but it does not enforce that + the type ID is used. For types where the internal fields' TypeIDIndex + is negative, ClassCreator will not set up bits for the type check, + which means a slightly smaller runtime memory footprint. + */ + template ::TypeIDIndex >= 0 > + struct JSToNative_ClassCreator : + tmp::IfElse< TypeSafe, + JSToNative_ObjectWithInternalFieldsTypeSafe::Value, + ClassCreator_InternalFields::Count, + ClassCreator_InternalFields::TypeIDIndex, + ClassCreator_InternalFields::NativeIndex, + ClassCreator_SearchPrototypeForThis::Value + >, + JSToNative_ObjectWithInternalFields::Count, + ClassCreator_InternalFields::NativeIndex, + ClassCreator_SearchPrototypeForThis::Value + > + >::Type + { + }; + +#if 0 + //! Experimental. + template + struct JSToNative_ClassCreator_Subclass + { + typedef typename TypeInfo::NativeHandle ResultType; + ResultType operator()( v8::Handle const & h ) const + { + typedef typename TypeInfo::NativeHandle PTP; + PTP typeCheck; typeCheck = (ResultType)NULL + /* If compiler errors led you here then SubT probably does not + publicly subclass ParentT. */ + ; + PTP p = CastFromJS(h); + //std::cerr << "dyncast="<(p)<<"\n"; + return p ? dynamic_cast(p) : NULL; + } + }; +#endif + +#if !defined(DOXYGEN) + namespace Detail + { + /** + A base class for ClassCreator_Factory_CtorArityDispatcher. + We don't really need this level of indirection, i think. + */ + template + struct Factory_CtorForwarder_Base + { + typedef typename TypeInfo::Type Type; + typedef typename TypeInfo::NativeHandle NativeHandle; + static void Delete( NativeHandle nself ) + { + delete nself; + } + protected: + /** + If argv.Length() >= Arity then this function ignores errmsg and + returns true, otherwise it writes a descriptive error message + to errmsg and return false. + */ + static bool argv_check( v8::Arguments const & argv, int Arity ) + { + if( argv.Length() >= Arity ) return true; + else + { + StringBuffer msg; + msg << "constructor requires " << Arity << " arguments!"; + throw std::range_error(msg.Content().c_str()); + return false; + } + } + }; + } +#endif // !DOXYGEN + + /** + Can be used as a concrete ClassCreator_Factor + specialization to forward JS ctor calls directly to native + ctors. + + T must be the ClassCreator'd type to construct. CtorProxy must + be a type having this interface: + + @code + TypeInfo::NativeHandle Call( v8::Arguments const & ); + @endcode + + Normally CtorProxy would be CtorForwarder or CtorArityDispatcher, + but any interface-compatible type will do. + + It must return a new object instance on success. On error it + may return NULL and "should" throw a native exception explaining + the problem. The exception will be caught by ClassCreator and + transformed into a JS-side exception. + + If CtorProxy::Call() succeeds (returns non-NULL and does not throw) + then NativeToJSMap is used to create a native-to-JS mapping. + To make use of this, the client should do the following: + + @code + // in the cvv8 namespace: + template <> + struct NativeToJS : NativeToJSMap::NativeToJSImpl {}; + @endcode + + After that, CastToJS( theNativeObject ) can work. + + The mapping is cleaned up when (if!) the object is sent through + the JS garbage collector or the client somehow triggers its + JS-aware destruction (e.g. via ClassCreator::DestroyObject(), + assuming the type was wrapped using ClassCreator). + */ + template + struct ClassCreator_Factory_NativeToJSMap : Detail::Factory_CtorForwarder_Base + { + public: + typedef NativeToJSMap N2JMap; + typedef typename TypeInfo::Type Type; + typedef typename TypeInfo::NativeHandle NativeHandle; + + /** + If CtorProxy::Call(argv) succeeds, N2JMap::Insert(jself, theNative) + is called. The result of CtorProxy::Call() is returned. + */ + static NativeHandle Create( v8::Persistent jself, v8::Arguments const & argv ) + { + NativeHandle n = CtorProxy::Call( argv ); + if( n ) N2JMap::Insert( jself, n ); + return n; + } + /** + Calls N2JMap::Remove( nself ) then (delete nself). + */ + static void Delete( NativeHandle nself ) + { + N2JMap::Remove( nself ); + delete nself; + } + }; + + /** @deprecated Use ClassCreator_Factory_Dispatcher instead (same interface). + */ + template + struct ClassCreator_Factory_CtorArityDispatcher : Detail::Factory_CtorForwarder_Base + { + public: + typedef typename TypeInfo::Type Type; + typedef typename TypeInfo::NativeHandle NativeHandle; + static NativeHandle Create( v8::Persistent , v8::Arguments const & argv ) + { + typedef CtorArityDispatcher Proxy; + return Proxy::Call( argv ); + } + }; + + /** + A ClassCreator_Factory implementation which forwards its Create() + member to CtorT::Call() (the interface used by CtorForwarder and friends). + + T must (or is assumed to) be a ClassCreator-wrapped class. + CtorForwarderList must be a Signature typelist of CtorForwarder + types and its "return type" must be T (optionally pointer-qualified). + + Example: + + @code + typedef CtorForwarder C0; + typedef CtorForwarder C1; + typedef CtorForwarder C2; + typedef Signature< CFT (C0, C1, C2) > CtorList; + + // Then create Factory specialization based on those: + template <> + struct ClassCreator_Factory : + ClassCreator_Factory_Dispatcher > {}; + @endcode + + Or: + + @code + template <> + struct ClassCreator_Factory : + ClassCreator_Factory_Dispatcher< MyType, CtorForwarder > + {}; + @endcode + */ + template + struct ClassCreator_Factory_Dispatcher : Detail::Factory_CtorForwarder_Base + { + public: + typedef typename TypeInfo::Type Type; + typedef typename TypeInfo::NativeHandle NativeHandle; + static NativeHandle Create( v8::Persistent jself, v8::Arguments const & argv ) + { + return CtorT::Call( argv ); + } + }; + + +}// namespaces + +#endif /* CODE_GOOGLE_COM_P_V8_CONVERT_CLASS_CREATOR_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/Makefile b/vendor/libv8-convert/cvv8/Makefile new file mode 100644 index 000000000..552c1ebd4 --- /dev/null +++ b/vendor/libv8-convert/cvv8/Makefile @@ -0,0 +1,8 @@ +all: + +EXAMPLE_DIR := ../../examples +ifneq (,$(wildcard $(EXAMPLE_DIR)/Makefile)) +$(sort all $(MAKECMDGOALS)): + $(MAKE) -C ../../examples $@ +endif + diff --git a/vendor/libv8-convert/cvv8/NativeToJSMap.hpp b/vendor/libv8-convert/cvv8/NativeToJSMap.hpp new file mode 100644 index 000000000..1e09da7bd --- /dev/null +++ b/vendor/libv8-convert/cvv8/NativeToJSMap.hpp @@ -0,0 +1,183 @@ +#if ! defined(V8_CONVERT_NATIVE_JS_MAPPER_HPP_INCLUDED) +#define V8_CONVERT_NATIVE_JS_MAPPER_HPP_INCLUDED + +#include "detail/convert_core.hpp" +namespace cvv8 { + /** + A helper class to assist in the "two-way-binding" of + natives to JS objects. This class holds native-to-JS + binding information. + + In the general case, a native-to-JS conversion is only + needed at the framework-level if bound/converted + functions/methods will _return_ bound native + pointers/references. If they only return "core" types (numbers + and strings, basically), or explicitly return v8-supported + types (e.g. v8::Handle) then no native-to-JS + conversion is typically needed. + + Known limitations: + + This type does not fully support subclass conversions. + e.g. the following function binding: + + @code + virtual MyType * (MyType::*)(); + @endcode + + _should_ be able to return a MySubType from derived implementations + but it currently cannot. Handling this requires that a parent class + be told each of its subclasses, and that we add internal handlers + which try lookups on those classes if a conversion to MyType fails. + + Reminder to self: the v8::juice tree has an example of that which we + can probably plunder. + */ + template + struct NativeToJSMap + { + private: + typedef TypeInfo TI; + typedef typename TI::Type Type; + /** + The native type to bind to. + */ + typedef typename TI::NativeHandle NativeHandle; + /** The type for holding the JS 'this' object. */ + typedef v8::Persistent JSObjHandle; + //typedef v8::Handle JSObjHandle; // Hmmm. + typedef std::pair ObjBindT; + typedef std::map OneOfUsT; + /** Maps (void const *) to ObjBindT. + + Reminder to self: we might need to make this map a static + non-function member to work around linking problems (at + least on Windows) which lead to multiple instances of + the returned map being created when the types being + bound are loaded from multiple DLLs. The out-of-class + initialization of the member is going to require a really + ugly set of template parameters, though. + */ + static OneOfUsT & Map() + { + static OneOfUsT bob; + return bob; + } + public: + /** Maps obj as a lookup key for jself. Returns false if !obj, + else true. */ + static bool Insert( JSObjHandle const & jself, + NativeHandle obj ) + { + return obj + ? (Map().insert( std::make_pair( obj, std::make_pair( obj, jself ) ) ),true) + : 0; + } + + /** + Removes any mapping of the given key. Returns the + mapped native, or 0 if none is found. + */ + static NativeHandle Remove( void const * key ) + { + typedef typename OneOfUsT::iterator Iterator; + OneOfUsT & map( Map() ); + Iterator it = map.find( key ); + if( map.end() == it ) + { + return 0; + } + else + { + NativeHandle victim = (*it).second.first; + map.erase(it); + return victim; + } + } + + /** + Returns the native associated (via Insert()) + with key, or 0 if none is found. + */ + static NativeHandle GetNative( void const * key ) + { + if( ! key ) return 0; + else + { + typename OneOfUsT::iterator it = Map().find(key); + return (Map().end() == it) + ? 0 + : (*it).second.first; + } + } + + /** + Returns the JS object associated with key, or + an empty handle if !key or no object is found. + */ + static v8::Handle GetJSObject( void const * key ) + { + if( ! key ) return v8::Handle(); + typename OneOfUsT::const_iterator it = Map().find(key); + if( Map().end() == it ) return v8::Handle(); + else return (*it).second.second; + } + + /** + A base NativeToJS implementation for classes which use NativeToJSMap + to hold their native-to-JS bindings. To be used like this: + + @code + // must be in the v8::convert namespace! + template <> + struct NativeToJS : NativeToJSMap::NativeToJSImpl {}; + @endcode + */ + struct NativeToJSImpl + { + v8::Handle operator()( Type const * n ) const + { + typedef NativeToJSMap BM; + v8::Handle const & rc( BM::GetJSObject(n) ); + if( rc.IsEmpty() ) return v8::Null(); + else return rc; + } + v8::Handle operator()( Type const & n ) const + { + return this->operator()( &n ); + } + }; + +#if 0 + //! Experimental + template + struct NativeToJSImpl_Subclass + { + v8::Handle operator()( Type const * n ) const + { + typedef NativeToJSMap BM; + v8::Handle const & rc( BM::GetJSObject(n) ); + if( rc.IsEmpty() ) + { + typedef typename NativeToJSMap::NativeToJSImpl PI; + return PI()(n); +#if 0 + typedef typename TypeInfo::NativeHandle PH; + rc = CastToJS(n); + if( rc.IsEmpty() ) return v8::Null(); + else return rc; +#endif + } + else return rc; + } + v8::Handle operator()( Type const & n ) const + { + return this->operator()( &n ); + } + }; +#endif + }; + +} // namespaces + +#endif /* include guard */ diff --git a/vendor/libv8-convert/cvv8/V8Shell.hpp b/vendor/libv8-convert/cvv8/V8Shell.hpp new file mode 100644 index 000000000..ecfb9aa3a --- /dev/null +++ b/vendor/libv8-convert/cvv8/V8Shell.hpp @@ -0,0 +1,650 @@ +#if !defined(V8_CONVERT_V8Shell_HPP_INCLUDED) +#define V8_CONVERT_V8Shell_HPP_INCLUDED +/** @file V8Shell.hpp + + This file contains the v8::convert::V8Shell class, a convenience + wrapper for bootstrapping integration of v8 into arbitrary + client applications. + + Dependencies: v8 and the STL. + + License: released into the Public Domain by its author, + Stephan Beal (http://wanderinghorse.net/home/stephan/). +*/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace cvv8 { + namespace Detail { + template + struct V8MaybeLocker + { + private: + v8::Locker lock; + public: + V8MaybeLocker() : lock() {} + }; + template <> + struct V8MaybeLocker + { + }; + } + /** + This class implements a very basic shell for v8. + + + These objects are basically thin wrappers around the + bootstrap code necessary for getting v8 running in an + application. They are intended to be stack-created in main() + (or equivalent) and used as a front-end for passing JS code + into v8 for execution. + + Because library-level JS code activated via this class + _might_ use v8::Unlocker to unlock the VM while C-level + routines are running, each instance of this class includes a + v8::Locker instance if UseLocker is true. (If it did not, + clients would be required to add one or accept crashes when + called code uses v8::Unlocker.) Only set UseLocker to false + if you _know_ that _no_ JS code run through this API will + end up trying to unlock v8. (If you're using this class + together with the v8::convert function binding API then you + are almost certainly using v8::Unlocker without realizing it.) + + Maintenance reminder: keep this class free of dependencies + on other library-level code so that we can re-use it + in arbitrary v8 clients. + + FIXME: the way this class uses v8::TryCatch is "all wrong", and any + functions using it need to be revisited. + */ + template + class V8Shell + { + public: + /** + A callback function signature for reporing JS-side + exception messages to the native world. + + TODO: consider passing a v8::Handle argument + instead of a (char const *) and possibly a (void *) State + handle for use by the client. + */ + typedef void (*ErrorMessageReporter)( char const * msg ); + private: + // The declaration order of the v8-related objects is important! + Detail::V8MaybeLocker locker; + v8::HandleScope hscope; + //v8::Handle globt; + v8::Handle context; + v8::Context::Scope cxscope; + v8::Handle global; + /** + tryCatch is only here until i can track down a post-main() + v8 assertion which happens when V8Shell-executed JS code + exits with an exception. It is just a workaround. + */ + v8::TryCatch tryCatch; + ErrorMessageReporter reporter; + static void DefaultErrorMessageReporter( char const * msg ) + { + if( msg && *msg ) std::cerr + //<< "[V8Shell default exception reporter says:]\n" + << msg << std::endl; + } + + /** + An v8::InvocationCallback implementation which implements a + JS-conventional print() routine. OS must be a pointer to + an ostream, e.g. std::cout or std::cerr. + + Each argument is converted to a string (using + v8::String::Utf8Value) and is output, separated by a + space. For compatibility with other toolkits' print() + implementations (some of which only accept one + argument), it is recommended that client script code + only rely on the first argument being output. + + Always returns v8::Undefined(). + + It is a little-known fact that one can replace the output + buffer used by std::cout (and other std::ostreams) with a + custom one, such that calling print() from JS code will + redirect the output to a different destination. This can + be used, e.g., to redirect std::cout to a libcurses window. + */ + template + static v8::Handle PrintToStdOstream( v8::Arguments const & argv ) + { + v8::HandleScope hscope; + int const argc = argv.Length(); + const char * cstr = NULL; + for (int i = 0; i < argc; i++) + { + if( 0 != i ) *OS << ' '; + v8::String::Utf8Value const str(argv[i]); + cstr = *str; + if( cstr ) *OS << cstr; + } + *OS << '\n'; + OS->flush(); + return v8::Undefined(); + } + + void init( char const * globalObjectName, + int argc, char const * const * argv, + unsigned short argOffset ) + { + if( globalObjectName && *globalObjectName ) + { + this->global->Set( v8::String::New(globalObjectName), this->global ); + } + if( (0 < argc) && (NULL != argv) ) + { + this->ProcessMainArgv( argc, argv, argOffset ); + } + } + + static void SetupTryCatch( v8::TryCatch & tc ) + { + tc.SetVerbose(true); + tc.SetCaptureMessage(true); + } + public: + /** + Initialize a v8 context and global object belonging to this object. + + If globalObjectName is not null and not empty then the global object + is given a refernce to itself using the given name, such that client + JS code can then refer to it. + + If argc is greater than 0 and argv is not NULL then argv is + assumed to be an arguments list in the format conventional + for main() and ProcessMainArgv(argc,argv,argOffset) is called. + */ + V8Shell( char const * globalObjectName = NULL, + int argc = 0, char const * const * argv = NULL, + unsigned short argOffset = 1 ) : + locker(), + hscope(), + //globt( v8::ObjectTemplate::New() ), + context( v8::Context::New(NULL, v8::ObjectTemplate::New()) ), + cxscope(context), + global( context->Global() ), + reporter( DefaultErrorMessageReporter ) + { + this->init( globalObjectName, argc, argv, argOffset ); + } + + /** + Destructs all v8 resources used by this object, e.g. the JS context. + */ + ~V8Shell() + { + if( ! v8::V8::IsDead() ) { + tryCatch.Reset(); + } + } + + /** + Sets the error reporter function used by + ExecuteString(). Passing 0 will disable exception + reporting. The default reporter sends its output to + std::cerr. + */ + void SetExecuteErrorReporter( ErrorMessageReporter r ) + { + this->reporter = r; + } + + /** + Outputs an exception message using the current + error reporter function. + + If try_catch or the current error reporter are + null then nothing is done. + + @see SetExecuteErrorReporter(). + */ + + void ReportException(v8::TryCatch* try_catch) + { + if( !try_catch || ! this->reporter ) return; + v8::HandleScope hsc; + v8::String::Utf8Value const excUtf(try_catch->Exception()); +#define TOCSTR(X) (*X ? *X : "") + const char* excCstr = TOCSTR(excUtf); + v8::Handle const & message( try_catch->Message() ); + std::ostringstream os; + os << "V8Shell Exception Reporter: "; + if (message.IsEmpty()) + { + // V8 didn't provide any extra information about this error; just + // print the exception. + os << excCstr << '\n'; + } + else + { + // output (filename):(line number): (message)... + int linenum = message->GetLineNumber(); + os << *v8::String::Utf8Value(message->GetScriptResourceName()) << ':' + << std::dec << linenum << ": " + << excCstr << '\n'; + // output source code line... + os << *v8::String::AsciiValue(message->GetSourceLine()) << '\n'; + // output decoration pointing to error location... + int start = message->GetStartColumn(); + for (int i = 0; i < start; i++) { + os << '-'; + } + int end = message->GetEndColumn(); + for (int i = start; i < end; i++) { + os << '^'; + } + os << '\n'; + } + std::string const & str( os.str() ); + this->reporter( str.c_str() ); +#undef TOCSTR + } + + /** + Adds the given function to the global object. + + Returns this object. + */ + V8Shell & operator()( char const * name, v8::Handle const & f ) + { + this->global->Set( v8::String::New(name), f ); + return *this; + } + + /** + Adds the given function to the global object. + + Returns this object. + */ + V8Shell & operator()( char const * name, v8::Handle const & f ) + { + return this->operator()( name, f->GetFunction() ); + } + + /** + Adds the given function to the global object. + + Returns this object. + */ + V8Shell & operator()( char const * name, v8::InvocationCallback const f ) + { + return this->operator()( name, v8::FunctionTemplate::New(f) ); + } + + /** + Returns the global object for this shell. + */ + v8::Handle Global() + { + return this->global; + } + + /** + Returns the context object for this shell. + */ + v8::Handle Context() + { + return this->context; + } + +#if 0 // changes made to global ObjectTemplate have no effect after cx is set up. + v8::Handle GlobalTemplate() + { + return this->globt; + } +#endif + + /** + Intended to be called from main() and passed the argc/argv + which are passed to main. offset is the number of arguments + to skip, and defaults to one to skip the argv[0] argument, + which is conventionally the application name. + + It skips all arguments up to "--". For each argument after + "--", it adds the argument to a list. At the end of the + list, the global object is assigned a property named + "arguments" which contains that list. + + If the argument list has no arguments after a "--" entry + then the "arguments" global value will be an empty array, + as opposed to null or undefined. + + This function does no interpretation of the arguments. + */ + V8Shell & ProcessMainArgv( int argc, char const * const * _argv, unsigned short offset = 1 ) + { + if( (argc<1) || !_argv ) return *this; + char const * endofargs = "--"; + v8::Handle argv( v8::Array::New() ); + int i = (int)offset; + for( ; i < argc; ++i ) + { + if( 0 == strcmp(_argv[i],endofargs) ) + { + ++i; + break; + } + } + int ndx = 0; + for( ; i < argc; ++i ) + { + char const * arg = _argv[i]; + if( arg ) + { // String::New() calls strlen(), which hates NULL + argv->Set( ndx++, v8::String::New(arg) ); + } + } + this->global->Set( v8::String::New("arguments"), argv ); + return *this; + } + + /** + Executes the given source string in the current + context. + + If the script throws an exception then a TryCatch object is used + to build an error string, which is passed to this object's error + reporter function. The default sends the output to std::cerr. + + If resultGoesTo is not null and the result a valid handle, then + the result is converted to a string and sent to that stream. + + Returns the result of the last expression evaluated in the script, + or an empty handle on error. + */ + v8::Handle ExecuteString(v8::Handle const & source, + v8::Handle name, + std::ostream * out = NULL ) + { + //this->executeThrew = false; + v8::HandleScope scope; + v8::TryCatch tc; + SetupTryCatch(tc); + v8::Handle script = v8::Script::Compile(source, name); + if( script.IsEmpty())//tc.HasCaught()) + { + // Report errors that happened during compilation. + //this->executeThrew = true; + this->ReportException(&tc); + return scope.Close(tc.ReThrow()); + //return v8::Handle(); + } + else + { + v8::Handle const & result( script->Run() ); + if( tc.HasCaught())//(result.IsEmpty()) + { + //this->executeThrew = true; + this->ReportException(&tc); + //return v8::Handle(); + return scope.Close(tc.ReThrow()); + } + else + { + if (out && !result.IsEmpty()) + { + (*out) << *v8::String::Utf8Value(result) << '\n'; + } + return scope.Close(result); + } + } + } + +#if 0 + bool ExecThrewException() const + { + return this->executeThrew; + } +#endif + + /** + Convenience form of ExecuteString(source,"some default name", reportExceptions, 0). + */ + v8::Handle ExecuteString(std::string const & source, + std::string const & name, + std::ostream * resultGoesTo ) + { + v8::HandleScope scope; + v8::Local const & s( v8::String::New( source.c_str(), static_cast(source.size()) ) ); + v8::Local const & n( v8::String::New( name.c_str(), static_cast(name.size()) ) ); + return scope.Close(this->ExecuteString( s, n, resultGoesTo )); + } + + /** + Convenience overload taking input from a native string. + */ + v8::Handle ExecuteString(std::string const & source ) + { + return this->ExecuteString(source, "ExecuteString()", 0); + } + + /** + Convenience form of ExecuteString(source,"some default name", 0, reportExceptions). + */ + v8::Handle ExecuteString(v8::Handle source ) + { + return this->ExecuteString(source, v8::String::New("ExecuteString()"), 0); + } + + /** + Convenience form of ExecuteString() reading from an opened input stream. + + Throws a std::exception if reading fails or the input is empty. + + An empty input is not necessarily an error. Todo: re-think this decision. + */ + v8::Handle ExecuteStream( std::istream & is, std::string const & name, + std::ostream * resultGoesTo = NULL ) + { + std::ostringstream os; + is >> std::noskipws; + std::copy( std::istream_iterator(is), std::istream_iterator(), std::ostream_iterator(os) ); + std::string const & str( os.str() ); + if( str.empty() ) + { + std::ostringstream msg; + msg << "Input stream ["<ExecuteString( str, name, resultGoesTo ); + } + + /** + Convenience form of ExecuteString() reading from a local file. + */ + v8::Handle ExecuteFile( char const * filename, + std::ostream * resultGoesTo = NULL ) + { + if( ! filename || !*filename ) + { + throw std::runtime_error("filename argument must not be NULL/empty."); + } + std::ifstream inf(filename); + if( ! inf.good() ) + { + // FIXME: throw a v8 exception and report it via our reporter. + // Nevermind: the result is useless b/c the exception has no proper vm stack/state info here... + std::ostringstream msg; + msg << "Could not open file ["<ExecuteStream( inf, filename, resultGoesTo ); + } + + /** + An v8::InvocationCallback implementation which implements + a JS-conventional print() routine, sending its output to + std::cout. See PrintToStdOstream() for the exact semantics + argument/return. + */ + static v8::Handle PrintToCout( v8::Arguments const & argv ) + { + return PrintToStdOstream<&std::cout>( argv ); + } + + /** + Identical to PrintToCout(), but sends its output to + std::cerr instead. + */ + static v8::Handle PrintToCerr( v8::Arguments const & argv ) + { + return PrintToStdOstream<&std::cerr>( argv ); + } + + private: + static v8::Handle Include( v8::Arguments const & argv ) + { + int const argc = argv.Length(); + if( argc < 1 ) return v8::Undefined(); + v8::HandleScope hsc; + v8::Local const jvself(argv.Data()); + if( jvself.IsEmpty() || !jvself->IsExternal() ) + { + return v8::ThrowException(v8::Exception::Error(v8::String::New("Include() callback is missing its native V8Shell object."))); + } + V8Shell * self = static_cast( v8::External::Cast(*jvself)->Value() ); + v8::String::Utf8Value fn(argv[0]); + try + { + return hsc.Close(self->ExecuteFile( *fn )); + } + catch( std::exception const & ex ) + { + char const * msg = ex.what(); + return v8::ThrowException(v8::Exception::Error(v8::String::New(msg ? msg : "Unspecified native exception."))); + } + } + + public: + /** + Returns a Function object implementing conventional + include(filename) functionality (called load() in some JS + shells). This function must be created dynamically + because the generated function internally refers back to + this object (so that we can re-use ExecuteString() for the + implementation). + + The return value of the Function is the value of the last + expression evaluated in the given JS code. + + Results are undefined, and almost certainly fatal, if + the generated function is ever called after this native + object has been destructed. For best results, to avoid + potential lifetime issues, never install the returned + function in any object other than this object's Global(). + */ + v8::Handle CreateIncludeFunction() + { + return v8::FunctionTemplate::New(Include, v8::External::New(this))->GetFunction(); + } + + /** + Implements the v8::InvocationCallback interface and has the + following JS interface: + + @code + Array getStracktrace([unsigned int limit = some reasonable default]) + @endcode + + Each element in the returned array represents a stack frame and + is a plain object with the following properties: + + column = 1-based column number (note that this is + different from most editors, but this is how v8 returns + this value). + + line = 1-based line number + + scriptName = name of the script + + functionName = name of the function + + isConstructor = true if this is a constructor call + + isEval = true if this is part of an eval() + + TODO: + + - Add a toString() member to the returned array which creates a + conventional-looking stacktrace string. + */ + static v8::Handle GetStackTrace( v8::Arguments const & argv ) + { + using namespace v8; + int32_t limitSigned = (argv.Length() > 0) ? argv[0]->Int32Value() : 0; + if( limitSigned <= 0 ) limitSigned = 8; + else if( limitSigned > 100 ) limitSigned = 100; + uint32_t limit = static_cast(limitSigned); + HandleScope hsc; + Local const st = StackTrace::CurrentStackTrace( limit, StackTrace::kDetailed ); + int const fcountI = st->GetFrameCount(); + // Who the hell designed the StackTrace API to return an int in GetFrameCount() but take + // an unsigned int in GetFrame()??? + uint32_t const fcount = static_cast(fcountI); + Local jst = Array::New(fcount); +#define STR(X) v8::String::New(X) + for( uint32_t i = 0; (i < fcount) && (i const & sf( st->GetFrame(i) ); + Local jsf = Object::New(); + jsf->Set(STR("column"), v8::Integer::New(sf->GetColumn())); + jsf->Set(STR("functionName"), sf->GetFunctionName()); + jsf->Set(STR("line"), v8::Integer::New(sf->GetLineNumber())); + jsf->Set(STR("scriptName"), sf->GetScriptName()); + jsf->Set(STR("isConstructor"), sf->IsConstructor() ? v8::True() : v8::False() ); + jsf->Set(STR("isEval"), sf->IsEval() ? v8::True() : v8::False() ); + jst->Set(i,jsf); + } + return hsc.Close(jst); +#undef STR + } + + /** + Can optionally be called to include the following functionality + in this shell's Global() object: + + JS Functions: + + print(...) (see PrintToCout()) + + getStacktrace([int limit]) (see GetStackTrace()) + + load(filename) (see CreateIncludeFunction()) + + Returns this object, for use in chaining. + */ + V8Shell & SetupDefaultBindings() + { + (*this)( "print", PrintToCout ) + ("getStacktrace", GetStackTrace) + ("load", this->CreateIncludeFunction()) + ; + return *this; + } + }; + + /** + Convenience typedef for V8Shell<>. + */ + typedef V8Shell<> Shell; + +} +#endif /* V8_CONVERT_V8Shell_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/XTo.hpp b/vendor/libv8-convert/cvv8/XTo.hpp new file mode 100644 index 000000000..f3502063e --- /dev/null +++ b/vendor/libv8-convert/cvv8/XTo.hpp @@ -0,0 +1,281 @@ +#if !defined (CVV8_TO_X_HPP_INCLUDED) +#define CVV8_TO_X_HPP_INCLUDED +#include "invocable.hpp" +#include "properties.hpp" +/** @file XTo.hpp + + This file provides an alternate approach to the function + conversion API. It covers: + + - Converting functions and methods to to v8::InvocationCallback, + v8::AccessorGetter, and v8::AccessorSetter. + + - Converting variables to v8::AccessorGetter and v8::AccessorSetter. + + All conversions of a given category, e.g. FunctionToXYZ or MethodToXYZ + have a common template, e.g. FunctionTo or MethodTo. The first type + passed to that template is a "tag" type which tells us what conversion + to perform. e.g. a function can be used as an v8::InvocationCallback, + v8::AccessorGetter, or v8::AccessorSetter. + + An example probably explains it best: + + @code + int aBoundInt = 3; + void test_to_bindings() + { + v8::InvocationCallback cb; + v8::AccessorGetter g; + v8::AccessorSetter s; + + using namespace cvv8; + + typedef FunctionTo< InCa, int(char const *), ::puts> FPuts; + typedef FunctionTo< Getter, int(void), ::getchar> GetChar; + typedef FunctionTo< Setter, int(int), ::putchar> SetChar; + cb = FPuts::Call; + g = GetChar::Get; + s = SetChar::Set; + + typedef VarTo< Getter, int, &aBoundInt > VarGet; + typedef VarTo< Setter, int, &aBoundInt > VarSet; + g = VarGet::Get; + s = VarSet::Set; + typedef VarTo< Accessors, int, &aBoundInt > VarGetSet; + g = VarGetSet::Get; + s = VarGetSet::Set; + + typedef BoundNative T; + typedef MethodTo< InCa, const T, int (), &T::getInt > MemInCa; + typedef MethodTo< Getter, const T, int (), &T::getInt > MemGet; + typedef MethodTo< Setter, T, void (int), &T::setInt > MemSet; + cb = MemInCa::Call; + g = MemGet::Get; + s = MemSet::Set; + } + @endcode + + This unconventional, but nonetheless interesting and arguably + very readable/writable approach was first proposed by Coen + Campman. +*/ + + +namespace cvv8 { + + /** + Base (unimplemented) FunctionTo interface. + + Specializations act as proxies for FunctionToInCa, + FunctionToGetter and FunctionToSetter. Tag must be one of + (InCa, InCaVoid, Getter, Setter). The other args are as + documented for the aforementioned proxied types. + + See FunctionToInCa for more information about the parameters. + */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< FunctionSignature >::Value > + struct FunctionTo DOXYGEN_FWD_DECL_KLUDGE; + + //! Behaves like FunctionToInCa. + template ::FunctionType Func, bool UnlockV8> + struct FunctionTo< InCa, Sig, Func, UnlockV8 > : FunctionToInCa + {}; + + //! Behaves like FunctionToInCaVoid. + template ::FunctionType Func, bool UnlockV8> + struct FunctionTo< InCaVoid, Sig, Func, UnlockV8 > : FunctionToInCaVoid + {}; + + //! Behaves like FunctionToGetter. + template ::FunctionType Func, bool UnlockV8> + struct FunctionTo< Getter, Sig, Func, UnlockV8 > : FunctionToGetter + {}; + + //! Behaves like FunctionToSetter. + template ::FunctionType Func, bool UnlockV8> + struct FunctionTo< Setter, Sig, Func, UnlockV8 > : FunctionToSetter + {}; + + /** @class VarTo + + Base (unimplemented) VarTo interface. + + Acts as a proxy for VarToGetter and VarToSetter. Tag must be + one of (Getter, Setter, Accessors). The other args are as + documented for VarToGetter and VarToSetter. + */ + template + struct VarTo DOXYGEN_FWD_DECL_KLUDGE; + + //! Behaves like VarToGetter. + template + struct VarTo< Getter, PropertyType,SharedVar> : VarToGetter + {}; + + //! Behaves like VarToSetter. + template + struct VarTo< Setter, PropertyType,SharedVar> : VarToSetter + {}; + + //! Behaves like VarToAccessors. + template + struct VarTo< Accessors, PropertyType,SharedVar> : VarToAccessors + {}; + + /** + Base (unimplemented) type for MemberTo-xxx conversions. + + Acts as a proxy for MemberToGetter, MemberToSetter and + MemberToAccessors. Tag must be one of (Getter, Setter, Accessors). + The other args are as documented for MemberToGetter and + MemberToSetter. + */ + template + struct MemberTo DOXYGEN_FWD_DECL_KLUDGE; + + //! Behaves like MemberToGetter. + template + struct MemberTo : MemberToGetter< T, PropertyType, MemVar > {}; + + //! Behaves like MemberToSetter. + template + struct MemberTo : MemberToSetter< T, PropertyType, MemVar > {}; + + //! Behaves like MemberToAccessors. + template + struct MemberTo : MemberToAccessors< T, PropertyType, MemVar > {}; + + /** + Base (unimplemented) MethodTo interface. + + Acts as a proxy for MethodToInCa, MethodToGetter and + MethodToSetter (or their const cousins if T is + const-qualified). Tag must be one of (InCa, InCaVoid, + Getter, Setter). The other args are as documented for the + aforementioned proxied types. + + See MethodToInCa for more information about the parameters. + */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< MethodSignature >::Value> + struct MethodTo DOXYGEN_FWD_DECL_KLUDGE; + + //! Behaves like MethodToInCa. For const methods, const-qualify T. + template ::FunctionType Func, bool UnlockV8> + struct MethodTo< InCa, T, Sig, Func, UnlockV8 > : MethodToInCa + {}; + + //! Behaves like MethodToInCaVoid. For const methods, const-qualify T. + template ::FunctionType Func, bool UnlockV8> + struct MethodTo< InCaVoid, T, Sig, Func, UnlockV8 > : MethodToInCaVoid + {}; + + //! Behaves like MethodToGetter. For const methods, const-qualify T. + template ::FunctionType Func, bool UnlockV8> + struct MethodTo< Getter, T, Sig, Func, UnlockV8 > : MethodToGetter + {}; + + //! Behaves like MethodToSetter. For const methods, const-qualify T. + template ::FunctionType Func, bool UnlockV8> + struct MethodTo< Setter, T, Sig, Func, UnlockV8 > : MethodToSetter + {}; + + /** + Base (unimplemented) FunctorTo interface. + + Behaves like one of the following, depending on the Tag type: + + FunctorToInCa (Tag=InCa), FunctorToInCaVoid (Tag=InCaVoid), + FunctorToGetter (Tag=Getter), FunctorToSetter (Tag=Setter) + + See FunctorToInCa for more information about the parameters. + */ + template >::Value + > + struct FunctorTo DOXYGEN_FWD_DECL_KLUDGE; + + //! Behaves like FunctorToInCa. + template + struct FunctorTo< InCa, FtorT, Sig, UnlockV8 > : FunctorToInCa + {}; + + //! Behaves like FunctorToInCaVoid. + template + struct FunctorTo< InCaVoid, FtorT, Sig, UnlockV8 > : FunctorToInCaVoid + {}; + + //! Behaves like FunctorToGetter. + template + struct FunctorTo< Getter, FtorT, Sig, UnlockV8 > : FunctorToGetter + {}; + + //! Behaves like FunctorToSetter. + template + struct FunctorTo< Setter, FtorT, Sig, UnlockV8 > : FunctorToSetter + {}; +} +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ + +#endif /* CVV8_TO_X_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/arguments.hpp b/vendor/libv8-convert/cvv8/arguments.hpp new file mode 100644 index 000000000..307db2cae --- /dev/null +++ b/vendor/libv8-convert/cvv8/arguments.hpp @@ -0,0 +1,817 @@ +#if !defined(V8_CONVERT_ARGUMENTS_HPP_INCLUDED) +#define V8_CONVERT_ARGUMENTS_HPP_INCLUDED +#include "convert.hpp" +#include + +namespace cvv8 { + + /** + A functor which fetches an argument by index. + + I = the argument index to fetch. + + The class is intended mainly to be invoked via code paths + selected by template metaprograms, thus the hard-coding of + the argument parameter index at compile-time. + */ + template + struct ArgAt + { + typedef char AssertIndex[ (I>=0) ? 1 : -1]; + /** + Returns argv[I] if argv.Length() is <= I, else v8::Undefined() + is returned. + */ + inline v8::Handle operator()( v8::Arguments const & argv ) const + { + return (argv.Length() > I) ? argv[I] : v8::Undefined(); + } + }; + + /** + Functor to fetch an argument and return its result + as a native value. + + I = the argument index to fetch. + + T = the native type to convert to. CastFromJS() must be legal. + */ + template + struct ArgAtCast + { + typedef JSToNative J2N; + typedef typename J2N::ReturnType ReturnType; + typedef char AssertIndex[ (I>=0) ? 1 : -1]; + /** + Returns CastFromJS( ArtAt(argv) ). + */ + inline ReturnType operator()( v8::Arguments const & argv ) const + { + typedef ArgAt Proxy; + return CastFromJS( Proxy()(argv) ); + } + }; + + /** + Marker class, for documentation purposes. + */ + struct ValuePredicate + { + /** + Must evaluate the handle and return true or false. + The framework cannot guaranty that h.IsEmpty() is false, + so implementations should be in the habit of checking it. + */ + bool operator()( v8::Handle const & h ) const; + }; + + /** + A functor interface for determining if a JS value + "is-a" value of a particular native type. The default + implementation is useable for any type for which the + following is legal: + + @code + T const * t = CastFromJS( aV8Handle ); + @endcode + + Specializations are used for most data types, but this + one is fine for client-bound types conformant with + CastFromJS(). + + Note that the default specializations treat T as a plain type, + discarding const/pointer/reference qualifiers. Certain types may + require that ValIs (and similar) be specialized in order + to behave properly. + */ + template + struct ValIs : ValuePredicate + { + typedef T Type; + /** + Returns true if v appears to contain a (T*). + */ + inline bool operator()( v8::Handle const & v ) const + { + return NULL != CastFromJS(v); + } + }; + + //! Specialization to treat (T const) as T. + template struct ValIs : ValIs {}; + //! Specialization to treat (T const &) as T. + template struct ValIs : ValIs {}; + //! Specialization to treat (T *) as T. + template struct ValIs : ValIs {}; + //! Specialization to treat (T const *) as T. + template struct ValIs : ValIs {}; + + /** + Specialization which treats void as the v8::Undefined() value. + */ + template <> + struct ValIs + { + typedef void Type; + /** + Returns true only if h is not empty and h->IsUndefined(). Note + that an empty handle evaluates to false in this context because + Undefined is a legal value whereas an empty handle is not. + (Though Undefined might not be _semantically_ legal in any given + use case, it is legal to dereference such a handle.) + */ + inline bool operator()( v8::Handle const & h ) const + { + return h.IsEmpty() ? false : h->IsUndefined(); + } + }; + +#if !defined(DOXYGEN) + namespace Detail { + /** + ValuePredicate impl which returns retrue if + Getter returns true for the given value. + + Getter must be a pointer to one of the v8::Value::IsXXX() + functions. This functor returns true if the passed-in handle is + not empty and its IsXXX() function returns true. + */ + template + struct ValIs_X : ValuePredicate + { + inline bool operator()( v8::Handle const & v ) const + { + return v.IsEmpty() ? false : ((*v)->*Getter)(); + } + }; + + /** + A ValuePredicate impl which returns true only if + the given handle is-a number and the number is in the + inclusive range (std::numeric_limits::min .. + max()). + */ + template + struct ValIs_NumberStrictRange : ValuePredicate + { + typedef NumT Type; + inline bool operator()( v8::Handle const & h ) const + { + if( h.IsEmpty() || ! h->IsNumber() ) return false; + else + { + double const dv( h->NumberValue() ); + return (dv >= std::numeric_limits::min()) + && (dv <= std::numeric_limits::max()); + } + } + }; + /** Special-case specialization which returns true if the given + handle is-a Number (without checking the range, which is + not necessary for this specific type in this context). + */ + template <> + struct ValIs_NumberStrictRange : ValuePredicate + { + typedef double Type; + inline bool operator()( v8::Handle const & h ) const + { + return !h.IsEmpty() && h->IsNumber(); + } + }; + } +#endif // DOXYGEN + + /** A Value predicate which returns true if its argument is-a Array. */ + struct ValIs_Array : Detail::ValIs_X<&v8::Value::IsArray> {}; + /** A Value predicate which returns true if its argument is-a Object. */ + struct ValIs_Object : Detail::ValIs_X<&v8::Value::IsObject> {}; + /** A Value predicate which returns true if its argument is-a Boolean. */ + struct ValIs_Boolean : Detail::ValIs_X<&v8::Value::IsBoolean> {}; + /** A Value predicate which returns true if its argument is-a Date. */ + struct ValIs_Date : Detail::ValIs_X<&v8::Value::IsDate> {}; + /** A Value predicate which returns true if its argument is-a External. */ + struct ValIs_External : Detail::ValIs_X<&v8::Value::IsExternal> {}; + /** A Value predicate which returns true if its argument has a false value. */ + struct ValIs_False : Detail::ValIs_X<&v8::Value::IsFalse> {}; + /** A Value predicate which returns true if its argument is-a Function. */ + struct ValIs_Function : Detail::ValIs_X<&v8::Value::IsFunction> {}; + /** A Value predicate which returns true if its argument is-a In32. */ + struct ValIs_Int32 : Detail::ValIs_X<&v8::Value::IsInt32> {}; + /** A Value predicate which returns true if its argument is-a UInt32. */ + struct ValIs_UInt32 : Detail::ValIs_X<&v8::Value::IsUint32 /* Note the "UInt" vs "Uint" descrepancy. i consider Uint to be wrong.*/ > {}; + /** A Value predicate which returns true if its argument is Null (JS null, not C++ NULL). */ + struct ValIs_Null : Detail::ValIs_X<&v8::Value::IsNull> {}; + /** A Value predicate which returns true if its argument has the special Undefined value. */ + struct ValIs_Undefined : Detail::ValIs_X<&v8::Value::IsUndefined> {}; + /** A Value predicate which returns true if its argument is-a Number. */ + struct ValIs_Number : Detail::ValIs_X<&v8::Value::IsNumber> {}; + /** A Value predicate which returns true if its argument is-a RegExp. */ + struct ValIs_RegExp : Detail::ValIs_X<&v8::Value::IsRegExp> {}; + /** A Value predicate which returns true if its argument is-a String. */ + struct ValIs_String : Detail::ValIs_X<&v8::Value::IsString> {}; + /** A Value predicate which returns true if its argument has a true value. */ + struct ValIs_True : Detail::ValIs_X<&v8::Value::IsTrue> {}; + + // FIXME: reverse the parent relationships between e.g. ValIs and ValIs_Array. + /** A Value predicate which returns true if its argument is a number capable + of fitting in an int8_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an uint8_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an int16_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an uint16_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an int32_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an uint32_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an int64_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is a number capable + of fitting in an uint64_t. */ + template <> struct ValIs : Detail::ValIs_NumberStrictRange {}; + /** A Value predicate which returns true if its argument is-a Number value. */ + template <> struct ValIs : ValIs_Number {}; + //! Special-case specialization to treat C strings as JS strings. + template <> struct ValIs : ValIs_String {}; + //! Special-case specialization to treat v8 strings as JS strings. + template <> struct ValIs : ValIs_String {}; + //! A Value predicate which returns true if its argument is-a Array. */ + template <> struct ValIs : ValIs_Array {}; + //! A Value predicate which returns true if its argument is-a Object. */ + template <> struct ValIs : ValIs_Object {}; + //! A Value predicate which returns true if its argument is-a Boolean. */ + template <> struct ValIs : ValIs_Boolean {}; + //! A Value predicate which returns true if its argument is-a Date. */ + template <> struct ValIs : ValIs_Date {}; + //! A Value predicate which returns true if its argument is-a External. */ + template <> struct ValIs : ValIs_External {}; + //! A Value predicate which returns true if its argument is-a Function. */ + template <> struct ValIs : ValIs_Function {}; + //! A Value predicate which returns true if its argument is-a Int32. */ + template <> struct ValIs : ValIs_Int32 {}; + //! A Value predicate which returns true if its argument is-a UInt32. */ + template <> struct ValIs : ValIs_UInt32 {}; + //! A Value predicate which returns true if its argument is-a Number. */ + template <> struct ValIs : ValIs_Number {}; + //! A Value predicate which returns true if its argument is-a RegExp. */ + template <> struct ValIs : ValIs_RegExp {}; + //! A Value predicate which returns true if its argument is-a String. */ + template <> struct ValIs : ValIs_String {}; + //! Specialization to treat Handle as T. */ + template struct ValIs< v8::Handle > : ValIs< T > {}; + //! Specialization to treat Local as T. */ + template struct ValIs< v8::Local > : ValIs< T > {}; + //! Specialization to treat Persistent as T. */ + template struct ValIs< v8::Persistent > : ValIs< T > {}; + + /** + Marker class, mainly for documentation purposes. + + Classes matching this concept "evaluate" a v8::Arguments + object for validity without actually performing any + "application logic." These are intended to be used as + functors, primarily triggered via code paths selected by + template metaprograms. + + They must be default-construcable and should have no + private state. Their public API consists of only operator(). + + This Concept's operator() is intended only to be used for + decision-making purposes ("are there enough arguments?" or + "are the arguments of the proper types?"), and not + higher-level application logic. + */ + struct ArgumentsPredicate + { + /** + Must "evaluate" the arguments and return true or false. + */ + bool operator()( v8::Arguments const & ) const; + }; + + /** + Functor to evaluate whether an Arguments list + has a certain range of argument count. + + Min is the minimum number. Max is the maximum. The range is + inclusive. Use (Max + struct Argv_Length : ArgumentsPredicate + { + private: + typedef char AssertMinIsPositive[ (Min_>=0) ? 1 : -1 ]; + enum { Min = Min_, Max = Max_ }; + public: + /** + Returns true if av meets the argument count + requirements defined by the Min and Max + values. + */ + bool operator()( v8::Arguments const & av ) const + { + + int const argc = av.Length(); + return (Max < Min) + ? argc >= Min + : (argc>=Min) && (argc<=Max); + } + }; + + /** + Arguments predicate functor. + + Index = arg index to check. + + ValIsType must match the ValuePredicate interface. + */ + template + struct ArgAt_Is : ArgumentsPredicate + { + /** + Returns true if ValType()( av[Index] ) is true. + */ + inline bool operator()( v8::Arguments const & av ) const + { + return (Index >= av.Length()) + ? false + : ValIsType()( av[Index] ); + } + }; + + /** + Arguments predicate functor. + + Index = arg index to check. + + T is a type for which ValIs is legal. The functor + returns true if ValIs returns true the argument + at the given index. + */ + template + struct ArgAt_IsA : ArgAt_Is< Index, ValIs > {}; + + namespace Detail { + /** + Functor which proxies the v8::Value "is-a" functions. + + Index is the argument index to check. Getter is the + member to be used to perform the is-a evaluation. + */ + template + struct ArgAt_IsX : ArgumentsPredicate + { + /** + Returns true only if (Index < av.Length()) + and av->Getter() returns true. + */ + inline bool operator()( v8::Arguments const & av ) const + { + return ( av.Length() <= Index ) + ? false + : ((*av[Index])->*Getter)(); + } + }; + } + + //! ArgumentsPredicate which returns true if the argument at Index is-a Array. */ + template + struct ArgAt_IsArray : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Object. */ + template + struct ArgAt_IsObject : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Boolean. */ + template + struct ArgAt_IsBoolean : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Date. */ + template + struct ArgAt_IsDate : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a External. */ + template + struct ArgAt_IsExternal : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index has a false value. */ + template + struct ArgAt_IsFalse : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Function. */ + template + struct ArgAt_IsFunction : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Int32Boolean. */ + template + struct ArgAt_IsInt32 : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a UInt32. */ + template + struct ArgAt_IsUInt32 : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index has the special Null value. */ + template + struct ArgAt_IsNull : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index has the special Undefined value. */ + template + struct ArgAt_IsUndefined : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a Number. */ + template + struct ArgAt_IsNumber : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a RegExp. */ + template + struct ArgAt_IsRegExp : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index is-a String. */ + template + struct ArgAt_IsString : Detail::ArgAt_IsX {}; + + //! ArgumentsPredicate which returns true if the argument at Index has a True value. */ + template + struct ArgAt_IsTrue : Detail::ArgAt_IsX {}; + + + /** + ArgumentsPredicate functor which always returns true. + + This currently has only one obscure use: as the predicate given to a + PredicatedInCa in conjunction with an N-arity callback, used as a + catch-all fallback as the last item in a list of PredicatedInCas + passed to PredicatedInCaDispatcher. (Got that?) + */ + struct Argv_True : ArgumentsPredicate + { + inline bool operator()( v8::Arguments const & ) const + { + return true; + } + }; + /** ArgumentsPredicate which always returns false. + + This predicate has only one known, rather obscure use in combination + with type lists. + */ + struct Argv_False : ArgumentsPredicate + { + inline bool operator()( v8::Arguments const & ) const + { + return false; + } + }; + + /** + An ArgumentsPredicate implementation which takes + two ArgumentsPredicate functors as template parameters + and combines them using an AND operation. + + See Argv_AndN if you just want to combine more than two functors. + (Argv_AndN can also be used for two functors but is more verbose + than this form for that case.) + */ + template + struct Argv_And : ArgumentsPredicate + { + /** + Returns true only if ArgPred1()(args) and + ArgPred2()(args) both return true. + */ + inline bool operator()( v8::Arguments const & args ) const + { + return ArgPred1()( args ) && ArgPred2()( args ); + } + }; + + /** + The "or" equivalent of Argv_And. + + Use Argv_OrN for chaining more than two predicates. + */ + template + struct Argv_Or : ArgumentsPredicate + { + /** + Returns true only if one of ArgPred1()(args) or + ArgPred2()(args) return true. + */ + inline bool operator()( v8::Arguments const & args ) const + { + return ArgPred1()( args ) || ArgPred2()( args ); + } + }; + + /** + This ArgumentsPredicate implementation combines a list of + other ArgumentsPredicates using an AND operation on the combined + results of each functor. + + PredList must be a type-list containing ArgumentsPredicate types. + This functor is a predicate which performs an AND operation on all + of the predicates in the type list. + + Note that an empty typelist evaluates to True in this context, for + deeply arcane reasons. + + See Argv_And if you just want to combine two functors + (it is more succinct for that case). + + Example: + + @code + // Predicate matching (function, ANYTHING, function) signature: + typedef Argv_AndN< CVV8_TYPELIST(( + Argv_Length<3>, + ArgAt_IsFunction<0>, + ArgAt_IsFunction<2> + )) > PredFuncXFunc; + @endcode + */ + template + struct Argv_AndN : ArgumentsPredicate + { + /** + Returns true only if all predicates in PredList + return true when passed the args object. + */ + inline bool operator()( v8::Arguments const & args ) const + { + typedef typename PredList::Head Head; + typedef typename tmp::IfElse< tmp::SameType::Value, + Argv_True, + Head>::Type P1; + typedef typename PredList::Tail Tail; + typedef Argv_AndN P2; + return P1()( args ) && P2()(args); + } + }; + + //! End-of-list specialization. + template <> + struct Argv_AndN : Argv_True {}; + + /** + The "or" equivalent of Argv_AndN. + + When chaining only two predicates Argv_Or offers + a more succinct equivalent to this type. + + Note that an empty typelist evaluates to False in this context, for + deeply arcane reasons. + */ + template + struct Argv_OrN : ArgumentsPredicate + { + /** + Returns true only if one of the predicates in PredList + returns true when passed the args object. + */ + inline bool operator()( v8::Arguments const & args ) const + { + typedef typename PredList::Head P1; + typedef typename PredList::Tail Tail; + typedef Argv_OrN P2; + return P1()( args ) || P2()(args); + } + }; + + //! End-of-list specialization. + template <> + struct Argv_OrN : ArgumentsPredicate + { + /** + Always returns false. + */ + inline bool operator()( v8::Arguments const & ) const + { + return false; + } + }; + + /** + Intended as a base class for a couple other + PredicatedXyz types. + + This type combines ArgumentsPredicate ArgPred and + CallT::Call() into one type, for template-based dispatching + purposes. + + ArgPred must be-a ArgumentsPredicate. CallT must + be a type having a static Call() function taking one + (v8::Arguments const &) and returning any type. + + This type uses subclassing instead of composition + to avoid having to specify the CallT::Call() return + type as an additional template parameter. i don't seem to + be able to template-calculate it from here. We can't use + CallT::ReturnType because for most bindings that value + is different from its Call() return type. We will possibly + eventually run into a problem with the lack of a way + to get Call()'s return type. + + @see PredicatedInCaDispatcher + */ + template + struct PredicatedInCaLike : ArgPred, CallT {}; + + /** + PredicatedInCa combines an ArgumentsPredicate functor + (ArgPred) with an InCa type, such that we can create lists + of functor/callback pairs for use in dispatching callbacks + based on the results of ArgumentPredicates. + + InCaT must implement the InCa interface. + + This type is primarily intended to be used together with + PredicatedInCaDispatcher. + + @see PredicatedInCaLike + + Reminder to self: this class is only in arguments.hpp, as opposed to + invocable_core.hpp, because i want (for pedantic + documentation-related reasons) this class to inherit + ArgumentsPredicate, which invocable*.hpp does not know about. + We might want to move ArgumentsPredicate and + ValuePredicate into convert_core.hpp and move this class back + into invocable_core.hpp. + + @see PredicatedInCaDispatcher + */ + template + struct PredicatedInCa : PredicatedInCaLike {}; + + /** + This class creates an InvocationCallback which dispatches to one of an + arbitrarily large set of other InvocationCallbacks, as determined by + predicate rules. + + PredList must be a type-list (e.g. Signature) of PredicatedInCa + implementations. See Call() for more details. + + Basic example: + + @code + // Overloads for 1-3 arguments: + typedef PredicatedInCa< Argv_Length<1>, ToInCa<...> > Cb1; + typedef PredicatedInCa< Argv_Length<2>, ToInCa<...> > Cb2; + typedef PredicatedInCa< Argv_Length<3>, ToInCa<...> > Cb3; + // Fallback impl for 0 or 4+ args: + typedef PredicatedInCa< Argv_True, InCaToInCa > CbN; + // Side note: this ^^^^^^^^^^^^^^ is the only known use for the + // Argv_True predicate. + + // Combine them into one InvocationCallback: + typedef PredicatedInCaDispatcher< CVV8_TYPELIST(( + Cb1, Cb2, Cb3, CbN + ))> AllOverloads; + v8::InvocationCallback cb = AllOverloads::Call; + @endcode + */ + template + struct PredicatedInCaDispatcher + : InCa + { + /** + For each PredicatedInCa (P) in PredList, if P()(argv) + returns true then P::Call(argv) is returned, else the next + predicate in the list is tried. + + If no predicates match then a JS-side exception will be triggered. + */ + static inline v8::Handle Call( v8::Arguments const & argv ) + { + typedef typename PredList::Head Head; + typedef typename tmp::IfElse< tmp::SameType::Value, + Argv_False, + Head>::Type Ftor; + typedef typename PredList::Tail Tail; + typedef char AssertEndOfListCheck[ tmp::SameType::Value + ? (tmp::SameType::Value ? 1 : -1) + : 1 + /* ensures that the Argv_False kludge does not call + any specialization other than the NilType one. + */ + ]; + return ( Ftor()( argv ) ) + ? Detail::OverloadCallHelper::Call( argv ) + : PredicatedInCaDispatcher::Call(argv); + } + }; + + //! End-of-list specialization. + template <> + struct PredicatedInCaDispatcher< tmp::NilType > : InCa + { + /** + Triggers a JS-side exception explaining (in English text) that no + overloads could be matched to the given arguments. + */ + static inline v8::Handle Call( v8::Arguments const & argv ) + { + return Toss(StringBuffer()<<"No predicates in the " + << "argument dispatcher matched the given " + << "arguments (arg count="< + struct PredicatedCtorForwarder + : PredicatedInCaLike {}; + + /** + The constructor counterpart of PredicatedInCaDispatcher. + PredList must be a typelist of PredicatedCtorForwarder (or + interface-compatible) types. The ReturnType part of the + typelist must be the base type the constructors in the list + can return (they must all share a common base). Clients must + not pass the ContextT parameter - it is required internally + for handling the end-of-typelist case. + + This template instantiates TypeName, so + if that template is to be specialized by client code, it should + be specialized before this template used. + */ + template + struct PredicatedCtorDispatcher + { + /** + Force the ContextT into a native handle type. + */ + typedef typename TypeInfo::NativeHandle ReturnType; + /** + For each PredicatedCtorForwarder (P) in PredList, if P()(argv) + returns true then P::Call(argv) is returned, else the next + predicate in the list is tried. + + If no predicates match then a JS-side exception will be triggered. + */ + static ReturnType Call( v8::Arguments const & argv ) + { + typedef typename PredList::Head Head; + typedef typename tmp::IfElse< tmp::SameType::Value, + Argv_False, + Head>::Type Ftor; + typedef typename PredList::Tail Tail; + return ( Ftor()( argv ) ) + ? Detail::CtorFwdDispatch::Call( argv ) + : PredicatedCtorDispatcher::Call(argv); + } + }; + + //! End-of-list specialization. + template + struct PredicatedCtorDispatcher< tmp::NilType, ContextT > : Signature< ContextT * () > + { + typedef typename TypeInfo::NativeHandle ReturnType; + /** + Triggers a native exception explaining (in English text) that no + overloads could be matched to the given arguments. It's kinda + cryptic, but we can't be more specific at this level of + the API. + */ + static ReturnType Call( v8::Arguments const & argv ) + { + StringBuffer os; + os << "No predicates in the " + << TypeName::Value + << " ctor argument dispatcher matched the given " + << "arguments (arg count="< // arg! Requires C++0x! +#include +#include // hope the client's platform is recent! +#include +#include +#include +#include +#include +#include +#include + +#if !defined(CVV8_CONFIG_HAS_LONG_LONG) +/* long long in C++ requires C++0x or compiler extensions. */ +# define CVV8_CONFIG_HAS_LONG_LONG 0 +#endif + +#include "signature_core.hpp" /* only needed for the Signature used by the generated code. */ +#include "tmp.hpp" + +namespace cvv8 { + + + /** + A convenience base type for TypeInfo specializations. + */ + template + struct TypeInfoBase + { + /** + The unqualified type T. In some special cases, Type _may_ + differ from T. + */ + typedef T Type; + /** + The "handle" type used to pass around native objects + between the JS and Native worlds. + + In _theory_ we can also use shared/smart pointers with + this typedef, but that requires custom handling in other + template code (mainly because we cannot store a + full-fledged shared pointer object directly inside a JS + object). + */ + typedef NHT NativeHandle; + + // MAYBE to do: add a function to get a pointer to the object, e.g. + // for dereferencing smart pointers. So far it's not been necessary. + // static NativeHandle Pointer( NativeHandle x ) { return x; } + }; + + /** + This may optionally be specialized for client-defined types + to define the type name used by some error reporting + code. + + The default implementation is usable but not all that useful. + */ + template + struct TypeName + { + /** Specializations must have a non-NULL value, and any number + of specializations may legally have the same value. + */ + static char const * Value; + }; +#if 0 + /** + This default implementation is unfortunate, but quite a bit + of error-reporting code uses this, with the assumption that + if it was worth binding to JS then it's worth having a + useful type name in error strings. + + FIXME: remove the default specialization if we can, as it will + cause us problems with some planned/potential uses which cross + DLL boundaries (there may be multiple definitions with different + addresses). + */ + template + char const * TypeName::Value = "T"; +#endif + + /** @def CVV8_TypeName_DECL + + A convenience macro for declaring a TypeName specialization. X must + be a type name with extra wrapping parenthesis, e.g.: + + @code + CVV8_TypeName_DECL((MyType)); + @endcode + + They are required so that we can also support template types with commas + in the names, e.g. (std::map). + + It must be called from inside the cvv8 namespace. + */ +#define CVV8_TypeName_DECL(X) template <> struct TypeName< cvv8::sl::At<0,CVV8_TYPELIST(X) >::Type > \ + { const static char * Value; } + + /** @def CVV8_TypeName_IMPL + + The counterpart of CVV8_TypeName_DECL, this must be called from the + cvv8 namespace. The X argument is as documented for CVV8_TypeName_DECL + and the NAME argument must be a C string. + + Example: + + @code + CVV8_TypeName_IMPL((MyType),"MyType"); + @endcode + */ +#define CVV8_TypeName_IMPL(X,NAME) char const * TypeName< cvv8::sl::At<0,CVV8_TYPELIST(X) >::Type >::Value = NAME + /** @def CVV8_TypeName_IMPL2 + + Almost identical to CVV8_TypeName_IMPL(), but can be used without + having first explicitly specializing TypeName. + */ +#define CVV8_TypeName_IMPL2(X,NAME) template <> CVV8_TypeName_IMPL(X,NAME) + + +#if 1 + template + struct TypeName : TypeName {}; + template + struct TypeName : TypeName {}; + template + struct TypeName : TypeName {}; +#endif + + /** + Describes basic type information regarding a type, for purposes + of static typing during JS-to/from-Native conversions. + + The default instantiation is suitable for most + cases. Specializations may be required in certain JS/Native + binding cases. + */ + template + struct TypeInfo : TypeInfoBase + { + }; + + template + struct TypeInfo : TypeInfo {}; + + template + struct TypeInfo : TypeInfo {}; + + template + struct TypeInfo : TypeInfo {}; + + template + struct TypeInfo : TypeInfo {}; + + template + struct TypeInfo : TypeInfo {}; + +#if 1 // this will only theoretically do what i want. Never actually tried to use a non-pointer NativeHandle type... + template + struct TypeInfo< v8::Handle > + { + typedef v8::Handle Type; + typedef v8::Handle NativeHandle; + }; +#endif + + /** + Base instantiation for T-to-v8::Handle conversion functor. + Must be specialized or it will not compile. + */ + template + struct NativeToJS + { + /** + Must be specialized. The argument type may be pointer-qualified. + Implementations for non-pod types are encouraged to have two + overloads, one taking (NT const &) and one taking (NT const *), + as this gives the underlying CastToJS() calls more leeway. + **/ + template + v8::Handle operator()( X const & ) const; + private: + typedef tmp::Assertion NativeToJSMustBeSpecialized; + }; + + /** + Specialization to treat (NT*) as (NT). + + NativeToJS must have an operator() taking + (NT const *). + */ + template + struct NativeToJS : NativeToJS +#if 1 + {}; +#else + { + v8::Handle operator()( NT const * v ) const + { + typedef NativeToJS Proxy; + if( v ) return Proxy()(v); + else return v8::Null() + ; + } + }; +#endif + /** + Specialization to treat (NT const *) as (NT). + */ + template + struct NativeToJS : NativeToJS {}; + // { + // typedef typename TypeInfo::Type const * ArgType; + // v8::Handle operator()( ArgType n ) const + // { + // typedef NativeToJS Proxy; + // return Proxy()( n ); + // } + // }; + + /** + Specialization to treat (NT const &) as (NT). + */ + template + struct NativeToJS : NativeToJS {}; + template + struct NativeToJS : NativeToJS {}; + +#if 0 + /** + Specialization to treat (NT &) as (NT). + */ + template + struct NativeToJS : NativeToJS {}; +#else + /** + A specialization to convert from (T&) to JS. + + Be very careful with this, and make sure that + NativeToJS has its own specialization, + as this implementation uses that one as its + basis. + */ + template + struct NativeToJS + { + typedef typename TypeInfo::Type & ArgType; + v8::Handle operator()( ArgType n ) const + { + typedef NativeToJS< typename TypeInfo::NativeHandle > Cast; + return Cast()( &n ); + } + }; +#endif + +#if 0 + template <> + struct NativeToJS + { + /** + Returns v8::Undefined(). + */ + template + v8::Handle operator()(Ignored const &) const + { + return ::v8::Undefined(); + } + }; +#endif + +#if !defined(DOXYGEN) + namespace Detail { + /** + Base implementation for "small" integer conversions (<=32 + bits). + */ + template + struct NativeToJS_int_small + { + v8::Handle operator()( IntegerT v ) const + { + return v8::Integer::New( static_cast(v) ); + } + }; + /** + Base implementation for "small" unsigned integer conversions + (<=32 bits). + */ + template + struct NativeToJS_uint_small + { + v8::Handle operator()( IntegerT v ) const + { + return v8::Integer::NewFromUnsigned( static_cast(v) ); + } + }; + } +#endif // if !defined(DOXYGEN) + + template <> + struct NativeToJS : Detail::NativeToJS_int_small {}; + + template <> + struct NativeToJS : Detail::NativeToJS_uint_small {}; + + template <> + struct NativeToJS : Detail::NativeToJS_int_small {}; + + template <> + struct NativeToJS : Detail::NativeToJS_uint_small {}; + +#if !defined(DOXYGEN) + namespace Detail { + /** + Base implementation for "big" numeric conversions (>32 bits). + */ + template + struct NativeToJS_int_big + { + /** Returns v as a double value. */ + v8::Handle operator()( IntegerT v ) const + { + return v8::Number::New( static_cast(v) ); + } + }; + } +#endif // if !defined(DOXYGEN) + + template <> + struct NativeToJS : Detail::NativeToJS_int_big {}; + + template <> + struct NativeToJS : Detail::NativeToJS_int_big {}; + + template <> + struct NativeToJS + { + v8::Handle operator()( double v ) const + { + return v8::Number::New( v ); + } + }; + + template <> + struct NativeToJS + { + v8::Handle operator()( bool v ) const + { + return v8::Boolean::New( v ); + } + }; + + template + struct NativeToJS< ::v8::Handle > + { + typedef ::v8::Handle handle_type; + v8::Handle operator()( handle_type const & li ) const + { + return li; + } + }; + + template + struct NativeToJS< ::v8::Local > + { + typedef ::v8::Local handle_type; + v8::Handle operator()( handle_type const & li ) const + { + return li; + } + }; + + template + struct NativeToJS< ::v8::Persistent > + { + typedef ::v8::Persistent handle_type; + v8::Handle operator()( handle_type const & li ) const + { + return li; + } + }; + + template <> + struct NativeToJS< ::v8::InvocationCallback > + { + v8::Handle operator()( ::v8::InvocationCallback const f ) const + { + return ::v8::FunctionTemplate::New(f)->GetFunction(); + } + }; + + + template <> + struct NativeToJS + { + v8::Handle operator()( std::string const & v ) const + { + /** This use of v.data() instead of v.c_str() is highly arguable. */ + char const * const cstr = v.data(); + return cstr ? v8::String::New( cstr, static_cast( v.size() ) ) : v8::String::New("",0); + } + }; + + template <> + struct NativeToJS + { + v8::Handle operator()( char const * v ) const + { + if( ! v ) return v8::Null(); + else return v8::String::New( v ); + } + }; + + /** + "Casts" v to a JS value using NativeToJS. + */ + template + inline v8::Handle CastToJS( T const & v ) + { + typedef NativeToJS F; + return F()( v ); + } + + /** + Overload to avoid ambiguity in certain calls. + */ + static inline v8::Handle CastToJS( char const * v ) + { + typedef NativeToJS F; + return F()( v ); + } + + /** + Overload to avoid mis-selection of templates. + */ + static inline v8::Handle CastToJS( v8::InvocationCallback v ) + { + typedef NativeToJS F; + return F()( v ); + } + + /** + Overload to avoid ambiguity in certain calls. + */ + static inline v8::Handle CastToJS( char * v ) + { + typedef NativeToJS F; + return F()( v ); + } + + /** Convenience instance of NativeToJS. */ + static const NativeToJS Int16ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS UInt16ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS Int32ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS UInt32ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS Int64ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS UInt64ToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS DoubleToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS BoolToJS = NativeToJS(); + /** Convenience instance of NativeToJS. */ + static const NativeToJS StdStringToJS = NativeToJS(); + + /** + Converts a native std::exception to a JS exception and throws + that exception via v8::ThrowException(). + */ + template <> + struct NativeToJS + { + /** Returns v8::Exception::Error(ex.what()). + + ACHTUNG: on 20110717 this function was changed to NOT trigger a + JS exception. Prior versions triggered a JS exception, but that + was done due to a misunderstanding on my part (i didn't know v8 + provided a way to create Error objects without throwing). This + change is semantically incompatible with older code which uses + this conversion. + + OLD way of doing it (don't do this!): + + @code + catch( std::exception const & ex ) { return CastToJS(ex); } + @endcode + + The equivalent is now: + + @code + catch( std::exception const & ex ) { return Toss(CastToJS(ex)); } + @endcode + */ + v8::Handle operator()( std::exception const & ex ) const + { + char const * msg = ex.what(); + return v8::Exception::Error(v8::String::New( msg ? msg : "unspecified std::exception" )); + /** ^^^ String::New() internally calls strlen(), which hates it when string==0. */ + } + }; + template <> + struct NativeToJS : NativeToJS {}; + template <> + struct NativeToJS : NativeToJS {}; + template <> + struct NativeToJS : NativeToJS {}; + + + /** + Base interface for converting from native objects to JS + objects. There is no default implementation, and it must be + specialized to be useful. + + When creating custom implementations, remember that in + practice, all custom client-bound types are passed around + internally by non-const pointer. This is in contrast to + conversions of POD- and POD-like types (numbers and strings), + which are passed around by value. + + It is theoretically possible to use smart pointers (with value + semantics) via this API, but it is untested. + */ + template + struct JSToNative + { + typedef typename TypeInfo::NativeHandle ResultType; + //! Must be specialized to be useful. + ResultType operator()( v8::Handle const & h ) const; + }; + + /** Specialization to treat (JST*) as JST. */ + template + struct JSToNative : JSToNative {}; + + /** Specialization to treat (JST*) as JST. */ + template + struct JSToNative : JSToNative {}; + + /** Specialization to treat (JST const *) as (JST *). */ + template + struct JSToNative : JSToNative {}; + + /** + A specialization to convert from JS to (T&). + */ + template + struct JSToNative + { + /** + Uses JSTNative() to try to convert a JS object to a + pointer, and then dereferences that pointer to form + (T&). Beware, however, that this operation throws a native + exeception (deriving from std::exception) if it fails, + because the only other other option is has is to + dereference null and crash your app. + */ + typedef typename TypeInfo::Type & ResultType; + ResultType operator()( v8::Handle const & h ) const + { + typedef JSToNative Cast; + typedef typename Cast::ResultType NH; + NH n = Cast()( h ); + if( ! n ) + { + throw std::runtime_error("JSToNative could not get native pointer. Throwing to avoid dereferencing null!"); + } + else return *n; + } + }; + + /** Specialization to treat (JST const &) as (JST). */ + template + struct JSToNative + { + typedef typename TypeInfo::Type const & ResultType; + ResultType operator()( v8::Handle const & h ) const + { + typedef JSToNative Cast; + typedef typename Cast::ResultType NH; +#if 0 + NH n = Cast()( h ); + if( ! n ) + { + throw std::runtime_error("JSToNative could not get native pointer. Throwing to avoid dereferencing null!"); + } + else return *n; +#else + return Cast()(h); +#endif + } + }; + + + + /** Specialization which passes on v8 Handles as-is. */ + template + struct JSToNative > + { + typedef v8::Handle ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h; + } + }; + template + struct JSToNative const &> : JSToNative< v8::Handle > {}; + template + struct JSToNative &> : JSToNative< v8::Handle > {}; + + /** Specialization which passes on v8 local Handles as-is. */ + template + struct JSToNative > + { + typedef v8::Local ResultType; + ResultType operator()( v8::Local const & h ) const + { + return h; + } + }; + template + struct JSToNative const &> : JSToNative< v8::Local > {}; + template + struct JSToNative &> : JSToNative< v8::Local > {}; + +#if !defined(DOXYGEN) + namespace Detail + { + template + struct JSToNative_V8Type + { + /** + If h is not empty and is of the correct type + then its converted handle is returned, else + an empty handle is returned. + */ + typedef v8::Handle ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return (h.IsEmpty() || !((*h)->*IsA)()/*man, what a construct!*/) + ? v8::Handle() + : v8::Handle(V8Type::Cast(*h)); + } + }; + } +#endif + template <> + struct JSToNative > : Detail::JSToNative_V8Type< v8::Object, &v8::Value::IsObject> + {}; + template <> + struct JSToNative< v8::Handle &> : JSToNative< v8::Handle > {}; + template <> + struct JSToNative< v8::Handle const &> : JSToNative< v8::Handle > {}; + + + template <> + struct JSToNative > : Detail::JSToNative_V8Type< v8::Array, &v8::Value::IsArray> + {}; + template <> + struct JSToNative< v8::Handle &> : JSToNative< v8::Handle > {}; + template <> + struct JSToNative< v8::Handle const &> : JSToNative< v8::Handle > {}; + + template <> + struct JSToNative > : Detail::JSToNative_V8Type< v8::Function, &v8::Value::IsFunction> + {}; + template <> + struct JSToNative< v8::Handle &> : JSToNative< v8::Handle > {}; + template <> + struct JSToNative< v8::Handle const &> : JSToNative< v8::Handle > {}; + + /** + An X-to-void specialization which we cannot use in the generic + case due to the syntactic limitations of void. + */ + template <> + struct JSToNative + { + typedef void ResultType; + ResultType operator()( ... ) const + { + return; + } + }; + + /** + A very arguable specialization which tries to convert a JS + value to native (void*) via v8::External. + */ + template <> + struct JSToNative + { + typedef void * ResultType; + /** + If h is-a External then this return its value, else it + return 0. + + We could arguably check if it is an object and has + internal fields, and return the first one, but i think + that would be going too far considering how arguably the + v8-to-(void *) conversion is in the first place. + */ + ResultType operator()( v8::Handle const & h ) const + { + if( h.IsEmpty() || ! h->IsExternal() ) return 0; + return v8::External::Cast(*h)->Value(); + } + }; + /** + A very arguable specialization which tries to convert a JS + value to native (void*) via v8::External. + */ + template <> + struct JSToNative + { + typedef void const * ResultType; + /** + If h is-a External then this return its value, else it + return 0. + + We could arguably check if it is an object and has + internal fields, and return the first one, but i think + that would be going to far considering how arguably the + v8-to-(void *) conversion is in the first place. + */ + ResultType operator()( v8::Handle const & h ) const + { + if( h.IsEmpty() || ! h->IsExternal() ) return 0; + return v8::External::Cast(*h)->Value(); + } + }; + + /** + A concrete JSToNative implementation intended to be used as the + base class for JSToNative implementations where T is "bound + to JS" in JS objects, and those JS objects meet the following + requirements: + + - They have exactly InternalFieldCount internal fields. + + - They have a C/C++-native object of type (T*) (or convertible + to type (T*)) stored as a v8::External value in the JS-object + internal field number InternalFieldIndex. + + Note that the InternalFieldCount check is only a quick + sanity-checking mechanism, and is by far not foolproof because + the majority of JS-bound native types only use 1 internal + field. + + It is illegal for InternalFieldCount to be equal to or smaller + than InternalFieldIndex, or for either value to be + negative. Violating these invariants results in a compile-time + assertion. + + If an object to convert matches the field specification but + is not a T (or publically derived from T) then results are + undefined (this could lead to a crash at runtime). + + There are cases where very-misbehaving JS code can force this + particular conversion algorithm to mis-cast the native. While + they have never been seen "in the wild", they can + theoretically happen. If that bothers you, and you want to be + able to sleep soundly at night, use + JSToNative_ObjectWithInternalFieldsTypeSafe instead of this + class. + + @see JSToNative_ObjectWithInternalFieldsTypeSafe + + */ + template + struct JSToNative_ObjectWithInternalFields + { + private: + typedef char AssertIndexRanges + [tmp::Assertion< + (InternalFieldIndex>=0) + && (InternalFieldCount>0) + && (InternalFieldIndex < InternalFieldCount) + >::Value + ? 1 : -1]; + public: + typedef typename TypeInfo::NativeHandle ResultType; + /** + If h is-a Object and it meets the requirements described + in this class' documentation, then this function returns + the result of static_cast(void*), using the (void*) + extracted from the Object. If the requirements are not met + then NULL is returned. + + See the class docs for more details on the requirements + of the passed-in handle. + + If SearchPrototypeChain is true and this object does not + contain a native then the prototype chain is searched. + This is generally only required when bound types are + subclassed. + */ + ResultType operator()( v8::Handle const & h ) const + { + if( h.IsEmpty() || ! h->IsObject() ) return NULL; + else + { + void * ext = NULL; + v8::Handle proto(h); + while( !ext && !proto.IsEmpty() && proto->IsObject() ) + { + v8::Local const & obj( v8::Object::Cast( *proto ) ); + ext = (obj->InternalFieldCount() != InternalFieldCount) + ? NULL + : obj->GetPointerFromInternalField( InternalFieldIndex ); + if( ! ext ) + { + if( !SearchPrototypeChain ) break; + else proto = obj->GetPrototype(); + } + } + return ext ? static_cast(ext) : NULL; + } + } + }; + + /** + A concrete JSToNative implementation (to be used as a base class) + which does a type-safe conversion from JS to (T*). + + T is the bound native type. A pointer of this type is expected + in the object-internal field specified by ObjectFieldIndex. + + Each value to be converted is checked for an internal field + (of type v8::External) at the index specified by + TypeIdFieldIndex. If (and only if) that field contains a + v8::External which holds the value TypeID is the conversion + considered legal. If they match but the native value stored + in field ObjectFieldIndex is NOT-a-T then results are + undefined. Note that the TypeID value is compared by pointer + address, not by its byte contents (which may legally be + NULL). + + If SearchPrototypeChain is true and the passed-in object + contains no native T then the prototype chain is checked + recursively. This is normally only necessary if the native + type is allowed to be subclasses from JS code (at which point + the JS 'this' is not the same exact object as the one + holding the native 'this' pointer, and we need to search the + prototype chain). + + For this all to work: the class-binding mechanism being used + by the client must store the TypeID value in all new + JS-created instances of T by calling SetInternalField( + TypeIdFieldIndex, theTypeID ) and store the native object + pointer in the field internal field ObjectFieldIndex. And + then they should do: + + @code + // in the cvv8 namespace: + template <> + struct JSToNative : + JSToNative_ObjectWithInternalFieldsTypeSafe + {}; + @endcode + + At which point CastFromJS() will take advantage of this + type check. + + + The real docs end here. What follows is pseudorandom blather... + + Theoretically (i haven't tried this but i know how the + underlying code works), it is possible for script code to + create a condition which will lead to an invalid cast if the + check performed by this class (or something equivalent) is + _not_ performed: + + @code + var x = new Native1(); + var y = new Native2(); + // assume y.someFunc and x.otherFunc are both bound to native functions + y.someFunc = x.otherFunc; + y.someFunc( ... ); // here is where it will likely end badly + @endcode + + When y.someFunc() is called, JS will look for a 'this' object of + type Native1, not Native2, because the type information related to + the conversion is "stored" in the callback function itself, not in + the native object. (This is a side-effect of us using templates to + create InvocationCallback implementations.) It will not find a + Native1, but it might (depending on how both classes are bound to + JS) find a Native2 pointer and _think_ it is a Native1. And by + "think it is" i mean "it will try to cast it to," but the cast is + illegal in that case. In any case it would be bad news. + + The check performed by this class can catch that condition + (and similar ones) and fail gracefully (i.e. returning a + NULL instead of performing an illegal cast). + */ + template + struct JSToNative_ObjectWithInternalFieldsTypeSafe + { + private: + typedef char AssertIndexRanges + [(InternalFieldCount>=2) + && (TypeIdFieldIndex != ObjectFieldIndex) + && (TypeIdFieldIndex >= 0) + && (TypeIdFieldIndex < InternalFieldCount) + && (ObjectFieldIndex >= 0) + && (ObjectFieldIndex < InternalFieldCount) + ? 1 : -1]; + public: + typedef typename TypeInfo::NativeHandle ResultType; + /** + If h is-a Object and it meets the requirements described + in this class' documentation, then this function returns + the result of static_cast(void*), using the (void*) + extracted from the Object. If the requirements are not met + then NULL is returned. + + See the class docs for more details on the requirements + of the passed-in handle. + + If SearchPrototypeChain is true and the object does not + contain a native then the prototype chain is searched + recursively. This is generally only required when bound + types are subclassed from JS code. + */ + ResultType operator()( v8::Handle const & h ) const + { + if( h.IsEmpty() || ! h->IsObject() ) return NULL; + else + { + void const * tid = NULL; + void * ext = NULL; + v8::Handle proto(h); + while( !ext && !proto.IsEmpty() && proto->IsObject() ) + { + v8::Local const & obj( v8::Object::Cast( *proto ) ); + tid = (obj->InternalFieldCount() != InternalFieldCount) + ? NULL + : obj->GetPointerFromInternalField( TypeIdFieldIndex ); + ext = (tid == TypeID) + ? obj->GetPointerFromInternalField( ObjectFieldIndex ) + : NULL; + if( ! ext ) + { + if( ! SearchPrototypeChain ) break; + else proto = obj->GetPrototype(); + } + } + return ext ? static_cast(ext) : NULL; + } + } + }; + + /** Specialization to convert JS values to int16_t. */ + template <> + struct JSToNative + { + typedef int16_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? static_cast(h->Int32Value()) + : 0; + } + }; + + /** Specialization to convert JS values to uint16_t. */ + template <> + struct JSToNative + { + typedef uint16_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? static_cast(h->Int32Value()) + : 0; + } + }; + + /** Specialization to convert JS values to int32_t. */ + template <> + struct JSToNative + { + typedef int32_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? h->Int32Value() + : 0; + } + }; + + /** Specialization to convert JS values to uint32_t. */ + template <> + struct JSToNative + { + typedef uint32_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? static_cast(h->Uint32Value()) + : 0; + } + }; + + + /** Specialization to convert JS values to int64_t. */ + template <> + struct JSToNative + { + typedef int64_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? static_cast(h->IntegerValue()) + : 0; + } + }; + + /** Specialization to convert JS values to uint64_t. */ + template <> + struct JSToNative + { + typedef uint64_t ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? static_cast(h->IntegerValue()) + : 0; + } + }; + + /** Specialization to convert JS values to double. */ + template <> + struct JSToNative + { + typedef double ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->IsNumber() + ? h->NumberValue() + : 0; + } + }; + + /** Specialization to convert JS values to bool. */ + template <> + struct JSToNative + { + typedef bool ResultType; + ResultType operator()( v8::Handle const & h ) const + { + return h->BooleanValue(); + } + }; + + /** Specialization to convert JS values to std::string. */ + template <> + struct JSToNative + { + typedef std::string ResultType; + ResultType operator()( v8::Handle const & h ) const + { + static const std::string emptyString; + v8::String::Utf8Value const utf8String( h ); + const char* s = *utf8String; + return s + ? std::string(s, utf8String.length()) + : emptyString; + } + }; + + /** + Specialization necessary to avoid incorrect default behaviour + for this special case. + + Reminder to self: we'll need a specialization like this any + time we want to use a type which is returned by VALUE from + JSToNative() and might be passed as a const reference as a + function argument type. The vast majority of bound native + types are bound internally as pointers (and don't need a + specialization like this one), whereas the std::string + conversion uses value semantics to simplify usage. + */ + template <> + struct JSToNative : public JSToNative {}; + +#if 0 // leave this unused code here for the sake of the next guy who tries to re-add it + /** + Nonono! This will Cause Grief when used together with CastFromJS() + because the returned pointer's lifetime cannot be guaranteed. + See ArgCaster for more details on the problem. + */ + template <> + struct JSToNative + { + public: + typedef char const * ResultType; + ResultType operator()( v8::Handle const & h ); + }; +#else +#if 0 // it turns out no current (20110627) code uses this. +// We might want to leave it in b/c that will cause compile errors +// in some use cases rather than link errors ("undefined ref..."). + /** Not great, but a happy medium. */ + template <> + struct JSToNative : JSToNative {}; +#endif +#endif + + namespace Detail + { + /** A kludge placeholder type for a ulong-is-not-uint64 + condition on some platforms. + + T is ignored, but is required to avoid class-redefinition + errors for the templates using this class. + */ + template + struct UselessConversionType + { + }; + } + + /** + This specialization is a kludge/workaround for use in cases + where (unsigned long int) is: + + 1) The same type as the platform's pointer type. + 2) Somehow NOT the same as one of the standard uintNN_t types. + 3) Used in CastToJS() or CastFromJS() calls. + + If ulong and uint64 are the same type then this specialization + is a no-op (it generates a converter for a type which will + never be converted), otherwords it performs a numeric conversion. + */ + template <> + struct NativeToJS< tmp::IfElse< tmp::SameType::Value, + Detail::UselessConversionType, + unsigned long >::Type > + : Detail::NativeToJS_int_big + { + }; + + /** + This is a kludge/workaround for use in cases where (unsigned + long int) is: + + 1) The same type as the platform's pointer type. + 2) Somehow NOT the same as one of the standard uintNN_t types. + 3) Used in CastToJS() or CastFromJS() calls. + + If ulong and uint64 are the same type then this specialization + is a no-op (it generates a converter for a type which will + never be converted), otherwords it performs a numeric + conversion. + */ + template <> + struct JSToNative< tmp::IfElse< + tmp::SameType::Value, + Detail::UselessConversionType, + unsigned long >::Type > + : JSToNative + { + }; + + /** + See the equivalent NativeToJS kludge for unsigned long. + */ + template <> + struct NativeToJS< tmp::IfElse< tmp::SameType::Value, + Detail::UselessConversionType, + long >::Type > + : Detail::NativeToJS_int_big + { + }; + + /** + See the equivalent JSToNative kludge for unsigned long. + */ + template <> + struct JSToNative< tmp::IfElse< + tmp::SameType::Value, + Detail::UselessConversionType, + long >::Type > : JSToNative + { + }; + +#if CVV8_CONFIG_HAS_LONG_LONG + /** + See the equivalent JSToNative kludge for unsigned long. + + Added 20100606 to please the sqlite3 plugin, where sqlite3_int64 + collides with (long long) on some platforms and causes an invalid + conversion compile-time error. + */ + template <> + struct JSToNative< tmp::IfElse< + tmp::SameType::Value, + Detail::UselessConversionType, + long long int >::Type > : JSToNative + { + }; + /** + See the equivalent JSToNative kludge for unsigned long. + + Added 20101126 to please the sqlite3 plugin, where + sqlite3_int64 collides with (long long) on some platforms and + causes a link-time error. + */ + template <> + struct NativeToJS< tmp::IfElse< tmp::SameType::Value, + Detail::UselessConversionType, + long long int >::Type > + : Detail::NativeToJS_int_big + { + }; +#endif + + + /** + Converts h to an object of type NT, using JSToNative to do + the conversion. + */ + template + typename JSToNative::ResultType CastFromJS( v8::Handle const & h ) + { + typedef JSToNative F; + return F()( h ); + } + + /** Convenience instance of JSToNative. */ + static const JSToNative JSToInt16 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToUInt16 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToInt32 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToUInt32 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToInt64 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToUInt64 = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToDouble = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToBool = JSToNative(); + /** Convenience instance of JSToNative. */ + static const JSToNative JSToStdString = JSToNative(); + + /** + A utility to add properties to a JS v8::Object or v8::ObjectTemplate. + ObjectType must be either v8::Object or v8::ObjectTemplate. It + _might_ work in limited context with v8::Array, but that is untested. + ObjectType is intended to be v8::Object or v8::ObjectTemplate, + but Object subclasses, e.g. v8::Array and v8::Function, "should" work + as well. + + It is intended to be used like this: + + \code + v8::Handle obj = ...; + ObjectPropSetter set(obj); + set("propOne", CastToJS(32) ) + ("propTwo", ... ) + (32, ... ) + ("func1", anInvocationCallback ) + ; + \endcode + */ + template ::Value, + v8::Handle, + v8::Handle + >::Type + > + class ObjectPropSetter + { + private: + v8::Handle const target; + public: + /** + Initializes this object to use the given array + as its append target. Results are undefined if + target is not a valid Object. + */ + explicit ObjectPropSetter( v8::Handle< ObjectType > const & obj ) :target(obj) + {} + ~ObjectPropSetter(){} + + + /** + Adds an arbtirary property to the target object. + */ + inline ObjectPropSetter & Set( KeyType const & key, v8::Handle const & v ) + { + this->target->Set(key->ToString(), CastToJS(v)); + return *this; + } + /** + Adds an arbtirary property to the target object. + */ + inline ObjectPropSetter & Set( char const * key, v8::Handle const & v ) + { + this->target->Set( v8::String::New(key), CastToJS(v)); + return *this; + } + + /** + Adds an arbitrary property to the target object using + CastToJS(v). + */ + template + inline ObjectPropSetter & operator()( KeyType const & key, T const & v ) + { + this->target->Set(key, CastToJS(v)); + return *this; + } + + /** + Adds a numeric property to the target object. + */ + template + inline ObjectPropSetter & operator()( int32_t ndx, T const & v ) + { + return this->Set( v8::Integer::New(ndx), CastToJS(v) ); + } + + /** + Adds a string-keyed property to the target object. + Note that if key is NULL, the v8::String constructor + will crash your app. (Good luck with that!) + */ + template + inline ObjectPropSetter & operator()( char const * key, T const & v ) + { + return this->Set( v8::String::New(key), CastToJS(v) ); + } + + + /** + Adds the given function as a member of the target object. + */ + inline ObjectPropSetter & operator()( char const * name, v8::InvocationCallback pf ) + { + return this->Set( name, v8::FunctionTemplate::New(pf)->GetFunction() ); + } + + /** + Returns this object's JS object. + */ + v8::Handle< v8::Object > Object() const + { + return this->target; + } + }; + + /** + NativeToJS classes which act on list types compatible with the + STL can subclass this to get an implementation. + */ + template + struct NativeToJS_list + { + v8::Handle operator()( ListT const & li ) const + { + typedef typename ListT::const_iterator IT; + IT it = li.begin(); + const size_t sz = li.size(); +#if 1 + v8::Handle rv( v8::Array::New( static_cast(sz) ) ); + for( int i = 0; li.end() != it; ++it, ++i ) + { + rv->Set( v8::Integer::New(i), CastToJS( *it ) ); + } + return rv; +#else + ObjectPropSetter app(Array::New( static_cast(sz) )); + for( int32_t i = 0; li.end() != it; ++it, ++i ) + { + app( i, CastToJS( *it ) ); + } + return app.Object(); +#endif + } + }; + + /** Partial specialization for std::list<>. */ + template + struct NativeToJS< std::list > : NativeToJS_list< std::list > {}; + /** Partial specialization for std::vector<>. */ + template + struct NativeToJS< std::vector > : NativeToJS_list< std::vector > {}; + + /** + NativeToJS classes which act on map types compatible with the + STL can subclass this to get an implementation. + + Both the key and mapped types of the given Map Type must be + converitible to v8 types using CastToJS(). + */ + template + struct NativeToJS_map + { + v8::Handle operator()( MapT const & li ) const + { + typedef typename MapT::const_iterator IT; + IT it( li.begin() ); + v8::Handle rv( v8::Object::New() ); + for( int i = 0; li.end() != it; ++it, ++i ) + { + rv->Set( CastToJS( (*it).first ), CastToJS( (*it).second ) ); + } + return rv; + } + }; + + /** Partial specialization for std::map<>. */ + template + struct NativeToJS< std::map > : NativeToJS_map< std::map > {}; + + /** + A base class for JSToNative + specializations. ListT must be compatible with std::list and + std::vector, namely: + + - Must support push_back( ListT::value_type ). + + - Must define value_type typedef or the second template + argument must be specified for this template. + + It is technically legal for ValueType to differ from + ListT::value_type if + ListT::push_back(JSToNative::ResultType) is + legal. e.g. if ListT is std::vector and we want to + truncate the values we could use, e.g. int32_t as the + ValueType. + */ + template + struct JSToNative_list + { + typedef ListT ResultType; + /** + Converts jv to a ListT object. + + If jv->IsArray() then the returned object is populated from + jv, otherwise the returned object is empty. Since it is + legal for an array to be empty, it is not generically + possible to know if this routine got an empty Array object + or a non-Array object. + */ + ResultType operator()( v8::Handle jv ) const + { + //typedef typename ListT::value_type VALT; + typedef ValueType VALT; + ListT li; + if( jv.IsEmpty() || ! jv->IsArray() ) return li; + v8::Handle ar( v8::Array::Cast(*jv) ); + uint32_t ndx = 0; + for( ; ar->Has(ndx); ++ndx ) + { + li.push_back( CastFromJS( ar->Get(v8::Integer::New(ndx)) ) ); + } + return li; + } + }; + + /** Partial specialization for std::list<>. */ + template + struct JSToNative< std::list > : JSToNative_list< std::list > {}; + + /** Partial specialization for std::vector<>. */ + template + struct JSToNative< std::vector > : JSToNative_list< std::vector > {}; + +#if 0 // untested code + /** + UNTESTED! + + Intended as a base class for JSToNative specializations + which proxy a std::map-like map. + */ + template + struct JSToNative_map + { + typedef MapT ResultType; + /** + Converts jv to a MapT object. + + If jv->IsObject() then the returned object is populated from + jv, otherwise the returned object is empty. Since it is + legal for an object to be empty, it is not generically + possible to know if this routine got an empty Object + or a non-Object handle. + */ + ResultType operator()( v8::Handle jv ) const + { + typedef ValueType VALT; + MapT map; + if( jv.IsEmpty() || ! jv->IsObject() ) return map; + Local obj( Object::Cast(*jv) ); + Local ar( obj->GetPropertyNames() ); + uint32_t ndx = 0; + for( ; ar->Has(ndx); ++ndx ) + { + Local const & k = ar->Get(Integer::New(ndx)); + if( ! obj->HasRealNamedProperty(k) ) continue; + map[CastFromJS(k)] = CastFromJS(obj->Get(k)); + } + return map; + } + }; +#endif + /** + A utility class for building up message strings, most notably + exception messages, using a mixture of native and JS message + data. + + It is used like a std::ostream: + + @code + StringBuffer msg; + msg << "Could not set property " + << "'" << propName + <<"' on object " << myJSObject << '!'; + return v8::ThrowException(msg.toError()); + // or: + return Toss(msg); + @endcode + */ + class StringBuffer + { + private: + std::ostringstream os; + public: + /** + Initializes the message stream. + */ + StringBuffer() : os() + { + } + StringBuffer(StringBuffer const & other) : os(other.os.str()) + { + } + StringBuffer & operator=(StringBuffer const & other) + { + this->os.str(other.os.str()); + return *this; + } + + /** + Empties out the message buffer. This invalidates any value + returned from previous calls to the (char const *) + operator. + */ + inline void Clear() + { + this->os.str(""); + } + + /** + Returns a copy of the current message content. + */ + inline std::string Content() const + { + return this->os.str(); + } + + /** + Converts the message state to a JS string. + */ + inline operator v8::Handle() const + { + return CastToJS( this->os.str() ); + } + + /** + Converts the message state to a v8::String (for use + with v8::Exception::Error() and friends). + */ + inline operator v8::Handle() const + { + std::string const & str(this->os.str()); + char const * cstr = str.c_str(); + return v8::String::New( cstr ? cstr : "", cstr ? str.size() : 0 ); + } + + /** + Appends to the message using CastFromJS(t) + */ + template + inline StringBuffer & operator<<( v8::Handle const & t ) + { + this->os << CastFromJS( t ); + return *this; + } + /** + Appends to the message using CastFromJS(t) + + Reminder to self: if this function is changed to take + a const reference instead of a copy, we get overload + ambiguity errors in some contexts. See: + + http://code.google.com/p/v8-juice/issues/detail?id=19 + + (And thanks to Feng Fillano for reporting and localizing + the problem.) + */ + template + inline StringBuffer & operator<<( v8::Local const t ) + { + this->os << CastFromJS( t ); + return *this; + } + + /** + Appends t to the message via std::ostream<<. + */ + template + inline StringBuffer & operator<<( T const t) + { + this->os << t; + return *this; + } + + /** + Returns this buffer's value wrapped in + a JS Error object. + */ + v8::Local toError() const + { + return v8::Exception::Error(*this); + } + }; + + /** Outputs sb.Content() to os and returns os. */ + inline std::ostream & operator<<( std::ostream & os, StringBuffer const & sb ) + { + return os << sb.Content(); + } + + + /** + Requi + "Lexically casts" msg to a string and throws a new JS-side + Error. ValT may be any type which can be sent to StringBuffer's + ostream operator. + + The return value is the result of calling + v8::ThrowException() (Undefined except in the face of a + serious internal error like OOM, i'm told by the v8 devs). + */ + template + inline v8::Handle Toss( ValT const & msg ) + { + return v8::ThrowException((StringBuffer() << msg).toError()); + } + + /** + Overload to avoid an ambiguity (and it's more efficient than + the default impl). + */ + inline v8::Handle Toss( char const * msg ) + { + return v8::ThrowException(v8::Exception::Error(v8::String::New( msg ? msg : "Unspecified error."))); + } + + /** + Eqivalent to v8::ThrowException(err). Note that if err is not an + Error object, the JS side will not get an Error object. e.g. if err + is-a String then the JS side will see the error as a string. + + The reason this does not convert err to an Error is because the v8 + API provides no way for us to know if err is already an Error object. + This function is primarily intended to be passed the results of + CastToJS(std::exception), which generates Error objects. + */ + inline v8::Handle Toss( v8::Handle const & err ) + { + return v8::ThrowException(err); + } + + /** + Efficiency overload. + */ + inline v8::Handle Toss( StringBuffer const & msg ) + { + return v8::ThrowException(msg.toError()); + } + /** + Like Toss(Handle), but converts err to a string and creates an + Error object, which is then thrown. + */ + inline v8::Handle TossAsError( v8::Handle const & err ) + { + return Toss(v8::Exception::Error(err->ToString())); + } + + /** + ArgCaster is a thin wrapper around CastFromJS(), and primarily + exists to give us a way to convert JS values to (char const *) + for purposes of passing them to native functions. The main + difference between this type and JSToNative is that this + interface explicitly allows for the conversion to be stored by + an instance of this type. That allows us to get more lifetime + out of converted values in certain cases (namely (char const*)). + + The default implementation is suitable for all cases which + JSToNative supports, but specializations can handle some of + the corner cases which JSToNative cannot (e.g. (char const *)). + + Added 20091121. + */ + template + struct ArgCaster + { + typedef typename JSToNative::ResultType ResultType; + /** + Default impl simply returns CastFromJS(v). + Specializations are allowed to store the result of the + conversion, as long as they release it when the destruct. + See ArgCaster for an example of that. + */ + inline ResultType ToNative( v8::Handle const & v ) const + { + return CastFromJS( v ); + } + /** + To eventually be used for some internal optimizations. + */ + enum { HasConstOp = 1 }; + }; + /** + Specialization for (char const *). The value returned from + ToNative() is guaranteed to be valid as long as the ArgCaster + object is alive or until ToNative() is called again (which will + almost certainly change the pointer). Holding a pointer to the + ToNative() return value after the ArgCaster is destroyed will + lead to undefined behaviour. Likewise, fetching a pointer, then + calling ToNative() a second time, will invalidate the first + pointer. + + BEWARE OF THESE LIMITATIONS: + + 1) This will only work properly for nul-terminated strings, + and not binary data! + + 2) Do not use this to pass (char const *) as a function + parameter if that function will hold a copy of the pointer + after it returns (as opposed to copying/consuming the + pointed-to-data before it returns) OR if it returns the + pointer passed to it. Returning is a specific corner-case + of "holding a copy" for which we cannot guaranty the lifetime + at the function-binding level. + + 3) Do not use the same ArgCaster object to convert multiple + arguments, as each call to ToNative() will invalidate the + pointer returned by previous calls. + + 4) The to-string conversion uses whatever encoding + JSToNative uses. + + Violating any of those leads to undefined behaviour, and + very possibly memory corruption for cases 2 or 3. + */ + template <> + struct ArgCaster + { + private: + /** + Reminder to self: we cannot use v8::String::Utf8Value + here because at the point the bindings call ToNative(), + v8 might have been unlocked, at which point dereferencing + the Utf8Value becomes illegal. + */ + std::string val; + typedef char Type; + public: + typedef Type const * ResultType; + /** + Returns the toString() value of v unless: + + - v.IsEmpty() + - v->IsNull() + - v->IsUndefined() + + In which cases it returns 0. + + The returned value is valid until: + + - ToNative() is called again. + - This object is destructed. + */ + ResultType ToNative( v8::Handle const & v ) + { + typedef JSToNative C; + if( v.IsEmpty() || v->IsNull() || v->IsUndefined() ) + { + return 0; + } + this->val = C()( v ); + return this->val.c_str(); + } + /** + To eventually be used for some internal optimizations. + */ + enum { HasConstOp = 0 }; + }; + +#if !defined(DOXYGEN) + namespace Detail { + /** + Default (unimplemented) CtorForwarderProxy impl. A helper + for the CtorForwarder class. All specializations except + the 0-arity one are generated from script code. + */ + template >::Value > + struct CtorForwarderProxy + { + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & ); + }; + + //! Specialization for 0-arity ctors. + template + struct CtorForwarderProxy + { + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & ) + { + typedef typename TypeInfo::Type RType; + return new RType; + } + }; + //! Specialization for ctors taking (v8::Arguments const &). + template + struct CtorForwarderProxy + { + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + typedef typename TypeInfo::Type T; + return new T(argv); + } + }; + + } +#endif + /** + A utility type to help forward v8::Arguments to native + constructors. This type is intended to assist in the creation + of ctor functions for JS-bound C++ classes. + + Requirements: + + - Sig is "almost" a function-signature-style type, but + because ctors don't have a return value in the conventional + sense, we have to use a tiny workaround: Sig should be passed + in like this from client code: + + @code + typedef CtorForwarder CF; + @endcode + + - (new T(...)) must be legal, taking a number of + arguments equal to Sig's Arity. + + - All arguments to the native ctor must be convertible + using CastFromJS(). + + Example: + + @code + typedef CtorForwarder CF0; + typedef CtorForwarder CF1; + typedef CtorForwarder CF2; + typedef CtorForwarder CFAny; + @endcode + + @see CtorArityDispatcher + */ + template + struct CtorForwarder : Signature + { + typedef Signature STL; + //typedef typename tmp::AddPointer::Type ReturnType; + typedef typename STL::ReturnType ReturnType; + /** + If (argv.Length()>=Arity) or Arity is less than 0, + then the constructor is called with Arity arguments + (if it >=0) or with 1 v8::Arguments parameter (for Arity<0). + + Returns the result of (new Type(...)), transfering ownership + to the caller. + + May propagate native exceptions. + */ + static ReturnType Call( v8::Arguments const & argv ) + { + enum { Arity = sl::Arity< STL >::Value }; + typedef Detail::CtorForwarderProxy Proxy; + return Proxy::Call( argv ); + } + }; + +#if !defined(DOXYGEN) + namespace Detail + { + + /** + Internal dispatch routine. CTOR _must_ be a CtorForwarder implementation + (or interface-compatible). + */ + template + struct CtorFwdDispatch + { + typedef typename TypeInfo::NativeHandle ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + return CTOR::Call( argv ); + } + }; + /** + Internal dispatch end-of-list routine. + */ + template + struct CtorFwdDispatch + { + typedef typename TypeInfo::NativeHandle ReturnType; + static ReturnType Call( v8::Arguments const & ) + { + return 0; + } + }; + /** + Internal type to dispatch a v8::Arguments list to one of + several a bound native constructors, depending on on the + argument count. + + List MUST be a Signature< ... > containing ONLY + CtorFowarder types (or compatible). + */ + template + struct CtorFwdDispatchList + { + typedef typename TypeInfo::NativeHandle ReturnType; + /** + Tries to dispatch Arguments to one of the constructors + in the List type, based on the argument count. + */ + static ReturnType Call( v8::Arguments const & argv ) + { + typedef typename List::Head CTOR; + typedef typename List::Tail Tail; + enum { Arity = (0==sl::Index::Value) + ? -1 : sl::Length::Value + }; + return ( (Arity < 0) || (Arity == argv.Length()) ) + ? CtorFwdDispatch< T, CTOR >::Call(argv ) + : CtorFwdDispatchList::Call(argv); + } + }; + /** + End-of-list specialization. + */ + template + struct CtorFwdDispatchList + { + typedef typename TypeInfo::NativeHandle ReturnType; + /** Writes an error message to errmsg and returns 0. */ + static ReturnType Call( v8::Arguments const & argv ) + { + StringBuffer msg; + msg << "No native constructor was defined for "<, + CtorForwarder, + CtorForwarder, + CtorForwarder + )> Ctors; + @endcode + + All entries in the typelist must be interface-compatible with + CtorForwarder. No two entries should have the same number + of arguments with one exception: an InvocationCallback-like + function taking (v8::Arguments const &) can be used as a + catch-all for any number of arguments. If used, it must be + the LAST entry because it will always match any argument + count (and will therefore trump any which (would) come after + it. + + The ctors are dispatched based solely on the argument count, + not their types. The first one with a matching arity + is called. + + IN THEORY (untested), the factories passed in the list may + legally return a type publically derived from + CtorList::ReturnType. + */ + template + struct CtorArityDispatcher + { + typedef typename CtorList::ReturnType RT; + typedef typename TypeInfo::NativeHandle NativeHandle; + static NativeHandle Call( v8::Arguments const & argv ) + { + typedef typename tmp::PlainType::Type Type; + typedef Detail::CtorFwdDispatchList Proxy; + return Proxy::Call( argv ); + } + }; + +} // namespaces + + +#endif /* CODE_GOOGLE_COM_P_V8_CONVERT_CORE_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/detail/doxygen_hack.hpp b/vendor/libv8-convert/cvv8/detail/doxygen_hack.hpp new file mode 100644 index 000000000..85778705d --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/doxygen_hack.hpp @@ -0,0 +1,28 @@ +/** @file doxygen_hack.hpp + + doxygen REFUSES to document class templates i forward-decl, even when + adding "@class" to the docs. Being the doc-pedant that i am, i felt + compelled to work around that. With gcc we can add an empty body to + those classes but MSVC doesn't like it. So we leave it out unless + doxygen is building, and then doxygen needs to be configured with: + + - ENABLE_PREPROCESSING = YES + - EXPAND_AS_DEFINED = DOXYGEN_FWD_DECL_KLUDGE + + and possibly: + + - MACRO_EXPANSION = YES + + and/or: + + - EXPAND_ONLY_PREDEF = YES +*/ +#if !defined(DOXYGEN) +# if !defined DOXYGEN_FWD_DECL_KLUDGE +# define DOXYGEN_FWD_DECL_KLUDGE +# endif +#else +# if !defined DOXYGEN_FWD_DECL_KLUDGE +# define DOXYGEN_FWD_DECL_KLUDGE {} +# endif +#endif diff --git a/vendor/libv8-convert/cvv8/detail/invocable_core.hpp b/vendor/libv8-convert/cvv8/detail/invocable_core.hpp new file mode 100644 index 000000000..a47b3dcb8 --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/invocable_core.hpp @@ -0,0 +1,2202 @@ +#if !defined(CODE_GOOGLE_COM_V8_CONVERT_INVOCABLE_V8_HPP_INCLUDED) +#define CODE_GOOGLE_COM_V8_CONVERT_INVOCABLE_V8_HPP_INCLUDED 1 + +/** @file invocable_core.hpp + +This file houses the core-most "invocation-related" parts of the +v8-convert API. These types and functions are for converting +free and member functions to v8::InvocationCallback functions +so that they can be tied to JS objects. It relies on the +CastToJS() and CastFromJS() functions to do non-function type +conversion. + +*/ + +#include "convert_core.hpp" +#include "signature_core.hpp" + +namespace cvv8 { + +/** + A concept class, primarily for documentation and tag-type purposes. +*/ +struct InCa +{ + /** + Matches the v8::InvocationCallback interface. All function bindings + created by this framework use Call() as their class-level + InvocationCallback interface. Some bindings provide additional + overloads as well. + */ + static v8::Handle Call( v8::Arguments const & ); +}; + +/** + A tag type for use with FunctionTo and MethodTo. +*/ +struct InCaVoid : InCa {}; + + +/** + Partial specialization for v8::InvocationCallback-like functions + (differing only in their return type) with an Arity value of -1. +*/ +template +struct FunctionSignature< RV (v8::Arguments const &) > : Signature +{ + typedef RV (*FunctionType)(v8::Arguments const &); +}; + +/** + Partial specialization for v8::InvocationCallback-like non-const + member functions (differing only in their return type) with an + Arity value of -1. +*/ +template +struct MethodSignature< T, RV (v8::Arguments const &) > : Signature< RV (v8::Arguments const &) > +{ + typedef T Type; + typedef RV (T::*FunctionType)(v8::Arguments const &); +}; + +/** + Partial specialization for v8::InvocationCallback-like const member + functions (differing only in their return type) with an Arity value + of -1. +*/ +template +struct ConstMethodSignature< T, RV (v8::Arguments const &) > : Signature< RV (v8::Arguments const &) > +{ + typedef T Type; + typedef RV (T::*FunctionType)(v8::Arguments const &) const; +}; + +/** + Full specialization for InvocationCallback and + InvocationCallback-like functions (differing only by their return + type), which uses an Arity value of -1. +*/ +template +struct FunctionPtr + : FunctionSignature +{ + public: + typedef FunctionSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename SignatureType::FunctionType FunctionType; + static FunctionType GetFunction() + { + return FuncPtr; + } +}; + +/** + Full specialization for InvocationCallback and + InvocationCallback-like functions (differing only by their return + type), which uses an Arity value of -1. +*/ +template +struct MethodPtr + : MethodSignature +{ + typedef MethodSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename SignatureType::FunctionType FunctionType; + static FunctionType GetFunction() + { + return FuncPtr; + } +}; + +/** + Full specialization for InvocationCallback and + InvocationCallback-like functions (differing only by their return + type), which uses an Arity value of -1. +*/ +template +struct ConstMethodPtr + : ConstMethodSignature +{ + typedef ConstMethodSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename SignatureType::FunctionType FunctionType; + static FunctionType GetFunction() + { + return FuncPtr; + } +}; + +#if !defined(DOXYGEN) +namespace Detail { + /** + A sentry class which instantiates a v8::Unlocker + if the boolean value is true or is a no-op if it is false. + */ + template struct V8Unlocker {}; + + /** + Equivalent to v8::Unlocker. + */ + template <> + struct V8Unlocker : v8::Unlocker + { + }; + + +} +#endif + +/** + A metatemplate which we can use to determine if a given type + is "safe" to use in conjunction with v8::Unlock. + + We optimistically assume that most types are safe and + add specializations for types we know are not safe, e.g. + v8::Handle and v8::Arguments. + + Specializations of this type basically make up a collective + "blacklist" of types which we know are not legal to use unless + v8 is locked by our current thread. As new problematic types are + discovered, they can be added to the blacklist by introducing a + specialization of this class. +*/ +template +struct IsUnlockable : tmp::BoolVal {}; +template +struct IsUnlockable : IsUnlockable {}; +template +struct IsUnlockable : IsUnlockable {}; +template +struct IsUnlockable : IsUnlockable {}; +template +struct IsUnlockable : IsUnlockable {}; + +/** + Explicit instantiation to make damned sure that nobody + re-sets this one. We rely on these semantics for + handling FunctionSignature like Const/MethodSignature + in some cases. +*/ +template <> +struct IsUnlockable : tmp::BoolVal {}; + +/* + Todo?: find a mechanism to cause certain highly illegal types to + always trigger an assertion... We could probably do it by + declaring but not definiting JSToNative/NativeToJS + specialializations. +*/ +template <> +struct IsUnlockable : tmp::BoolVal {}; + +template <> +struct IsUnlockable : tmp::BoolVal {}; + +template +struct IsUnlockable< v8::Handle > : tmp::BoolVal {}; + +template +struct IsUnlockable< v8::Persistent > : tmp::BoolVal {}; + +template +struct IsUnlockable< v8::Local > : tmp::BoolVal {}; + +template <> +struct IsUnlockable : tmp::BoolVal {}; + +/** + Given a tmp::TypeList-compatible type list, this metafunction's + Value member evalues to true if IsUnlockable::Value is + true for all types in TList, else Value evaluates to false. + As a special case, an empty list evaluates to true because in this + API an empty list will refer to a function taking no arguments. +*/ +template +struct TypeListIsUnlockable : tmp::BoolVal< + IsUnlockable::Value && TypeListIsUnlockable::Value + > +{ +}; + +//! End-of-typelist specialization. +template <> +struct TypeListIsUnlockable< tmp::NilType > : tmp::BoolVal +{}; +/** + Given a Signature, this metafunction's Value member + evaluates to true if: + + - IsUnlockable::Value is true and... + + - IsUnlockable::Value is true (only relavent + for Const/MethodSignature, not FunctionSignature) and... + + - TypeListIsUnlockable< SigTList >::Value is true. + + If the value is true, the function signature has passed the most + basic check for whether or not it is legal to use v8::Unlocker + to unlock v8 before calling a function with this signature. Note + that this is a best guess, but this code cannot know + app-specific conditions which might make this guess invalid. + e.g. if a bound function itself uses v8 and does not explicitly + acquire a lock then the results are undefined (and will very + possibly trigger an assertion in v8, killing the app). Such + things can and do happen. If you're lucky, you're building + against a debug version of libv8 and its assertion text will + point you directly to the JS code which caused the assertion, + then you can disable unlocking support for that binding. + + If you want to disable unlocking for all bound members of a given + class, create an IsUnlockable specialization whos Value + member evaluates to false. Then no functions/methods using that + class will cause this metafunction to evaluate to true. + + Note that FunctionToInCa, Const/MethodToInCa, etc., are all + Signature subclasses, and can be used directly with + this template. + + Example: + + @code + // This one can be unlocked: + typedef FunctionSignature< int (int) > F1; + // SignatureIsUnlockable::Value == true + + // This one cannot because it contains a v8 type in the arguments: + typedef FunctionSignature< int (v8::Handle) > F2; + // SignatureIsUnlockable::Value == false + @endcode + + For Const/MethodToInCa types, this check will also fail if + IsUnlockable< SigTList::Context >::Value is false. +*/ +template +struct SignatureIsUnlockable : tmp::BoolVal< + IsUnlockable::Value && + IsUnlockable::Value && + IsUnlockable::Value && + SignatureIsUnlockable::Value + > {}; +//! End-of-list specialization. +template <> +struct SignatureIsUnlockable : tmp::BoolVal {}; + +/** + Internal exception type to allow us to differentiate + "no native 'this' pointer found" errors from all other + exceptions. It is thrown by the CallNative() functions + of various JS-to-Native function forwarders. +*/ +struct MissingThisException +{ +protected: + StringBuffer msg; + template + void init() + { + this->msg << "CastFromJS<"<< TypeName::Value + << ">() returned NULL. Throwing to avoid " + << "dereferencing a NULL pointer!"; + } + MissingThisException() {} +public: + /** + Returns the exception message text, which does not change + after construction. + */ + StringBuffer const & Buffer() const { return msg; } +}; + + +/** + This special-case convenience form of Toss() triggers a JS-side + exception containing an English-language message explaining that + CastFromJS() failed, i.e. the native 'this' pointer for a bound + native T object could not be found. It uses TypeName::Value as the + class' name. + + This is primarily intended for use in two cases: + + - Internally in the cvv8 binding mechanisms. + + - In client code when binding non-member functions as JS-side methods of + native objects. + + Returns the result of v8::ThrowException(...). + + Example: + + @code + v8::Handle my_bound_func( v8::Arguments const & argv ) { + T * self = CastFromJS( argv.This() ); + if( ! self ) { + return TossMissingThis(); + } + ... + } + @endcode + + BUG: TypeName::Value is NOT used here because... If we instantiate + TypeName<> from here then we require a value for TypeName<>::Value or we + break FunctorTo and friends (because TypeName'ing functors isn't always + possible). The problem with that is that i want to use TypeName::Value's + address as a type key and that can't work cross-DLL on Windows (and + possibly other platforms) if we have a default value for TypeName::Value. + i hope to eventually find a solution which is both cross-platform and + allows us to invoke TypeName::Value from here. +*/ +template +v8::Handle TossMissingThis() +{ + return Toss(StringBuffer()<<"CastFromJS<" +#if 0 + <::Value +#else + <<'T' +#endif + <<">() returned NULL! Cannot find 'this' pointer!"); +} + +#if !defined(DOXYGEN) +namespace Detail { +/** Temporary internal macro. Undef'd at the end of this file. */ +#define HANDLE_PROPAGATE_EXCEPTION catch( MissingThisException const & ){ return TossMissingThis(); } \ + catch(...){ throw; } (void)0/* (void)0 is a hack to help emacs' indentation out!*/ + + /** + A MissingThisException type holding generic + message text which references TypeName::Value + as being the problematic class. + */ + template + struct MissingThisExceptionT : MissingThisException + { + MissingThisExceptionT() + { + this->init(); + } + }; + +/** + Temporary internal macro to trigger a static assertion if unlocking + support is requested but cannot be implemented for the given + wrapper due to constraints on our use of v8 when it is unlocked. + + This differs from ASSERT_UNLOCK_SANITY_CHECK in that this is intended + for use with functions which we _know_ (while coding, as opposed to + finding out at compile time) are not legally unlockable. +*/ +#define ASSERT_UNLOCKV8_IS_FALSE typedef char ThisSpecializationCannotUseV8Unlocker[!UnlockV8 ? 1 : -1] +/** + Temporary internal macro to trigger a static assertion if: + UnlockV8 is true and SignatureIsUnlockable::Value is false. + This is to prohibit that someone accidentally enables locking + when using a function type which we know (based on its + signature's types) cannot obey the (un)locking rules. +*/ +#define ASSERT_UNLOCK_SANITY_CHECK typedef char AssertCanEnableUnlock[ \ + !UnlockV8 ? 1 : (SignatureIsUnlockable< SignatureType >::Value ? 1 : -1) \ + ] + + template >::Value > + struct FunctionForwarder DOXYGEN_FWD_DECL_KLUDGE; + + template + struct FunctionForwarder + : FunctionSignature + { + public: + typedef FunctionSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + return (RV) func(argv); + } + + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + + ASSERT_UNLOCKV8_IS_FALSE; + typedef char AssertArity[ sl::Arity::Value == -1 ? 1 : -1]; + }; + + //! Reminder to self: we really do need this specialization for some cases. + template + struct FunctionForwarder + : FunctionForwarder + {}; + + template + struct FunctionForwarder<0,Sig, UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename SignatureType::FunctionType FunctionType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return func(); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + ASSERT_UNLOCK_SANITY_CHECK; + typedef char AssertArity[ sl::Arity::Value == 0 ? 1 : -1]; + }; + + template >::Value> + struct FunctionForwarderVoid DOXYGEN_FWD_DECL_KLUDGE; + + template + struct FunctionForwarderVoid<0,Sig, UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef Sig FunctionType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)func() + /* the explicit cast there is a workaround for the RV==void + case. It is a no-op for other cases, since the return value + is already RV. Some compilers (MSVC) don't allow an explicit + return of a void expression without the cast. + */; + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + ASSERT_UNLOCK_SANITY_CHECK; + typedef char AssertArity[ sl::Arity::Value == 0 ? 1 : -1]; + }; + + template + struct FunctionForwarderVoid + : FunctionSignature + { + public: + typedef FunctionSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)func(argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + ASSERT_UNLOCKV8_IS_FALSE; + typedef char AssertArity[ sl::Arity::Value == -1 ? 1 : -1]; + }; + + /** + Internal impl for cvv8::ConstMethodForwarder. + */ + template >::Value + > + struct MethodForwarder DOXYGEN_FWD_DECL_KLUDGE; + + + template + struct MethodForwarder : MethodSignature + { + public: + typedef MethodSignature SignatureType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename TypeInfo::Type Type; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (self.*func)(); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( self, func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + + ASSERT_UNLOCK_SANITY_CHECK; + }; + + template + struct MethodForwarder + : MethodSignature + { + public: + typedef MethodSignature SignatureType; + typedef char AssertArity[ sl::Arity::Value == -1 ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + return (self.*func)(argv); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( self, func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative(func, argv) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + ASSERT_UNLOCKV8_IS_FALSE; + }; + + template + struct MethodForwarder : + MethodForwarder + {}; + + template >::Value + > + struct MethodForwarderVoid DOXYGEN_FWD_DECL_KLUDGE; + + template + struct MethodForwarderVoid + : MethodSignature + { + public: + typedef MethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef T Type; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( Type & self, FunctionType func, v8::Arguments const & ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)(); + } + static v8::Handle Call( Type & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid + : MethodSignature + { + public: + typedef MethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename TypeInfo::Type Type; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( Type & self, FunctionType func, v8::Arguments const & argv ) + { + return (ReturnType)(self.*func)(argv); + } + static v8::Handle Call( Type & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + ASSERT_UNLOCKV8_IS_FALSE; + }; + + template + struct MethodForwarderVoid + : MethodForwarderVoid + {}; + + /** + Internal impl for cvv8::ConstMethodForwarder. + */ + template >::Value + > + struct ConstMethodForwarder DOXYGEN_FWD_DECL_KLUDGE; + + template + struct ConstMethodForwarder : ConstMethodSignature + { + public: + typedef ConstMethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (self.*func)(); + } + + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( self, func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative(func, argv) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarder + : ConstMethodSignature + { + public: + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ sl::Arity::Value == -1 ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + return (ReturnType)(self.*func)(argv); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( self, func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative(func, argv) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + ASSERT_UNLOCKV8_IS_FALSE; + }; + + template + struct ConstMethodForwarder + : ConstMethodForwarder + {}; + + template >::Value + > + struct ConstMethodForwarderVoid DOXYGEN_FWD_DECL_KLUDGE; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + public: + typedef ConstMethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename TypeInfo::Type Type; + static ReturnType CallNative( Type const & self, FunctionType func, v8::Arguments const & ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)(); + } + + static v8::Handle Call( Type const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + + template + struct ConstMethodForwarderVoid + : ConstMethodSignature + { + public: + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ sl::Arity::Value == -1 ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + typedef typename TypeInfo::Type Type; + static ReturnType CallNative( Type const & self, FunctionType func, v8::Arguments const & argv ) + { + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)(); + } + static v8::Handle Call( Type const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + return CastToJS( CallNative( func, argv ) ); + } + HANDLE_PROPAGATE_EXCEPTION; + } + ASSERT_UNLOCKV8_IS_FALSE; + }; + + template + struct ConstMethodForwarderVoid + : ConstMethodForwarderVoid + {}; + +} +#endif // DOXYGEN + +/** + A helper type for passing v8::Arguments lists to native non-member + functions. + + Sig must be a function-signature-like argument. e.g. , + and the members of this class expect functions matching that signature. + + If UnlockV8 is true then v8::Unlocker will be used to unlock v8 + for the duration of the call to Func(). HOWEVER... (the rest of + these docs are about the caveats)... + + A UnlockV8 value of SignatureIsUnlockable::Value uses a + reasonably sound heuristic but it cannot predict certain + app-dependent conditions which render its guess semantically + invalid. See SignatureIsUnlockable for more information. + + It is illegal for UnlockV8 to be true if ANY of the following + applies: + + - The callback itself will "use" v8 but does not explicitly use + v8::Locker. If it uses v8::Locker then it may safely enable + unlocking support. We cannot determine via templates whether + or not a function "uses" v8 except by guessing based on the + return and arguments types. + + - Any of the return or argument types for the function are v8 + types, e.g. v8::Handle or v8::Arguments. + SignatureIsUnlockable::Value will evaluate to false + if any of the "known bad" types is contained in the function's + signature. If this function is given a true value but + SignatureIsUnlockable::Value is false then + a compile-time assertion will be triggered. + + - Certain callback signatures cannot have unlocking support + enabled because if we unlock then we cannot legally access the data + we need to convert. These will cause a compile-time assertion + if UnlockV8 is true. All such bits are incidentally covered by + SignatureIsUnlockable's check, so this assertion can + only happen if the client explicitly sets UnlockV8 to true for + those few cases. + + - There might be other, as yet unknown/undocumented, corner cases + where unlocking v8 is semantically illegal at this level of the + API. + + Violating any of these leads to undefined behaviour. The library + tries to fail at compile time for invalid combinations when it + can, but (as described aboved) it can be fooled into thinking that + unlocking is safe. + + Reminder to self: we can implement this completely via inheritance of + the internal Proxy type, but i REALLY want the API docs out here at this + level instead of in the Detail namespace (which i filter out of doxygen + for the most part). +*/ +template >::Value +> +struct FunctionForwarder +{ +private: + typedef typename tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::FunctionForwarderVoid< sl::Arity< Signature >::Value, Sig, UnlockV8 >, + Detail::FunctionForwarder< sl::Arity< Signature >::Value, Sig, UnlockV8 > + >::Type + Proxy; +public: + typedef typename Proxy::SignatureType SignatureType; + typedef typename Proxy::ReturnType ReturnType; + typedef typename Proxy::FunctionType FunctionType; + /** + Passes the given arguments to func(), converting them to the appropriate + types. If argv.Length() is less than sl::Arity< SignatureType >::Value then + a JS exception is thrown, with one exception: if the function has "-1 arity" + (i.e. it is InvocationCallback-like) then argv is passed on to it regardless + of the value of argv.Length(). + + The native return value of the call is returned to the caller. + */ + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + return Proxy::CallNative( func, argv ); + } + /** + Equivalent to CastToJS( CallNative(func,argv) ) unless ReturnType + is void, in which case CastToJS() is not invoked and v8::Undefined() + will be returned. + */ + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return Proxy::Call( func, argv ); + } +}; + +/** + CallForwarder basically does the opposite of FunctionForwarder: it + converts native arguments to JS and calls a JS function. + + The default implementation is useless - it must be specialized + for each arity. +*/ +template +struct CallForwarder +{ + /** + Implementations must be templates taking Arity arguments in addition + to the first two. All argument types must legal for use with + CastToJS(). + + If either self or func.IsEmpty() then a JS exception must be thrown, + else implementations must return func->Call(self, N, ARGS), where + ARGS is an array of v8::Handle and N is the number of + items in that array (and, not coincidentally, is the same value as + Arity). The ARGS array must be populated by calling CastToJS(ARG_N) + for each argument, where ARG_N is the Nth argument. + */ + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + ... ); + /** + Convenience form of Call() which must be equivalent to + Call(func,func,...). + */ + static v8::Handle Call( v8::Handle const & func, ... ); +}; + +//! Specialization for 0-arity calls. +template <> +struct CallForwarder<0> +{ + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func ) + { + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, 0, NULL); + } + static v8::Handle Call( v8::Handle const & func ) + { + return Call( func, func ); + } +}; + + +#if !defined(DOXYGEN) +namespace Detail { + + /** + Base internal implementation of cvv8::FunctionToInCa. + */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< FunctionSignature >::Value > + struct FunctionToInCa : FunctionPtr, InCa + { + + typedef FunctionSignature SignatureType; + typedef FunctionForwarder< sl::Arity::Value, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( v8::Arguments const & argv ) + { + return (ReturnType)Proxy::CallNative( Func, argv ); + /** + The (ReturnType) cast is effectively a no-op for all types + except void, where it is used to get around a limitation in + some compilers which does not allow us to explicitly return + foo() when foo() returns void. + */ + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + + /** Almost identical to FunctionToInCa, but expressly does not + instantiate NativeToJS< Signature::ReturnType >, meaning + that: + + a) it can proxy functions which have non-convertible return types. + + b) JS always gets the 'undefined' JS value as the return value. + */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< FunctionSignature >::Value > + struct FunctionToInCaVoid : FunctionPtr, InCa + { + typedef FunctionSignature SignatureType; + typedef FunctionForwarderVoid< sl::Arity::Value, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( v8::Arguments const & argv ) + { + return (ReturnType)Proxy::CallNative( Func, argv ); + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + + /** Method equivalent to FunctionToInCa. */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< MethodSignature >::Value + > + struct MethodToInCa : MethodPtr, InCa + { + typedef MethodPtr SignatureType; + enum { Arity = sl::Arity::Value }; + typedef MethodForwarder< T, Arity, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, v8::Arguments const & argv ) + { + return Proxy::CallNative( self, Func, argv ); + } + static ReturnType CallNative( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( T & self, v8::Arguments const & argv ) + { + return Proxy::Call( self, Func, argv ); + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + + /** Method equivalent to FunctionToInCaVoid. */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< MethodSignature >::Value + > + struct MethodToInCaVoid : MethodPtr, InCa + { + typedef MethodPtr SignatureType; + enum { Arity = sl::Arity::Value }; + typedef MethodForwarderVoid< T, Arity, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, v8::Arguments const & argv ) + { + return Proxy::CallNative( self, Func, argv ); + } + static ReturnType CallNative( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( T & self, v8::Arguments const & argv ) + { + return Proxy::Call( self, Func, argv ); + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + + /** Const method equivalent to MethodToInCa. */ + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< ConstMethodSignature >::Value + > + struct ConstMethodToInCa : ConstMethodPtr, InCa + { + typedef ConstMethodPtr SignatureType; + typedef ConstMethodForwarder< T, sl::Arity::Value, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, v8::Arguments const & argv ) + { + return Proxy::CallNative( self, Func, argv ); + } + static ReturnType CallNative( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( T const & self, v8::Arguments const & argv ) + { + return Proxy::Call( self, Func, argv ); + } + }; + + template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< ConstMethodSignature >::Value + > + struct ConstMethodToInCaVoid : ConstMethodPtr, InCa + { + typedef ConstMethodPtr SignatureType; + typedef ConstMethodForwarderVoid< T, sl::Arity::Value, Sig, UnlockV8 > Proxy; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, v8::Arguments const & argv ) + { + return Proxy::CallNative( self, Func, argv ); + } + static ReturnType CallNative( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( v8::Arguments const & argv ) + { + return Proxy::Call( Func, argv ); + } + static v8::Handle Call( T const & self, v8::Arguments const & argv ) + { + return Proxy::Call( self, Func, argv ); + } + ASSERT_UNLOCK_SANITY_CHECK; + }; + +} // Detail namespace +#endif // DOXYGEN +#undef ASSERT_UNLOCK_SANITY_CHECK +#undef ASSERT_UNLOCKV8_IS_FALSE + + +/** + A template for converting free (non-member) function pointers + to v8::InvocationCallback. + + Sig must be a function signature. Func must be a pointer to a function + with that signature. + + If UnlockV8 is true then v8::Unlocker will be used to unlock v8 + for the duration of the call to Func(). HOWEVER... see + FunctionForwarder for the details/caveats regarding that + parameter. + + Example: + + @code + v8::InvocationCallback cb = + FunctionToInCa< int (int), ::putchar>::Call; + @endcode +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< Signature >::Value + > +struct FunctionToInCa + : tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::FunctionToInCaVoid< Sig, Func, UnlockV8>, + Detail::FunctionToInCa< Sig, Func, UnlockV8> + >::Type +{}; + +/** + A variant of FunctionToInCa with the property of NOT invoking the + conversion of the function's return type from native to JS form. i.e. it + does not cause NativeToJS< Signature::ReturnType > to be + instantiated. This is useful when such a conversion is not legal because + CastToJS() won't work on it or, more generally, when you want the JS + interface to always get the undefined return value. + + Call() always returns v8::Undefined(). CallNative(), however, + returns the real return type specified by Sig (which may be void). + + Example: + + @code + v8::InvocationCallback cb = + FunctionToInCaVoid< int (int), ::putchar>::Call; + @endcode +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< Signature >::Value + > +struct FunctionToInCaVoid : Detail::FunctionToInCaVoid< Sig, Func, UnlockV8> +{}; + + +/** + A template for converting non-const member function pointers to + v8::InvocationCallback. If T is const qualified then this works + as for ConstMethodToInCaVoid. + + To convert JS objects to native 'this' pointers this API uses + CastFromJS(arguments.This()), where arguments is the + v8::Arguments instance passed to the generated InvocationCallback + implementation. If that conversion fails then the generated + functions will throw a JS-side exception when called. + + T must be some client-specified type which is presumably bound (or + at least bindable) to JS-side Objects. Sig must be a member + function signature for T. Func must be a pointer to a function with + that signature. + + See FunctionForwarder for details about the UnlockV8 parameter. + + Example: + + @code + v8::InvocationCallback cb = + MethodToInCa::Call; + // For const methods: + cb = MethodToInCa::Call; + @endcode +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< MethodSignature >::Value + > +struct MethodToInCa + : tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::MethodToInCaVoid, + Detail::MethodToInCa + >::Type +{ +}; + +/** + See FunctionToInCaVoid - this is identical exception that it + works on member functions of T. If T is const qualified + then this works as for ConstMethodToInCaVoid. + + Example: + + @code + v8::InvocationCallback cb = + MethodToInCaVoid< T, int (int), &T::myFunc>::Call; + @endcode + +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< MethodSignature >::Value + > +struct MethodToInCaVoid + : Detail::MethodToInCaVoid +{ +}; + +#if !defined(DOXYGEN) +namespace Detail { + template + struct FunctorToInCaSelector : ConstMethodForwarder >::Value, Sig, UnlockV8> + { + }; + template + struct FunctorToInCaSelector : ConstMethodForwarderVoid >::Value, Sig, UnlockV8> + {}; +} +#endif + +/** + This class converts a functor to an InvocationCallback. Ftor must + be a functor type. Sig must be a signature unambiguously matching + a Ftor::operator() implementation and Ftor::operator() must be + const. UnlockV8 is as described for FunctionToInCa. +*/ +template >::Value + > +struct FunctorToInCa : InCa +{ + inline static v8::Handle Call( v8::Arguments const & argv ) + { + typedef Detail::FunctorToInCaSelector< + typename Signature::ReturnType, Ftor, Sig, UnlockV8 + > Proxy; + return Proxy::Call( Ftor(), &Ftor::operator(), argv ); + } +}; + +/** + The functor equivalent of FunctionToInCaVoid. See FunctorToInCa for + the requirements of the Ftor and Sig types. +*/ +template >::Value + > +struct FunctorToInCaVoid : InCa +{ + inline static v8::Handle Call( v8::Arguments const & argv ) + { + typedef Detail::FunctorToInCaSelector< + void, Ftor, Sig, UnlockV8 + > Proxy; + return Proxy::Call( Ftor(), &Ftor::operator(), argv ); + } +}; + +/** + Functionally identical to MethodToInCa, but for const member functions. + + See FunctionForwarder for details about the UnlockV8 parameter. + + Note that the Sig signature must be suffixed with a const qualifier! + + Example: + + @code + v8::InvocationCallback cb = + ConstMethodToInCa< T, int (int), &T::myFunc>::Call; + @endcode + +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< ConstMethodSignature >::Value + > +struct ConstMethodToInCa +#if 0 // not working due to an ambiguous Sig vs Sig. Kinda weird, since MethodToInCa works. + : MethodToInCa {}; +#else + : tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::ConstMethodToInCaVoid, + Detail::ConstMethodToInCa + >::Type +{}; +#endif +/** + See FunctionToInCaVoid - this is identical exception that it + works on const member functions of T. + + Note that the Sig signature must be suffixed with a const qualifier! + + Example: + + @code + v8::InvocationCallback cb = + ConstMethodToInCaVoid< T, int (int), &T::myFunc>::Call; + @endcode + +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< ConstMethodSignature >::Value + > +struct ConstMethodToInCaVoid : Detail::ConstMethodToInCaVoid +{}; + +/** + Identicial to FunctionForwarder, but works on non-const + member methods of type T. + + Sig must be a function-signature-like argument. e.g. , and the members of this class expect T member + functions matching that signature. +*/ +template >::Value> +struct MethodForwarder +{ +private: + typedef typename + tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::MethodForwarderVoid< T, sl::Arity< Signature >::Value, Sig, UnlockV8 >, + Detail::MethodForwarder< T, sl::Arity< Signature >::Value, Sig, UnlockV8 > + >::Type + Proxy; +public: + typedef typename Proxy::SignatureType SignatureType; + typedef typename Proxy::FunctionType FunctionType; + typedef typename Proxy::ReturnType ReturnType; + /** + Passes the given arguments to (self.*func)(), converting them + to the appropriate types. If argv.Length() is less than + sl::Arity::Value then a JS exception is + thrown, with one exception: if the function has "-1 arity" + (i.e. it is InvocationCallback-like) then argv is passed on + to it regardless of the value of argv.Length(). + */ + inline static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + return Proxy::Call( self, func, argv ); + } + + /** + Like the 3-arg overload, but tries to extract the (T*) object using + CastFromJS(argv.This()). + */ + inline static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return Proxy::Call( func, argv ); + } +}; + + +/** + Identical to MethodForwarder, but works on const member methods. +*/ +template >::Value + > +struct ConstMethodForwarder +#if 1 //?msvc Seems to work. +: MethodForwarder {}; +#else +{ +private: + typedef typename + tmp::IfElse< tmp::SameType::ReturnType>::Value, + Detail::ConstMethodForwarderVoid< T, sl::Arity< Signature >::Value, Sig, UnlockV8 >, + Detail::ConstMethodForwarder< T, sl::Arity< Signature >::Value, Sig, UnlockV8 > + >::Type + Proxy; +public: + typedef typename Proxy::SignatureType SignatureType; + typedef typename Proxy::FunctionType FunctionType; + + /** + Passes the given arguments to (self.*func)(), converting them + to the appropriate types. If argv.Length() is less than + sl::Arity< Signature >::Value then a JS exception is thrown, with one + exception: if the function has "-1 arity" (i.e. it is + InvocationCallback-like) then argv is passed on to it + regardless of the value of argv.Length(). + */ + inline static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + return Proxy::Call( self, func, argv ); + } + + /** + Like the 3-arg overload, but tries to extract the (T const *) + object using CastFromJS(argv.This()). + */ + inline static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return Proxy::Call( func, argv ); + } +}; +#endif + +/** + Tries to forward the given arguments to the given native + function. Will fail if argv.Lengt() is not at least + sl::Arity>::Value, throwing a JS exception in that + case _unless_ the function is InvocationCallback-like, in which + case argv is passed directly to it regardless of the value of + argv.Length(). +*/ +template +inline typename FunctionSignature::ReturnType +forwardFunction( Sig func, v8::Arguments const & argv ) +{ + typedef FunctionSignature MSIG; + typedef typename MSIG::ReturnType RV; + enum { Arity = sl::Arity< Signature >::Value }; + typedef typename + tmp::IfElse< tmp::SameType::Value, + Detail::FunctionForwarderVoid< Arity, Sig >, + Detail::FunctionForwarder< Arity, Sig > + >::Type Proxy; + return (RV)Proxy::CallNative( func, argv ); +} + +/** + Works like forwardFunction(), but forwards to the + given non-const member function and treats the given object + as the 'this' pointer. +*/ +template +inline typename MethodSignature::ReturnType +forwardMethod( T & self, + Sig func, + /* if i do: typename MethodSignature::FunctionType + then this template is never selected. */ + v8::Arguments const & argv ) +{ + typedef MethodSignature MSIG; + typedef typename MSIG::ReturnType RV; + enum { Arity = sl::Arity< MSIG >::Value }; + typedef typename + tmp::IfElse< tmp::SameType::Value, + Detail::MethodForwarderVoid< T, Arity, Sig >, + Detail::MethodForwarder< T, Arity, Sig > + >::Type Proxy; + return (RV)Proxy::CallNative( self, func, argv ); +} + +/** + Like the 3-arg forwardMethod() overload, but + extracts the native T 'this' object from argv.This(). + + Note that this function requires that the caller specify + the T template parameter - it cannot deduce it. +*/ +template +inline typename MethodSignature::ReturnType +forwardMethod(Sig func, v8::Arguments const & argv ) +{ + typedef MethodSignature MSIG; + typedef typename MSIG::ReturnType RV; + enum { Arity = sl::Arity< MSIG >::Value }; + typedef typename + tmp::IfElse< tmp::SameType::Value, + Detail::MethodForwarderVoid< T, Arity, Sig >, + Detail::MethodForwarder< T, Arity, Sig > + >::Type Proxy; + return (RV)Proxy::CallNative( func, argv ); +} + + +/** + Works like forwardMethod(), but forwards to the given const member + function and treats the given object as the 'this' pointer. + +*/ +template +inline typename ConstMethodSignature::ReturnType +forwardConstMethod( T const & self, + //typename ConstMethodSignature::FunctionType func, + Sig func, + v8::Arguments const & argv ) +{ + typedef ConstMethodSignature MSIG; + typedef typename MSIG::ReturnType RV; + enum { Arity = sl::Arity< MSIG >::Value }; + typedef typename + tmp::IfElse< tmp::SameType::Value, + Detail::ConstMethodForwarderVoid< T, Arity, Sig >, + Detail::ConstMethodForwarder< T, Arity, Sig > + >::Type Proxy; + return (RV)Proxy::CallNative( self, func, argv ); +} + +/** + Like the 3-arg forwardConstMethod() overload, but + extracts the native T 'this' object from argv.This(). + + Note that this function requires that the caller specify + the T template parameter - it cannot deduce it. +*/ +template +inline typename ConstMethodSignature::ReturnType +forwardConstMethod(Sig func, v8::Arguments const & argv ) +{ + typedef ConstMethodSignature MSIG; + typedef typename MSIG::ReturnType RV; + enum { Arity = sl::Arity< MSIG >::Value }; + typedef typename + tmp::IfElse< tmp::SameType::Value, + Detail::ConstMethodForwarderVoid< T, Arity, Sig >, + Detail::ConstMethodForwarder< T, Arity, Sig > + >::Type Proxy; + return (RV)Proxy::CallNative( func, argv ); +} + +/** + A structified/functorified form of v8::InvocationCallback. It is + sometimes convenient to be able to use a typedef to create an alias + for a given InvocationCallback. Since we cannot typedef function + templates this way, this class can fill that gap. +*/ +template +struct InCaToInCa : FunctionToInCa< v8::Handle (v8::Arguments const &), ICB> +{ +}; + + +#if 0 // YAGNI +/** + "Converts" an InCaToInCa instance to JS by treating it as an + InvocationCallback function. This is primarily useful in + conjunction with ClassCreator::Set() to add function bindings. +*/ +template +struct NativeToJS< InCaToInCa > +{ + /** + Returns a JS handle to InCaToInCa::Call(). + */ + v8::Handle operator()( InCaToInCa const & ) + { + return v8::FunctionTemplate::New(InCaToInCa::Call)->GetFunction(); + } +}; +#endif + +#if !defined(DOXYGEN) +namespace Detail { + /** Internal code duplication reducer. */ + template + v8::Handle TossArgCountError( v8::Arguments const & args ) + { + return Toss((StringBuffer() + <<"Incorrect argument count ("< > +> +struct ArityDispatch : InCa +{ + /** + When called, if (Artity==-1) or if (Arity==args.Length()) then + InCaT::Call(args) is returned, else Fallback::Call(args) is returned. + + Implements the InvocationCallback interface. + */ + inline static v8::Handle Call( v8::Arguments const & args ) + { + return ( (-1==Arity) || (Arity == args.Length()) ) + ? InCaT::Call(args) + : Fallback::Call(args); + } +}; + + +/** + InvocationCallback wrapper which calls another InvocationCallback + and translates any native ExceptionT exceptions thrown by that + function into JS exceptions. + + ExceptionT must be an exception type which is thrown by const + reference (e.g. STL-style) as opposed to by pointer (MFC-style). + + SigGetMsg must be a function-signature-style argument describing + a method within ExceptionT which can be used to fetch the message + reported by the exception. It must meet these requirements: + + a) Be const + b) Take no arguments + c) Return a type convertible to JS via CastToJS() + + Getter must be a pointer to a function matching that signature. + + InCaT must be a InCa type. When Call() is called by v8, it will pass + on the call to InCaT::Call() and catch exceptions as described below. + + Exceptions of type (ExceptionT const &) and (ExceptionT const *) which + are thrown by ICB get translated into a JS exception with an error + message fetched using ExceptionT::Getter(). + + If PropagateOtherExceptions is true then exception of types other + than ExceptionT are re-thrown (which can be fatal to v8, so be + careful). If it is false then they are not propagated but the error + message in the generated JS exception is unspecified (because we + have no generic way to get such a message). If a client needs to + catch multiple exception types, enable propagation and chain the + callbacks together. In such a case, the outer-most (last) callback + in the chain should not propagate unknown exceptions (to avoid + killing v8). + + This type can be used to implement "chaining" of exception + catching, such that we can use the InCaCatcher + to catch various distinct exception types in the context + of one v8::InvocationCallback call. + + Example: + + @code + // Here we want to catch MyExceptionType, std::runtime_error, and + // std::exception (the base class of std::runtime_error, by the + // way) separately: + + // When catching within an exception hierarchy, start with the most + // specific (most-derived) exceptions. + + // Client-specified exception type: + typedef InCaCatcher< + MyExceptionType, + std::string (), + &MyExceptionType::getMessage, + InCaToInCa, // the "real" InvocationCallback + true // make sure propagation is turned on so chaining can work! + > Catch_MyEx; + + // std::runtime_error: + typedef InCaCatcher_std< Catch_MyEx, std::runtime_error > Catch_RTE; + + // std::exception: + typedef InCaCatcher_std< Catch_RTE > MyCatcher; + + // Now MyCatcher::Call is-a InvocationCallback which will handle + // MyExceptionType, std::runtime_error, and std::exception via + // different catch blocks. Note, however, that the visible + // behaviour for runtime_error and std::exception (its base class) + // will be identical here, though they actually have different + // code. + @endcode +*/ +template < typename ExceptionT, + typename SigGetMsg, + typename ConstMethodSignature::FunctionType Getter, + typename InCaT, + bool PropagateOtherExceptions = false + > +struct InCaCatcher : InCa +{ + /** + Returns ICB(args), converting any exceptions of type (ExceptionT + const &) or (ExceptionT const *) to JS exceptions. Other exception + types are handled as described in the class-level documentation. + + See the class-level docs for full details. + */ + static v8::Handle Call( v8::Arguments const & args ) + { + try + { + return InCaT::Call( args ); + } + catch( ExceptionT const & e2 ) + { + /* reminder to self: we now have the unusual corner case that + if Getter() returns a v8::Handle it will be thrown + as-is instead of wrapped in an Error object. See the Toss() docs + for why that is so. We could use tmp::SameType to alternately + call TossAsError(), but i'm too tired and i honestly don't ever + expect any exception type to return v8 handles. + */ + return Toss((e2.*Getter)()); + } + catch( ExceptionT const * e2 ) + { + return Toss((e2->*Getter)()); + } + catch(...) + { + if( PropagateOtherExceptions ) throw; + else return Toss("Unknown native exception thrown!"); + } + } +}; + +/** + Convenience form of InCaCatcher which catches std::exception objects and + uses their what() method to fetch the error message. + + The ConcreteException parameter may be std::exception (the default) or + any publically derived subclass of std::exception. When using a + non-default value, one can chain exception catchers to catch most-derived + types first. + + PropagateOtherExceptions determines whether _other_ exception types are + propagated or not. It defaults to false if ConcreteException is + std::exception (exactly, not a subtype), else it defaults to true. The + reasoning is: when chaining these handlers we need to catch the + most-derived first. Those handlers need to propagate other exceptions so + that we can catch the lesser-derived ones (or those from completely + different hierarchies) in subsequent catchers. The final catcher "should" + (arguably) swallow unknown exceptions, converting them to JS exceptions + with an unspecified message string (propagating them is technically legal + but will most likely crash v8). + + Here is an example of chaining: + + @code + typedef InCaCatcher_std< InCaToInCa, std::logic_error > LECatch; + typedef InCaCatcher_std< LECatch, std::runtime_error > RECatch; + typedef InCaCatcher_std< RECatch, std::bad_cast > BCCatch; + typedef InCaCatcher_std< BCCatch > BaseCatch; + v8::InvocationCallback cb = BaseCatch::Call; + @endcode + + In the above example any exceptions would be processed in the order: + logic_error, runtime_error, bad_cast, std::exception, anything else. Notice + that we took advantage of the PropagateOtherExceptions default value for all + cases to get the propagation behaviour we want. +*/ +template < + typename InCaT, + typename ConcreteException = std::exception, + bool PropagateOtherExceptions = !tmp::SameType< std::exception, ConcreteException >::Value +> +struct InCaCatcher_std : + InCaCatcher +{}; + +namespace Detail { + /** + An internal level of indirection for overloading-related + dispatchers. + */ + template + struct OverloadCallHelper : InCa + { + inline static v8::Handle Call( v8::Arguments const & argv ) + { + return InCaT::Call(argv); + } + }; + //! End-of-list specialization. + template <> + struct OverloadCallHelper : InCa + { + inline static v8::Handle Call( v8::Arguments const & argv ) + { + return Toss( StringBuffer() + << "End of typelist reached. Argument count=" + < Call( v8::Arguments const & argv ); + + And a static const integer (or enum) value called Arity, + which must specify the expected number of arguments, or be + negative specify that the function accepts any number of + arguments. + + In other words, all entries in FwdList must implement the + interface used by most of the InCa-related API. + + Example: + + @code + // Overload 3 variants of a member function: + typedef CVV8_TYPELIST(( + MethodToInCa, + MethodToInCa, + MethodToInCa + // Note that "N-arity" callbacks MUST come last in the list + // because they will always match any arity count and therefore + // trump any overloads which follow them. + )) OverloadList; + typedef ArityDispatchList< OverloadList > MyOverloads; + v8::InvocationCallback cb = MyOverloads::Call; + @endcode + + Note that only one line of that code is evaluated at runtime - the rest + is all done at compile-time. +*/ +template +struct ArityDispatchList : InCa +{ + /** + Tries to dispatch argv to one of the bound functions defined + in FwdList, based on the number of arguments in argv and + the Arity + + Implements the v8::InvocationCallback interface. + */ + inline static v8::Handle Call( v8::Arguments const & argv ) + { + typedef typename FwdList::Head FWD; + typedef typename FwdList::Tail Tail; + enum { Arity = sl::Arity< FWD >::Value }; + return ( (-1 == Arity) || (Arity == argv.Length()) ) + ? Detail::OverloadCallHelper::Call(argv) + : ArityDispatchList::Call(argv); + } +}; + +/** + End-of-list specialization. +*/ +template <> +struct ArityDispatchList : Detail::OverloadCallHelper +{ +}; + +#if !defined(DOXYGEN) +namespace Detail { + //! Internal helper for ToInCa impl. + template + struct ToInCaSigSelector : MethodSignature + { + template < typename MethodSignature::FunctionType Func, bool UnlockV8 > + struct Base : cvv8::MethodToInCa + { + }; + }; + + //! Internal helper for ToInCa impl. + template + struct ToInCaSigSelector : FunctionSignature + { + template < typename FunctionSignature::FunctionType Func, bool UnlockV8 > + struct Base : cvv8::FunctionToInCa + { + }; + }; + + //! Internal helper for ToInCaVoid impl. + template + struct ToInCaSigSelectorVoid : MethodSignature + { + template < typename MethodSignature::FunctionType Func, bool UnlockV8 > + struct Base : cvv8::MethodToInCaVoid + { + }; + }; + + //! Internal helper for ToInCaVoid impl. + template + struct ToInCaSigSelectorVoid : FunctionSignature + { + template < typename FunctionSignature::FunctionType Func, bool UnlockV8 > + struct Base : cvv8::FunctionToInCaVoid + { + }; + }; + +} +#endif // DOXYGEN + +/** + A wrapper for MethodToInCa, ConstMethodToInCa, and + FunctionToInCa, which determines which one of those to use based + on the type of T and its constness. + + For non-member functions, T must be void. For non-const member + functions T must be non-cvp-qualified T. For const member functions + T must be const-qualified. + + See FunctionForwarder for the meaning of the UnlockV8 parameter. + + Examples: + + @code + typedef ToInCa NonConstMethod; + typedef ToInCa ConstMethod; + typedef ToInCa Func; + + v8::InvocationCallback cb; + cb = NonConstMethod::Call; + cb = ConstMethod::Call; + cb = Func::Call; + @endcode + + Note the extra 'const' qualification for const method. This is + neccessary to be able to portably distinguish the constness + (some compilers allow us to add the const as part of the + function signature). Also note that the 'void' 1st parameter for + non-member functions is a bit of a hack. +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< Detail::ToInCaSigSelector >::Value + > +struct ToInCa : Detail::ToInCaSigSelector::template Base +{ +}; + +/** + This works just like ToInCa but instead of behaving like + FunctionToInCa or Const/MethoToInCa it behaves like + FunctionToInCaVoid or Const/MethoToInCaVoid. +*/ +template ::FunctionType Func, + bool UnlockV8 = SignatureIsUnlockable< Detail::ToInCaSigSelector >::Value + > +struct ToInCaVoid : Detail::ToInCaSigSelectorVoid::template Base +{ +}; + + +/** + A slightly simplified form of FunctionToInCa which is only + useful for "InvocationCallback-like" functions and requires + only two arguments: + + @code + // int my_func( v8::Arguments const & ); + typedef InCaLikeFunction< int, my_func > F; + @endcode +*/ +template +struct InCaLikeFunction : FunctionToInCa< RV (v8::Arguments const &), Func> +{ +}; + +/** + A slightly simplified form of MethodToInCa which is only + useful for non-const "InvocationCallback-like" methods: + + @code + // Method: int MyType::func( v8::Arguments const & ) + typedef InCaLikeMethod F; + @endcode +*/ +template +struct InCaLikeMethod : MethodToInCa< T, RV (v8::Arguments const &), Func> +{}; + +/** + A slightly simplified form of ConstMethodToInCa which is only + useful for const "InvocationCallback-like" methods: + + @code + // Method: int MyType::func( v8::Arguments const & ) const + typedef InCaLikeConstMethod F; + @endcode +*/ +template +struct InCaLikeConstMethod : ConstMethodToInCa< T, RV (v8::Arguments const &), Func> +{}; + + +#if 0 +//! Don't use. Doesn't yet compile. Trying to consolidate Const/MethodXyz +template ::FunctionType Func> +struct SigToInCa : + tmp::IfElse< + sl::IsFunction< Signature >::Value, + FunctionToInCa< ASig, Func >, + typename tmp::IfElse< + sl::IsConstMethod< Signature >::Value, + ConstMethodToInCa< typename tmp::PlainType::Context>::Type, ASig, Func >, + MethodToInCa< typename Signature::Context, ASig, Func > + >::Type + >::Type +{}; +#endif + +/** + This class acts as a proxy for another InCa-compatible class, + running client-defined intialization code the _first_ time + its callback is called from JS. This could be used to run + library-dependent intialization routines such as lt_dlinit(). + + InCaT must conform to the InCa interface (i.e., have a static Call() + function which implements the v8::InvocationCallback interface). + + InitFunctor must be default-constructable and have an operator() + (preferably const) taking no args and returning any type which can be + ignored (i.e. not dynamically-allocated resources). +*/ +template +struct OneTimeInitInCa : InCa +{ + /** + The first time this function is called it runs + InitFunctor()() to execute any client-dependent setup. If + that throws a native exception it is propagated back to the + caller and initialization is considered NOT to have + occurred, meaning the next call to this function will also + run InitFunctor()(). + + If initialization does not throw, InCaT::Call(argv) is + called and its value is returned. Once initialization + succeeds, it is _not_ triggered on subsequent calls to this + function. + + Pedantic note: if this class is used in code which is linked + in from multiple DLLs, the init routine might be called + more than once, depending on the platform. + */ + static v8::Handle Call( v8::Arguments const & argv ) + { + static bool bob = false; + if( ! bob ) + { + InitFunctor()(); + /* Reminder: if it throws we do not set bob=true. + This is part of the interface, not an accident. + */ + bob = true; + } + return InCaT::Call( argv ); + } +}; + + +#if 0// i'm not yet decided on these bits... +struct NativeToJS_InCa_Base +{ + typedef v8::InvocationCallback ArgType; + template + inline v8::Handle operator()( SigT const & ) const + { + return v8::FunctionTemplate::New(SigT::Call)->GetFunction(); + } +}; + +template ::FunctionType Func> +struct NativeToJS< FunctionToInCa > : NativeToJS_InCa_Base {}; +template ::FunctionType Func> +struct NativeToJS< FunctionToInCaVoid > : NativeToJS_InCa_Base {}; + +template ::FunctionType Func> +struct NativeToJS< MethodToInCa > : NativeToJS_InCa_Base {}; +template ::FunctionType Func> +struct NativeToJS< MethodToInCaVoid > : NativeToJS_InCa_Base {}; + +template ::FunctionType Func> +struct NativeToJS< ConstMethodToInCa > : NativeToJS_InCa_Base {}; +template ::FunctionType Func> +struct NativeToJS< ConstMethodToInCaVoid > : NativeToJS_InCa_Base {}; + +template ::FunctionType Func> +struct NativeToJS< ToInCa > : NativeToJS_InCa_Base {}; +template ::FunctionType Func> +struct NativeToJS< ToInCaVoid > : NativeToJS_InCa_Base {}; +#endif + +#include "invocable_generated.hpp" +} // namespace + +#undef HANDLE_PROPAGATE_EXCEPTION +#undef ENABLE_TOINCA + +#endif /* CODE_GOOGLE_COM_V8_CONVERT_INVOCABLE_V8_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/detail/invocable_generated.hpp b/vendor/libv8-convert/cvv8/detail/invocable_generated.hpp new file mode 100644 index 000000000..6c7227f5f --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/invocable_generated.hpp @@ -0,0 +1,3588 @@ +/* AUTO-GENERATED CODE! EDIT AT YOUR OWN RISK! */ +#if !defined(DOXYGEN) +namespace Detail { + template + struct FunctionForwarder<1,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<1,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (1 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 1-arity calls. +template <> +struct CallForwarder<1> +{ + template < typename A0> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0 + ) + { + v8::Handle args[] = { + CastToJS(a0) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0> + static v8::Handle Call( v8::Handle const & func, + A0 a0 + ) + { + return Call( func, func, a0 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 1 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 1 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + + typedef ArgCaster AC0; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<2,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<2,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (2 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 2-arity calls. +template <> +struct CallForwarder<2> +{ + template < typename A0, typename A1> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1 + ) + { + return Call( func, func, a0,a1 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 2 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 2 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<3,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<3,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (3 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 3-arity calls. +template <> +struct CallForwarder<3> +{ + template < typename A0, typename A1, typename A2> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2 + ) + { + return Call( func, func, a0,a1,a2 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 3 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 3 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<4,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<4,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (4 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 4-arity calls. +template <> +struct CallForwarder<4> +{ + template < typename A0, typename A1, typename A2, typename A3> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3 + ) + { + return Call( func, func, a0,a1,a2,a3 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 4 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 4 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<5,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<5,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (5 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 5-arity calls. +template <> +struct CallForwarder<5> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4 + ) + { + return Call( func, func, a0,a1,a2,a3,a4 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 5 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 5 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<6,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<6,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (6 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 6-arity calls. +template <> +struct CallForwarder<6> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4), CastToJS(a5) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 + ) + { + return Call( func, func, a0,a1,a2,a3,a4,a5 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 6 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 6 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4, arg5 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<7,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<7,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (7 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 7-arity calls. +template <> +struct CallForwarder<7> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4), CastToJS(a5), CastToJS(a6) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 + ) + { + return Call( func, func, a0,a1,a2,a3,a4,a5,a6 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 7 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 7 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<8,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<8,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (8 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 8-arity calls. +template <> +struct CallForwarder<8> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4), CastToJS(a5), CastToJS(a6), CastToJS(a7) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 + ) + { + return Call( func, func, a0,a1,a2,a3,a4,a5,a6,a7 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 8 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 8 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<9,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<9,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (9 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 9-arity calls. +template <> +struct CallForwarder<9> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4), CastToJS(a5), CastToJS(a6), CastToJS(a7), CastToJS(a8) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 + ) + { + return Call( func, func, a0,a1,a2,a3,a4,a5,a6,a7,a8 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 9 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 9 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 ); + } + } +}; +} +namespace Detail { + template + struct FunctionForwarder<10,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + return CastToJS( CallNative( func, argv ) ); + } + }; + + template + struct FunctionForwarderVoid<10,Sig,UnlockV8> : FunctionSignature + { + typedef FunctionSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + CallNative( func, argv ); + return v8::Undefined(); + } + }; +} +namespace Detail { + template + struct MethodForwarder : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct MethodForwarderVoid : MethodSignature + { + typedef MethodSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( T & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +namespace Detail { + template + struct ConstMethodForwarder : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = ( V8Unlocker() ); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative( self, func, argv ) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try { return CastToJS( CallNative(func, argv) ); } + HANDLE_PROPAGATE_EXCEPTION; + } + }; + + template + struct ConstMethodForwarderVoid : ConstMethodSignature + { + typedef ConstMethodSignature SignatureType; + typedef char AssertArity[ (10 == sl::Arity::Value) ? 1 : -1]; + typedef typename SignatureType::FunctionType FunctionType; + typedef typename SignatureType::ReturnType ReturnType; + static ReturnType CallNative( T const & self, FunctionType func, v8::Arguments const & argv ) + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + V8Unlocker const & unlocker = V8Unlocker(); + return (ReturnType)(self.*func)( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + static v8::Handle Call( T const & self, FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative( self, func, argv ); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + static ReturnType CallNative( FunctionType func, v8::Arguments const & argv ) + { + T const * self = CastFromJS(argv.This()); + if( ! self ) throw MissingThisExceptionT(); + return (ReturnType)CallNative(*self, func, argv); + } + static v8::Handle Call( FunctionType func, v8::Arguments const & argv ) + { + try + { + CallNative(func, argv); + return v8::Undefined(); + } + HANDLE_PROPAGATE_EXCEPTION; + } + }; +} +//! Specialization for 10-arity calls. +template <> +struct CallForwarder<10> +{ + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9> + static v8::Handle Call( v8::Handle const & self, + v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 + ) + { + v8::Handle args[] = { + CastToJS(a0), CastToJS(a1), CastToJS(a2), CastToJS(a3), CastToJS(a4), CastToJS(a5), CastToJS(a6), CastToJS(a7), CastToJS(a8), CastToJS(a9) + }; + return (self.IsEmpty() || func.IsEmpty()) + ? Toss("Illegal argument: empty v8::Handle<>.") + : func->Call(self, sizeof(args)/sizeof(args[0]), args); + } + template < typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9> + static v8::Handle Call( v8::Handle const & func, + A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 + ) + { + return Call( func, func, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 ); + } + +}; +namespace Detail { +template +struct CtorForwarderProxy +{ + enum { Arity = 10 }; + typedef typename Signature::ReturnType ReturnType; + static ReturnType Call( v8::Arguments const & argv ) + { + if( argv.Length() < Arity ) + { + throw std::range_error("CtorForwarder::Ctor() expects at least 10 JS arguments!"); + } + else + { + typedef typename sl::At< 0, Signature >::Type A0; + typedef typename sl::At< 1, Signature >::Type A1; + typedef typename sl::At< 2, Signature >::Type A2; + typedef typename sl::At< 3, Signature >::Type A3; + typedef typename sl::At< 4, Signature >::Type A4; + typedef typename sl::At< 5, Signature >::Type A5; + typedef typename sl::At< 6, Signature >::Type A6; + typedef typename sl::At< 7, Signature >::Type A7; + typedef typename sl::At< 8, Signature >::Type A8; + typedef typename sl::At< 9, Signature >::Type A9; + + typedef ArgCaster AC0; + typedef ArgCaster AC1; + typedef ArgCaster AC2; + typedef ArgCaster AC3; + typedef ArgCaster AC4; + typedef ArgCaster AC5; + typedef ArgCaster AC6; + typedef ArgCaster AC7; + typedef ArgCaster AC8; + typedef ArgCaster AC9; + + AC0 ac0; A0 arg0(ac0.ToNative(argv[0])); + AC1 ac1; A1 arg1(ac1.ToNative(argv[1])); + AC2 ac2; A2 arg2(ac2.ToNative(argv[2])); + AC3 ac3; A3 arg3(ac3.ToNative(argv[3])); + AC4 ac4; A4 arg4(ac4.ToNative(argv[4])); + AC5 ac5; A5 arg5(ac5.ToNative(argv[5])); + AC6 ac6; A6 arg6(ac6.ToNative(argv[6])); + AC7 ac7; A7 arg7(ac7.ToNative(argv[7])); + AC8 ac8; A8 arg8(ac8.ToNative(argv[8])); + AC9 ac9; A9 arg9(ac9.ToNative(argv[9])); + + typedef typename TypeInfo::Type Type; + return new Type( arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 ); + } + } +}; +} +#endif // if !defined(DOXYGEN) diff --git a/vendor/libv8-convert/cvv8/detail/signature_core.hpp b/vendor/libv8-convert/cvv8/detail/signature_core.hpp new file mode 100644 index 000000000..b4ff3fe6d --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/signature_core.hpp @@ -0,0 +1,498 @@ +#if !defined(CODE_GOOGLE_COM_V8_CONVERT_SIGNATURE_CORE_HPP_INCLUDED) +#define CODE_GOOGLE_COM_V8_CONVERT_SIGNATURE_CORE_HPP_INCLUDED 1 +#include "tmp.hpp" +#include "doxygen_hack.hpp" + +namespace cvv8 { +/** @file signature_core.hpp + +This file houses the core-most templates related to handling +function/method signatures as full-fleged types. +*/ + + + +/** @class Signature + + Base (unimplemented) template for holding function-signature-style + argument lists in a type-rich manner. Most implementations are + script-generated and accept up to some library-build-time-defined number + of types in their argument list (the interface guarantees at least 10 + unless the client builds a custom copy with a smaller limit). + + All specializations implement a "type list" interface. The sl namespace + contains several different compile-time algorithms (sometimes called + template metafunctions) for querying the arity and types in a signature. + + Sig must be a function-signature-style parameter list, e.g.: + + @code + Signature< void (int, double) > + Signature< void (MyType::*)( int double ) > + Signature< void (MyType::*)( char const * ) const > + @endcode + + This interface treates the "function parameter part" of its arguments as + a "type list", and several algorithms in the sl namespace are available + for fetching type information from a Signature type. This is an + "extended" typelist, however, because it also remembers the return type + and optionally the class containing a member function described by the + signature (neither of those are counted as part of the list, but are + accessible separately). + + Required interface for specializations: + + @code + typedef functionSignature FunctionType; // e.g. void () or void (T::*)() const. + typedef functionReturnType ReturnType; + typedef T Context; // void for non-member functions, non-vp-qualified T + // for all T members. const-qualified T for const members. + typedef firstArgType Head; // head type of type-list. + typedef Signature< RV (...)> Tail; // tail of type-list. (...)==arg types 2..N. + // When Arity==0, Head and Tail must both be tmp::NilType. For Arity==1 + // Tail is Signature but one could argue that it should be tmp::NilType. + + @endcode + + It is intended to be used like this: + + @code + typedef Signature< int (char const *, double) > Sig; + assert( 2 == sl::Arity::Value ); + assert( 2 == sl::Length::Value ) + assert( (tmp::SameType< char const *, sl::At<0,Sig>::Type >::Value) ); + assert( (tmp::SameType< double, sl::At<1,Sig>::Type >::Value) ); + assert( 1 == sl::Index< double, Sig >::Value) ); + assert( !sl::Contains< int, Sig >::Value) ); // Sig::ReturnType doesn't count here! + assert( sl::IsConstMethod< Signature< void (MyType::*)() const > >::Value ); + assert( sl::IsMethod< Signature< void (MyType::*)() const > >::Value ); + assert( !sl::IsConstMethod< Signature< void (MyType::*)() > >::Value ); + // Those can all be made into static assertions, by the way. + @endcode + + Note that the length of the typelist does not include the return value + type nor (for member methods) the containing class (the Context typedef). + + Functions taking one (v8::Arguments const &) argument and + returning any type are considered to be + "InvocationCallback-like" and are treated specially. They have + an Arity value of -1, which is used as a hint by binding code + that the function can accept any number of arguments when called + from JS code (there is no way to create Arguments objects + directly from C++, only indirectly via Call()ing or Apply()ing a + v8::Function). +*/ +template struct Signature DOXYGEN_FWD_DECL_KLUDGE; + +/** @def CVV8_TYPELIST + + CVV8_TYPELIST is a (slightly) convenience form of + Signature for creating typelists where we do not care about the + "return type" or "context" parts of the list. + + It is used like this: + + @code + typedef CVV8_TYPELIST(( int, double, char )) MyList; + @endcode + + NOTE the doubled parenthesis! + + Many members of the API which take a type-list require a + Signature-compatible typelist because they need the ReturnValue and/or + Context parts. CVV8_TYPELIST is intended for cases where niether the + ReturnValue nor Context are evaluated (both are void for CVV8_TYPELIST). + + The maximum number of types the typelist can hold is limited + to some build-time configuration option. +*/ +#define CVV8_TYPELIST(X) ::cvv8::Signature< void (*)X > + +/** \namespace cvv8::sl + + The sl namespace exclusively holds template metafunctions for working + with Signature-style typelists. +*/ +namespace sl { + + /** + Metafunction whose Value member evaluates to the length of the + given Signature. + */ + template < typename ListT > + struct Length : tmp::IntVal< + tmp::IsNil::Value ? 0 : (1 + Length::Value) + > {}; + + //! End-of-list specialization. + template <> + struct Length : tmp::IntVal<0> {}; + /** + Metafunction whose Type member evaluates to the type of the + I'th argument type in the given Signature. Fails to compile + if I is out of range. + */ + template < unsigned short I, typename ListT > + struct At : At + { + typedef char AssertIndex[ (I >= Length::Value) ? -1 : 1 ]; + }; + + //! Beginning-of-list specialization. + template < typename ListT > + struct At<0, ListT> + { + typedef typename ListT::Head Type; + }; + /** + End-of-list specialization. i don't think we need this, actually. + */ + template + struct At : tmp::Identity + {}; + + /** + Metafunction whose Type Value member evaluates to the 0-based + index of the first occurrance of the the type T in the + given Signature's argument list. Evaluates to -1 if T is not + contained in the argument list. Signature::ReturnType and + Signature::Context are not evaluated. + + Clients _must not_ pass a value for the 3rd template parameter. + */ + template < typename T, typename ListT, unsigned short Internal = 0 > + struct Index : tmp::IntVal< tmp::SameType::Value + ? Internal + : Index::Value> + { + }; + + //! End-of-list specialization. + template < typename T, unsigned short Internal > + struct Index : tmp::IntVal<-1> {}; + + /** + Convenience form of Index which evaluates to true + if Index returns a non-negative value, else it evaluates + to false. + */ + template < typename T, typename ListT> + struct Contains : tmp::BoolVal< Index::Value >= 0 > {}; + + + /** + A metatype which calculates the number of arguments in the given + typelist, but evaluates to -1 if SigT's only argument is + (v8::Arguments const &), as such function signatures are considered + to be n-arity. + */ + template + struct Arity + { + enum { + Value = ((1==Length::Value) + && (0==Index::Value)) + ? -1 + : Length::Value + }; + }; + + /** + This metafunction evaluates to true if SigT appears to be + "InvocationCallback-like" (returns any type and takes one + (v8::Arguments const &) parameter). + + We could implement this a number of different ways. The + current impl simply checks if the arity is -1. + */ + template + struct IsInCaLike : tmp::BoolVal< -1 == Arity::Value > {}; + + /** + A metafunction which has a true Value if the Signature type SigT + represents a non-member function. + */ + template + struct IsFunction : tmp::BoolVal< tmp::SameType::Value > {}; + + /** + A metafunction which has a true Value if the Signature type SigT + represents a member function (const or not). + */ + template + struct IsMethod : tmp::BoolVal< !tmp::SameType::Value > {}; + + /** + A metafunction which has a true Value if the Signature type SigT + represents a non-const member function. + */ + template + struct IsNonConstMethod : tmp::BoolVal< !tmp::IsConst< typename SigT::Context >::Value && IsMethod::Value > {}; + + /** + A metafunction which has a true Value if the Signature type SigT + represents a const member function. + */ + template + struct IsConstMethod : + tmp::BoolVal< tmp::IsConst< typename SigT::Context >::Value && IsMethod::Value > {}; + //tmp::BoolVal< SigT::IsConst && IsMethod::Value > {}; + +} + +namespace tmp { + /** + A metatemplate who's Type member resolves to IF if Cond is + true, or ELSE if Cond is false. Its Value member evaluates + to 1 or 0, accordingly. + */ + template + struct IfElse : sl::At< Cond ? 0 : 1, Signature > + { + }; +} + +#if 0 +//! Highly arguably specialization. +template struct Signature< Signature > : Signature {}; +#endif + +/** + Specialization to give "InvacationCallback-like" functions + an Arity value of -1. + + Reminder: we can get rid of this if we factory out the Arity definition + and use sl::Arity instead. +*/ +template +struct Signature +{ + typedef RV ReturnType; + typedef RV (*FunctionType)(v8::Arguments const &); + typedef void Context; + typedef v8::Arguments const & Head; + typedef Signature Tail; +}; + +template +struct Signature : Signature +{}; + +template +struct Signature : Signature +{ + typedef T Context; + typedef RV (Context::*FunctionType)(v8::Arguments const &); +}; + + +template +struct Signature : Signature +{ + typedef T const Context; + typedef RV (Context::*FunctionType)(v8::Arguments const &) const; +}; + + + +/** @class FunctionSignature + Base (unimplemented) signature for FunctionSignature + specializations. The type passed to it must be a function + signature. + + All implementations must define the interface described for + Signature and its Context typedef must be void for this type. + + Examples: + + @code + // void func_foo(): + typedef FunctionSignature< void () > NoArgsReturnsVoid; + + // int func_foo(double): + typedef FunctionSignature< int (double) > OneArgReturnsInt; + + // double func_foo(int,int): + typedef FunctionSignature< double (int,int) > TwoArgsReturnsDouble; + @endcode + +*/ +template +struct FunctionSignature : Signature< FunctionSig > {}; + +/** @class MethodSignature + Base (unimplemented) signature for MethodSignature + specializations. The Sig type passed to it must match a member method + signature of a function from the class T. + e.g. (void (T::*)(int)) or its equivalent (void (int)). + + All implementations must have the interface called for by Signature + and the Context typedef must be non-cvp-qualified T. + + Examples: + + @code + // void MyType::func(): + typedef MethodSignature< MyType, void () > NoArgsReturnsVoid; + + // int MyType::func(double): + typedef MethodSignature< MyType, int (double) > OneArgReturnsInt; + + // double MyType::func(int,int): + typedef MethodSignature< MyType, double (int,int) > TwoArgsReturnsDouble; + @endcode + + As of r2019 (20110723), MethodSignature and + ConstMethodSignature are equivalent. + + Reminders to self: + + i would really like this class to simply subclass Signature and we + would add in a couple typedefs we need. This would cut the specializations + we generate. However, i don't know how to make this work. The problems + include: + + - i can't "refactor" Signature::FunctionType to the proper type + at this level. +*/ +template +struct MethodSignature DOXYGEN_FWD_DECL_KLUDGE; + +/** @class ConstMethodSignature + Base (unimplemented) signature for ConstMethodSignature + specializations. The Sig type passed to it must be a member + method signature of a const function from the class T. + e.g. (void (T::*)(int) const) + + All implementations must have the interface called for by Signature + and the Context typedef must be non-cvp-qualified T. The IsConst + member (enum or static/const boolean) must be a true value. + + Examples: + + @code + // void MyType::func() const: + typedef ConstMethodSignature< MyType, void () > NoArgsReturnsVoid; + + // int MyType::func(double) const: + typedef ConstMethodSignature< MyType, int (double) > OneArgReturnsInt; + + // double MyType::func(int,int) const: + typedef ConstMethodSignature< MyType, double (int,int) > TwoArgsReturnsDouble; + @endcode + + As of r2019 (20110723), MethodSignature and + ConstMethodSignature are equivalent. +*/ +template +struct ConstMethodSignature DOXYGEN_FWD_DECL_KLUDGE; +//template +//struct ConstMethodSignature : ConstMethodSignature {}; + +template +struct MethodSignature< T, RV () > : Signature< RV () > +{ + typedef T Context; + typedef RV (Context::*FunctionType)(); +}; + + +template +struct MethodSignature< T, RV (T::*)() > : MethodSignature +{ +}; + +template +struct MethodSignature< T const, RV () > : ConstMethodSignature< T, RV () > +{}; + +template +struct MethodSignature< T const, RV (T::*)() > : MethodSignature +{ +}; +#if 1 //msvc? +template +struct MethodSignature< T const, RV (T::*)() const > : MethodSignature +{ +}; +#endif + +template +struct ConstMethodSignature< T, RV () > : Signature< RV (T::*)() const > +{ + typedef T const Context; + typedef RV (Context::*FunctionType)() const; +}; +template +struct ConstMethodSignature< T, RV (T::*)() const > : ConstMethodSignature +{ +}; + + +/** + A "type-rich" function pointer. + + Sig must be a function signature type usable in the construct + FunctionSignature. FuncPtr must be a function of that type. +*/ +template ::FunctionType FuncPtr> +struct FunctionPtr : FunctionSignature +{ + /** + This type's full "signature" type. + */ + typedef FunctionSignature SignatureType; + /** + The data type of FuncPtr. + */ + typedef typename SignatureType::FunctionType FunctionType; + + /** The function specifies in the template arguments. */ + static const FunctionType Function; +}; +template ::FunctionType FuncPtr> +typename FunctionPtr::FunctionType const FunctionPtr::Function = FuncPtr; + +/** + Used like FunctionPtr, but in conjunction with non-const + member functions ("methods") of the T class. See FunctionPtr + for the requirements of the Sig type. +*/ +template ::FunctionType FuncPtr> +struct MethodPtr : MethodSignature +{ + typedef MethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + static const FunctionType Function; +}; +template ::FunctionType FuncPtr> +typename MethodPtr::FunctionType const MethodPtr::Function = FuncPtr; +/** + Used like MethodPtr, but in conjunction with const methods of the T + class. +*/ +template ::FunctionType FuncPtr> +struct ConstMethodPtr : ConstMethodSignature +{ + typedef ConstMethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + static const FunctionType Function; +}; +template ::FunctionType FuncPtr> +typename ConstMethodPtr::FunctionType const ConstMethodPtr::Function = FuncPtr; + +#if 0 //!msvc +//! Specialization to treat (const T) as ConstMethodPtr. +template ::FunctionType FuncPtr> +struct MethodPtr : ConstMethodPtr +{ + typedef MethodSignature SignatureType; + typedef typename SignatureType::FunctionType FunctionType; + static const FunctionType Function; +}; +#endif + +#include "signature_generated.hpp" +} // namespaces + +#endif /* CODE_GOOGLE_COM_V8_CONVERT_SIGNATURE_CORE_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/detail/signature_generated.hpp b/vendor/libv8-convert/cvv8/detail/signature_generated.hpp new file mode 100644 index 000000000..30102c1f2 --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/signature_generated.hpp @@ -0,0 +1,911 @@ +/* AUTO-GENERATED CODE! EDIT AT YOUR OWN RISK! */ +#if !defined(DOXYGEN) + +template +struct Signature< RV () > +{ + typedef RV ReturnType; + enum { IsConst = 0 }; + typedef void Context; + typedef RV (*FunctionType)(); + typedef tmp::NilType Head; + typedef Head Tail; +}; +template +struct Signature< RV (*)() > : Signature +{}; + +template +struct Signature< RV (T::*)() > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(); +}; +template +struct Signature< RV (T::*)() const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)() const; + enum { IsConst = 1 }; +}; +//! Specialization for 1 arg(s). +template +struct Signature< RV (A1) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1); + typedef A1 Head; + typedef Signature< RV () > Tail; +}; + +//! Specialization for 1 arg(s). +template +struct Signature< RV (*)(A1) > : Signature +{}; + +//! Specialization for T non-const methods taking 1 arg(s). +template +struct Signature< RV (T::*)(A1) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1); +}; + +//! Specialization for T const methods taking 1 arg(s). +template +struct Signature< RV (T::*)(A1) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1) const; +}; + +//! Specialization for 2 arg(s). +template +struct Signature< RV (A1, A2) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 2 arg(s). +template +struct Signature< RV (*)(A1, A2) > : Signature +{}; + +//! Specialization for T non-const methods taking 2 arg(s). +template +struct Signature< RV (T::*)(A1, A2) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2); +}; + +//! Specialization for T const methods taking 2 arg(s). +template +struct Signature< RV (T::*)(A1, A2) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2) const; +}; + +//! Specialization for 3 arg(s). +template +struct Signature< RV (A1, A2, A3) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 3 arg(s). +template +struct Signature< RV (*)(A1, A2, A3) > : Signature +{}; + +//! Specialization for T non-const methods taking 3 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3); +}; + +//! Specialization for T const methods taking 3 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3) const; +}; + +//! Specialization for 4 arg(s). +template +struct Signature< RV (A1, A2, A3, A4) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 4 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4) > : Signature +{}; + +//! Specialization for T non-const methods taking 4 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4); +}; + +//! Specialization for T const methods taking 4 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4) const; +}; + +//! Specialization for 5 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 5 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5) > : Signature +{}; + +//! Specialization for T non-const methods taking 5 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5); +}; + +//! Specialization for T const methods taking 5 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5) const; +}; + +//! Specialization for 6 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 6 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6) > : Signature +{}; + +//! Specialization for T non-const methods taking 6 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6); +}; + +//! Specialization for T const methods taking 6 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6) const; +}; + +//! Specialization for 7 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 7 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7) > : Signature +{}; + +//! Specialization for T non-const methods taking 7 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7); +}; + +//! Specialization for T const methods taking 7 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7) const; +}; + +//! Specialization for 8 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 8 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8) > : Signature +{}; + +//! Specialization for T non-const methods taking 8 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8); +}; + +//! Specialization for T const methods taking 8 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8) const; +}; + +//! Specialization for 9 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 9 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) > : Signature +{}; + +//! Specialization for T non-const methods taking 9 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9); +}; + +//! Specialization for T const methods taking 9 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const; +}; + +//! Specialization for 10 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 10 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) > : Signature +{}; + +//! Specialization for T non-const methods taking 10 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); +}; + +//! Specialization for T const methods taking 10 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const; +}; + +//! Specialization for 11 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 11 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) > : Signature +{}; + +//! Specialization for T non-const methods taking 11 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11); +}; + +//! Specialization for T const methods taking 11 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) const; +}; + +//! Specialization for 12 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 12 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) > : Signature +{}; + +//! Specialization for T non-const methods taking 12 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12); +}; + +//! Specialization for T const methods taking 12 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) const; +}; + +//! Specialization for 13 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 13 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) > : Signature +{}; + +//! Specialization for T non-const methods taking 13 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13); +}; + +//! Specialization for T const methods taking 13 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) const; +}; + +//! Specialization for 14 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 14 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) > : Signature +{}; + +//! Specialization for T non-const methods taking 14 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14); +}; + +//! Specialization for T const methods taking 14 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) const; +}; + +//! Specialization for 15 arg(s). +template +struct Signature< RV (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) > +{ + typedef RV ReturnType; + typedef void Context; + typedef RV (*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15); + typedef A1 Head; + typedef Signature Tail; +}; + +//! Specialization for 15 arg(s). +template +struct Signature< RV (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) > : Signature +{}; + +//! Specialization for T non-const methods taking 15 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) > : Signature +{ + typedef T Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15); +}; + +//! Specialization for T const methods taking 15 arg(s). +template +struct Signature< RV (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) const > : Signature +{ + typedef T const Context; + typedef RV (T::*FunctionType)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) const; +}; + +template +struct MethodSignature< T, RV ( A0) > : Signature< RV (T::*)( A0) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0) > : MethodSignature< T, RV ( A0) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0) > : + MethodSignature< T, RV ( A0) > +{}; + +template +struct MethodSignature< T const, RV ( A0) > : + ConstMethodSignature< T, RV ( A0) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0) > : + MethodSignature< T const, RV ( A0) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0) const > : + MethodSignature< T const, RV ( A0) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0) > : Signature< RV (T::*)( A0) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0) const > : + ConstMethodSignature< T, RV ( A0) > +{}; +template +struct MethodSignature< T, RV ( A0, A1) > : Signature< RV (T::*)( A0, A1) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1) > : MethodSignature< T, RV ( A0, A1) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1) > : + MethodSignature< T, RV ( A0, A1) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1) > : + ConstMethodSignature< T, RV ( A0, A1) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1) > : + MethodSignature< T const, RV ( A0, A1) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1) const > : + MethodSignature< T const, RV ( A0, A1) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1) > : Signature< RV (T::*)( A0, A1) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1) const > : + ConstMethodSignature< T, RV ( A0, A1) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2) > : Signature< RV (T::*)( A0, A1, A2) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2) > : MethodSignature< T, RV ( A0, A1, A2) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2) > : + MethodSignature< T, RV ( A0, A1, A2) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2) > : + ConstMethodSignature< T, RV ( A0, A1, A2) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2) > : + MethodSignature< T const, RV ( A0, A1, A2) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2) const > : + MethodSignature< T const, RV ( A0, A1, A2) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2) > : Signature< RV (T::*)( A0, A1, A2) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2) const > : + ConstMethodSignature< T, RV ( A0, A1, A2) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3) > : Signature< RV (T::*)( A0, A1, A2, A3) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3) > : MethodSignature< T, RV ( A0, A1, A2, A3) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3) > : + MethodSignature< T, RV ( A0, A1, A2, A3) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3) > : + MethodSignature< T const, RV ( A0, A1, A2, A3) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3) > : Signature< RV (T::*)( A0, A1, A2, A3) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4) > : Signature< RV (T::*)( A0, A1, A2, A3, A4) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4) > : Signature< RV (T::*)( A0, A1, A2, A3, A4) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4, A5) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4, A5, A6) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4, A5, A6, A7) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8) > +{}; +template +struct MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{ +}; +template +struct MethodSignature< T, RV (*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{ +}; + +template +struct MethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : + MethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{}; + +template +struct MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{}; + +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{}; + +#if 1 // msvc? Apparently this works. +template +struct MethodSignature< T const, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) const > : + MethodSignature< T const, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{}; +#endif + + +template +struct ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > : Signature< RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) const > +{ +}; +template +struct ConstMethodSignature< T, RV (T::*)( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) const > : + ConstMethodSignature< T, RV ( A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) > +{}; +#endif // if !defined(DOXYGEN) diff --git a/vendor/libv8-convert/cvv8/detail/tmp.hpp b/vendor/libv8-convert/cvv8/detail/tmp.hpp new file mode 100644 index 000000000..aff069f6c --- /dev/null +++ b/vendor/libv8-convert/cvv8/detail/tmp.hpp @@ -0,0 +1,120 @@ +#ifndef CODE_GOOGLE_COM_P_V8_CONVERT_TMP_HPP_INCLUDED +#define CODE_GOOGLE_COM_P_V8_CONVERT_TMP_HPP_INCLUDED + +namespace cvv8 { +/** + The tmp namespace contains code related to template + metaprogramming, a-la Alexandrescu's Loki library or Boost MPL. + + All of it is independent of the core library. + + This is not a complete/full-featured TMP library - it only + contains the functions needed by our library-level code. +*/ +namespace tmp { + + struct NilType {}; + typedef NilType nil; + + + /** + An utmost most-basic compile-time assertion template. + If Condition is false, an incomplete specialization of + this type is invoked, causing a compile-time error. + */ + template + struct Assertion + { + enum { Value = 1 }; + }; + /** Unimplemented - causes a compile-time error if used. */ + template <> + struct Assertion; + + + /** A convenience base type for metafunctions holding a constant value. */ + template + struct ConstVal + { + static const ValType Value = Val; + }; + /** A metafunction holding an integer constant. */ + template + struct IntVal : ConstVal {}; + /** A metafunction holding an unsigned short constant. */ + template + struct UShortVal : ConstVal {}; + /** A metafunction holding a bool constant. */ + template + struct BoolVal : ConstVal {}; + + /** A metatype whos Value member is true if X and Y are the same type. */ + template + struct SameType : BoolVal {}; + /** Specialization for X==Y. */ + template + struct SameType : BoolVal {}; + + template + struct Identity + { + typedef T Type; + }; + + template + struct PlainType + { + typedef T Type; + }; + template + struct PlainType : PlainType {}; + template + struct PlainType : PlainType {}; + template + struct PlainType : PlainType {}; + +#if 0 + /** Metatemplate whose Type evaluates to (T*). */ + template + struct AddPointer + { + typedef T * Type; + }; + /** Specialization whose Type evaluates to (T *). */ + template + struct AddPointer + { + typedef T * Type; + }; + /** Specialization whose Type evaluates to (T const *). */ + template + struct AddPointer + { + typedef T const * Type; + }; + + //! Unimplemented. How to handle this? + template + struct AddPointer; + //! Unimplemented. How to handle this? + template + struct AddPointer; +#endif + + template + struct IsConst : BoolVal {}; + template + struct IsConst : BoolVal {}; + template + struct IsConst : IsConst {}; + template + struct IsConst : IsConst {}; + + + template + struct IsNil : SameType {}; + + + +}} // namespaces +#endif // CODE_GOOGLE_COM_P_V8_CONVERT_TMP_HPP_INCLUDED diff --git a/vendor/libv8-convert/cvv8/generator/Signature.hpp b/vendor/libv8-convert/cvv8/generator/Signature.hpp new file mode 100644 index 000000000..969a5e54b --- /dev/null +++ b/vendor/libv8-convert/cvv8/generator/Signature.hpp @@ -0,0 +1,72 @@ +#if !defined(BOOST_PP_IS_ITERATING) +# include +# include +# include +# include +# include +# if !defined(CVV8_PP_ITER_MAX) +# error "Define CVV8_PP_ITER_MAX before including this file." +# endif +# if !defined(CVV8_SIGNATURE_GENERATED_HPP_INCLUDED) +# define BOOST_PP_ITERATION_LIMITS (0, CVV8_PP_ITER_MAX) +# define BOOST_PP_FILENAME_1 "Signature.hpp" +# include BOOST_PP_ITERATE() +# endif /* include guard */ +#else +#define n BOOST_PP_ITERATION() + +template +struct Signature< RV (BOOST_PP_ENUM_PARAMS(n, A)) > +{ + typedef RV ReturnType; + static const bool IsConst = false; + typedef void Context; + typedef RV (*FunctionType)(BOOST_PP_ENUM_PARAMS(n, A)); +#if n > 0 + typedef A0 Head; + typedef Signature< RV (BOOST_PP_ENUM_SHIFTED_PARAMS(n, A)) > Tail; +#else + typedef tmp::NilType Head; + typedef Head Tail; +#endif +}; + +template +struct Signature< RV (*)(BOOST_PP_ENUM_PARAMS(n, A)) > + : Signature< RV (BOOST_PP_ENUM_PARAMS(n, A)) > +{}; + +//! Non-const method. +template +struct Signature< RV (T::*)(BOOST_PP_ENUM_PARAMS(n, A)) > + : Signature< RV (BOOST_PP_ENUM_PARAMS(n, A))> +{ + typedef T Context; + typedef RV (Context::*FunctionType)(BOOST_PP_ENUM_PARAMS(n, A)); +#if n > 0 + typedef A0 Head; + typedef Signature< RV (T::*)(BOOST_PP_ENUM_SHIFTED_PARAMS(n, A)) > Tail; +#else + typedef tmp::NilType Head; + typedef Head Tail; +#endif +}; + +//! Const method. +template +struct Signature< RV (T::*)(BOOST_PP_ENUM_PARAMS(n, A)) const > + : Signature< RV (BOOST_PP_ENUM_PARAMS(n, A))> +{ + typedef T const Context; + typedef RV (Context::*FunctionType)(BOOST_PP_ENUM_PARAMS(n, A)) const; + static const bool IsConst = true; +#if n > 0 + typedef A0 Head; + typedef Signature< RV (T::*)(BOOST_PP_ENUM_SHIFTED_PARAMS(n, A)) const > Tail; +#else + typedef tmp::NilType Head; + typedef Head Tail; +#endif +}; + +#endif /* BOOST_PP_IS_ITERATING */ diff --git a/vendor/libv8-convert/cvv8/invocable.hpp b/vendor/libv8-convert/cvv8/invocable.hpp new file mode 100644 index 000000000..dac513380 --- /dev/null +++ b/vendor/libv8-convert/cvv8/invocable.hpp @@ -0,0 +1,67 @@ +#if !defined(CODE_GOOGLE_COM_P_V8_CONVERT_INVOKE_HPP_INCLUDED) +#define CODE_GOOGLE_COM_P_V8_CONVERT_INVOKE_HPP_INCLUDED 1 + +#include "convert.hpp" +#include "detail/invocable_core.hpp" +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ +#endif /* CODE_GOOGLE_COM_P_V8_CONVERT_INVOKE_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/properties.hpp b/vendor/libv8-convert/cvv8/properties.hpp new file mode 100644 index 000000000..1b4b936ad --- /dev/null +++ b/vendor/libv8-convert/cvv8/properties.hpp @@ -0,0 +1,730 @@ +#if !defined(CODE_GOOGLE_COM_P_V8_CONVERT_PROPERTIES_HPP_INCLUDED) +#define CODE_GOOGLE_COM_P_V8_CONVERT_PROPERTIES_HPP_INCLUDED 1 + +#include "invocable.hpp" + +namespace cvv8 { + + /** + Marker class, primarily for documentation purposes. + + This class models the v8::AccessorGetter interface, and + XyzToGetter classes inherit this type as a sign that they + implement this interface. + + This class has no implemention - it only exists for + documentation purposes. + */ + struct AccessorGetterType + { + /** + The v8::AccessorGetter() interface. + */ + static v8::Handle Get(v8::Local property, const v8::AccessorInfo &info); + //{ return Toss(StringBuffer()<<"Property '"< property, v8::Local value, const v8::AccessorInfo& info); + }; + + /** @typedef AccessorGetterType Getter + + Convenience typedef, primarily to simplify usage of + FunctionTo and friends. + */ + typedef AccessorGetterType Getter; + + /** @typedef AccessorSetterType Setter + + Convenience typedef, primarily to simplify usage of + FunctionTo and friends. + */ + typedef AccessorSetterType Setter; + + /** + A tag type for use with VarTo, MemberTo, MethodTo, and FunctionTo. + */ + struct Accessors : AccessorGetterType, AccessorSetterType {}; + + /** + This template create an v8::AccessorGetter from a static/shared + variable. + + SharedVar must be pointer to a static variable and must not + be NULL. + + CastToJS(*SharedVar) must be legal. + */ + template + struct VarToGetter : AccessorGetterType + { + /** Implements the v8::AccessorGetter() interface. */ + inline static v8::Handle Get(v8::Local property, const v8::AccessorInfo &info) + { + return CastToJS( *SharedVar ); + } + }; + + /** + The setter counterpart of StaticVarToGetter(). + + SharedVar must be pointer to a static variable and must not + be NULL. + + (*SharedVar = CastFromJS()) must be legal. + + Reminder: this is not included in the StaticVarToGetter + template so that we can avoid either the Get or Set + conversion for cases where it is not legal (or not desired). + If they were both in one class, both Get and Set would _have_ + to be legal. + */ + template + struct VarToSetter : AccessorSetterType + { + /** Implements the v8::AccessorSetter() interface. */ + inline static void Set(v8::Local property, v8::Local value, const v8::AccessorInfo& info) + { + *SharedVar = CastFromJS( value ); + } + }; + + /** + A proxy for both VarToGetter and VarToSetter, providing both + Get() and Set() functions. + */ + template + struct VarToAccessors : VarToGetter, + VarToSetter + {}; + + /** + This template creates a v8::AcessorGetter which binds directly to + a non-const native class member variable. + + Requirements: + + - T must be convertible to (T*) via CastFromJS(). + - MemVar must be an accessible member of T. + - PropertyType must be convertible via CastToJS(). + + If the underlying native 'this' object cannot be found (that + is, if CastFromJS() fails) then this routine will + trigger a JS exception. + */ + template + struct MemberToGetter : AccessorGetterType + { + /** Implements the v8::AccessorGetter() interface. */ + inline static v8::Handle Get(v8::Local property, const v8::AccessorInfo &info) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle self = CastFromJS( info.This() ); + return ( ! self ) + ? Toss( StringBuffer() << "Native member property getter '" + << property << "' could not access native 'this' object!" ) + : CastToJS( (self->*MemVar) ); + } + }; + + /** + This is the Setter counterpart of MemberToGetter. + + Requirements: + + - T must be convertible to (T*) via CastFromJS(). + - PropertyType must be convertible via CastToJS(). + - MemVar must be an accessible member of T. + + If the underlying native This object cannot be found then this + routine will trigger a JS exception. + */ + template + struct MemberToSetter : AccessorSetterType + { + /** Implements the v8::AccessorSetter() interface. */ + inline static void Set(v8::Local property, v8::Local value, const v8::AccessorInfo& info) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle self = CastFromJS( info.This() ); + if( self ) self->*MemVar = CastFromJS( value ); + else Toss( StringBuffer() << "Native member property setter '" + << property << "' could not access native 'this'his object!" ); + } + }; + + /** + A proxy for both MemberToGetter and MemberToSetter, providing both + Get() and Set() functions. + + This should be called MembersToAccessors (plural Members). + */ + template + struct MemberToAccessors : MemberToGetter, + MemberToSetter + {}; + + /** + An AccessorSetter() implementation which always triggers a JS exception. + Can be used to enforce "pedantically read-only" variables. Note that + JS does not allow us to assign an AccessorSetter _without_ assigning + an AccessorGetter. Also note that there is no AccessorGetterThrow, + because a write-only var doesn't make all that much sense (use + methods for those use cases). + */ + struct ThrowingSetter : AccessorSetterType + { + inline static void Set(v8::Local property, v8::Local, const v8::AccessorInfo &) + { + Toss(StringBuffer() << + "Native member property setter '" + << property + << "' is configured to throw an exception when modifying " + << "this read-only member!"); + } + }; + + /** + Implements the v8::AccessorGetter interface to bind a JS + member property to a native getter function. This function + can be used as the getter parameter to + v8::ObjectTemplate::SetAccessor(). + + Sig must be a function-signature-style type and Getter must + capable of being called with no arguments and returning a + value which can be CastToJS() to a JS value. + + If Getter() throws a native exception it is converted to a JS + exception. + */ + template ::FunctionType Getter> + struct FunctionToGetter : AccessorGetterType + { + inline static v8::Handle Get( v8::Local< v8::String > property, const v8::AccessorInfo & info ) + { + return CastToJS( (*Getter)() ); + } + }; + + /** + Implements the v8::AccessorSetter interface to bind a JS + member property to a native getter function. This function + can be used as the getter parameter to + v8::ObjectTemplate::SetAccessor(). + + SigSet must be function-signature-style pattern + for the setter function. The native + function must follow conventional mutator signature: + + ReturnType ( PropertyType ) + + PropertyType may differ from the return type. PropertyType + may not be void but the ReturnType may be. Any return value + from the setter is ignored by the JS engine. + + Note that the v8 API appears to not allow us to just set + a setter, but not a getter. We have to set a getter without + a setter, a getter with a setter, or neither. At least that's + been my experience. + + If Setter() throws a native exception it is converted to a JS + exception. + */ + template ::FunctionType Func> + struct FunctionToSetter : AccessorSetterType + { + inline static void Set( v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + typedef FunctionSignature FT; + (*Func)( CastFromJS::Type>( value ) ); + } + }; + + + /** + Implements the v8::AccessorGetter interface to bind a JS + member property to a native getter function. This function + can be used as the getter parameter to + v8::ObjectTemplate::SetAccessor(). + + Sig must be a function-pointer-style argument with a + non-void return type convertible to v8 via CastToJS(), and + Getter must be function capable of being called with 0 + arguments (either because it has none or they have + defaults). + */ + template ::FunctionType Getter> + struct MethodToGetter : AccessorGetterType + { + inline static v8::Handle Get( v8::Local< v8::String > property, const v8::AccessorInfo & info ) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle self = CastFromJS( info.This() ); + return self + ? CastToJS( (self->*Getter)() ) + : Toss( StringBuffer() << "Native member property getter '" + << property << "' could not access native This object!" ); + } + }; + + /** + Overload for const native getter functions. + */ + template ::FunctionType Getter> + struct ConstMethodToGetter : AccessorGetterType + { + inline static v8::Handle Get( v8::Local< v8::String > property, const v8::AccessorInfo & info ) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle const self = CastFromJS( info.This() ); + return self + ? CastToJS( (self->*Getter)() ) + : Toss( (StringBuffer() << "Native member property getter '" + << property << "' could not access native This object!").toError() ) + ; + } + }; + + /** + Implements v8::AccessorSetter interface to proxy a JS + member property through a native member setter function. + + This function can be used as the setter parameter to + v8::ObjectTemplate::SetAccessor(). + + Sig must be a function-pointer-style type and Getter must + be a T member function of that type. The function must be + capable of being called with only 1 argument (either + because it only accepts 1 or has defaults for the others), + and its return value is discarded (not converted to v8) + because that's how v8's native setters work. + + Exceptions thrown by the underlying function are + translated to JS exceptions. + + FIXME: code is 100% identical to ConstMethodToSetter except + for FunctionType typedef. Consolidate them in a base class. + */ + template ::FunctionType Setter> + struct MethodToSetter : AccessorSetterType + { + static void Set(v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle self = CastFromJS( info.This() ); + if( ! self ) + { + Toss( StringBuffer() << "Native member property setter '" + << property << "' could not access native This object!" ); + } + else + { + + typedef typename sl::At< 0, Signature >::Type ArgT; + (self->*Setter)( CastFromJS( value ) ); + } + return; + } + }; + + /** + Const-method equivalent of MethodToSetter. + + FIXME: code is 100% identical to ConstMethodToSetter except + for FunctionType typedef. Consolidate them in a base class. + */ + template ::FunctionType Setter> + struct ConstMethodToSetter : AccessorSetterType + { + static void Set(v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + typedef typename TypeInfo::Type Type; + typedef typename JSToNative::ResultType NativeHandle; + NativeHandle self = CastFromJS( info.This() ); + if( ! self ) + { + Toss( StringBuffer() << "Native member property setter '" + << property << "' could not access native This object!" ); + } + else + { + typedef typename sl::At< 0, Signature >::Type ArgT; + (self->*Setter)( CastFromJS( value ) ); + } + } + }; + + + /** + Similar to FunctionToGetter but uses a functor as a getter. + This is rarely useful, since the functor has no direct access + to any application state (unless that is static/shared within + the Ftor class). + + Ftor must be a functor. Sig must be a signature matching a const + Ftor::operator() implementation. CastToJS(Signature::ReturnType) + must be legal. + + The signature's return type may not be void (this is a getter, + and getters don't return void). + */ + template + struct FunctorToGetter + { + inline static v8::Handle Get( v8::Local< v8::String > property, const v8::AccessorInfo & info ) + { + //const static Ftor f(); + return CastToJS(Ftor()()); + } + }; + + /** + The setter counterpart of FunctorToGetter. + + Ftor must be a functor which accepts 1 arguments. + Sig must be a signature matching a Ftor::operator() + implementation. + + The return value of Ftor::operator() is not evaluated, so it may be + void or any non-convertible type. It is semantically illegal to bind + a setter which return resources allocated by the setter, if those + resources are passed to the caller. In such a case, each access + _will_ leak memory. But nobody returns allocated memory from a + setter, right? + + CastFromJS() must be legal, where ArgType1 + is sl::At<0, Signature >::Type. + */ + template + struct FunctorToSetter + { + inline static void Set(v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + typedef typename sl::At< 0, Signature >::Type ArgT; + Ftor()( CastFromJS( value ) ); + } + }; + + /** + SetterCatcher is the AccessorSetter equivalent of InCaCatcher, and + is functionality identical except that its 4th template parameter + must be-a AccessorSetterType instead of an InCa type. + */ + template < typename ExceptionT, + typename SigGetMsg, + typename ConstMethodSignature::FunctionType Getter, + typename SetterT, + bool PropagateOtherExceptions = false + > + struct SetterCatcher : AccessorSetterType + { + static void Set(v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + try + { + SetterT::Set( property, value, info ); + } + catch( ExceptionT const & e2 ) + { + Toss((e2.*Getter)()); + } + catch( ExceptionT const * e2 ) + { + Toss((e2->*Getter)()); + } + catch(...) + { + if( PropagateOtherExceptions ) throw; + else Toss("Unknown native exception thrown!"); + } + } + }; + + /** + A convenience form of SetterCatcher which catches std::exception + and subtyes. See InCaCatcher_std for full details - this type is + identical except that its first template parameter must be-a + AccessorSetterType instead of InCa type. + */ + template < + typename SetterT, + typename ConcreteException = std::exception, + bool PropagateOtherExceptions = !tmp::SameType< std::exception, ConcreteException >::Value + > + struct SetterCatcher_std : + SetterCatcher + {}; + + /** + GetterCatcher is the AccessorSetter equivalent of InCaCatcher, and + is functionality identical except that its 4th template parameter + must be-a AccessorGetterType instead of an InCa type. + */ + template < typename ExceptionT, + typename SigGetMsg, + typename ConstMethodSignature::FunctionType Getter, + typename GetterT, + bool PropagateOtherExceptions = false + > + struct GetterCatcher : AccessorGetterType + { + static v8::Handle Get( v8::Local< v8::String > property, const v8::AccessorInfo & info ) + { + try + { + return GetterT::Get( property, info ); + } + catch( ExceptionT const & e2 ) + { + return Toss(CastToJS((e2.*Getter)())); + } + catch( ExceptionT const * e2 ) + { + return Toss(CastToJS((e2->*Getter)())); + } + catch(...) + { + if( PropagateOtherExceptions ) throw; + else return Toss("Unknown native exception thrown!"); + } + } + }; + + /** + A convenience form of GetterCatcher which catches std::exception + and subtyes. See InCaCatcher_std for full details - this type is + identical except that its first template parameter must be-a + AccessorGetterType instead of InCa type. + */ + template < + typename GetterT, + typename ConcreteException = std::exception, + bool PropagateOtherExceptions = !tmp::SameType< std::exception, ConcreteException >::Value + > + struct GetterCatcher_std : + GetterCatcher + {}; + + + /** + AccessAdder is a convenience class for use when applying several + (or more) accessor bindings to a prototype object. + + Example: + + @code + AccessorAdder acc(myPrototype); + acc("foo", MemberToGetter(), + MemberToSetter()) + ("bar", ConstMethodToGetter(), + MethodToSetter()) + ... + ; + @endcode + */ + class AccessorAdder + { + private: + v8::Handle const & proto; + + /** A "null" setter which does nothing. Used only as default + argument to operator(). Its Set() is not actually used + but this type is used as a placeholder for a NULL + v8::AccessorSetter. + */ + struct NullSetter + { + /** The v8::AccessorSetter() interface. */ + static void Set(v8::Local< v8::String > property, v8::Local< v8::Value > value, const v8::AccessorInfo &info) + { + } + }; + public: + /** + Initializes this object so that calls to operator() will + apply to p. p must out-live this object. More specifically, + operator() must not be called after p has been destroyed. + */ + explicit AccessorAdder( v8::Handle const & p ) + : proto(p) + {} + AccessorAdder const & operator()( char const * name, + v8::AccessorGetter g, + v8::AccessorSetter s = NULL, + v8::Handle< v8::Value > data=v8::Handle< v8::Value >(), + v8::AccessControl settings=v8::DEFAULT, + v8::PropertyAttribute attribute=v8::None) const + { + proto->SetAccessor(v8::String::New(name), g, s, data, settings, attribute); + return *this; + } + /** + Adds GetterT::Get and SetterT::Set as accessors for the + given property in the prototype object. + + GetterT must be-a AccessorGetterType. SetterT must be-a + AccessorSetterType. Note that their values are not used, + but GetterT::Get and SetterT::Set are used + directly. The objects are only passed in to keep the + client from having to specify them as template + parameters (which is clumsy for operator()), as their + types can be deduced. + + The 3rd and higher arguments are as documented (or not!) + for v8::ObjectTemplate::SetAccessor(). + + Returns this object, for chaining calls. + */ + template + AccessorAdder const & operator()( char const * name, + GetterT const &, + SetterT const & = NullSetter(), + v8::Handle< v8::Value > data=v8::Handle< v8::Value >(), + v8::AccessControl settings=v8::DEFAULT, + v8::PropertyAttribute attribute=v8::None) const + { + // jump through a small hoop to ensure identical semantics vis-a-vis + // the other overload. + return this->operator()( name, GetterT::Get, + tmp::SameType::Value ? NULL : SetterT::Set, + data, settings, attribute); + } + }; + +#if 0 /* i'm still undecided on the in-class naming conventions here... */ + /** + ClassAccessor provides a slight simplification for cases + where several different members/methods of a given bound + class (T) need to be bound to v8. It wraps the following + classes so that clients can use them one fewer template + parameters: + + MemberToGetter, MemberToSetter, MethodToGetter, MethodToSetter, + ConstMethodToGetter, ConstMethodToSetter + + Example: + + @code + typedef ClassAccessor CA; + v8::AccessorGetter get; + + get = MemberToGetter::Get + // is equivalent to: + get = CA::MemGet::Set + @endcode + + Its only real benefit is saving a bit of typing when several T + member/method bindings are made and T's real type name is longer + than 'T'. e.g. it gets tedious to repeatedly type + MyExceedinglyLongClassName in method/member-binding templates. + (Function-local typedefs help.) + */ + template + struct ClassAccessor + { + template + struct MemGet : MemberToGetter {}; + template + struct MemSet : MemberToSetter {}; + template ::FunctionType Getter> + struct MethGet : MethodToGetter {}; + template ::FunctionType Getter> + struct CMethGet : ConstMethodToGetter {}; + template ::FunctionType Setter> + struct MethSet : MethodToSetter {}; + template ::FunctionType Setter> + struct CMethSet : ConstMethodToSetter {}; + }; +#endif /* ClassAccessor */ + +} // namespaces +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ +#endif /* CODE_GOOGLE_COM_P_V8_CONVERT_PROPERTIES_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/signature.hpp b/vendor/libv8-convert/cvv8/signature.hpp new file mode 100644 index 000000000..4961d7039 --- /dev/null +++ b/vendor/libv8-convert/cvv8/signature.hpp @@ -0,0 +1,70 @@ +#if !defined(WANDERINGHORSE_NET_SIGNATURE_HPP_INCLUDED) +#define WANDERINGHORSE_NET_SIGNATURE_HPP_INCLUDED 1 + + +namespace cvv8 { +#include "detail/signature_core.hpp" +#include "detail/signature_generated.hpp" +} +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ +#endif /* WANDERINGHORSE_NET_SIGNATURE_HPP_INCLUDED */ diff --git a/vendor/libv8-convert/cvv8/v8-convert.hpp b/vendor/libv8-convert/cvv8/v8-convert.hpp new file mode 100644 index 000000000..1ee91d73e --- /dev/null +++ b/vendor/libv8-convert/cvv8/v8-convert.hpp @@ -0,0 +1,169 @@ +#if !defined(CODE_GOOGLE_COM_P_V8_CONVERT_V8_CONVERT_HPP_INCLUDED) +#define CODE_GOOGLE_COM_P_V8_CONVERT_V8_CONVERT_HPP_INCLUDED 1 + +// Doxygen REFUSES to use this block as namespace docs: @namespace cvv8 +/** @mainpage libv8-convert (cvv8) + +The cvv8 namespace (formerly v8::convert) houses APIs for handling the +following: + +- Converting between v8 Value handles and "native types" using generic +interface. This allows us to write generic algorithms which convert +between JS/C++ without having to know the exact types we're dealing +with. The basic POD types and some STL types are supported out of the +box and plugging in one's own types is normally quite simple. + +- Converting free- and member functions into v8::InvocationCallback +functions. These generated functions convert the JavaScript-originated +function arguments into native counterparts, forward the data to the +original native function, and convert the return values back to +something JS can use. + +Those two core features give us all we need in order to be able to +bind near-arbitrary C/C++ functions with JavaScript (where calling +conventions and type conversions allow us to do so). For cases where +the "automatic" function-to-InvocationCallback conversions are not +suitable, the type-conversion API can simplify the implementation of +custom v8::InvocationCallback functions. + +All of the conversions are compile-time typesafe where possible and +fail gracefully when such a determination can only be made at runtime. + +This code originated as the core-most component of the v8-juice +library (http://code.google.com/p/v8-juice). After a couple years +i felt compelled to refactor it into a toolkit usable by arbitrary +v8-using clients, doing a bit of cleanup along the way. The eventuall +intention is that this code will replace the v8::juice::convert +code. + +Author: Stephan Beal (http://wanderinghorse.net/home/stephan/) + +License: Dual MIT/Public Domain + +Project home page: http://code.google.com/p/v8-juice/wiki/V8Convert + +The most important functions and types, from a user's perspective, +include: + +Converting types: + +- cvv8::CastToJS() +- cvv8::CastFromJS() + +Implementing custom conversions: + +- cvv8::NativeToJS +- cvv8::JSToNative + +Converting functions to v8::InvocationCallback: + +- cvv8::FunctionToInCa +- cvv8::MethodToInCa +- cvv8::ConstMethodToInCa +- cvv8::ToInCa +- cvv8::FunctorToInCa +- cvv8::PredicatedInCa and cvv8::PredicatedInCaDispatcher + +Binding JS properties to native properties, functions, methods, or +functors: + +- cvv8::FunctionToGetter, cvv8::FunctionToSetter +- cvv8::MethodToGetter, cvv8::MethodToSetter +- cvv8::ConstMethodToGetter, cvv8::ConstMethodToSetter +- cvv8::FunctorToGetter, cvv8::FunctorToSetter + +Other utilities: + +- cvv8::CtorForwarder and cvv8::CtorArityDispatcher +- cvv8::ClassCreator simplifies binding of C++ classes with v8. +- cvv8::FunctionTo converts functions to ... +- cvv8::MethodTo converts methods to ... +- cvv8::FunctorTo converts functors to ... +- cvv8::VarTo converts variables to ... +- cvv8::CallForwarder forwards native arguments to JS functions. +- The tmp and sl namespaces hold various template metaprogramming bits. +- ... there's more ... + +Most of the code in this library are internal template specializations +which take care of the dirty work. Typical clients won't typically need +more than what's listed above. + +A core rule of this library is "if it ain't documented, don't use +it." All public API members which are intended for client-side use +are documented. Some one-line proxies whose purpose is either very +obvious, exist only for template type resolution reasons, or +are strictly internal are not necessarily documented. + +*/ +namespace cvv8 { +} + +#include "convert.hpp" +#include "invocable.hpp" +#include "arguments.hpp" +#include "ClassCreator.hpp" +#include "properties.hpp" +#include "XTo.hpp" +/** LICENSE + + This software's source code, including accompanying documentation and + demonstration applications, are licensed under the following + conditions... + + The author (Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) + explicitly disclaims copyright in all jurisdictions which recognize + such a disclaimer. In such jurisdictions, this software is released + into the Public Domain. + + In jurisdictions which do not recognize Public Domain property + (e.g. Germany as of 2011), this software is Copyright (c) 2011 + by Stephan G. Beal, and is released under the terms of the MIT License + (see below). + + In jurisdictions which recognize Public Domain property, the user of + this software may choose to accept it either as 1) Public Domain, 2) + under the conditions of the MIT License (see below), or 3) under the + terms of dual Public Domain/MIT License conditions described here, as + they choose. + + The MIT License is about as close to Public Domain as a license can + get, and is described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + + The full text of the MIT License follows: + + -- + Copyright (c) 2011 Stephan G. Beal (http://wanderinghorse.net/home/stephan/) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + --END OF MIT LICENSE-- + + For purposes of the above license, the term "Software" includes + documentation and demonstration source code which accompanies + this software. ("Accompanies" = is contained in the Software's + primary public source code repository.) + +*/ + +#endif /* CODE_GOOGLE_COM_P_V8_CONVERT_V8_CONVERT_HPP_INCLUDED */ From 8e7352eb6dcc806c995cc36be6e6dcc1f8245f22 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:02:16 +1300 Subject: [PATCH 38/63] Add libgit2 error codes to error object --- src/error.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/error.cc b/src/error.cc index 9f180f667..586163731 100755 --- a/src/error.cc +++ b/src/error.cc @@ -6,24 +6,70 @@ #include #include -#include "../vendor/libgit2/include/git2.h" +#include "cvv8/v8-convert.hpp" +#include "git2.h" #include "../include/error.h" using namespace v8; +using namespace cvv8; using namespace node; +namespace cvv8 { + template <> + struct NativeToJS : NativeToJS {}; +} + void GitError::Initialize (Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Error")); NODE_SET_PROTOTYPE_METHOD(constructor_template, "strError", StrError); + // Add libgit2 error codes to error object + Local libgit2Errors = Object::New(); + + libgit2Errors->Set(String::NewSymbol("GIT_SUCCESS"), cvv8::CastToJS(GIT_SUCCESS), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ERROR"), cvv8::CastToJS(GIT_ERROR), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOTOID"), cvv8::CastToJS(GIT_ENOTOID), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOTFOUND"), cvv8::CastToJS(GIT_ENOTFOUND), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOMEM"), cvv8::CastToJS(GIT_ENOMEM), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EOSERR"), cvv8::CastToJS(GIT_EOSERR), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EOBJTYPE"), cvv8::CastToJS(GIT_EOBJTYPE), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOTAREPO"), cvv8::CastToJS(GIT_ENOTAREPO), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EINVALIDTYPE"), cvv8::CastToJS(GIT_EINVALIDTYPE), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EMISSINGOBJDATA"), cvv8::CastToJS(GIT_EMISSINGOBJDATA), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EPACKCORRUPTED"), cvv8::CastToJS(GIT_EPACKCORRUPTED), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EFLOCKFAIL"), cvv8::CastToJS(GIT_EFLOCKFAIL), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EZLIB"), cvv8::CastToJS(GIT_EZLIB), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EBUSY"), cvv8::CastToJS(GIT_EBUSY), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EBAREINDEX"), cvv8::CastToJS(GIT_EBAREINDEX), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EINVALIDREFNAME"), cvv8::CastToJS(GIT_EINVALIDREFNAME), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EREFCORRUPTED"), cvv8::CastToJS(GIT_EREFCORRUPTED), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ETOONESTEDSYMREF"), cvv8::CastToJS(GIT_ETOONESTEDSYMREF), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EPACKEDREFSCORRUPTED"), cvv8::CastToJS(GIT_EPACKEDREFSCORRUPTED), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EINVALIDPATH"), cvv8::CastToJS(GIT_EINVALIDPATH), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EREVWALKOVER"), cvv8::CastToJS(GIT_EREVWALKOVER), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EINVALIDREFSTATE"), cvv8::CastToJS(GIT_EINVALIDREFSTATE), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOTIMPLEMENTED"), cvv8::CastToJS(GIT_ENOTIMPLEMENTED), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EEXISTS"), cvv8::CastToJS(GIT_EEXISTS), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EOVERFLOW"), cvv8::CastToJS(GIT_EOVERFLOW), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOTNUM"), cvv8::CastToJS(GIT_ENOTNUM), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ESTREAM"), cvv8::CastToJS(GIT_ESTREAM), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EINVALIDARGS"), cvv8::CastToJS(GIT_EINVALIDARGS), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EOBJCORRUPTED"), cvv8::CastToJS(GIT_EOBJCORRUPTED), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EAMBIGUOUSOIDPREFIX"), cvv8::CastToJS(GIT_EAMBIGUOUSOIDPREFIX), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_EPASSTHROUGH"), cvv8::CastToJS(GIT_EPASSTHROUGH), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ENOMATCH"), cvv8::CastToJS(GIT_ENOMATCH), ReadOnly); + libgit2Errors->Set(String::NewSymbol("GIT_ESHORTBUFFER"), cvv8::CastToJS(GIT_ESHORTBUFFER), ReadOnly); + + constructor_template->Set(String::NewSymbol("codes"), libgit2Errors, ReadOnly); + target->Set(String::NewSymbol("Error"), constructor_template->GetFunction()); } From 363de575077d214cdf3e9b5cd4decc0895321c3c Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:03:20 +1300 Subject: [PATCH 39/63] Refactored error object to wrap libgit2 error in a native Error object --- lib/error.js | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/error.js b/lib/error.js index ac4b18750..dd2120c1d 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,22 +1,25 @@ -var git = require( '../' ); +var git = require('../'), + util = require('util'); -var _Error = function( obj ) { - var self = {}; - - if( obj instanceof git.raw.Error ) { - self.error = obj; - } - else { - if( !self.error ) { - self.error = new git.raw.Error(); - } - - if( typeof obj === 'number' ) { - return self.error.strError( obj ); - } +/** + * Initialise an Error object + * + * @param {mixed} obj A git.raw.Error object or a string describing the error. + * @return {Object} + */ +var GitError = function(object) { + var error = null; + var gitError = new git.raw.Error(); + if (typeof object === 'number') { + error = new Error(gitError.strError(object)); + error.code = object; } - - return self; + return error; }; -exports.error = _Error; +// Add libgit2 error codes to git.error object +for (var errorName in git.raw.Error.codes) { + GitError[errorName] = git.raw.Error.codes[errorName]; +} + +exports.error = GitError; From 5f2b8b76f69f42c193d6e58ee27db3515de8b6ad Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:03:41 +1300 Subject: [PATCH 40/63] Minor oid fixes --- src/oid.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/oid.cc b/src/oid.cc index a7bf5481b..064457918 100755 --- a/src/oid.cc +++ b/src/oid.cc @@ -16,7 +16,7 @@ void GitOid::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(New); - + constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->SetClassName(String::NewSymbol("Oid")); @@ -62,7 +62,7 @@ char* GitOid::AllocFmt() { } char* GitOid::ToString(char* buffer, size_t bufferSize) { - git_oid_to_string(buffer, bufferSize, &this->oid); + return git_oid_to_string(buffer, bufferSize, &this->oid); } void GitOid::Cpy(git_oid* out) { @@ -145,7 +145,7 @@ Handle GitOid::ToString(const Arguments& args) { HandleScope scope; GitOid *oid = ObjectWrap::Unwrap(args.This()); - + if(args.Length() == 0 || !args[0]->IsNumber()) { return ThrowException(Exception::Error(String::New("Length argument is required and must be a Number."))); } @@ -160,14 +160,14 @@ Handle GitOid::Cpy(const Arguments& args) { HandleScope scope; GitOid *oid = ObjectWrap::Unwrap(args.This()); - + if(args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("GitOid argument is required and must be a Object."))); } GitOid *clone = ObjectWrap::Unwrap(args[0]->ToObject()); - - git_oid *out; + + git_oid *out = NULL; oid->Cpy(out); clone->SetValue(*out); @@ -177,18 +177,18 @@ Handle GitOid::Cpy(const Arguments& args) { Handle GitOid::Cmp(const Arguments& args) { HandleScope scope; - GitOid *oid = ObjectWrap::Unwrap(args.This()); - + // GitOid *oid = ObjectWrap::Unwrap(args.This()); + if(args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("GitOid argument is required and must be a Object."))); } - + if(args.Length() == 1 || !args[1]->IsObject()) { return ThrowException(Exception::Error(String::New("GitOid argument is required and must be a Object."))); } - GitOid* a = ObjectWrap::Unwrap(args[0]->ToObject()); - GitOid* b = ObjectWrap::Unwrap(args[1]->ToObject()); + // GitOid* a = ObjectWrap::Unwrap(args[0]->ToObject()); + // GitOid* b = ObjectWrap::Unwrap(args[1]->ToObject()); //int cmp = oid->Cmp(&a->GetValue(), &b->GetValue()); int cmp = 0; From 03ea2c3bd0a3a10567cfe7bdd1fb13e40ed0d8b4 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:03:51 +1300 Subject: [PATCH 41/63] Added convenience-error test --- test/convenience-error.js | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/convenience-error.js diff --git a/test/convenience-error.js b/test/convenience-error.js new file mode 100644 index 000000000..2f8df4c2b --- /dev/null +++ b/test/convenience-error.js @@ -0,0 +1,56 @@ +var git = require('../'); +var rimraf = require('rimraf'); +var fs = require( 'fs' ); + +// Helper functions +var helper = { + // Test if obj is a true function + testFunction: function(test, obj, label) { + // The object reports itself as a function + test(typeof obj, 'function', label + ' reports as a function.'); + // This ensures the repo is actually a derivative of the Function [[Class]] + test(toString.call(obj), '[object Function]', label + ' [[Class]] is of type function.'); + }, + // Test code and handle exception thrown + testException: function(test, fun, label) { + try { + fun(); + test(false, label); + } + catch (ex) { + test(true, label); + } + } +}; + +/** + * Test that the error object is present. + * + * @param {Object} test + */ +exports.method = function(test){ + test.expect(2); + + helper.testFunction(test.equals, git.error, 'Error'); + + test.done(); +}; + +/** + * Test that + * + * @param {Object} test + */ +exports.improperCommitId = function(test) { + test.expect(1); + git.repo('../.git', function(error, repository) { + + repository.commit('not a proper commit sha', function(error, commit) { + + test.equals(error.code, git.error.GIT_EINVALIDTYPE, 'Attempting to get commit by invalid SHA should error'); + + test.done(); + }); + }); +}; + From 29176fb7c39f9ffe21c422c4da4e5355ca507177 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:04:07 +1300 Subject: [PATCH 42/63] Updated convenience-commit to work with new commit api --- test/convenience-commit.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/test/convenience-commit.js b/test/convenience-commit.js index 63ec60bc5..d3092c7b7 100644 --- a/test/convenience-commit.js +++ b/test/convenience-commit.js @@ -42,12 +42,13 @@ exports.method = function(test){ * @param {Object} test */ exports.improperCommitId = function(test) { - test.expect(1); + test.expect(2); git.repo('../.git', function(error, repository) { repository.commit('not a proper commit sha', function(error, commit) { - test.equals(error, 'Object does not exist in the scope searched.', 'Attempting to get commit by invalid SHA should error'); + test.equals(error.code, git.error.GIT_ENOTFOUND, 'Correct error should occur'); + test.equals(error.message, 'Object does not exist in the scope searched.', 'Attempting to get commit by invalid SHA should error'); test.done(); }); @@ -62,20 +63,22 @@ var historyCountKnownSHA = 'fce88902e66c72b5b93e75bdb5ae717038b221f6'; * @param {Object} test */ exports.history = function(test) { - test.expect(2); + test.expect(368); git.repo('../.git', function(error, repository) { repository.commit(historyCountKnownSHA, function(error, commit) { - test.equals(error, 0, 'Getting latest branch commit should not error'); var historyCount = 0; var expectedHistoryCount = 364; - commit.history().on('commit', function(commit) { + commit.history().on('commit', function(error, commit) { + test.equals(error, null, 'There should be no errors'); historyCount++; - }).on('end', function(commits) { + }).on('end', function(error, commits) { - test.equals(historyCount, expectedHistoryCount, 'History count does not match expected'); + test.equals(error, null, 'There should be no errors'); + test.equals(historyCount, expectedHistoryCount, 'Manual count does not match expected'); + test.equals(commits.length, expectedHistoryCount, '"end" count does not match expected'); test.done(); }); From a3c5009970cce399c23af3fa9917a8811d0691c6 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:04:23 +1300 Subject: [PATCH 43/63] Replaced " with ', updated test --- test/convenience-repo.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/test/convenience-repo.js b/test/convenience-repo.js index a7d44e2ff..d9f359dce 100644 --- a/test/convenience-repo.js +++ b/test/convenience-repo.js @@ -1,17 +1,17 @@ -var git = require( "../" ); -var rimraf = require("rimraf"); -var fs = require( "fs" ); +var git = require( '../' ); +var rimraf = require('rimraf'); +var fs = require( 'fs' ); // Helper functions var helper = { // Test if obj is a true function testFunction: function(test, obj, label) { // The object reports itself as a function - test(typeof obj, "function", label + " reports as a function."); + test(typeof obj, 'function', label + ' reports as a function.'); // This ensures the repo is actually a derivative of the Function [[Class]] - test(toString.call(obj), "[object Function]", label + " [[Class]] is of type function."); + test(toString.call(obj), '[object Function]', label + ' [[Class]] is of type function.'); }, - // Test code and handle exception thrown + // Test code and handle exception thrown testException: function(test, fun, label) { try { fun(); @@ -29,20 +29,20 @@ var helper = { exports.method = function(test){ test.expect(5); - helper.testFunction(test.equals, git.repo, "Repo"); + helper.testFunction(test.equals, git.repo, 'Repo'); // Test callback argument existence helper.testException(test.ok, function() { - git.repo("some/path"); - }, "Throw an exception if no callback"); + git.repo('some/path'); + }, 'Throw an exception if no callback'); // Test invalid repository - git.repo("/etc/hosts", function(err, path) { - test.equals("The specified repository is invalid", err, "Invalid repository error code"); + git.repo('/etc/hosts', function(err, path) { + test.equals('The specified repository is invalid', err.message, 'Invalid repository error code'); // Test valid repository - git.repo("../.git", function(err, path) { - test.equals(0, err, "Valid repository error code"); + git.repo('../.git', function(err, path) { + test.equals(0, err, 'Valid repository error code'); test.done(); }); @@ -56,19 +56,19 @@ exports.method = function(test){ exports.init = function(test) { test.expect(4); - helper.testFunction(test.equals, git.repo().init, "Repo::Init"); + helper.testFunction(test.equals, git.repo().init, 'Repo::Init'); // Cleanup, remove test repo directory - if it exists - rimraf("./test.git", function() { + rimraf('./test.git', function() { // Create bare repo and test for creation - git.repo().init("./test.git", true, function(err, path, isBare) { - test.equals(0, err, "Successfully created bare repository"); + git.repo().init('./test.git', true, function(err, path, isBare) { + test.equals(0, err, 'Successfully created bare repository'); // Verify repo exists - git.repo("./test.git", function(err, path, repo) { - test.equals(0, err, "Valid repository created"); + git.repo('./test.git', function(err, path, repo) { + test.equals(0, err, 'Valid repository created'); // Cleanup, remove test repo directory - rimraf("./test.git", test.done); + rimraf('./test.git', test.done); }); }); }); From ada10b769b36e440aa3ed201343f82d0a9b4575a Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:04:42 +1300 Subject: [PATCH 44/63] Updated convenience-tree to work with new api --- test/convenience-tree.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/convenience-tree.js b/test/convenience-tree.js index 3d0870031..d97e51b0e 100644 --- a/test/convenience-tree.js +++ b/test/convenience-tree.js @@ -6,7 +6,7 @@ var sha = '5716e9757886eaf38d51c86b192258c960d9cfea'; var fileCount = 513; exports.walk = function(test) { - test.expect(1); + test.expect(516); git.repo('../.git', function(error, repo) { if(error) { throw error; } @@ -14,11 +14,14 @@ exports.walk = function(test) { repo.commit(sha, function(error, commit) { if(error) { throw error; } var entryCount = 0; - commit.tree().walk().on('entry', function(index, entry) { + commit.tree().walk().on('entry', function(error, index, entry) { + test.equals(error, null, 'There should be no error'); entryCount++; - }).on('end', function() { - test.equals(entryCount, fileCount, 'The manual tree entry count and the "end" tree entry count do not match'); - test.done(); + }).on('end', function(error, entries) { + test.equals(error, null, 'There should be no error'); + test.equals(entryCount, fileCount, 'The manual tree entry count and the "end" tree entry count do not match'); + test.equals(entries.length, fileCount, 'The end entries count and the manual entry count do not match'); + test.done(); }); }); }); From 83169abaa435d5ed4548efbad3cf3f25134a4f70 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:05:25 +1300 Subject: [PATCH 45/63] Use error constants to check for completion of history walk, emit error appropriately if one is provided --- lib/commit.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/commit.js b/lib/commit.js index 43afc7bae..195a76902 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -17,7 +17,7 @@ var _Commit = function( obj ) { else { self.commit = new git.raw.Commit(); } - + Object.defineProperty( self, 'id', { get: function() { var oid = new git.raw.Oid(); @@ -69,7 +69,7 @@ var _Commit = function( obj ) { Object.defineProperty( self, 'author', { get: function() { var sig = new git.raw.Sig(); - + self.commit.author( sig ); return git.sig( sig ); @@ -104,25 +104,28 @@ var _Commit = function( obj ) { return self.tree().entry( path ); }; - self.history = function( start, end ) { - var revwalk = git.revwalk( self.repo ), + self.history = function(start, end) { + var revwalk = git.revwalk(self.repo), event = new events.EventEmitter(), commits = []; - revwalk.walk( self.id, function( err, index, commit ) { - if( err ) { - event.emit( 'end', commits ); - } - else { - event.emit( 'commit', commit ); - commits.push( commit ); + revwalk.walk(self.id, function(error, index, commit) { + if(error) { + if (error === git.error.GIT_EREVWALKOVER) { + event.emit('end', null, commits); + return; + } else { + event.emit('commit', new git.error(error), commit); + return; + } } + event.emit('commit', null, commit); + commits.push(commit); }); return event; }; - return self; }; From fd3b2f3e81a7dfdc5d0c0bf8fbf7fc82b400119d Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:06:02 +1300 Subject: [PATCH 46/63] Refactored tree walk --- lib/tree.js | 67 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/lib/tree.js b/lib/tree.js index aa3e40f82..e51d3de41 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -18,56 +18,71 @@ var _Tree = function( obj, tree ) { self.tree = new git.raw.Tree(); } - Object.defineProperty( self, 'length', { + Object.defineProperty(self, 'length', { get: function() { return self.tree.entryCount(); }, enumerable: true }); - self.walk = function( repo ) { - var entry - , i - , len = self.length - , repo = repo || self.repo - , event = new events.EventEmitter(); + self.walk = function(repo) { + repo = repo || self.repo; - function next(i) { + var entry, + index, + length = self.length, + event = new events.EventEmitter(), + entries = []; + + function next(index) { var dir; var tree; var prerequisites = 0; - function complete() { - if( i Date: Sat, 2 Mar 2013 02:06:14 +1300 Subject: [PATCH 47/63] Updated index --- lib/index.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/index.js b/lib/index.js index 613b17b17..3d687095f 100755 --- a/lib/index.js +++ b/lib/index.js @@ -13,7 +13,6 @@ if (~os.type().indexOf("CYGWIN") && !~path.indexOf(root)) { exports.util = require("./util.js").util; exports.blob = require("./blob.js").blob; exports.repo = require("./repo.js").repo; -exports.error = require("./error.js").error; exports.sig = require("./sig.js").sig; exports.oid = require("./oid.js").oid; exports.object = require("./object.js").object; @@ -24,6 +23,14 @@ exports.tree = require("./tree.js").tree; exports.entry = require("./tree_entry.js").entry; // Assign raw api to module -exports.raw = require("../build/Release/nodegit"); +try { + exports.raw = require('../build/Debug/nodegit'); +} catch (error) { + exports.raw = require('../build/Release/nodegit'); +} + +// Initialize error object after so it may access raw.Error +exports.error = require("./error.js").error; + // Set version -exports.version = "0.0.6"; +exports.version = "0.0.7"; From 052c050a65e2d79e9e7f65140ae5754bceb8f42c Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 02:16:14 +1300 Subject: [PATCH 48/63] Fixed typo in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99949194f..d72531903 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "engines": { "node": "~0.8" }, - "depenencies": { + "dependencies": { "async": ">= 0.1.21", "node-gyp": "~0.8.2" }, From e8876707938abf94d5cc02b0c4017c4fec2aa44e Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 22:40:47 +1300 Subject: [PATCH 49/63] Added adm-zip --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index d72531903..7ec2b4634 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ }, "dependencies": { "async": ">= 0.1.21", + "adm-zip": "", "node-gyp": "~0.8.2" }, "devDependencies": { From 2d71044741412280370cb0326c96d3a5a7b5dca1 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Sat, 2 Mar 2013 22:41:07 +1300 Subject: [PATCH 50/63] Updated install script --- install.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/install.js b/install.js index e6e60c687..1207a4a43 100644 --- a/install.js +++ b/install.js @@ -1,7 +1,10 @@ var async = require('async'), child_process = require('child_process'), spawn = child_process.spawn, - path = require('path'); + path = require('path'), + fs = require('fs'), + request = require('request'), + AdmZip = require('adm-zip'); function passthru() { var args = Array.prototype.slice.call(arguments); @@ -27,14 +30,62 @@ function envpassthru() { passthru.apply(null, ['/usr/bin/env'].concat(Array.prototype.slice.call(arguments))); } +var updateSubmodules = function(mainCallback) { + console.log('[nodegit] Downloading libgit2 dependency.'); + async.series([ + function(callback) { + envpassthru('git', 'submodule', 'init', callback); + }, function(callback) { + envpassthru('git', 'submodule', 'update', callback); + } + ], function(error) { + if (error) process.exit(error); + mainCallback(); + }); +}; + +var checkoutDependencies = function(mainCallback) { + console.log('[nodegit] Downloading libgit2 dependency.'); + + var libgit2ZipUrl = 'https://github.com/libgit2/libgit2/archive/v0.15.0.zip'; + zipFile = __dirname + '/vendor/libgit2.zip', + unzippedFolderName = __dirname + '/vendor/libgit2-0.15.0', + targetFolderName = __dirname + '/vendor/libgit2'; + + async.series([ + function(callback) { + request(libgit2ZipUrl) + .pipe(fs.createWriteStream(zipFile)) + .on('close', function () { + callback(); + }); + + }, function(callback) { + var zip = new AdmZip(zipFile); + zip.extractAllTo(__dirname + '/vendor/', true); + fs.unlink(zipFile); + callback(); + }, + function renameLibgit2Folder(callback) { + fs.rename(unzippedFolderName, targetFolderName, callback); + } + ], function(error) { + if (error) process.exit(error); + mainCallback(); + }); +}; + var buildDir = path.join(__dirname, 'vendor/libgit2/build'); async.series([ function(callback) { - console.log('[nodegit] Downloading libgit2 dependency.'); - envpassthru('git', 'submodule', 'init', callback); - }, - function(callback) { - envpassthru('git', 'submodule', 'update', callback); + // Check for presence of .git folder + fs.exists(__dirname + '/.git', function(exists) { + if (exists) { + updateSubmodules(callback); + } else { + checkoutDependencies(callback); + } + }); }, function(callback) { console.log('[nodegit] Building libgit2 dependency.'); From 87c31e8ea43212f466b6d9964f6ee40e07e170b5 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 22:44:26 +1300 Subject: [PATCH 51/63] Renamed async methods, added refactored constructor template, added parentSync, made parent async --- include/commit.h | 37 ++++++++--- src/commit.cc | 159 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 151 insertions(+), 45 deletions(-) diff --git a/include/commit.h b/include/commit.h index 90147d9e7..ac63ae59c 100755 --- a/include/commit.h +++ b/include/commit.h @@ -27,7 +27,7 @@ class GitCommit : public ObjectWrap { /** * v8::FunctionTemplate used to create Node.js constructor */ - static Persistent constructor_template; + static Persistent constructor_template; /** * Used to intialize the EventEmitter from Node.js @@ -56,10 +56,11 @@ class GitCommit : public ObjectWrap { ~GitCommit() {} static Handle New(const Arguments& args); + static Handle NewInstance(); static Handle Lookup(const Arguments& args); - static void EIO_Lookup(uv_work_t *req); - static void EIO_AfterLookup(uv_work_t *req); + static void LookupWork(uv_work_t *req); + static void LookupAfterWork(uv_work_t *req); static Handle Close(const Arguments& args); static Handle Id(const Arguments& args); @@ -71,11 +72,15 @@ class GitCommit : public ObjectWrap { static Handle Author(const Arguments& args); static Handle Tree(const Arguments& args); - static void EIO_Tree(uv_work_t* req); - static void EIO_AfterTree(uv_work_t* req); + static void TreeWork(uv_work_t* req); + static void TreeAfterWork(uv_work_t* req); static Handle ParentCount(const Arguments& args); + + static Handle ParentSync(const Arguments& args); static Handle Parent(const Arguments& args); + static void ParentWork(uv_work_t* req); + static void ParentAfterWork(uv_work_t* req); private: git_commit* commit; @@ -89,10 +94,22 @@ class GitCommit : public ObjectWrap { Persistent callback; }; - //struct tree_request { - // GitCommit* commit; - // Tree* tree; - // Persistent callback; - //}; + /** + * Struct: parent_request + * Contains references to the current commit, parent commit (output) + * parent commit's index, also contains references to an error code post + * lookup, and a callback function to execute. + */ + struct ParentBaton { + uv_work_t request; + int errorCode; + const char* errorMessage; + + int index; + GitCommit *commit; + git_commit *rawParentCommit; + Persistent callback; + }; + }; #endif diff --git a/src/commit.cc b/src/commit.cc index 989360756..40cf69074 100755 --- a/src/commit.cc +++ b/src/commit.cc @@ -8,6 +8,7 @@ #include #include "../vendor/libgit2/include/git2.h" +#include "cvv8/v8-convert.hpp" #include "../include/reference.h" #include "../include/sig.h" @@ -22,25 +23,26 @@ using namespace node; void GitCommit::Initialize(Handle target) { HandleScope scope; - Local t = FunctionTemplate::New(New); - - constructor_template = Persistent::New(t); - constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(String::NewSymbol("Commit")); - - NODE_SET_PROTOTYPE_METHOD(constructor_template, "lookup", Lookup); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", Close); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "id", Id); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "messageShort", MessageShort); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "message", Message); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "time", Time); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "timeOffset", TimeOffset); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "author", Author); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "tree", Tree); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "parentCount", ParentCount); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "parent", Parent); - - target->Set(String::NewSymbol("Commit"), constructor_template->GetFunction()); + Local tpl = FunctionTemplate::New(New); + + tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->SetClassName(String::NewSymbol("Commit")); + + NODE_SET_PROTOTYPE_METHOD(tpl, "lookup", Lookup); + NODE_SET_PROTOTYPE_METHOD(tpl, "close", Close); + NODE_SET_PROTOTYPE_METHOD(tpl, "id", Id); + NODE_SET_PROTOTYPE_METHOD(tpl, "messageShort", MessageShort); + NODE_SET_PROTOTYPE_METHOD(tpl, "message", Message); + NODE_SET_PROTOTYPE_METHOD(tpl, "time", Time); + NODE_SET_PROTOTYPE_METHOD(tpl, "timeOffset", TimeOffset); + NODE_SET_PROTOTYPE_METHOD(tpl, "author", Author); + NODE_SET_PROTOTYPE_METHOD(tpl, "tree", Tree); + NODE_SET_PROTOTYPE_METHOD(tpl, "parentCount", ParentCount); + NODE_SET_PROTOTYPE_METHOD(tpl, "parent", Parent); + NODE_SET_PROTOTYPE_METHOD(tpl, "parentSync", ParentSync); + + constructor_template = Persistent::New(tpl->GetFunction()); + target->Set(String::NewSymbol("Commit"), constructor_template); } git_commit* GitCommit::GetValue() { @@ -112,6 +114,14 @@ Handle GitCommit::New(const Arguments& args) { return scope.Close(args.This()); } +Handle GitCommit::NewInstance() { + HandleScope scope; + + Local instance = constructor_template->NewInstance(); + + return scope.Close(instance); +} + Handle GitCommit::Lookup(const Arguments& args) { HandleScope scope; @@ -142,20 +152,19 @@ Handle GitCommit::Lookup(const Arguments& args) { uv_work_t *req = new uv_work_t; req->data = ar; - uv_queue_work(uv_default_loop(), req, EIO_Lookup, EIO_AfterLookup); + uv_queue_work(uv_default_loop(), req, LookupWork, LookupAfterWork); return scope.Close( Undefined() ); } -void GitCommit::EIO_Lookup(uv_work_t *req) { +void GitCommit::LookupWork(uv_work_t *req) { lookup_request *ar = static_cast(req->data); git_oid oid = ar->oid->GetValue(); ar->err = ar->commit->Lookup(ar->repo->GetValue(), &oid); - } -void GitCommit::EIO_AfterLookup(uv_work_t *req) { +void GitCommit::LookupAfterWork(uv_work_t *req) { HandleScope scope; lookup_request *ar = static_cast(req->data); @@ -217,7 +226,7 @@ Handle GitCommit::Message(const Arguments& args) { GitCommit *commit = ObjectWrap::Unwrap(args.This()); - return scope.Close( String::New(commit->Message()) ); + return scope.Close(String::New(commit->Message())); } Handle GitCommit::Time(const Arguments& args) { @@ -296,27 +305,107 @@ Handle GitCommit::ParentCount(const Arguments& args) { return scope.Close( Integer::New(count) ); } -Handle GitCommit::Parent(const Arguments& args) { +Handle GitCommit::ParentSync(const Arguments& args) { HandleScope scope; + if(args.Length() == 0 || !args[0]->IsNumber()) { + return ThrowException(Exception::Error(String::New("Position must be a Number."))); + } + GitCommit *commit = ObjectWrap::Unwrap(args.This()); - if(args.Length() == 0 || !args[0]->IsObject()) { - return ThrowException(Exception::Error(String::New("Commit is required and must be an Object."))); + git_commit *parentCommitValue ; + int errorCode = git_commit_parent(&parentCommitValue, commit->commit, args[0]->ToInteger()->Value()); + + if (errorCode) { + return ThrowException(Exception::Error(String::New(git_lasterror()))); } - if(args.Length() == 1 || !args[1]->IsNumber()) { + Local parent = GitCommit::constructor_template->NewInstance(); + GitCommit *parentCommit = ObjectWrap::Unwrap(parent); + parentCommit->SetValue(parentCommitValue); + + return scope.Close(parent); +} + +Handle GitCommit::Parent(const Arguments& args) { + HandleScope scope; + + if(args.Length() != 2) { + return ThrowException(Exception::Error(String::New("Position and callback are required"))); + } + + if(!args[0]->IsNumber()) { return ThrowException(Exception::Error(String::New("Position is required and must be a Number."))); } - GitCommit* out = ObjectWrap::Unwrap(args[0]->ToObject()); - git_commit* in; - int index = args[1]->ToInteger()->Value(); + if(!args[1]->IsFunction()) { + return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); + } - int err = commit->Parent(&in, index); - out->SetValue(in); + Local callback = Local::Cast(args[1]); - return scope.Close( Integer::New(err) ); + ParentBaton* baton = new ParentBaton(); + baton->request.data = baton; + baton->commit = ObjectWrap::Unwrap(args.This()); + baton->commit->Ref(); + baton->index = args[0]->ToInteger()->Value(); + baton->callback = Persistent::New(callback); + + uv_queue_work(uv_default_loop(), &baton->request, ParentWork, ParentAfterWork); + + return Undefined(); +} + +void GitCommit::ParentWork(uv_work_t* req) { + ParentBaton* baton = static_cast(req->data); + + baton->rawParentCommit = NULL; + baton->errorCode = git_commit_parent(&baton->rawParentCommit, baton->commit->commit, baton->index); + + if (baton->errorCode) { + baton->errorMessage = git_lasterror(); + } +} + +void GitCommit::ParentAfterWork(uv_work_t* req) { + HandleScope scope; + + ParentBaton* baton = static_cast(req->data); + delete req; + + if (baton->errorCode) { + Local argv[1] = { + Exception::Error(String::New(baton->errorMessage)) + }; + + TryCatch try_catch; + + baton->callback->Call(Context::GetCurrent()->Global(), 1, argv); + + if (try_catch.HasCaught()) { + node::FatalException(try_catch); + } + } else { + + Local parent = GitCommit::constructor_template->NewInstance(); + GitCommit *parentCommit = ObjectWrap::Unwrap(parent); + parentCommit->SetValue(baton->rawParentCommit); + + Handle argv[2] = { + Local::New(Null()), + parent + }; + + TryCatch try_catch; + baton->callback->Call(Context::GetCurrent()->Global(), 2, argv); + if (try_catch.HasCaught()) { + node::FatalException(try_catch); + } + } + baton->commit->Unref(); + baton->callback.Dispose(); + delete baton; } -Persistent GitCommit::constructor_template; +Persistent GitCommit::constructor_template; From b9a6ae6f0959ff60df23b828b31e8d2c9def37d3 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:22:49 +1300 Subject: [PATCH 52/63] Minor tidyup, remove callback->Dispose() --- src/commit.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/commit.cc b/src/commit.cc index 40cf69074..952850373 100755 --- a/src/commit.cc +++ b/src/commit.cc @@ -61,6 +61,7 @@ int GitCommit::Lookup(git_repository* repo, git_oid* oid) { void GitCommit::Close() { git_commit_close(this->commit); + this->commit = NULL; } const git_oid* GitCommit::Id() { @@ -194,7 +195,7 @@ Handle GitCommit::Close(const Arguments& args) { GitCommit *commit = ObjectWrap::Unwrap(args.This()); commit->Close(); - return scope.Close( Undefined() ); + return scope.Close(Undefined()); } Handle GitCommit::Id(const Arguments& args) { @@ -210,7 +211,7 @@ Handle GitCommit::Id(const Arguments& args) { oid->SetValue(*const_cast(commit->Id())); - return scope.Close( Undefined() ); + return scope.Close(Undefined()); } Handle GitCommit::MessageShort(const Arguments& args) { @@ -404,7 +405,6 @@ void GitCommit::ParentAfterWork(uv_work_t* req) { } } baton->commit->Unref(); - baton->callback.Dispose(); delete baton; } From 5f5f1cd07286db9b91845629823fc8af1ea65c1f Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:27:21 +1300 Subject: [PATCH 53/63] Fixed malloc error --- src/commit.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commit.cc b/src/commit.cc index 952850373..a91773de1 100755 --- a/src/commit.cc +++ b/src/commit.cc @@ -405,7 +405,6 @@ void GitCommit::ParentAfterWork(uv_work_t* req) { } } baton->commit->Unref(); - delete baton; } Persistent GitCommit::constructor_template; From fcb8922c09bd0e4e6da0311965962c5972beab67 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:28:00 +1300 Subject: [PATCH 54/63] Updated convenience commit object --- lib/commit.js | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/lib/commit.js b/lib/commit.js index 195a76902..4d7efeb32 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -4,13 +4,6 @@ var git = require( '../' ) var _Commit = function( obj ) { var self = { _cache: {} }; - //if( obj instanceof git.raw.Repo ) { - // self.commit = new git.raw.Commit( obj ); - //} - //else if( obj instanceof git.raw.Commit ) { - // self.commit = obj; - //} - if( obj instanceof git.raw.Commit ) { self.commit = obj; } @@ -28,12 +21,12 @@ var _Commit = function( obj ) { enumerable: true }); - Object.defineProperty( self, 'sha', { + Object.defineProperty(self, 'sha', { get: function() { var oid = new git.raw.Oid(); - self.commit.id( oid ); + self.commit.id(oid); - return oid.toString( 40 ); + return oid.toString(40); }, enumerable: true }); @@ -66,6 +59,13 @@ var _Commit = function( obj ) { enumerable: true }); + Object.defineProperty(self, 'parentCount', { + get: function() { + return self.commit.parentCount(); + }, + enumerable: true + }); + Object.defineProperty( self, 'author', { get: function() { var sig = new git.raw.Sig(); @@ -126,6 +126,29 @@ var _Commit = function( obj ) { return event; }; + /** + * Retrieve the commit's parent at the given position. + * + * @todo implement async + * + * @param {Integer} position + */ + self.parent = function(position, callback) { + var parent = + self.commit.parent(position, function(errorCode, parent) { + var error = null; + if (errorCode !== git.error.GIT_SUCCESS) { + error = git.error(errorCode); + } + callback(error, new _Commit(parent)); + }); + + }; + + self.parentSync = function(position) { + return new _Commit(self.commit.parentSync(position)); + }; + return self; }; From 61392cb96ec2ce412da792953cb81a10fb37dfd9 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:29:01 +1300 Subject: [PATCH 55/63] Updated error documentation --- lib/error.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/error.js b/lib/error.js index dd2120c1d..de7716670 100644 --- a/lib/error.js +++ b/lib/error.js @@ -17,7 +17,11 @@ var GitError = function(object) { return error; }; -// Add libgit2 error codes to git.error object +/** + * Add libgit2 error codes to git.error object. + * + * Refer to vendor/libgit2/include/git2/errors.h for error code definitions. + */ for (var errorName in git.raw.Error.codes) { GitError[errorName] = git.raw.Error.codes[errorName]; } From 81636d5384cfb2f5de6c49e57a1b91213e37164a Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:30:00 +1300 Subject: [PATCH 56/63] Tidy up --- src/blob.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/blob.cc b/src/blob.cc index 3d3069f5b..ff56275b5 100755 --- a/src/blob.cc +++ b/src/blob.cc @@ -80,9 +80,6 @@ Handle GitBlob::New(const Arguments& args) { Handle GitBlob::Lookup(const Arguments& args) { HandleScope scope; - GitBlob* blob = ObjectWrap::Unwrap(args.This()); - Local callback; - if(args.Length() == 0 || !args[0]->IsObject()) { return ThrowException(Exception::Error(String::New("Repo is required and must be an Object."))); } @@ -95,7 +92,8 @@ Handle GitBlob::Lookup(const Arguments& args) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } - callback = Local::Cast(args[2]); + GitBlob* blob = ObjectWrap::Unwrap(args.This()); + Local callback = Local::Cast(args[2]); lookup_request* ar = new lookup_request(); ar->blob = blob; @@ -132,8 +130,9 @@ void GitBlob::EIO_AfterLookup(uv_work_t* req) { ar->callback->Call(Context::GetCurrent()->Global(), 1, argv); - if(try_catch.HasCaught()) + if(try_catch.HasCaught()) { FatalException(try_catch); + } ar->callback.Dispose(); From d2f96c1a3d274a148e19dbdd25b04f86e7f32484 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:30:13 +1300 Subject: [PATCH 57/63] Updated convenience commit tests --- test/convenience-commit.js | 39 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/test/convenience-commit.js b/test/convenience-commit.js index d3092c7b7..ee56240d8 100644 --- a/test/convenience-commit.js +++ b/test/convenience-commit.js @@ -44,9 +44,7 @@ exports.method = function(test){ exports.improperCommitId = function(test) { test.expect(2); git.repo('../.git', function(error, repository) { - repository.commit('not a proper commit sha', function(error, commit) { - test.equals(error.code, git.error.GIT_ENOTFOUND, 'Correct error should occur'); test.equals(error.message, 'Object does not exist in the scope searched.', 'Attempting to get commit by invalid SHA should error'); @@ -108,6 +106,43 @@ exports.masterHead = function(test) { }); }; +/** + * Test that retreiving parent works as expected. + * + * @param {Object} test + */ +exports.parentSync = function(test) { + test.expect(2); + git.repo('../.git', function(error, repository) { + repository.commit('2d71044741412280370cb0326c96d3a5a7b5dca1', function(error, commit) { + test.equals(commit.parentCount, 1, 'Commit has exactly one parent'); + var parent = commit.parentSync(0) + test.equals(parent.sha, 'e8876707938abf94d5cc02b0c4017c4fec2aa44e', 'Parent SHA should match expected value'); + test.done(); + }); + }); +}; + +/** + * Test that retreiving parent works as expected. + * + * @param {Object} test + */ +exports.parent = function(test) { + test.expect(2); + git.repo('../.git', function(error, repository) { + repository.commit('2d71044741412280370cb0326c96d3a5a7b5dca1', function(error, commit) { + test.equals(commit.parentCount, 1, 'Commit has exactly one parent'); + commit.parent(0, function(error, parent) { + if (error) throw error; + test.equals(parent.sha, 'e8876707938abf94d5cc02b0c4017c4fec2aa44e', 'Parent SHA should match expected value'); + test.done(); + }); + + }); + }); +}; + /** * Test that retrieving and walking a commit's tree works as expected. * From dd8e48547a61791122f209e4be1081d1c58717ae Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:32:42 +1300 Subject: [PATCH 58/63] Updated error tests --- test/raw-error.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/raw-error.js b/test/raw-error.js index 6e6af594c..075a3d805 100644 --- a/test/raw-error.js +++ b/test/raw-error.js @@ -10,7 +10,7 @@ var helper = { // This ensures the repo is actually a derivative of the Function [[Class]] test( toString.call( obj ), '[object Function]', label +' [[Class]] is of type function.' ); }, - // Test code and handle exception thrown + // Test code and handle exception thrown testException: function( test, fun, label ) { try { fun(); @@ -28,7 +28,7 @@ exports.constructor = function( test ){ // Test for function helper.testFunction( test.equals, git.Error, 'Error' ); - + // Ensure we get an instance of Error test.ok( new git.Error() instanceof git.Error, 'Invocation returns an instance of Error' ); @@ -48,7 +48,7 @@ exports.str_error = function( test ) { helper.testException( test.ok, function() { testError.strError(); }, 'Throw an exception if no error code' ); - + // Test that arguments result correctly helper.testException( test.ifError, function() { testError.strError( 0 ); From 9371d7a8244dfdb6189655f68707255ab67d6779 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:33:11 +1300 Subject: [PATCH 59/63] Updated tests --- test/convenience-error.js | 2 +- test/raw-object.js | 2 +- test/raw-oid.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/convenience-error.js b/test/convenience-error.js index 2f8df4c2b..c2152f1aa 100644 --- a/test/convenience-error.js +++ b/test/convenience-error.js @@ -47,7 +47,7 @@ exports.improperCommitId = function(test) { repository.commit('not a proper commit sha', function(error, commit) { - test.equals(error.code, git.error.GIT_EINVALIDTYPE, 'Attempting to get commit by invalid SHA should error'); + test.notEqual(error.code, git.error.GIT_SUCCESS, 'Attempting to get commit by invalid SHA should error'); test.done(); }); diff --git a/test/raw-object.js b/test/raw-object.js index 1d0b045ff..7a04f76f7 100644 --- a/test/raw-object.js +++ b/test/raw-object.js @@ -10,7 +10,7 @@ var helper = { // This ensures the repo is actually a derivative of the Function [[Class]] test( toString.call( obj ), '[object Function]', label +' [[Class]] is of type function.' ); }, - // Test code and handle exception thrown + // Test code and handle exception thrown testException: function( test, fun, label ) { try { fun(); diff --git a/test/raw-oid.js b/test/raw-oid.js index 7cd7fac0b..3ebf4fdaa 100644 --- a/test/raw-oid.js +++ b/test/raw-oid.js @@ -10,7 +10,7 @@ var helper = { // This ensures the repo is actually a derivative of the Function [[Class]] test( toString.call( obj ), '[object Function]', label +' [[Class]] is of type function.' ); }, - // Test code and handle exception thrown + // Test code and handle exception thrown testException: function( test, fun, label ) { try { fun(); @@ -28,7 +28,7 @@ exports.constructor = function( test ){ // Test for function helper.testFunction( test.equals, git.Oid, 'Oid' ); - + // Ensure we get an instance of Oid test.ok( new git.Oid() instanceof git.Oid, 'Invocation returns an instance of Oid' ); @@ -48,7 +48,7 @@ exports.mkstr = function( test ) { helper.testException( test.ok, function() { testOid.mkstr(); }, 'Throw an exception if no hex String' ); - + // Test that both arguments result correctly helper.testException( test.ifError, function() { testOid.mkstr( "somestr" ); From 5fe4dbeb715314f2d8a91ff7e9ada94fa82dbe53 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:40:16 +1300 Subject: [PATCH 60/63] Update README.md --- README.md | 79 +++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index b252f396b..2fb9fe53a 100644 --- a/README.md +++ b/README.md @@ -30,26 +30,19 @@ $ npm install nodegit ### Mac OS X/Linux/Unix ### -#### Install `nodegit` by cloning source from GitHub and running the `configure`, `make`, and `make install` commands: #### -\*Note: `nodegit` assumes your library path exists at `~/.node_libraries` you can change this by specifying a new lib path\* +#### Install `nodegit` by cloning source from GitHub and running `node install`: #### ```` bash $ git clone git://github.com/tbranyen/nodegit.git $ cd nodegit - -$ ./configure -$ make -$ make install - -$ make install NODE_LIB_PATH=/path/to/your/libraries +$ node install ```` \*Updating to a new version\* ```` bash -$ make update - -$ make update NODE_LIB_PATH=/path/to/your/libraries +$ git pull +$ node install ```` ### Windows via Cygwin ### @@ -70,22 +63,22 @@ API Example Usage var git = require("nodegit"); // Read a repository -git.repo(".git", function(err, repo) { +git.repo('.git', function(err, repo) { // Success is always 0, failure is always an error string - if (err) { throw err; } + if (error) { throw error; } // Use the master branch - repo.branch("master", function(err, branch) { - if (err) { throw err; } + repo.branch('master', function(err, branch) { + if (error) { throw error; } // Iterate over the revision history var history = branch.history(); // Commit event emits commit object - history.on("commit", function(commit) { + history.on('commit', function(commit) { // Print out `git log` emulation - console.log("commit " + commit.sha); - console.log(commit.author.name + "<" + commit.author.email + ">"); + console.log('commit ' + commit.sha); + console.log(commit.author.name + '<' + commit.author.email + '>'); console.log(commit.time); console.log("\n"); console.log(commit.message); @@ -98,81 +91,81 @@ git.repo(".git", function(err, repo) { #### Raw API #### ```` javascript -var git = require( 'nodegit' ).raw; +var git = require('nodegit').raw; // Create instance of Repo constructor var repo = new git.Repo(); // Read a repository -repo.open( '.git', function( err ) { +repo.open('.git', function(error) { // Err is an integer, success is 0, use strError for string representation - if( err ) { + if(error) { var error = new git.Error(); - throw error.strError( err ); + throw error.strError(error); } // Create instance of Ref constructor with this repository - var ref = new git.Ref( repo ); + var ref = new git.Ref(repo); // Find the master branch - repo.lookupRef( ref, '/refs/heads/master', function( err ) { - if( err ) { + repo.lookupRef(ref, '/refs/heads/master', function(err) { + if(error) { var error = new git.Error(); - throw error.strError( err ); + throw error.strError(err); } // Create instance of Commit constructor with this repository - var commit = new git.Commit( repo ), + var commit = new git.Commit(repo), // Create instance of Oid constructor oid = new git.Oid(); // Set the oid constructor internal reference to this branch reference - ref.oid( oid ); + ref.oid(oid); // Lookup the commit for this oid - commit.lookup( oid, function() { - if( err ) { + commit.lookup(oid, function(err) { + if(err) { var error = new git.Error(); throw error.strError( err ); } // Create instance of RevWalk constructor with this repository - var revwalk = new git.RevWalk( repo ); + var revwalk = new git.RevWalk(repo); // Push the commit as the start to walk - revwalk.push( commit ); + revwalk.push(commit); // Recursive walk function walk() { // Each revision walk iteration yields a commit - var revisionCommit = new git.Commit( repo ); + var revisionCommit = new git.Commit(repo); - revwalk.next( revisionCommit, function( err ) { + revwalk.next( revisionCommit, function(err) { // Finish recursion once no more revision commits are left - if( err ) { return; } + if(err) { return; } // Create instance of Oid for sha var oid = new git.Oid(); // Set oid to the revision commit - revisionCommit.id( oid ); + revisionCommit.id(oid); // Create instance of Sig for author var author = new git.Sig(); // Set the author to the revision commit author - revisionCommit.author( author ); + revisionCommit.author(author); // Convert timestamp to milliseconds and set new Date object var time = new Date( revisionCommit.time() * 1000 ); // Print out `git log` emulation - console.log( oid.toString( 40 ) ); - console.log( author.name() + '<' + author.email() + '>' ); - console.log( time ); - console.log( '\n' ); - console.log( revisionCommit.message() ); - console.log( '\n' ); + console.log(oid.toString( 40 )); + console.log(author.name() + '<' + author.email() + '>'); + console.log(time); + console.log('\n'); + console.log(revisionCommit.message()); + console.log('\n'); // Recurse! walk(); From f5c1975ce988190c1485ff1d5f104db738217b72 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:47:34 +1300 Subject: [PATCH 61/63] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2fb9fe53a..86ed14aa4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Node.js libgit2 bindings +Node.js libgit2 bindings [![Build Status](https://travis-ci.org/tbranyen/nodegit.png)](https://travis-ci.org/tbranyen/nodegit) ======================= Created by Tim Branyen [@tbranyen](http://twitter.com/tbranyen) From c12df9c8a03e6e87484cd0fcc65f16d9f396e12c Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:48:59 +1300 Subject: [PATCH 62/63] Added devDependencies --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7ec2b4634..aa0a35539 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.0.7", + "version": "0.0.8", "homepage": "https://github.com/tbranyen/nodegit", "keywords": [ "libgit2", @@ -30,11 +30,12 @@ "node": "~0.8" }, "dependencies": { - "async": ">= 0.1.21", - "adm-zip": "", "node-gyp": "~0.8.2" }, "devDependencies": { + "adm-zip": "0.2.x", + "request": "2.9.x", + "async": ">= 0.1.21", "nodeunit": "0.7.x", "rimraf": "1.0.x" }, From 4c96d1cad9a9867e0c490a931a43f6e557aed4bb Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 6 Mar 2013 23:54:20 +1300 Subject: [PATCH 63/63] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa0a35539..b97c75b78 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.0.8", + "version": "0.0.71", "homepage": "https://github.com/tbranyen/nodegit", "keywords": [ "libgit2",

=uHz#4%J0P!RYVlzYKcqTl#P^Wo1(_e1-EG? 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